diff -r 453dfc402455 -r 0aa8cc770c8a localconnectivityservice/dun/utils/inc/DunTransporter.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/localconnectivityservice/dun/utils/inc/DunTransporter.h Tue Aug 31 16:03:15 2010 +0300 @@ -0,0 +1,800 @@ +/* +* 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