javamanager/javacaptain/tsrc/test_rtcplugin2/src/test2runtime.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javamanager/javacaptain/tsrc/test_rtcplugin2/src/test2runtime.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,252 @@
+/*
+* Copyright (c) 2008 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:  Test2Runtime
+*
+*/
+
+
+#include "logger.h"
+
+#include "javaprocessconstants.h"
+#include "commsendpoint.h"
+
+#include "coreinterface.h"
+#include "pmcinterface.h"
+#include "rtcmessages.h"
+
+#include "test2runtime.h"
+
+const int EXIT_TIMER_TIMEOUT    = 2;
+const int LAUNCH_TIMER_TIMEOUT  = 5;
+
+namespace java
+{
+namespace captain
+{
+
+Test2Runtime::Test2Runtime(const Uid& aUID,
+                           CoreInterface* aCore)
+        :mUid(aUID), mCore(aCore), mPid(-1),
+        mRunning(false), mExiting(false),
+        mRuntimeAddress(0), mTimerId(0)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+}
+
+Test2Runtime::~Test2Runtime()
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+}
+
+const char* const APP_UID_ARGUMENT          = "-appid";
+const char* const PUSH_ARGUMENT             = "-push";
+const char* const PREWARM_ARGUMENT          = "-prewarm";
+const char* const AUTO_INVOCATION_ARGUMENT  = "-autoinvocation";
+const char* const DEBUG_ARGUMENT            = "-debug";
+const char* const BG_START_ARGUMENT         = "-background";
+
+// RtcRuntimeInterface
+bool Test2Runtime::launch(const rtcLaunchInfo& aLaunchInfo)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    bool launchSuccess = false;
+
+    std::vector<std::string> params;
+
+    params.push_back("javatestruntime");
+    params.push_back(java::runtime::JAVA_MIDP_STARTER_DLL); //The name of the dll, that runs MIDlets
+    params.push_back(APP_UID_ARGUMENT);
+
+    char* appUID = java::util::JavaCommonUtils::wstringToUtf8(mUid.toString());
+    params.push_back(appUID);
+    delete [] appUID;
+
+    switch (aLaunchInfo.mLaunchType)
+    {
+    case RTC_LAUNCH_TYPE_PUSH_C:
+        params.push_back(PUSH_ARGUMENT);
+        break;
+
+    case RTC_LAUNCH_TYPE_AUTO_INVOCATION_C:
+        params.push_back(AUTO_INVOCATION_ARGUMENT);
+        break;
+
+    case RTC_LAUNCH_TYPE_BACKGROUND_C:
+        params.push_back(BG_START_ARGUMENT);
+        break;
+
+    case RTC_LAUNCH_TYPE_NORMAL_C: // fall through
+    default:
+        break;
+
+    }
+
+    mPid = mCore->getPmc()->launch(params, 0);
+
+    if (mPid > 0)
+    {
+        launchSuccess = true;
+        startTimer(LAUNCH_TIMER_TIMEOUT);
+    }
+
+    return launchSuccess;
+}
+
+int Test2Runtime::pid() const
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+    return mPid;
+}
+
+Uid Test2Runtime::uid() const
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+    return mUid;
+}
+
+bool Test2Runtime::isRunning() const
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    return mRunning;
+}
+
+bool Test2Runtime::terminate(const rtcTerminateInfo& /*aTerminateInfo*/)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    bool alreadyTerminated = false;
+
+    CommsMessage msg;
+    setTerminateApplicationReqParams(msg, mUid, RTC_TERMINATE_OPTIONS_NONE_C);
+    msg.setReceiver(mRuntimeAddress);
+
+    if (0 == mCore->getComms()->send(msg))
+    {
+        startTimer(EXIT_TIMER_TIMEOUT);
+        alreadyTerminated = false;
+        mExiting = true;
+    }
+    else
+    {
+        if (mPid > 0 && mCore)
+        {
+            mCore->getPmc()->kill(mPid);
+            alreadyTerminated = false;
+            mExiting = true;
+        }
+        else
+        {
+            alreadyTerminated = true;
+        }
+    }
+
+    return alreadyTerminated;
+}
+
+// ProcessManagementEventsInterface
+void Test2Runtime::pmcTerminated(const int& /*aPid*/, const int& /*exitCode*/)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    stopTimer();
+
+    mPid = -1;
+    mRuntimeAddress = 0;
+    mRunning = false;
+    mExiting = false;
+}
+
+void Test2Runtime::runningInd(const int& aRuntimeAddress, const int& /*aStatus*/)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    mRuntimeAddress = aRuntimeAddress;
+
+    if (!mExiting)
+    {
+        stopTimer();
+        mRunning = true;
+    }
+}
+
+void Test2Runtime::terminatedInd(const int& /*aStatus*/)
+{
+    if (!mExiting)
+    {
+        startTimer(EXIT_TIMER_TIMEOUT);
+    }
+}
+
+// CommsListener
+void Test2Runtime::processMessage(CommsMessage& aMessage)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    switch (aMessage.getMessageId())
+    {
+    default:
+        ELOG1(EJavaCaptain, "Unknown message forwarded to Test2Runtime %d", aMessage.getMessageId());
+
+    }
+}
+
+void Test2Runtime::startTimer(const int& aTimeout)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    // Only cancel if already started
+    if (0 != mTimerId)
+    {
+        mCore->getTimerServer()->timerCancel(mTimerId);
+        mTimerId = 0;
+    }
+    mTimerId = mCore->getTimerServer()->timerCreateSeconds(aTimeout, this);
+}
+void Test2Runtime::stopTimer()
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    if (0 != mTimerId)
+    {
+        mCore->getTimerServer()->timerCancel(mTimerId);
+        mTimerId = 0;
+    }
+}
+
+
+// TimerServerEventsInterface methods
+void Test2Runtime::timerTimeout(const int& aTimerId)
+{
+    JELOG4(EJavaCaptain, EInfoHeavyLoad);
+
+    if (aTimerId == mTimerId)
+    {
+        mTimerId = 0;
+        if (mPid > 0 && mCore)
+        {
+            mCore->getPmc()->kill(mPid);
+        }
+    }
+    else
+    {
+        LOG1WSTR(EJavaCaptain, EError, "timerTimeout(%s)", mUid.toString());
+        ELOG2(EJavaCaptain, "Wrong timerId! ok:%d FAIL:%d", mTimerId, aTimerId);
+    }
+}
+
+} // namespace captain
+} // namespace java
+