diff -r f5050f1da672 -r 04becd199f91 javamanager/javacaptain/src/amc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javamanager/javacaptain/src/amc.h Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,201 @@ +/* +* 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: Amc +* +*/ + +#ifndef AMC_H +#define AMC_H + +#include +#include + +#include "logger.h" +#include "scopedlocks.h" +#include "javauid.h" + +#include "commslistener.h" +#include "commsmessage.h" + + +#include "applicationruntimeeventsinterface.h" +#include "coreinterface.h" +#include "rtcinterface.h" +#include "amcinterface.h" +#include "amcmessages.h" + +using namespace java::comms; +using java::util::Uid; + +namespace java +{ + +namespace captain +{ + +class ApplicationManagementEventsInterface; + +using java::util::ScopedLock; + +class Amc : public AmcInterface, + public ApplicationRuntimeEventsInterface, + public CommsListener +{ +public: + Amc(); + virtual ~Amc(); + + bool start(CoreInterface* aCore, + ApplicationManagementEventsInterface* aAmEventsDispatcher); + bool stop(); + + // ApplicationRuntimeEventsInterface + virtual void arLaunched(const Uid& aUID, const int& aRuntimeCommsAddress); + virtual void arTerminated(const Uid& aUID, const int& aExitCode); + + // CommsListener methods + virtual void processMessage(CommsMessage& aMessage); + +private: + + // Helper functions for request handling + void handleStart(CommsMessage&); + void handleStop(CommsMessage&); + void handleUpdate(CommsMessage&); + + class StopRequest + { + public: + StopRequest(CoreInterface* aCore, const int& aAddress, const int& aModuleId, const int& aMsgRef, + const int& aNumOfUIDS, Uid* aUIDS) + :mCore(aCore), mAddress(aAddress), mModuleId(aModuleId), mMsgRef(aMsgRef) + { + JELOG2(EJavaCaptain); + java::util::ScopedLock lock(mUidsCollectionsMutex); + for (int i = 0 ; igetRtc()->disable(*iter); + if (mCore->getRtc()->terminate(*iter)) + { + // Was not running in the first place can be directly put to stopped list + mUidStatuses.insert(std::make_pair(*iter, 0)); + iter = mUidsToBeStopped.erase(iter); + } + else + { + ++iter; + } + } + + // Was the request fulfilled. + if (!mUidsToBeStopped.size()) + { + notifyRequester(); + return true; + } + + return false; // Nope some requests are still pending. + } + + bool updateStatus(const Uid& aUID, const int& status) + { + JELOG2(EJavaCaptain); + ScopedLock lock(mUidsCollectionsMutex); + + for (uids_t::iterator iter = mUidsToBeStopped.begin() ; + iter != mUidsToBeStopped.end() ; ++iter) + { + if (*iter == aUID) + { + mUidStatuses.insert(std::make_pair(aUID, status)); + mUidsToBeStopped.erase(iter); + break; + } + } + + // Was this the last one ie. the request has been fulfilled. + if (!mUidsToBeStopped.size()) + { + notifyRequester(); + return true; + } + + return false; // Nope some requests are still pending. + } + + void notifyRequester() + { + JELOG2(EJavaCaptain); + CommsMessage message; + message.setReceiver(mAddress); + message.setModuleId(mModuleId); + message.setMessageRef(mMsgRef); + setAmcResponseParamaters(message, mUidStatuses.size()); + + for (uidStatuses_t::iterator iter = mUidStatuses.begin() ; + iter != mUidStatuses.end() ; ++iter) + { + message << iter->first << iter->second; + } + + mCore->getComms()->send(message); + } + + void sendStopNotAllowed(const int& aNumOfUIDS, Uid* aUIDS) + { + JELOG2(EJavaCaptain); + for (int i = 0 ; i uids_t; + uids_t mUidsToBeStopped; + + typedef std::map uidStatuses_t; + uidStatuses_t mUidStatuses; + java::util::ScopedMutex mUidsCollectionsMutex; + + CoreInterface* mCore; + + const int mAddress; + const int mModuleId; + const int mMsgRef; + }; + + CoreInterface* mCore; + ApplicationManagementEventsInterface* mAmEventsDispatcher; + StopRequest* mStopRequest; // only one at a time +}; + +} // namespace captain +} // namespace java + +#endif // AMC_H +