javaruntimes/starterutils/src/runtimestarterutils.cpp
branchRCL_3
changeset 19 04becd199f91
--- /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());
+    }
+}