--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaruntimes/starterutils/src/runtimestarterutils.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: This class contains utilities for starting the JVM.
+*
+*/
+
+
+#include <sstream>
+
+#include "commsclientendpoint.h"
+#include "commslistener.h"
+#include "commsmessage.h"
+#include "rtcmessages.h"
+#include "coremessages.h"
+
+#include "runtimestarterutils.h"
+#include "osthreadsupervisor.h"
+
+#include "logger.h"
+#include "exception"
+#include "runtimeexception.h"
+#include "javacommonutils.h"
+#include "bootclasspath.h"
+#include "ueiargsparser.h"
+
+#include "threaddumper.h"
+
+namespace java // codescanner::namespace
+{
+namespace runtime // codescanner::namespace
+{
+
+/**
+ * This class is for listening the messages from Java Captain related to
+ * development fetures.
+ */
+class DevelopmentFeaturesListener : public java::comms::CommsListener
+{
+public:
+ /**
+ * Default contructor of DevelopmentFeaturesListener.
+ */
+ DevelopmentFeaturesListener();
+
+ /**
+ * Destructor of DevelopmentFeaturesListener.
+ */
+ ~DevelopmentFeaturesListener();
+
+ /**
+ * This processes messages only with moduleId PLUGIN_ID_JAVACAPTAIN_CORE_C
+ *@see commslistener.h
+ */
+ void processMessage(CommsMessage& message);
+};
+} // end namespace runtime
+} // end namespace java
+
+using namespace java::runtime;
+using namespace java::util;
+
+
+const wchar_t* const JAVA_CAPTAIN = L"javacaptain";
+const int DEVELOPMENT_MODULE_ID = java::comms::PLUGIN_ID_JAVACAPTAIN_CORE_C; // codescanner::constnames
+
+OS_EXPORT
+RuntimeStarterUtils::RuntimeStarterUtils(): mComms(0),
+ mSupervisor(0),
+ mListener(0)
+{
+ JELOG2(EJavaRuntime);
+}
+
+OS_EXPORT RuntimeStarterUtils::~RuntimeStarterUtils()
+{
+ JELOG2(EJavaRuntime);
+ delete mSupervisor;
+ mSupervisor = 0;
+
+ delete mListener;
+ mListener = 0;
+
+ delete mComms;
+ mComms = 0;
+}
+
+OS_EXPORT
+void RuntimeStarterUtils::startThreadSupervisor(bool tryThreadDumping)
+{
+ JELOG2(EJavaRuntime);
+ // Delete the old one if exists.
+ if (mSupervisor)
+ {
+ delete mSupervisor;
+ mSupervisor = 0;
+ }
+ mSupervisor = new OsThreadSupervisor(tryThreadDumping); // codescanner::nonleavenew
+}
+
+OS_EXPORT
+void RuntimeStarterUtils::enableDevelopmentFeatures(JvmStarter& jvmStarter,
+ bool askForArgs,
+ std::wstring *pApplicationArgs)
+{
+ JELOG2(EJavaRuntime);
+
+ // Try to find if there is already client endpoint available.
+ CommsClientEndpoint* comms =
+ java::comms::CommsClientEndpoint::find(JAVA_CAPTAIN);
+
+ if (comms == 0)
+ {
+ // Not found, so creating new one.
+ mComms = new CommsClientEndpoint(); // codescanner::nonleavenew
+ comms = mComms;
+ }
+
+ // Create a listener for receiving development messages from JavaCaptain.
+ mListener = new DevelopmentFeaturesListener(); // codescanner::nonleavenew
+ comms->registerListener(DEVELOPMENT_MODULE_ID, mListener);
+
+ // If necessary ask more arguments from JC
+ if (askForArgs)
+ {
+ LOG(EJavaRuntime, EInfo, "Getting extra args from Java Captain");
+
+ java::comms::CommsMessage message;
+ java::comms::CommsMessage reply;
+
+ // Send a message to Java captain in order to get debug attributes.
+ java::captain::setGetExtraArguments(message);
+
+ comms->connect(java::comms::IPC_ADDRESS_JAVA_CAPTAIN_C);
+ int status = comms->sendReceive(message, reply, 1);
+
+ if (status == 0)
+ {
+ std::wstring runtimeArgs;
+ std::wstring applicationArgs;
+ java::captain::getGetExtraArgumentsAck(reply, runtimeArgs,
+ applicationArgs);
+
+ if (pApplicationArgs)
+ {
+ *pApplicationArgs = applicationArgs;
+ }
+
+ addRuntimeArguments(runtimeArgs, jvmStarter);
+ }
+ }
+}
+
+void RuntimeStarterUtils::addRuntimeArguments(const std::wstring& aRuntimeArgs,
+ JvmStarter& aJvmStarter)
+{
+ if (aRuntimeArgs.length() > 0)
+ {
+ UeiArgsParser parser;
+ std::wstring jvmArgs = parser.convertUeiArgsToJvmArgs(aRuntimeArgs);
+
+ std::wstringstream stream;
+ stream << jvmArgs; // codescanner::leave
+
+ std::wstring jvmArg;
+ while (stream.good())
+ {
+ stream >> jvmArg; // codescanner::leave
+ if (jvmArg.length() > 0)
+ {
+ LOG1(EJavaRuntime, EInfo, " Attrib: %S", jvmArg.c_str());
+ aJvmStarter.appendRawJvmArgument(jvmArg);
+ }
+ }
+ }
+}
+OS_EXPORT
+void RuntimeStarterUtils::getExtBootClassPath(std::wstring& extendedBootClassPath)
+{
+ getExtendedBootClassPath(extendedBootClassPath);
+}
+
+DevelopmentFeaturesListener::DevelopmentFeaturesListener()
+{
+ JELOG2(EJavaRuntime);
+}
+
+DevelopmentFeaturesListener::~DevelopmentFeaturesListener()
+{
+ JELOG2(EJavaRuntime);
+}
+
+void DevelopmentFeaturesListener::processMessage(CommsMessage& message)
+{
+ JELOG2(EJavaRuntime);
+ if (message.getMessageId() == java::captain::CORE_MSG_ID_DO_THREAD_DUMP)
+ {
+ WLOG(EJavaRuntime, "Doing THREAD DUMP");
+ ThreadDump::doDump();
+ }
+ else
+ {
+ ELOG2(EJavaRuntime, "Unknown message sent to development features "
+ "listener. messageId = %d, moduleId = %d.",
+ message.getMessageId(), message.getModuleId());
+ }
+}