diff -r 0aa8cc770c8a -r 4a793f564d72 localconnectivityservice/dun/utils/inc/DunTransporter.h --- a/localconnectivityservice/dun/utils/inc/DunTransporter.h Tue Aug 31 16:03:15 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,800 +0,0 @@ -/* -* 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: Managing abstracted "channels" of network side communication -* -*/ - - -#ifndef C_CDUNTRANSPORTER_H -#define C_CDUNTRANSPORTER_H - -#include -#ifdef PRJ_USE_NETWORK_STUBS -#include -#else -#include -#endif -#include -#include "DunNetDataport.h" - -typedef TAny* TConnId; // supported now: RSocket*, RComm* - -const TInt KDunStreamTypeMask = 0x02; // 10 -const TInt KDunOperationTypeMask = 0x01; // 01 - -enum TDunOperationType - { - EDunOperationTypeUndefined = KErrNotFound, - EDunOperationTypeRead = 0x00, // 00 - EDunOperationTypeWrite = 0x01 // 01 - }; - -enum TDunMediaContext - { - EDunMediaContextUndefined = KErrNotFound, - EDunMediaContextNetwork = 0, - EDunMediaContextLocal - }; - -enum TDunMedia - { - EDunMediaUndefined = KErrNotFound, - EDunMediaNetwork = 0, - EDunMediaRComm, - EDunMediaRSocket - }; - -enum TDunDirection - { - EDunDirectionUndefined = KErrNotFound, - EDunReaderUpstream = 0x00, // 00 - EDunWriterUpstream = 0x01, // 01 - EDunReaderDownstream = 0x02, // 10 - EDunWriterDownstream = 0x03 // 11 - }; - -enum TDunStreamType - { - EDunStreamTypeUndefined = KErrNotFound, - EDunStreamTypeUpstream = 0x00, // 00 - EDunStreamTypeDownstream = 0x02 // 10 - }; - -enum TDunState - { - EDunStateIdle, - EDunStateTransferring, // Transporter state for data tranfer (up/downstream) - EDunStateSignalCopy, // Transporter state for signal copying (RComm) - EDunStateSignalNotify, // Transporter state for signal notifying (RSocket) - EDunStateDataWaiting, // Transporter state for data waiting - EDunStateSignalWaiting, // Transporter state for signal waiting - EDunStateDataPushing, // Transporter state for data pushing (multiplexer) - EDunStateCallListen, // Transporter state for call state listening - EDunStateAtCmdHandling, // ATEXT state for AT command handling - EDunStateAtCmdPushing, // ATEXT state for AT command reply pushing - EDunStateAtCmdEchoing, // ATEXT state for AT command character echoing (text mode) - EDunStateAtUrcHandling, // ATEXT state for URC handling - EDunStateModeListening, // ATEXT state for mode change listening - EDunStateEcomListening, // ATEXT state for ECOM change listening - EDunStateNvramListening, // ATEXT state for NVRAM change listening - EDunStateUiNoting // Transporter state for UI note showing - }; - -enum TDunReasonType - { - EDunReasonTypeSignal, - EDunReasonTypeRW, - EDunReasonTypeRunL - }; - -class CDunChanMan; -class MDunPluginManager; -class MDunTransporterUtility; -class CDunTransUtils; -class CDunConnWaiter; -class TDunWaiterData; -class CDunUpstream; -class CDunDownstream; -class CDunSignalCopy; -class CDunSignalNotify; -class CDunNoteHandler; - -/** - * Class used for reporting connection error's reason and signal changes - * of network side - * Connection error can happen in read/write and RunL error cases - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( TDunConnectionReason ) - { - -public: - - /** - * Reason type of error; either R/W or RunL - * or signal (network side) - * Set in all cases (signal, R/W, RunL) - */ - TDunReasonType iReasonType; - - /** - * Context of media where error occurred: network or local - * Set in all error cases (signal, R/W, RunL) - */ - TDunMediaContext iContext; - - /** - * Signal type of network side - * Set if signal case, 0 otherwise - */ - TUint iSignalType; - - /** - * Is signal high or low of network side - * Set if signal case, 0 otherwise - */ - TBool iSignalHigh; - - /** - * Direction of data transfer - * Set if R/W case, EDunDirectionUndefined otherwise - */ - TDunDirection iDirection; - - /** - * Error code of failure - * Set if R/W or RunL case, KErrNone otherwise - */ - TInt iErrorCode; - - }; - -/** - * Notification interface class to report line status - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( MDunConnMon ) - { - -public: - - /** - * Gets called when line status changes or when any type of error is - * detected - * - * @since S60 3.2 - * @param aConnId Connection ID for callback - * @param aConnReason Reason for progress change - * @return None - */ - virtual void NotifyProgressChangeL( - TConnId aConnId, - TDunConnectionReason aConnReason ) = 0; - - }; - -/** - * Notification interface class to report service advertisement status changes - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( MDunServAdvMon ) - { - -public: - - /** - * Gets called when advertisement status changes to start - * - * @since S60 5.0 - * @param aCreation ETrue if channel creation - * EFalse if channel free - * @return None - */ - virtual void NotifyAdvertisementStart( TBool aCreation ) = 0; - - /** - * Gets called when advertisement status changes to end - * - * @since S60 5.0 - * @return None - */ - virtual void NotifyAdvertisementEnd() = 0; - - }; - -/** - * Notification interface class for buffer correction - * This interface makes possible to change suggested local media buffer size - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( MDunBufferCorrection ) - { - -public: - - /** - * Notifies about request to change local media's buffer size - * - * @since S60 3.2 - * @param aLength Suggested buffer length that will be used if no - * correction done - * @return New (corrected) buffer length - */ - virtual TInt NotifyBufferCorrection( TInt aLength ) = 0; - - }; - -/** - * Class to store data needed for each separate "channel" - * One TDunChannelData data contains objects needed for one channel - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( TDunChannelData ) - { - -public: - - /** - * RComm object of network side - * Not own. - */ - RComm* iNetwork; - - /** - * RComm object of local media side - * If this is set then iSocket is not used - * Not own. - */ - RComm* iComm; - - /** - * RSocket object of local media side - * If this is set then iComm is not used - * Not own. - */ - RSocket* iSocket; - - /** - * Name for the channel - */ - HBufC8* iChannelName; - - /** - * Upstream read/write object - * Reads data from local media and writes to network - * Not own. - */ - CDunUpstream* iUpstreamRW; - - /** - * Downstream read/write object - * Reads data from network and writes to local media - * Not own. - */ - CDunDownstream* iDownstreamRW; - - /** - * Upstream buffer (Local -> Network) - * Not own. - */ - TUint8* iBufferUpstream; - - /** - * Downstream buffer (Local <- Network) - * Not own. - */ - TUint8* iBufferDownstream; - - /** - * Pointer to upstream's buffer (Local -> Network) - * Not own. - */ - TPtr8* iBufferUpPtr; - - /** - * Pointer to downstream's buffer (Local <- Network) - * Not own. - */ - TPtr8* iBufferDownPtr; - - /** - * Upstream signal copy - * If this is set then iSignalNotify is not used - * Not own. - */ - CDunSignalCopy* iUpstreamSignalCopy; - - /** - * Downstream signal copy - * If this is set then iSignalNotify is not used - * Not own. - */ - CDunSignalCopy* iDownstreamSignalCopy; - - /** - * Signal notifier - * If this is set then the following are not used: - * iUpstreamSignalCopy, iDownstreamSignalCopy - * Not own. - */ - CDunSignalNotify* iSignalNotify; - - /** - * Owner's UID - */ - TUid iOwnerUid; - - /** - * Flag that indicates whether this channel is allocated or not - */ - TBool iChannelInUse; - - }; - -/** - * Class to store data needed for each plugin service advertisement - * One TDunChannelData data contains objects needed for one plugin - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( TDunServAdvData ) - { - -public: - - /** - * Owner's UID for which to have the monitor - */ - TUid iOwnerUid; - - /** - * Service advertisement monitor - * Not own. - */ - MDunServAdvMon* iServAdvMon; - - }; - -/** - * Class for managing abstracted "channels" of network side communication - * This is main class to be used by other components - * - * @lib dunutils.lib - * @since S60 v3.2 - */ -NONSHARABLE_CLASS( CDunTransporter ) : public CBase - { - - friend class CDunTransUtils; - friend class CDunChanMan; - -public: - - /** - * Two-phased constructor. - * @param aPluginManager Callback to call when notification via - * MDunPluginManager to be made - * @param aNumOfMaxChannels Number of wanted maximum channels - * (can be omitted with 0) - * @return Instance of self - */ - IMPORT_C static CDunTransporter* NewL( MDunPluginManager* aPluginManager, - TInt aNumOfMaxChannels=0 ); - - /** - * Destructor. - */ - virtual ~CDunTransporter(); - - /** - * Number of allocated channels, is the same number as allocated and active - * (non-waiting) channels - * - * @since S60 3.2 - * @return Number of allocated channels - */ - IMPORT_C TInt NumberOfAllocatedChannels(); - - /** - * Number of waiting channels, is the same number as allocated and inactive - * (waiting) channels - * - * @since S60 3.2 - * @return Number of waiting channels - */ - IMPORT_C TInt NumberOfWaitingChannels(); - - /** - * Gets the number of allocated channels by owner UID, is the same number - * as allocated and active (non-waiting) channels - * - * @since S60 5.0 - * @param aOwnerUid UID of the channel owner - * @return Number of allocated channels by UID - */ - IMPORT_C TInt GetNumberOfAllocatedChannelsByUid( TUid aOwnerUid ); - - /** - * Gets the number of waiting channels by owner UID, is the same number - * as allocated and inactive (waiting) channels - * - * @since S60 5.0 - * @param aOwnerUid UID of the channel owner - * @return Number of waiting channels by UID - */ - IMPORT_C TInt GetNumberOfWaitingChannelsByUid( TUid aOwnerUid ); - - /** - * Service advertisement status - * - * @since S60 5.0 - * @return ETrue if OK to advertise, EFalse otherwise - */ - IMPORT_C TBool AdvertisementStatus(); - - /** - * Creates a channel of communication between local media (aComm) and - * network - * Local media object pointer also works as a connection ID for the - * allocated channel - * - * @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 - */ - IMPORT_C void AllocateChannelL( - RComm* aComm, - TUid aOwnerUid, - const TDesC8& aName, - TBool aEnqueuedFail, - MDunBufferCorrection* aCorrection=NULL ); - - /** - * Creates a channel of communication between local media (aSocket) and - * network - * Local media object pointer also works as a connection ID for the - * allocated channel - * - * @since S60 3.2 - * @param aSocket Pointer to opened local media RSocket ID object - * @param aOwnerUid UID of the channel owner - * @param aName Name for the channel - * @param aEnqueuedFail ETrue if enqueued failure, EFalse otherwise - * @param aNoFreeChans ETrue if no free channels, EFalse otherwise - * @return None - */ - IMPORT_C void AllocateChannelL( - RSocket* aSocket, - TUid aOwnerUid, - const TDesC8& aName, - TBool aEnqueuedFail, - TBool& aNoFreeChans ); - - /** - * Frees an allocated channel by local media (aComm) connection ID - * - * @since S60 3.2 - * @param aComm Pointer to opened local media RComm ID object - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt FreeChannel( RComm* aComm ); - - /** - * Frees an allocated channel by local media (aSocket) connection ID - * - * @since S60 3.2 - * @param aSocket Pointer to opened local media RSocket ID object - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt FreeChannel( RSocket* aSocket ); - - /** - * Issues transfer requests for all transfer objects by local media - * (aComm) connection ID - * This will cause the Transporter by be ready for transferring data - * - * @since S60 3.2 - * @param aComm Pointer to opened local media RComm ID object - * @return None - */ - IMPORT_C void IssueTransferRequestsL( RComm* aComm ); - - /** - * Issues transfer requests for all transfer objects by local media - * (aSocket) connection ID - * This will cause the Transporter by be ready for transferring data - * - * @since S60 3.2 - * @param aSocket Pointer to opened local media RSocket ID object - * @return None - */ - IMPORT_C void IssueTransferRequestsL( RSocket* aSocket ); - - /** - * Stops transfers for all transfer objects by local media (aComm) - * connection ID - * - * @since S60 3.2 - * @param aComm Pointer to opened local media RComm ID object - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt StopTransfers( RComm* aComm ); - - /** - * Stops transfers for all transfer objects by local media (aSocket) - * connection ID - * - * @since S60 3.2 - * @param aSocket Pointer to opened local media RSocket ID object - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt StopTransfers( RSocket* aSocket ); - - /** - * Adds connection monitor callback for either local media or network side - * by connection ID - * Callbacks will be called read/write error is detected during endpoint - * operation - * - * @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 - * @param aSignal ETrue if also signal notification wanted from network side - * @return None - */ - IMPORT_C void AddConnMonCallbackL( RComm* aComm, - MDunConnMon* aCallback, - TDunDirection aDirection, - TBool aSignal ); - - /** - * Adds connection monitor callback for either local media or network side - * by connection ID - * Callbacks will be called when line status switches to high or low - * - * @since S60 3.2 - * @param aSocket Pointer to opened local media RSocket ID object - * @param aCallback Pointer to object whose callbacks will be called - * @param aDirection Direction of operation to monitor for read/write error - * @param aSignal ETrue if also signal notification wanted from network side - * @return None - */ - IMPORT_C void AddConnMonCallbackL( RSocket* aSocket, - MDunConnMon* aCallback, - TDunDirection aDirection, - TBool aSignal ); - - /** - * Adds error to consider as no error condition when doing any of the four - * endpoint's read/writer operation - * - * @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 None - */ - IMPORT_C void AddSkippedErrorL( TInt aError, - RComm* aComm, - TDunDirection aDirection ); - - /** - * Adds error to consider as no error condition when doing any of the four - * endpoint's read/writer operation - * - * @since S60 3.2 - * @param aError Error code to consider as "no error" - * @param aSocket Pointer to opened local media RSocket ID object - * @param aDirection One of four data transfer endpoints where to add a - * skipped error code - * @return None - */ - IMPORT_C void AddSkippedErrorL( TInt aError, - RSocket* aSocket, - TDunDirection aDirection ); - - /** - * Sets service advertisement monitor callback by owner UID - * Callbacks will be called when advertisement status changes. - * The callbacks are updated with every successfully completed - * channel allocation/free (and allocation failure) so it is recommended - * to call this method after AllocateChannelL(). - * - * @since S60 5.0 - * @param aOwnerUid Owner's UID for which to have the monitor - * @param aCallback Pointer to object whose callbacks will be called - * @return None - */ - IMPORT_C void SetAdvertisementMonitorL( TUid aOwnerUid, - MDunServAdvMon* aCallback ); - - /** - * Frees service advertisement monitor callback by owner UID - * - * @since S60 5.0 - * @param aOwnerUid Owner's UID for which to have the monitor - * @param aCallback Pointer to object whose callbacks will be called - * @return Symbian error code on error, KErrNone otherwise - */ - IMPORT_C TInt FreeAdvertisementMonitor( TUid aOwnerUid, - MDunServAdvMon* aCallback ); - -private: - - CDunTransporter( MDunPluginManager* aPluginManager, - TInt aNumOfMaxChannels ); - - void ConstructL(); - - /** - * Initializes the transporter, must be called as the first operation - * - * @since S60 3.2 - * @return KErrAlreadyExists = already initialized, - * KErrGeneral = network initialization failed, - * KErrNone otherwise - */ - TInt InitializeL(); - - /** - * UnInitializes the transporter, can be called as the last operation - * - * @since S60 3.2 - * @return None - */ - void UnInitialize(); - - /** - * Initialize the transporter - * - * @since S60 3.2 - * @return Symbian error code on error, KErrNone otherwise - */ - TInt InitializeOnDemand(); - - /** - * UnInitialize the transporter - * - * @since S60 3.2 - * @return Symbian error code on error, KErrNone otherwise - */ - TInt UnInitializeOnDemand(); - - /** - * Returns index of media for connection ID - * - * @since S60 3.2 - * @param aConnId Connection ID for media - * @param aMediaContext Context of media to search for; either local or - * network - * @return Symbian error code on error, found index otherwise - */ - TInt GetMediaIndex( TConnId aConnId, - TDunMediaContext aMediaContext=EDunMediaContextLocal ); - - /** - * Returns index of media for connection ID - * - * @since S60 3.2 - * @param aConnId Connection ID for media - * @param aMediaContext Context of media to search for; either local or - * network - * @return Found index - */ - TInt GetMediaIndexL( TConnId aConnId, - TDunMediaContext aMediaContext=EDunMediaContextLocal ); - - /** - * Checks initialization and RSubSessionBase() handle - * - * @since S60 3.2 - * @param aConnId Connection ID for media - * @return KErrNotReady if not initialized, KErrBadHandle if no handle - */ - TInt CheckInitAndHandle( TConnId aConnId ); - - /** - * Deletes own internal data - * - * @since S60 3.2 - * @return None - */ - void DeleteTransporter(); - -private: // data - - /** - * Pointer to common utility class - * Own. - */ - MDunTransporterUtility* iUtility; - - /** - * Pointer to RComm channel manager class - * Own. - */ - CDunChanMan* iChanMan; - - /** - * Pointer to note handler class - * Own. - */ - CDunNoteHandler* iNoteHandler; - - /** - * Array of abstractions of each "channel" - * One TDunChannelData entry contains objects needed for one channel - */ - RArray iChannelData; - - /** - * Array of service advertisement data for each plugin - * One TDunServAdvData entry contains objects needed for one plugin - */ - RArray iServAdvData; - - /** - * Callback to call when notification via MDunPluginManager to be made - * Not own. - */ - MDunPluginManager* iPluginManager; - - /** - * Number of channels that are active - * Used for updating KPSUidDialupConnStatus Pub&Sub key - */ - TInt iActiveChannels; - - /** - * Number of wanted maximum channels (can be omitted with 0) - * Used for initialization of this class - */ - TInt iNumOfMaxChannels; - - /** - * Indicates whether this class is initialized or not - */ - TBool iInitialized; - - /** - * Indicates whether or not it is OK to advertise services - */ - TBool iAdvertise; - - /** - * Instance of network side abstraction - * Own. - */ - CDunNetDataport* iNetwork; - - }; - -#endif // C_CDUNTRANSPORTER_H