--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsprocess/commsrootserverconfig/configurator/src/c32start.h Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,302 @@
+// Copyright (c) 2003-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:
+// Defines the reference Comms Configurator
+//
+//
+
+/**
+ @file
+ @internalTechnology
+*/
+
+#if !defined(__C32START_H__)
+#define __C32START_H__
+#include <c32root.h>
+#include "c32cmi.h"
+#include "c32startshared.h"
+#include <e32property.h>
+#include <domainmember.h>
+#include <comms-infras/commsdebugutility.h>
+/** Subsystem name, used for logging.
+*/
+__FLOG_STMT(_LIT8(KSubsys,"C32Start");)
+
+/** Component name, used for logging.
+*/
+__FLOG_STMT(_LIT8(KComponent,"Events");)
+
+/** Name of the application.
+*/
+_LIT(KC32StartName, "C32Start");
+
+/** Name of the Rootserver executable.
+*/
+_LIT(KRootServerExe, "c32exe.exe");
+
+/** Default priority of the Rootserver executeable and
+thus the priority Comms Process.
+*/
+const TProcessPriority KRootServerDefaultPriority=EPriorityHigh;
+
+class CCommsProcessStarter;
+class CBindingRef;
+
+/** Type of module.
+*/
+enum TModuleType {
+ /** A module which can only be at the top end of a hierarchical binding.
+ */
+ EServerModule,
+ /** Standard Comms Provider Module.
+ */
+ EProviderModule
+ };
+
+/** State of module.
+*/
+enum TModuleState {
+ /** The module is not currently loaded.
+ */
+ ENotLoaded,
+ /** The module is currently being loaded by the Rootserver.
+ */
+ ELoading,
+ /** The module has been loaded and is running.
+ */
+ ELoaded,
+ /** The module could not be loaded by the Rootserver.
+ */
+ ELoadFailed
+ /** The module is being currently Unloaded by the root server
+ */
+ ,EUnLoading
+ };
+
+/** State of a binding
+*/
+enum TBindingState {
+ /** The binding is not currently active.
+ */
+ ENotBound,
+ /** The binding is being set up by the Rootserver.
+ */
+ EBinding,
+ /** The binding has been created and is active.
+ */
+ EBound,
+ /** The Rootserver was unable to set up the binding.
+ */
+ EBindFailed
+ /** Either 'end' module of the binding has failed to load, result being binding won't start
+ */
+ ,EBindInComplete
+ };
+
+class CModuleRef : public CActive
+/** An instance of this object represents one module to be-, being- or which is
+loaded by the RootServer. The public inheritance of CActive
+*/
+ {
+public:
+ static CModuleRef* NewLC(RRootServ& aRootServer, CCommsProcessStarter& aCommsProcess, C32CmiData& aCModuleCMIData);
+ ~CModuleRef();
+ const inline TCFGroupNameF& GroupName() const;
+ TModuleState State() const { return iState; }
+ const TCFModuleNameF& Name() const { return static_cast<const TCFModuleNameF&>(iParams.iParams.iName); }
+ TUint32 ScaledStartupState() const { return iScaledStartupState; }
+ TBool SystemCritical() const { return iSystemCritical; }
+ TBool SystemCriticalAfterInit() const {return iSystemCriticalAfterInit;}
+
+ void Load();
+ TBool Resurrect();
+ TBool operator==(const TCFModuleNameF& aModuleName) const;
+ static TInt CompareScaledStartupState(const CModuleRef& aModule1, const CModuleRef& aModule2);
+
+ inline HBufC8* GetIniData() const;
+ inline TBool IsOnDemand() const;
+ inline void SetRMessage(const RMessage2& aMessage);
+ const RMessage2& Message() const { return iRMessage; }
+ void MaybeCompleteMessage(TInt aReturnValue);
+ void UnLoadCpm(const TCFModuleNameF& aModuleName,TRSUnLoadType aType);
+ void CancelUnLoadCpm(const TCFModuleNameF& aModuleName);
+ void CancelLoadCpm(const TCFModuleNameF& aModuleName);
+ void UnBindCpm();
+ inline void IncrementBindings() { ++iNumBindings; }
+ inline void IncrementCompletedBindings() { ++iCompletedBindings; }
+ void UpdateCompletedBinding(TInt aReturnvalue);
+ inline void SetHasBindings() { iHasBinding = ETrue; }
+
+protected:
+ void DoCancel();
+ void RunL();
+
+private:
+ CModuleRef(RRootServ& aRootServer, CCommsProcessStarter& aCommsProcess);
+ void ConstructL(C32CmiData& aCModuleCMIData);
+
+private:
+ RPointerArray<CBindingRef> iBindings;
+ TUint32 iScaledStartupState;
+ TUint iNumBindings;
+ RRootServ& iRootServer;
+ CCommsProcessStarter& iCommsProcess;
+ TModuleState iState;
+ TModuleType iType;
+ HBufC8* iIniData;
+ TRSStartModuleParams iParams;
+ TBool iSystemCritical;
+ TBool iSystemCriticalAfterInit;
+ TConfiguratorModuleParams iConfigParams;
+ RMessage2 iRMessage;
+ TUint iCompletedBindings; // when iNumBindings == iCompletedBindings, Message is completed
+ TBool iHasBinding;
+ };
+
+class CBindingRef : public CActive
+/** An instance of this object represents one binding to be-, being- or which is
+bound by the RootServer.
+*/
+ {
+public:
+ CBindingRef(RRootServ& aRootServer, CCommsProcessStarter& aStartConfigProcess,
+ const TRSBindingInfo& aBinding);
+ ~CBindingRef();
+ inline void SetState(TBindingState aState);
+ void UpdateCompletedBinding(TInt aReturnValue);
+ const TCFSubModuleAddress& FromModule() const;
+ const TCFSubModuleAddress& ToModule() const;
+ TInt BindIfReady();
+protected:
+ void DoCancel();
+ void RunL();
+
+private:
+ CBindingRef();
+ void ConstructL(RRootServ& aRootServer, CCommsProcessStarter& aStartConfigProcess,
+ TRSBindingInfo& aBinding);
+private:
+ RRootServ& iRootServer;
+ CCommsProcessStarter& iStartProcess;
+ TBindingState iState;
+ TRSBindingInfo iBindInfo;
+ };
+
+class CDeathWatcher : public CActive
+/** Observes the death publication and notifies the CommsProcessStarter
+*/
+ {
+public:
+ static CDeathWatcher* NewL(CCommsProcessStarter& aStartConfigProcess);
+ ~CDeathWatcher();
+protected:
+ void DoCancel();
+ void RunL();
+private:
+ CDeathWatcher(CCommsProcessStarter& aStartConfigProcess);
+ void Construct();
+private:
+ CCommsProcessStarter& iStartProcess;
+ RProperty iDeathProperty;
+ };
+
+class CStartupStateObserver : public CDmDomain
+/** Observes the Generic Start-up Architecture state transitions, if the GSA is available. The
+need to cope with its absence prevents the more obvious approach of simply deriving
+CCommsProcessStarter from CDmDomain.
+*/
+ {
+public:
+ static CStartupStateObserver* NewL(CCommsProcessStarter& aStarter);
+ ~CStartupStateObserver();
+protected:
+ void RunL();
+private:
+ CStartupStateObserver(CCommsProcessStarter& aStarter);
+private:
+ CCommsProcessStarter& iStarter;
+ };
+
+ class CRsConfiguratorServer;
+class CCommsProcessStarter : public CBase
+/** The main class orchestrating loading and binding of the Comms Provider
+Modules as specified by the .CMI files.
+*/
+ {
+public:
+ enum TModuleState { ELoadingModule, EListeningforDeath };
+
+ static CCommsProcessStarter* NewLC(RRootServ& aRootServer, RProperty& aProperty);
+ ~CCommsProcessStarter();
+ void ReadConfigAndStartAllL(const TDesC& aCMISuppressions);
+ CModuleRef* GetModule(const TCFModuleNameF& aModule ) const;
+ void NotifyLoadCompletion(CModuleRef& aModule);
+ void NotifyBindCompletion(CBindingRef& aBinding);
+ void NotifySuddenDeath(TInt aDeathCount, TInt aDeathStatus);
+ void NotifyStartupStateChange();
+ TBool ConfigurationComplete() const;
+ TBool InTestMode() const
+ {
+ return iTestMode;
+ }
+ void PrintSummary();
+ void LoadOnDemandModule(CModuleRef& aModule);
+ RPointerArray<CModuleRef>& GetModulesList()
+ {
+ return iModules;
+ }
+ RPointerArray<CBindingRef>& GetBindingList()
+ {
+ return iBindings;
+ }
+protected:
+ TInt UnloadedModuleIdx() const
+ {
+ return iUnloadedModuleIdx;
+ }
+private:
+ CCommsProcessStarter(RRootServ& aRootServer, RProperty& aProperty);
+ TBool SplitInt(TPtrC8 &aDes, TInt& aValue) const;
+ TBool SplitUint(TPtrC8 &aDes, TUint& aValue) const;
+ void ContinueLoading();
+ void Shutdown();
+
+private:
+ TInt iUnloadedModuleIdx;
+ TInt iModulesLoading;
+ TInt iModulesLoaded;
+ RRootServ& iRootServer;
+ RPointerArray<CModuleRef> iModules;
+ RPointerArray<CBindingRef> iBindings;
+ CDeathWatcher* iDeathWatcher;
+ TInt iDeathCount;
+ RProperty& iConfigurationProperty;
+ enum TPublicationLevel { EUnpublished = 0, EPublishedCore, EPublishedComplete };
+ TPublicationLevel iPublicationLevel;
+ // Because of monitoring startup state changes we can come through twice in the "final" state,
+ // but only want one summary dump (avoid deluging the user with apparent ambiguity)
+ __FLOG_STMT(TBool iSummaryAlreadyPrinted; )
+ TUint iBindCount;
+#ifndef SYMBIAN_ZERO_COPY_NETWORKING
+ TInt iInitMBufPoolSize;
+ TInt iMaxMBufPoolSize;
+#endif
+ TBool iTestMode;
+ CStartupStateObserver* iStartupStateObserver;
+ TBool iNeedToAckLastState;
+ TUint32 iScaledStartupState;
+ TBool iFinishedloading;
+ CRsConfiguratorServer* iConfiguratorServer;
+ };
+#include "c32start.inl"
+#endif