sensorservices/sensorserver/inc/server/senserverchannel.h
changeset 0 4e1aa6a622a0
child 21 ccb4f6b3db21
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sensorservices/sensorserver/inc/server/senserverchannel.h	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,670 @@
+/*
+* 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 channel implemetation
+*
+*/
+
+
+#ifndef SENSERVERCHANNEL_H
+#define SENSERVERCHANNEL_H
+
+#include <e32base.h>
+#include "sensrvtypes.h"
+#include "sensrvchannelinfo.h"
+#include "sensrvresourcechannelinfo.h"
+#include "sensrvmessage.h"
+#include "ssypropertyprovider.h"
+#include "ssychanneldataprovider.h"
+#include "sensrvgeneralproperties.h"
+
+class CSensrvTransaction;
+class CSensrvPluginProxy;
+class CSensrvTransactionQueue;
+class CSensrvPropertyQueue;
+class CSensrvChannelListener;
+class CSensrvChannelBuffer;
+class CSensrvConditionEvaluator;
+
+/**
+* Implements channel related handling.
+*
+* @since S60 5.0
+*/
+class CSensrvChannel : public CBase
+    {
+    public:
+
+        /**
+        * Channel state.
+        */
+        enum TSensrvChannelState
+            {
+            EChannelStateClosed,             ///< Channel is closed
+            EChannelStateOpen,               ///< Channel is open to at least one client
+            EChannelStateListening           ///< Channel is listening for data
+            };
+
+        /**
+        * Two phase constructor
+        *
+        * @since S60 5.0
+        * @param aInfo Channel info.
+        * @param aProxy Callback proxy.
+        * @return New CSensrvChannel instance
+        * @exception KErrNoMemory Out of memory
+        */
+		static CSensrvChannel* NewL( const TSensrvResourceChannelInfo& aInfo,
+									 CSensrvPluginProxy& aProxy );
+
+        /**
+        * Destructor.
+        */
+        virtual ~CSensrvChannel();
+
+        /**
+        * Returns the channel id
+        *
+        * @since S60 5.0
+        * @return Channel id.
+        */
+        inline TSensrvChannelId Id() { return iId; };
+
+        /**
+        * Gets channel state.
+        * Called from both threads.
+        *
+        * @since S60 5.0
+        * @return Current channel state
+        */
+        inline TSensrvChannelState State() const { return iState; };
+
+        /**
+        * Gets parent proxy reference.
+        * Called from both threads.
+        *
+        * @since S60 5.0
+        * @return Current channel state
+        */
+        inline CSensrvPluginProxy& Proxy() { return iProxy; };
+
+        /**
+        * Gets data provider pointer.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return Current data provider pointer. Can be NULL.
+        */
+        inline MSsyChannelDataProvider* DataProvider() { return iDataProvider; };
+
+        /**
+        * Gets property provider pointer.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return Current property provider pointer. Can be NULL.
+        */
+        inline MSsyPropertyProvider* PropertyProvider() { return iPropertyProvider; };
+
+        /**
+        * Gets data buffer pointer.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return Data buffer pointer. Can be NULL.
+        */
+        inline CSensrvChannelBuffer* Buffer() { return iChannelBuffer; };
+
+        /**
+        * Gets maximum allowed buffering count.
+        * Called from server thread.
+        *
+        * @since S60 5.0
+        * @return Maximum allowed buffering count
+        */
+        inline TInt MaxBufferingCount() { return iMaxBufferingCount; };
+
+        /**
+        * Gets the persistent ETransTypeMediatorNewDataAvailable transaction.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return ETransTypeMediatorNewDataAvailable transaction
+        */
+        inline CSensrvTransaction* DataAvailableTransaction() const { return iDataAvailableTransaction; };
+
+       /**
+        * Gets the persistent ETransTypeMediatorPropertyChanged transaction.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return ETransTypeMediatorPropertyChanged transaction.
+        */
+        inline CSensrvTransaction* PropertyChangedTransaction() const { return iPropertyChangedTransaction; };
+
+        /**
+        * Gets the persistent ETransTypeMediatorForceBufferFilled transaction.
+        * Called from server thread.
+        *
+        * @since S60 5.0
+        * @return ETransTypeMediatorForceBufferFilled transaction
+        */
+        inline CSensrvTransaction* ForceBufferFilledTransaction() const { return iForceBufferFilledTransaction; };
+
+        /**
+        * Gets the persistent ETransTypeMediatorForceChannelClose transaction.
+        * Called from SSY thread.
+        *
+        * @since S60 5.0
+        * @return ETransTypeMediatorForceChannelClose transaction
+        */
+        inline CSensrvTransaction*  ForceChannelCloseTransaction() const { return iForceChannelCloseTransaction; };
+
+        /**
+        * Gets the listener count.
+        * Called from server thread.
+        *
+        * @since S60 5.0
+        * @return Listener count.
+        */
+        inline TInt ListenerCount() const { return iListenerList.Count(); };
+
+        /**
+        * Gets the data item size
+        * Called from server thread.
+        *
+        * @since S60 5.0
+        * @return Data item size
+        */
+        inline TInt DataItemSize() const { return iChannelInfo.iDataItemSize; };
+
+        /**
+        * Handles client message.
+        * Message completion responsibility transfers.
+        * Called only within server thread.
+        *
+        * @since S60 5.0
+        * @param aMessage The message containing the client request.
+        */
+        void DispatchMessage( CSensrvMessage& aMessage );
+
+        /**
+        * Indicates channel has been opened by SSY
+        * Called from SSY thread only.
+        *
+        * @since S60 5.0
+        * @param aErrorCode Indicates any error that occurred during channel opening.
+        * @param aDataProvider Pointer to channel data provider instance
+        * @param aSensorPropertyProvider Pointer to sensor property provider instance
+        */
+        void ChannelOpened( TInt aErrorCode,
+                            MSsyChannelDataProvider* aDataProvider,
+                            MSsyPropertyProvider* aSensorPropertyProvider );
+
+        /**
+        * Indicates channel has been closed by SSY
+        * Called from SSY thread only.
+        *
+        * @since S60 5.0
+        */
+        void ChannelClosed();
+
+        /**
+        * Store a changed property provided by SSY.
+        * Called from SSY thread only.
+        *
+        * @since S60 5.0
+        * @param aProperty Property that has changed
+        * @param aIgnoreSession Do not store change for this session. Can be NULL.
+        * @return ETrue if property was stored to any listener.
+        */
+        TBool StoreChangedProperty( const TSensrvProperty& aProperty,
+                                    const CSensrvSession* aIgnoreSession );
+
+        /**
+        * Completes transaction after it has been handled by SSY.
+        * Only called from server thread.
+        *
+        * @since S60 5.0
+        * @param aTransaction The transaction to complete
+        */
+        void CompleteTransaction( CSensrvTransaction* aTransaction );
+
+        /**
+        * Cleans up session related data.
+        *
+        * @since S60 5.0
+        * @param aSession The session that was deleted
+        */
+        void SessionTerminated( CSensrvSession* aSession );
+
+        /**
+        * Handles notify failure at SSY
+        *
+        * @since S60 5.0
+        */
+        void HandleSsyNotifyFailure();
+
+        /**
+        * Forces buffer filled at SSY
+        *
+        * @since S60 5.0
+        */
+        void ForceBufferFilled();
+
+        /**
+        * Recalculates buffering count, if there is more than one
+        * client.
+        *
+        * @since S60 5.0
+        * @return The new buffering count. If returned value is zero,
+        *         it means there are no listeners in channel.
+        */
+        TInt RecalculateBufferingCount();
+
+        /**
+        * Creates a new condition evaluator or returns an existing one.
+        *
+        * @since S60 5.0
+        * @return The condition evaluator reference.
+        */
+        CSensrvConditionEvaluator* ConditionEvaluatorL();
+
+        /**
+        * Get clients of this channel. The client identified by aCallerSecureId
+        * is not added to the affected clients list.
+        *
+        * @since S60 5.0
+        * @param[in,out] aAffectedClients On return contains client
+        *                 processes priorities for this channel.
+        * @param[in]     aCallerSecureId Identifies the listener which is filtered away.
+        */
+        void GetAffectedClients( RArray<TInt>& aAffectedClients,
+                                 TSecureId aCallerSecureId );
+
+        /**
+        * Gets listener for session.
+        *
+        * @since S60 5.0
+        * @param aSession Session for which the listener is needed.
+        * @return Listener pointer or NULL if not found.
+        */
+        CSensrvChannelListener* GetListener(CSensrvSession* aSession);
+
+        /**
+        * Takes the property set control.
+        * Required priority checks must be done by client before using this method.
+        *
+        * @since S60 5.0
+        * @param[in] aListener The listener that takes control or NULL if control is freed.
+        */
+        void TakePropertySetControl( CSensrvChannelListener* aListener );
+
+        /**
+        * Gets the listener that has taken the property set control.
+        *
+        * @since S60 5.0
+        * @return The listener that has taken the property set control or NULL if control has not been taken.
+        */
+        inline CSensrvChannelListener* TakenPropertySetControl() const { return iCurrentSetPropertyControl; };
+
+        /**
+        * Gets the highest priority listener and its multiples from this channel.
+        *
+        * @since S60 5.0
+        * @param[out] aHighestPriority Stores the highest priority.
+        * @return Multiples of highest listener priority
+        */
+        TInt GetHighestListenerPriority( TInt& aHighestPriority );
+
+        /**
+        * Gets channel group
+        * Called from server thread.
+        *
+        * @since S60 5.0
+        * @return Channel group.
+        */
+        TSensrvResourceChannelInfo::TSensrvChannelGroup ChannelGroup();
+
+    private:
+
+        /**
+        * C++ constructor
+        *
+        * @since S60 5.0
+        * @param aInfo Channel info.
+        * @param aProxy Callback proxy.
+        */
+        CSensrvChannel(const TSensrvChannelInfo& aInfo,
+                       CSensrvPluginProxy& aProxy);
+
+        /**
+        * 2nd phase of construction
+        *
+        * @since S60 5.0
+        */
+        void ConstructL();
+
+        /**
+        * Handles next transaction in queue.
+        * If first transaction is still executing
+        * or the queue is empty, does nothing.
+        *
+        * @since S60 5.0
+        */
+        void HandleNextTransaction();
+
+        /**
+        * Deletes a listener.
+        *
+        * @since S60 5.0
+        * @param aSession Session for which the listener is deleted.
+        */
+        void DeleteListener(CSensrvSession* aSession);
+
+        /**
+        * Finds a listener by session.
+        *
+        * @since S60 5.0
+        * @param aSession Session for which the listener is found.
+        */
+		CSensrvChannelListener* FindListener( CSensrvSession* aSession );
+
+        /**
+        * Closes the channel to SSY if there are no listeners.
+        *
+        * @since S60 5.0
+        */
+        void CloseIfNeeded();
+
+        /**
+        * Handles start data and condition listening transactions
+        *
+        * @since S60 5.0
+        * @param aTransaction Reference to the transaction.
+        * @return Error code
+        */
+        TInt HandleStartListeningTransaction(CSensrvTransaction& aTransaction);
+
+        /**
+        * Handles stop data and condition listening transactions
+        *
+        * @since S60 5.0
+        * @param aTransaction Reference to the transaction.
+        * @param[out] aSsyTransactionNeeded Returns ETrue if SSY transaction is needed.
+        * @return Error code
+        */
+        TInt HandleStopListeningTransaction(CSensrvTransaction& aTransaction,
+                                            TBool& aSsyTransactionNeeded);
+
+        /**
+        * Gets the highest priority listener and its multiples from all affected channels.
+        *
+        * @since S60 5.0
+        * @param[out] aHighestPriority Stores the highest priority.
+        * @return Multiples of highest listener priority
+        */
+        TInt GetHighestListenerPriorityOfAffectedChannels( TInt& aHighestPriority );
+
+        /**
+        * Updated set property success indication to channel listeners
+        *
+        * @since S60 5.0
+        * @param[in] aChannel Channel to update
+        * @param aHighestOfAffectedChannels Highest priority of affected channels
+        * @param aMultiplesOnAffectedChannels Multiples of highest priority listeners
+        */
+        static void UpdateSetPropertySuccessIndToChannelListeners(
+            CSensrvChannel& aChannel, TInt aHighestOfAffectedChannels, TInt aMultiplesOnAffectedChannels );
+
+        /**
+        * Handles set property success indications on property change
+        *
+        * @since S60 5.0
+        */
+        void HandleSetPropertySuccessIndOnPropertyChange();
+
+        /**
+        * Handles set property success indications on listener creation or deletion
+        *
+        * @since S60 5.0
+        */
+        void HandleSetPropertySuccessIndOnCreateOrDelete();
+
+
+        /**
+        * Handles dependent channels on channel open
+        *
+        * @since S60 5.0
+        */
+		void HandleDependencyOnOpen();
+
+        /**
+        * Handles dependent channels on channel close
+        *
+        * @since S60 5.0
+        */
+		void HandleDependencyOnClose( const TInt& aPriority );
+
+        /**
+        * Sets dependent channel availability
+        *
+        * @since S60 5.0
+        */
+		TInt SetAvailability( TSensrvChannelId aChannelId, TSensrvProperty& aProperty, TSensrvAvailability aValue, const TSecurityInfo& aSecurityInfo );
+
+        /**
+        * Sets dependent channel availability
+        *
+        * @since S60 5.0
+        */
+		TInt SetChannelAvailability( TSensrvChannelId aChannelIdToEnable, TSensrvChannelId aChannelIdToDisable, TSensrvProperty& aProperty );
+
+        /**
+        * Sets dependent channel availability
+        *
+        * @since S60 5.0
+        */
+		TInt SetChannelAvailability( TSensrvChannelId aChannelId, TSensrvProperty& aProperty, TSensrvAvailability aValue );
+
+        /**
+        * Get channel from affected channels list with the lowest priority
+        *
+        * @since S60 5.0
+        */
+		TInt GetLowestChannelPriority( const RSensrvChannelList* aAffectedChannelsList, TSensrvChannelId& aChannelId );
+
+
+        /**
+        * Get channel from affected channels list with the highest priority
+        *
+        * @since S60 5.0
+        */
+		TInt GetHighestChannelPriority( const RSensrvChannelList* aAffectedChannelsList, TSensrvChannelId& aChannelId );
+
+        /**
+        * Gets the affected channel list from SSY
+        *
+        * @since S60 5.0
+        * @return Affected channel list or NULL
+        */
+        RSensrvChannelList* GetAffectedChannels() const;
+
+        /**
+        * Gets the affected channel list from SSY
+        *
+        * @since S60 5.0
+        * @return Affected channel list or NULL
+        */
+        RSensrvChannelList* GetAvailabilityAffectedChannels( TSensrvAvailability aValue ) const;
+
+        /**
+        * Reads channel group
+        *
+        * @since S60 5.0
+        * @return Channel group.
+        */
+        TSensrvResourceChannelInfo::TSensrvChannelGroup ReadChannelGroup();
+
+        /**
+        * Handles channel availability property change
+        *
+        * @since S60 5.0
+        */
+        void HandleAvailabilityChange( const TSensrvProperty& aProperty );
+
+        /**
+        * Handles channel availability property change
+        *
+        * @since S60 5.0
+        */
+		void HandleAvailabilityChange( const TSensrvAvailability& value );
+
+        /**
+        * Handles channel availability property change to unavailabe
+        *
+        * @since S60 5.0
+        */
+		void CSensrvChannel::SetChannelUnavailable( );
+
+        /**
+        * Handles channel availability property change to availabe
+        *
+        * @since S60 5.0
+        */
+		void CSensrvChannel::SetChannelAvailable( );
+
+    private: // Member variables
+
+        /**
+        * Channel identifier of this channel.
+        */
+        TSensrvChannelId iId;
+
+        /**
+        * Transaction queue for transactions targeting this channel.
+        * Own. iChannelQueue owns the queued transactions.
+        */
+        CSensrvTransactionQueue* iChannelQueue;
+
+        /**
+        * Current channel state
+        */
+        TSensrvChannelState iState;
+
+        /**
+        * Callback proxy
+        */
+        CSensrvPluginProxy& iProxy;
+
+        /**
+        * Channel listener array for open clients
+        * Listed listeners are owned.
+        */
+        RPointerArray<CSensrvChannelListener> iListenerList;
+
+        /**
+        * Channel buffer.
+        * Own.
+        */
+        CSensrvChannelBuffer* iChannelBuffer;
+
+        /**
+        * Data provider residing in SSY thread heap.
+        * Can safely be accessed only from SSY thread.
+        * Not Own, owned by SSY.
+        */
+        MSsyChannelDataProvider* iDataProvider;
+
+        /**
+        * Sensor property provider residing in SSY thread heap.
+        * Can safely be accessed only from SSY thread.
+        * Not Own, owned by SSY.
+        */
+        MSsyPropertyProvider* iPropertyProvider;
+
+        /**
+        * Transaction for notifying new data from SSY to Server.
+        * It is stored and reused to both avoid repeatedly
+        * constructing and deleting it and to ensure it always
+        * exists, as the transaction is initiated by SSY.
+        * Own.
+        */
+        CSensrvTransaction* iDataAvailableTransaction;
+
+        /**
+        * Transaction for notifying buffer filled must be forced.
+        * It is stored and reused to avoid repeatedly
+        * constructing and deleting it.
+        * Own.
+        */
+        CSensrvTransaction* iForceBufferFilledTransaction;
+
+        /**
+        * Transaction for notifying channel close must be forced.
+        * It is stored and reused to  ensure it always
+        * exists, as the transaction is initiated by SSY.
+        * Own.
+        */
+        CSensrvTransaction* iForceChannelCloseTransaction;
+
+        /**
+        * Indicates outstanding explicit buffer fill request.
+        */
+        TBool iForcingBufferFilled;
+
+        /**
+        * Indicates maximum buffering count.
+        */
+        TInt iMaxBufferingCount;
+
+        /**
+        * Transaction for notifying property change from SSY to Server
+        * Own.
+        */
+        CSensrvTransaction* iPropertyChangedTransaction;
+
+        /**
+        * Condition evaluator plugin.
+        * Own.
+        */
+        CSensrvConditionEvaluator* iConditionEvaluator;
+
+        /**
+        * Channel info of this channel.
+        */
+        TSensrvResourceChannelInfo iChannelInfo;
+
+        /**
+        * The channel listener that has taken the property set control.
+        * Not own.
+        */
+        CSensrvChannelListener* iCurrentSetPropertyControl;
+
+        /**
+        * Highest listener priority of the channel.
+        */
+        TInt iHighestListenerPriority;
+
+        /**
+        * Multiples of highest listener priority.
+        * If there are no listeners on this channel, value is zero.
+        * If there is single listener with the highest priority, value is one, etc.
+        */
+        TInt iHighestListenerPriorityMultiples;
+
+    };
+
+
+
+#endif // SENSERVERCHANNEL_H