diff -r f5050f1da672 -r 04becd199f91 javamanager/javacaptain/inc.s60/pmc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javacaptain/inc.s60/pmc.h Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,172 @@ +/* +* 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 +* +*/ + +#ifndef PMC_H +#define PMC_H + +#include +#include + +#include + +#include + + +#include "javaoslayer.h" +#include "logger.h" +#include "scopedlocks.h" + +#include "pmcinterface.h" + +using namespace java::util; + +namespace java +{ + +namespace captain +{ +class CoreInterface; +class ProcessManagementEventsInterface; + +class ProcessEvents +{ +public: + virtual ~ProcessEvents() {} + virtual void handleTerminated(const int& pid, const int& exitCode) = 0; +}; + +class Pmc : public PmcInterface, + public ProcessEvents +{ +public: + Pmc(); + virtual ~Pmc(); + + bool start(CoreInterface* aCore, + ProcessManagementEventsInterface* aProcessManagementEventsDispatcher); + bool stop(); + + // PmcInterface + virtual int launch(const cmdLine_t& cmdLine, const int& options); + virtual int terminate(const int& pid); + virtual int kill(const int& pid); + + // ProcessEvents + virtual void handleTerminated(const int& pid, const int& exitCode); + +protected: + + class ProcessActive : public CActive + { + ProcessActive(); // cannot be used + public: + ProcessActive(RProcess* aProcess, ProcessEvents* aEvents, bool aPrewarm) + :CActive(EPriorityStandard), mRProcess(aProcess), mEvents(aEvents), mExited(false) + { + JELOG4(EJavaCaptain, EInfo); + CActiveScheduler::Add(this); + mRProcess->Logon(iStatus); + SetActive(); + JavaOsLayer::startUpTrace("CAPTAIN: Process resume", -1, -1); + if (aPrewarm) + { + // Can't use EPriorityLow, because the compiler takes wrong + // enum from CActive. + mRProcess->SetPriority(/*EPriorityLow*/ (TProcessPriority)150); + } + mRProcess->Resume(); + } + virtual ~ProcessActive() + { + JELOG4(EJavaCaptain, EInfo); + Cancel(); + if (!mExited) + { + mRProcess->Close(); + delete mRProcess; + } + } + + virtual void RunL() + { + JELOG4(EJavaCaptain, EInfo); + mEvents->handleTerminated(mRProcess->Id(), mRProcess->ExitReason()); + mRProcess->Close(); + delete mRProcess; + mExited = true; + } + virtual void DoCancel() + { + JELOG4(EJavaCaptain, EInfo); + mRProcess->LogonCancel(iStatus); + } + + virtual bool isExited() const + { + JELOG4(EJavaCaptain, EInfo); + return mExited; + } + virtual void Terminate(const int& reason) + { + JELOG4(EJavaCaptain, EInfo); + if (!mExited) + { + mRProcess->Terminate(reason); + showErrorNote(); + } + } + virtual void Kill(const int& reason) + { + JELOG4(EJavaCaptain, EInfo); + if (!mExited) + { + mRProcess->Kill(reason); + showErrorNote(); + } + } + + private: + void showErrorNote() + { + LOG(EJavaCaptain, EInfo, "Process failed to exit gracefully"); +#ifdef RD_JAVA_EXIT_ERROR_DIALOG + //Print the dialog showing that force process kill was done. + CAknGlobalNote* globalNote = CAknGlobalNote::NewL(); + globalNote->ShowNoteL(EAknGlobalErrorNote, + _L("Midp process failed to exit gracefully.")); + delete globalNote; +#endif + } + + private: + RProcess* mRProcess; + ProcessEvents* mEvents; + bool mExited; + }; + + CoreInterface* mCore; + ProcessManagementEventsInterface* mProcessManagementEventsDispatcher; + + typedef std::map processes_t; + processes_t mProcesses; + java::util::ScopedMutex mProcessesMutex; +}; + +} // namespace captain +} // namespace java + +#endif // PMC_H