localconnectivityservice/dun/utils/inc/DunChanMan.h
branchRCL_3
changeset 19 0aa8cc770c8a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/localconnectivityservice/dun/utils/inc/DunChanMan.h	Tue Aug 31 16:03:15 2010 +0300
@@ -0,0 +1,407 @@
+/*
+* 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:  RComm channel management related functionality (waiter)
+*
+*/
+
+
+#ifndef C_CDUNCHANMAN_H
+#define C_CDUNCHANMAN_H
+
+#include "DunTransUtils.h"
+#include "DunTransporter.h"
+
+class CDunSignalWaiter;
+class CDunDataWaiter;
+
+/**
+ *  Class for CDunDataWaiter's and CDunSignalWaiter's connection monitoring
+ *  support
+ *  When CDunDataWaiter or CDunSignalWaiter detects activity, data in this
+ *  class is used as helper data to create subsequent calls to
+ *  CDunTransporter::AddConnMonCallbackL
+ *
+ *  @lib dunutils.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( TDunConnMonCallback )
+    {
+
+public:
+
+    /**
+     * Callback to call when notification via MDunConnMon to be made
+     * (CDunTransporter::AddConnMonCallbackL, aCallback parameter)
+     * Not own.
+     */
+    MDunConnMon* iCallback;
+
+    /**
+     * Direction where to add connection monitor
+     * (CDunTransporter::AddConnMonCallbackL, aDirection parameter)
+     */
+    TDunDirection iDirection;
+
+    };
+
+/**
+ *  Class for CDunDataWaiter's and CDunSignalWaiter's connection monitoring
+ *  support
+ *  When CDunConnWaiter or CDunSignalWaiter detects activity, data in this
+ *  class is used as helper data to create subsequent calls to
+ *  CDunTransporter::AddSkippedErrorL
+ *
+ *  @lib dunutils.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( TDunSkippedError )
+    {
+
+public:
+
+    /**
+     * Error code of read/write condition that should be skipped
+     * (CDunTransporter::AddSkippedErrorL, aError parameter)
+     */
+    TInt iError;
+
+    /**
+     * Direction of read/write error condition
+     * (CDunTransporter::AddSkippedErrorL, aDirection parameter)
+     */
+    TDunDirection iDirection;
+
+    };
+
+/**
+ *  Class for CDunDataWaiter's or CDunSignalWaiter's connection monitoring
+ *  support
+ *  When CDunDataWaiter or CDunSignalWaiter detects activity, data in this
+ *  class is used as helper
+ *  data to create subsequent calls to the following APIs
+ *  CDunTransporter::AddConnMonCallbackL
+ *  CDunTransporter::AddSkippedErrorL
+ *
+ *  @lib dunutils.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( TDunWaiterData )
+    {
+
+public:
+
+    /**
+     * RComm object of local media side
+     * Not own.
+     */
+    RComm* iComm;
+
+    /**
+     * Name for the channel
+     */
+    HBufC8* iChannelName;
+
+    /**
+     * Signal waiter object for a channel
+     * Not own.
+     */
+    CDunSignalWaiter* iSignalWaiter;
+
+    /**
+     * Data waiter object for a channel
+     * Not own.
+     */
+    CDunDataWaiter* iDataWaiter;
+
+    /**
+     * Pointer to object implementing buffer correction
+     * Not own.
+     */
+    MDunBufferCorrection* iCorrection;
+
+    /**
+     * Connection monitor raw data that will be added to TDunChannelData array
+     * after activity detected by iDataWaiter or iSignalWaiter
+     */
+    RArray<TDunConnMonCallback> iConnMons;
+
+    /**
+     * Skipped error raw data that will be added to TDunChannelData array
+     * after activity detected by iDataWaiter or iSignalWaiter
+     */
+    RArray<TDunSkippedError> iOkErrors;
+
+    /**
+     * Flag to indicate whether enqueued channel allocation required.
+     * Second option is to use service advertisement API.
+     */
+    TBool iEnqueuedFail;
+
+    /**
+     * UID of plugin that allocated this channel
+     * Used for making notification via MDunPluginManager callback
+     * Added to TDunChannelData array after activity detected by iDataWaiter
+     */
+    TUid iOwnerUid;
+
+    };
+
+/**
+ *  Notification interface class for creating new channel
+ *  Used by CDunDataWaiter ro CDunSignalWaiter to create new channel when
+ *  activity is detected
+ *
+ *  @lib dunutils.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( MDunChannelAllocator )
+    {
+
+public:
+
+    /**
+     * CDunTransporter callback: gets called when waiter wants new channel
+     *
+     * @since S60 3.2
+     * @param aComm Connection where new data exists
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    virtual TInt NotifyNewChannelRequest( RComm* aComm ) = 0;
+
+    };
+
+/**
+ *  Class for RComm channel management related functionality (waiter)
+ *  activity is detected by CDunDataWaiter or CDunSignalWaiter objects
+ *  Also takes care of waiter object creation.
+ *
+ *  @lib dunutils.lib
+ *  @since S60 v3.2
+ */
+NONSHARABLE_CLASS( CDunChanMan ) : public CBase,
+                                   public MDunChannelAllocator
+    {
+
+public:
+
+    /**
+     * Two-phased constructor.
+     * @param aParent Parent class owning this friend class (CDunTransporter)
+     * @param aUtility Pointer to common utility class
+     * @param aUtilityAux Pointer to other than CDunTransporter utility class
+     * @param aPluginManager Callback to call when notification via
+     *                       MDunPluginManager to be made
+     * @return Instance of self
+     */
+	static CDunChanMan* NewL( CDunTransporter& aParent,
+	                          MDunTransporterUtility* aUtility,
+	                          MDunTransporterUtilityAux* aUtilityAux,
+	                          MDunPluginManager* aPluginManager );
+
+    /**
+    * Destructor.
+    */
+    virtual ~CDunChanMan();
+
+    /**
+     * Resets data to initial values
+     *
+     * @since S60 3.2
+     * @return None
+     */
+    void ResetData();
+
+    /**
+     * Number of waiters
+     *
+     * @since S60 3.2
+     * @return Number of waiters
+     */
+    TInt NumberOfWaiters();
+
+    /**
+     * Gets number of waiters by owner UID
+     *
+     * @since S60 5.0
+     * @param aOwnerUid UID of the channel owner
+     * @return Number of waiters
+     */
+    TInt GetNumberOfWaitersByUid( TUid aOwnerUid );
+
+    /**
+     * Adds new connection waiter to connection waiter array
+     *
+     * @since S60 3.2
+     * @param aComm Pointer to opened local media RComm ID object
+     * @param aOwnerUid UID of the channel owner
+     * @param aName Name for the channel
+     * @param aEnqueuedFail ETrue if enqueued failure, EFalse otherwise
+     * @param aCorrection Pointer to object implementing buffer correction
+     * @return None
+     */
+    void AddConnWaiterL( RComm* aComm,
+                         TUid aOwnerUid,
+                         const TDesC8& aName,
+                         TBool aEnqueuedFail,
+                         MDunBufferCorrection* aCorrection );
+
+    /**
+     * Removes existing waiter from connection waiter array
+     *
+     * @since S60 3.2
+     * @param aComm Pointer to opened local media RComm ID object
+     * @return KErrNotFound if waiter not found, KErrNone if removed
+     */
+    TInt RemoveConnWaiter( RComm* aComm );
+
+    /**
+     * Makes CDunDataWaiter and CDunSignalWaiter ready to detect activity
+     *
+     * @since S60 3.2
+     * @param aComm Pointer to opened local media RComm ID object
+     * @return KErrNotFound if waiter not found, KErrNone if request issued
+     */
+    TInt IssueConnWaiterRequest( RComm* aComm );
+
+    /**
+     * Stops CDunDataWaiter and CDunSignalWaiter to detect new data
+     *
+     * @since S60 3.2
+     * @param aComm Pointer to opened local media RComm ID object
+     * @return KErrNotFound if waiter not found, KErrNone if stopped
+     */
+    TInt StopConnWaiter( RComm* aComm );
+
+    /**
+     * Saves waiter's connection monitor callback data
+     *
+     * @since S60 3.2
+     * @param aComm Pointer to opened local media RComm ID object
+     * @param aCallback Pointer to object whose callbacks will be called
+     * @param aDirection Direction of operation to monitor for read/write
+     *                   error
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt SaveWaiterConnMonCallbackL( RComm* aComm,
+                                     MDunConnMon* aCallback,
+                                     TDunDirection aDirection );
+
+    /**
+     * Saves waiter's skipped error data
+     *
+     * @since S60 3.2
+     * @param aError Error code to consider as "no error"
+     * @param aComm Pointer to opened local media RComm ID object
+     * @param aDirection One of four data transfer endpoints where to add a
+     *                   skipped error code
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt SaveWaiterSkippedErrorL( TInt aError,
+                                  RComm* aComm,
+                                  TDunDirection aDirection );
+
+private:
+
+    CDunChanMan( CDunTransporter& aParent,
+                 MDunTransporterUtility* aUtility,
+                 MDunTransporterUtilityAux* aUtilityAux,
+                 MDunPluginManager* aPluginManager );
+
+    void ConstructL();
+
+    /**
+     * Initializes this class
+     *
+     * @since S60 3.2
+     * @return None
+     */
+    void Initialize();
+
+     /**
+      * Fills data for channel created by waiter
+      *
+      * @since S60 3.2
+      * @param aComm Pointer to opened local media RComm ID object
+      * @param aFirstFree Index to first free channel
+      * @return Symbian error code on error, KErrNone otherwise
+      */
+    TInt FillNewWaiterChannelData(RComm* aComm, TInt aFirstFree);
+
+    /**
+     * Restores saved waiter data to connection data
+     *
+     * @since S60 3.2
+     * @param aWaiterIndex Index to waiter data
+     * @param aChannelIndex Index to connection data
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt RestoreWaiterData( TInt aWaiterIndex, TInt aChannelIndex );
+
+    /**
+     * Deletes waiter objects of aIndex:th waiters
+     *
+     * @since S60 3.2
+     * @param aIndex Index of waiters to delete
+     * @param aNewOwnership ETrue if ownership transferred, EFalse otherwise
+     * @return Symbian error code on error, KErrNone otherwise
+     */
+    TInt DeleteWaiters( TInt aIndex, TBool aNewOwnership=EFalse );
+
+// from base class MDunChannelAllocator
+
+    /**
+     * From MDunChannelAllocator.
+     * Notifies when new channel is wanted
+     *
+     * @since S60 3.2
+     * @param aComm Connection where new data exists
+     * @return KErrNone
+     */
+    TInt NotifyNewChannelRequest( RComm* aComm );
+
+private:  // data
+
+    /**
+     * Parent class owning this friend class (CDunTransporter)
+     */
+    CDunTransporter& iParent;
+
+    /**
+     * Pointer to common utility class
+     * Not own.
+     */
+    MDunTransporterUtility* iUtility;
+
+    /**
+     * Pointer to other than CDunTransporter utility class
+     * Not own.
+     */
+    MDunTransporterUtilityAux* iUtilityAux;
+
+    /**
+     * Callback to call when notification via MDunPluginManager to be made
+     * Not own.
+     */
+    MDunPluginManager* iPluginManager;
+
+    /**
+     * Waiter's data that will be added to iChannelData when waiter detects
+     * read activity. After copying to iChannelData the data will be removed
+     * from this array.
+     */
+    RArray<TDunWaiterData> iWaiterData;
+
+    };
+
+#endif  // C_CDUNCHANMAN_H