diff -r 000000000000 -r 4e1aa6a622a0 sensorservices/sensorserver/inc/server/sensrvproxymanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sensorservices/sensorserver/inc/server/sensrvproxymanager.h Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,455 @@ +/* +* Copyright (c) 2006-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: Sensor server proxy manager +* +*/ + + +#ifndef SENSRVPROXYMANAGER_H +#define SENSRVPROXYMANAGER_H + +#include +#include +#include "sensrvproxymanager.h" +#include "sensrvtypes.h" +#include "sensrvpluginproxy.h" +#include "sensrvecomchangelistener.h" +#include "sensrvshutdown.h" + +class CSensrvSession; +class CSensrvTransactionQueue; +class CSensrvServer; + + +typedef TPckgBuf TSensrvResourceChannelInfoPckgBuf; + +/** +* Manages proxies and transactions not targeting single channel. +* +* @since S60 5.0 +*/ +class CSensrvProxyManager : public CBase, + public MSensrvEcomChangeObserver + { + public: + + /** + * Two phase constructor + * + * @since S60 5.0 + * @return New CSensrvProxyManager instance + * @param Reference to server main class. + * @exception KErrNoMemory Out of memory + */ + static CSensrvProxyManager* NewL(CSensrvServer& aServer); + + /** + * Destructor. + */ + virtual ~CSensrvProxyManager(); + + /** + * Get pointer to server main thread heap + * + * @since S60 5.0 + * @return Heap pointer + */ + inline RHeap* ServerHeap() {return iHeap;} + + /** + * Get transaction timeout + * + * @since S60 5.0 + * @return Transaction timeout in microseconds + */ + inline TTimeIntervalMicroSeconds32& TransactionTimeout() {return iTransactionTimeout;} + + /** + * Get SSY stack size + * + * @since S60 5.0 + * @return SSY thread stack size in bytes + */ + inline TInt SsyStackSize() {return iSsyStackSize;} + + /** + * Get SSY heap max size + * + * @since S60 5.0 + * @return SSY thread heap max size in bytes + */ + inline TInt SsyHeapMaxSize() {return iSsyHeapMaxSize;} + + /** + * Get thread termination grace period + * + * @since S60 5.0 + * @return Thread termination grace period in microseconds + */ + inline TTimeIntervalMicroSeconds32& ThreadTerminationGracePeriod() {return iThreadTerminationGracePeriod;} + + /** + * Get SSY inactivity period before unloading + * + * @since S60 5.0 + * @return SSY inactivity period in microseconds + */ + inline TTimeIntervalMicroSeconds32& SsyInactivityPeriod() {return iSsyInactivityPeriod;} + + /** + * Get channel data buffer size multiplier. + * + * @since S60 5.0 + * @return Buffer size multiplier + */ + inline TInt BufferSizeMultiplier() {return iBufferSizeMultiplier;} + + /** + * Handles client message. + * Message completion responsibility transfers. + * + * @since S60 5.0 + * @param aMessage The message containing the client request + */ + void DispatchMessage( CSensrvMessage& aMessage ); + + /** + * Generates new unique id (within context of this server instance). + * + * @since S60 5.0 + * @return New unique id. + */ + TInt GenerateUniqueId(); + + /** + * Notifies that a proxy has finished its initialization. + * This triggers wait queue handling. + * + * Note that the notifying proxy might or might not + * have initialized properly. + * + * @since S60 5.0 + */ + void NotifyProxyInitialized(); + + /** + * Duplicates mutex handle to one held by main thread. + * + * @since S60 5.0 + * @param aSrc Source handle + * @param aDst Destination handle + * @return Normal Symbian errors + */ + TInt DuplicateMutexHandle(const RMutex& aSrc, RMutex& aDst) const; + + /** + * Cleans up session related data. + * + * @since S60 5.0 + * @param aSession The session that was deleted + */ + void SessionTerminated( CSensrvSession* aSession ); + + /** + * Shuts server down gracefully. + * + * @since S60 5.0 + * @param aMessage Message related to shutdown. + */ + void ShutdownServer(const RMessage2& aMessage); + + void ShutdownServer(); + + /** + * Notifies that proxy thread has been terminated + * + * @since S60 5.0 + */ + void SsyThreadTerminated(); + + // From MSensrvEcomChangeObserver + + /** + * Called when the ecom has been scanned + * + * @since S60 5.0 + * @param aImplementationInfos Found SSY implementation infos + * The observer is responsible for cleanup of this array, + * if change was not blocked (return ETrue). + * @return EFalse if changing is currently blocked. Try again later. + */ + virtual TBool EcomChanged( RImplInfoPtrArray* aImplementationInfos ); + + /** + * Notifies clients that a change has happened in available channels. + * + * @since S60 5.0 + * @param[in] aChangedChannel Channel information of the channel. + * @param[in] aChangeType If ESensrvChannelAdded, channel is a newly available + * channel. + * If ESensrvChannelRemoved, channel was removed and is + * no longer available. + */ + void NotifyChannelChange(const TSensrvResourceChannelInfo& aChangedChannel, + TSensrvChannelChangeType aChangeType ); + + + void AddSession(); + +#ifdef COMPONENT_TRACE_DEBUG + /** + * Traces a channel info list contents to component trace + */ + void TraceChannelInfoList(const RSensrvResourceChannelInfoList& aInfoList); + + /** + * Traces a channel info list contents to component trace + */ + void TraceChannelInfoList(const RSensrvChannelInfoList& aInfoList); +#endif + + + inline TTimeIntervalMicroSeconds32& TerminationPeriod() {return iTerminationPeriod;} + + /** + * Loads the dynamic channel SSYs that matches to given query if not already loaded. + * + * @since S60 5.0 + * @param[in] aQueryInfo Channel query info + * @param[in] aMessage Message from client for capability checking + * @param[in] aAddChannelChangeListener Updates the listener reference count if ETrue + * @return ETrue if loading of any required SSY is pending. Otherwise EFalse. + */ + TBool LoadDynamicChannelSsysIfNeeded(const TSensrvResourceChannelInfo& aQueryInfo, + const RMessage2& aQueryMessage, + TBool aAddChannelChangeListener); + + /** + * Removes channel change listener from the matching dynamic channel SSYs to allow unloading. + * + * @since S60 5.0 + * @param[in] aQueryInfo Channel query info + * @param[in] aMessage Message from client for capability checking + */ + void RemoveChannelChangeListenerFromDynamicChannelSsys(const TSensrvResourceChannelInfo& aQueryInfo, + const RMessage2& aQueryMessage); + + + private: // Member functions + + /** + * C++ constructor + */ + CSensrvProxyManager(CSensrvServer& aServer); + + /** + * Second phase of construction. + */ + void ConstructL(); + + /** + * Handles waiting transactions. + * + * @since S60 5.0 + */ + void HandleTransactionsQueryChannels(); + + void HandleTransactionsOpenChannel(); + + /** + * Requests info about channels asynchronously. + * Any errors are indicated in message completion code. + * + * @since S60 5.0 + * @param aMessage The message related to this request. Ownership passed here. + */ + void QueryChannels(CSensrvMessage& aMessage); + + void OpenChannel(CSensrvMessage& aMessage); + + /** + * Gets the proxy that handles the specified channel. + * + * @since S60 5.0 + * @param aChannelId The channel id of desired channel. + * @return Pointer to the proxy handling the specified channel or NULL if not found. + */ + CSensrvPluginProxy* GetProxyForChannel(TSensrvChannelId aChannelId) const; + + /** + * Fetches configurable settings from cenrep and + * stores them in member variables. + * + * @since S60 5.0 + */ + void GetSettings(); + + /** + * Adds proxy to proxy list + * + * @since S60 5.0 + * @param aProxyUid Implementation UID of the proxy to add + * @return Pointer to new proxy or NULL if failed + */ + CSensrvPluginProxy* AddProxy(const TUid& aProxyUid); + + /** + * Callback method for proxy cleaner periodic object. + * Check which proxies are marked for deletion and deletes them if they are + * ready for cleanup. + * + * @since S60 5.0 + * @param aObject Pointer to this + * @return Irrelevant, always zero + */ + static TInt ProxyCleanerCallback( TAny* aObject ); + + + private: + + /** + * Reference to server main class. + * Not own + */ + CSensrvServer& iServer; + + /** + * Holds transactions while all proxies finish initializing. + * Queued transactions are owned by queue. + * Own. + */ + CSensrvTransactionQueue* iWaitQueueQueryChannels; + + /** + * Holds transactions while all proxies finish initializing. + * Queued transactions are owned by queue. + * Own. + */ + CSensrvTransactionQueue* iWaitQueueOpenChannel; + + /** + * Master list or proxies. + * Own proxies contained in array. + */ + RPointerArray iProxyList; + + /** + * Counter used to generate unique ids. + */ + TInt iIdCounter; + + /** + * Critical section to protect access to iIdCounter + */ + RMutex iProxyManagerMutex; + + /** + * Indicates all proxies have been initialized + */ + TBool iAllProxiesInitialized; + + /** + * Server thread handle + */ + RThread iServerThread; + + /** + * Pointer to server main thread heap. + * Not own. + */ + RHeap* iHeap; + + /** + * Transaction timeout for plugin transactions + */ + TTimeIntervalMicroSeconds32 iTransactionTimeout; + + /** + * SSY thread stack size + */ + TInt iSsyStackSize; + + /** + * SSY thread maximum heap size + */ + TInt iSsyHeapMaxSize; + + /** + * Thread termination grace period + */ + TTimeIntervalMicroSeconds32 iThreadTerminationGracePeriod; + + /** + * SSY inactivity period before unloading + */ + TTimeIntervalMicroSeconds32 iSsyInactivityPeriod; + + /** + * Number of SSY threads still active during shutdown. + */ + TInt iShuttingDownCount; + + /** + * Shutting down message. + */ + RMessagePtr2 iShutdownMessage; + + /** + * Buffer size multiplier. + */ + TInt iBufferSizeMultiplier; + + /** + * Implementation info array of SSYs + * Own. + */ + RImplInfoPtrArray* iSsyImplInfoArray; + + /** + * Listener for SSY plugin changes + * Own + */ + CSensrvEcomChangeListener* iEcomChangeListener; + + /** + * Used to delete uninstalled proxies asynchronously + * Own + */ + CPeriodic* iProxyCleaner; + + /** + * Keep track of current sessions + */ + TInt iSessionCounter; + + /** + * A pointer to server shutdown, owned + */ + CSensrvShutdown* iServerShutdown; + + /** + * Automatic server termination grace period + */ + TTimeIntervalMicroSeconds32 iTerminationPeriod; + + /** + * Indicates if automatic server termination has been started. + */ + TBool iShutdown; + + }; + + + +#endif // SENSRVPROXYMANAGER_H