--- /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 <e32base.h>
+#include <ecom/ecom.h>
+#include "sensrvproxymanager.h"
+#include "sensrvtypes.h"
+#include "sensrvpluginproxy.h"
+#include "sensrvecomchangelistener.h"
+#include "sensrvshutdown.h"
+
+class CSensrvSession;
+class CSensrvTransactionQueue;
+class CSensrvServer;
+
+
+typedef TPckgBuf<TSensrvResourceChannelInfo> 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<CSensrvPluginProxy> 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