diff -r f5050f1da672 -r 04becd199f91 javamanager/javacaptain/src.s60/pmc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javacaptain/src.s60/pmc.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,162 @@ +/* +* 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: Pmc + * +*/ + + +#include +#include + +#include "javasymbianoslayer.h" +#include "logger.h" + +#include "pmc.h" +#include "processmanagementeventsinterface.h" +#include "coreinterface.h" + +#include "midpruntimearguments.h" + +using namespace java::comms; + +namespace java +{ +namespace captain +{ + +Pmc::Pmc():mCore(0), mProcessManagementEventsDispatcher(0) +{ + JELOG4(EJavaCaptain, EInfo); +} + +Pmc::~Pmc() +{ + JELOG4(EJavaCaptain, EInfo); + mCore = 0; + mProcessManagementEventsDispatcher = 0; +} + +bool Pmc::start(CoreInterface* aCore, + ProcessManagementEventsInterface* aProcessManagementEventsDispatcher) +{ + JELOG4(EJavaCaptain, EInfo); + mCore = aCore; + mProcessManagementEventsDispatcher = aProcessManagementEventsDispatcher; + + return true; +} + +bool Pmc::stop() +{ + JELOG4(EJavaCaptain, EInfo); + + ScopedLock lock(mProcessesMutex); + for (processes_t::iterator iter = mProcesses.begin() ; iter != mProcesses.end() ; /*emty*/) + { + delete iter->second; + mProcesses.erase(iter++); + } + return true; +} + +int Pmc::launch(const cmdLine_t& cmdLine, const int& /*options*/) +{ + JELOG4(EJavaCaptain, EInfo); + int cmdLineSize = cmdLine.size(); + if (cmdLineSize > 0) + { + std::auto_ptr runtimeProcess(stringToDes(cmdLine[0].c_str())); + + std::ostringstream params; + for (unsigned int i = 1 ; i < cmdLineSize ; i++) + { + params << cmdLine[i] << " "; + } + std::auto_ptr runtimeArgs(stringToDes(params.str().c_str())); + ILOG2(EJavaCaptain, "launch command line: %s : %s", + cmdLine[0].c_str(), params.str().c_str()); + + ScopedLock lock(mProcessesMutex); + + processes_t::iterator iter = mProcesses.begin(); + while (iter != mProcesses.end()) + { + if (iter->second->isExited()) + { + delete iter->second; + mProcesses.erase(iter); + iter = mProcesses.begin(); + } + else + { + ++iter; + } + } + + std::auto_ptr rp(new RProcess); + bool prewarm = false; + if (std::find(cmdLine.begin(), cmdLine.end(), java::runtime::PREWARM_ARGUMENT) != cmdLine.end()) + { + prewarm = true; + } + JavaOsLayer::startUpTrace("CAPTAIN: Creating process", -1, -1); + if (KErrNone == rp->Create(TPtr(runtimeProcess->Des()), TPtr(runtimeArgs->Des()))) + { + int pid = rp->Id(); + mProcesses.insert(std::make_pair(pid, new ProcessActive(rp.release(), this, prewarm))); + return pid; + } + } + + return 0; +} + +int Pmc::terminate(const int& pid) +{ + JELOG4(EJavaCaptain, EInfo); + + ScopedLock lock(mProcessesMutex); + processes_t::iterator iter = mProcesses.find(pid); + if (iter != mProcesses.end()) + { + iter->second->Terminate(KErrNone); + } + + return 0; +} + +int Pmc::kill(const int& pid) +{ + JELOG4(EJavaCaptain, EInfo); + + ScopedLock lock(mProcessesMutex); + processes_t::iterator iter = mProcesses.find(pid); + if (iter != mProcesses.end()) + { + iter->second->Kill(KErrNone); + } + + return 0; +} + +void Pmc::handleTerminated(const int& pid, const int& exitCode) +{ + JELOG4(EJavaCaptain, EInfo); + if (mProcessManagementEventsDispatcher) + mProcessManagementEventsDispatcher->pmcTerminated(pid, exitCode); +} + +} // namespace captain +} // namespace java +