diff -r 000000000000 -r c8caa15ef882 simpleengine/siputils/inc/simplesipconnection.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/siputils/inc/simplesipconnection.h Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,655 @@ +/* +* Copyright (c) 2006-2009 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: SIMPLE engine core. +* +*/ + + + + +#ifndef CSimpleSIPConnection_H +#define CSimpleSIPConnection_H + + +// INCLUDES +#include +#include +#include +#include "simplecommon.h" +#include "simplesipconncallback.h" +#include "simplecommon.h" +#include "simplerefreshtimer.h" +#include "simplerequest.h" +#include "simplesettings.h" + +// FORWARD DECLARATIONS +class CSimpleSipProfileObserver; +class CSIPClientTransaction; +class CSimpleRefreshTimer; +class CSIPMessageElements; +class CSIPSubscribeDialogAssoc; +class CSimpleSipConnectionObserver; + +// CLASS DECLARATION + + + +/** + * CSimpleSipConnection + * + * @lib simplesiputils + * @since S60 v3.2 + */ + +class CSimpleSipConnection : public CBase, + public MSIPObserver, + public MSimpleSipConnCallback + { + +public: + + /** + * Subscription types + */ + enum TSimpleSubsType + { + ESubsRegular, + ESubsWinfo, + ESubsList + }; + + /** + * Two-phased constructor. + */ + IMPORT_C static CSimpleSipConnection* NewL(); + + /** + * Destructor. + */ + IMPORT_C virtual ~CSimpleSipConnection(); + + /** + * Dispatch a client request + * + * @since S60 v3.2 + * @param aReq client request + */ + IMPORT_C void DispatchReqL( MSimpleEngineRequest& aReq ); + + /** + * SIP Status accessor + * + * @since S60 v3.2 + * @param aOpId operation id + * @param aRetryAfter SIP header value, OUTPUT + * @return SIP status, 0 if not found + */ + IMPORT_C TUint SIPStatus( TInt aOpId, TInt& aRetryAfter ); + + /** + * SIP connection state accessor + * + * @since S60 v3.2 + * @return SIP state + */ + IMPORT_C TSimpleSipState SIPState(); + + /** + * current SIP Identity accessor + * @return SIP identity + */ + IMPORT_C TPtrC8 CurrentSIPIdentityL(); + + /** + * SIP Subscription-state accessor + * @param aReq corresponding engine's request + * @return subscription-state. + */ + IMPORT_C MSimpleEngineRequest::TSimpleSipSubscriptionState SipSubscriptionState( + MSimpleEngineRequest& aReq ); + + /** + * Set service id + * @param aServiceId new service id + */ + IMPORT_C void SetServiceId( TInt32 aServiceId ); + + /** + * Search the corresponding client request + * + * @since S60 v3.2 + * @param aTrans SIP transaction + * @return request or NULL if request not found + */ + CSimpleRequest* GetRequest( CSIPClientTransaction& aTrans ); + + /** + * Search the corresponding client request + * + * @since S60 v3.2 + * @param aDialog SIP dialog + * @return initial SUBSCRIBE request or NULL if request not found + */ + CSimpleRequest* GetdDialogRequest( const CSIPDialog& aDialog ); + + /** + * Handles publish response. + * This reads SIP-ETAG and resets refresh timer. + * + * @since S60 v3.2 + * @param aMesElems SIP message elements + * @param aReq corresponding engine's request + */ + void HandlePublishRespL( + const CSIPMessageElements& aMesElems, + CSimpleRequest* aReq ); + + /** + * Time to refresh a request + * + * @since S60 v3.2 + * @param aReq request + */ + void StartToRefreshL( CSimpleRequest& aReq ); + + /** + * Time to check expiration + * + * @since S60 v3.2 + * @param aReq request + */ + void StartToCheckExpiryL( CSimpleRequest& aReq ); + + /** + * Handles server request in a dialog + * This resets refresh timer when needed. + * + * @since S60 v3.2 + * @param aMesElems SIP message elements + * @param aReq corresponding engine's request + * @param aMethod SIP method + */ + void HandleDialogRequestL( + const CSIPMessageElements& aMesElems, + CSimpleRequest& aReq, + const TDesC8& aMethod ); + + /** + * Retry publication, with a body when pending data exists. + * + * @since S60 v3.2 + * @param aReq request + * @return error code + */ + TInt DoSendPendingPublish( CSimpleRequest& aReq ); + +// from base class MSIPObserver + + /** + * From MSIPObserver. + * A SIP request has been received from the network. + * This function is called when the SIP request was received using such + * an IAP, for which the application has not created a CSIPConnection + * object. + * + * @since S60 v3.2 + * @pre aTransaction != 0 + * @param aIapId The IapId from which the SIP request was received. + * @param aTransaction contains local address, remote address of a SIP + * message, as well as optional SIP message method, headers and + * body. The ownership is transferred. + */ + void IncomingRequest( TUint32 aIapId, + CSIPServerTransaction* aTransaction ); + + /** + * From MSIPObserver. + * The received SIP request time-outed and it is invalid i.e. cannot be used + * anymore. + * This will be called if the user fails to create a SIP connection and + * does not send an appropriate SIP response. + * + * @since S60 v3.2 + * @param aTransaction The time-outed transaction. + */ + void TimedOut( CSIPServerTransaction& aTransaction ); + +// from base class MSimpleSipConnCallback + + /** + * From MSimpleSipConnCallback. + * Connection state is changed + * + * @since S60 v3.2 + * @param aState new SIP state + */ + void ConnectionStateChange( + TSimpleSipState aState, TInt aSipError ); + + /** + * Handle received message + * + * @since S60 v5.0 + * @param aFrom message received from + * @param aContent message content + * @return error code + */ + TInt HandleReceivedMessage( const TDesC8& aFrom, + const TDesC8& aContent ); + + /** + * Connection method has changed (Roaming). + * + * @since S60 3.2.3 + */ + void ConnectionChanged(); + +protected: + + /** + * C++ default constructor. + */ + CSimpleSipConnection(); + +private: + + void ConstructL(); + + /** + * Search the corresponding client request + * + * @since S60 v3.2 + * @param aTrans SIP transaction + * @return request or NULL if request not found + */ + CSimpleRequest* GetCliRequest( MSimpleEngineRequest& aRequest ); + + /** + * Read static settings and register SIP profile. + * If already registered then uses the current registeration. + * + * @since S60 v3.2 + * @param aReq request + * @leave KErrNotFound if SIP profile is not found + */ + void RegisterL( MSimpleEngineRequest& aReg ); + + /** + * Start to listen to status events + * + * @since S60 v3.2 + * @param aReq request + */ + void ListenStatusL( MSimpleEngineRequest& aReq ); + + /** + * Start publish transaction + * + * @since S60 v3.2 + * @param aReq request + */ + void StartPublishL( MSimpleEngineRequest& aReq ); + + /** + * Request instant message receiving + * + * @since S60 v5.0 + * @param aReq request + */ + void RequestInstantMessageReceivingL( MSimpleEngineRequest& aReq ); + + /** + * Send instant message + * + * @since S60 v5.0 + * @param aReq request + */ + void SendInstantMessageL( MSimpleEngineRequest& aReq ); + + /** + * Update publish + * + * @since S60 v3.2 + * @param aReq request + */ + void ModifyPublishL( MSimpleEngineRequest& aReq ); + + /** + * Stop publish + * + * @since S60 v3.2 + * @param aReq request + */ + void StopPublishL( MSimpleEngineRequest& aReq ); + + /** + * Start subscription + * if aReq expiry time is 0 then it means fetch presence once + * + * @since S60 v3.2 + * @param aReq request + */ + void SubscribeL( MSimpleEngineRequest& aReq ); + + /** + * Start list subscription + * if aReq expiry time is 0 then it means fetch presence once + * + * @since S60 v3.2 + * @param aReq request + */ + void SubscribeListL( MSimpleEngineRequest& aReq ); + + /** + * Start WINFO subscription + * + * @since S60 v3.2 + * @param aReq request + */ + void SubscribeWinfoL( MSimpleEngineRequest& aReq ); + + /** + * Stop subscription + * + * @since S60 v3.2 + * @param aReq request + */ + void StopSubscribeL( MSimpleEngineRequest& aReq ); + + /** + * Delete all pending client requests + * + * @since S60 v3.2 + */ + void DeleteRequests(); + + /** + * Delete all pending specified type of requests. + * + * @since S60 5.0 + * @param aRequestType request type + */ + void DeleteRequests( CSimpleRequest::TSimpleSipReqType aRequestType ); + + /** + * Destroy the request + * + * @since S60 v3.2 + * @param aReq request + */ + void DeleteRequest( MSimpleEngineRequest& aReq ); + + /** + * Destroy the request with a delay + * + * @since S60 v3.2 + * @param aReq request + */ + void DeleteRequestStart( MSimpleEngineRequest& aReq ); + + /** + * Complete all pending register client requests + * + * @since S60 v3.2 + * @param aStatus status + */ + void CompleteRegisterRequests( TInt aStatus ); + + /** + * Complete all open regular client requests + * + * @since S60 v3.2 + * @param aStatus status + */ + void CompleteRegularRequests( TInt aStatus ); + + /** + * Complete status event request + * + * @since S60 v3.2 + */ + void CompleteStatusRequest(); + + /** + * Fill the headers and content for SIP PUBLISH request + * and send the SIP request, + * + * @since S60 v3.2 + * @param aRemoteURI remote request-URI + * @param aExpiry expires time + * @param aContent payload data + * @param aSipIfMatch sip-if-match/ETag SIP header value + * @return SIP transaction + */ + CSIPClientTransaction* DoPublishL( + const TDesC8& aRemoteURI, TInt aExpiry, + const TDesC8& aContent, const TDesC8& aSipIfMatch, + const TDesC8& aContentType ); + + /** + * Send SIP SUBSCRIBE request + * + * @since S60 v3.2 + * @param aRemoteURI remote request-URI + * @param aExpiry expires time + * @param aContent payload data + * @param aSubsDialog subscription dialog, OUT + * @param aRefesh ETrue if subscription is refreshed automatically + * @param aType subscription use case + * @param aAnonymous ETrue if anonymous subscription is wanted + * (should be EFalse always when aType is WINFO subscription) + * @return SIP transaction + */ + CSIPClientTransaction* DoSubscribeL( + const TDesC8& aRemoteURI, + TInt aExpiry, + const TDesC8& aContent, + CSIPSubscribeDialogAssoc*& aSubsDialog, + TBool aRefresh, + TSimpleSubsType aType, + TBool aAnonymous ); + + /** + * Read static settings and register default SIP profile. + * If already registered then uses the current registeration. + * + * @since S60 v3.2 + * @param aReq request + * @leave KErrNotFound if SIP profile is not found + */ + void RegisterDefaultL( MSimpleEngineRequest& aReg ); + + /** + * Read static settings and register a specified SIP profile. + * If already registered then uses the current registeration. + * + * @since S60 v3.2 + * @param aReq request + * @leave KErrNotFound if SIP profile is not found + */ + void RegisterAnyL( MSimpleEngineRequest& aReg ); + + /** + * Set SIP state + * + * @since S60 v3.2 + * @param aState SIP state + */ + void SetSipState( TSimpleSipState aState ); + + /** + * Converts ascii reason string into enum and stores into aR entity + * + * @since S60 v3.2 + * @param aReason reason text + * @param aR request entity + */ + void DoSetResponseReason( + const TDesC8& aReason, CSimpleRequest& aR ); + + /** + * Converts ascii reason string into enum and stores into aR entity + * + * @since S60 v3.2 + * @param aReason reason + * @param aR client request entity + */ + void DoSetResponseReason2( + TInt aReason, MSimpleEngineRequest& aR ); + + /** + * Is the reson code permanent reason + * + * @since S60 v3.2 + * @param aReason error code + * @return TRUE if permanent resason and should not be retried. + */ + TBool IsPermanentReason( TInt aReason ); + + /** + * Increase iCurrentNbrSubs + * + * @since S60 v3.2 + */ + void IncreaseNbrSubs(); + + /** + * Decrease iCurrentNbrSubs + * + * @since S60 v3.2 + */ + void DecreaseNbrSubs(); + + /** + * Refresh or retry to publish + * + * @since S60 v3.2 + * @param aReq request + */ + void DoRefreshPublishL( CSimpleRequest& aReq ); + + /** + * Retry to subscribe + * + * @since S60 v3.2 + * @param aReq request + */ + void DoRefreshSubscribe( CSimpleRequest& aReq ); + + /** + * Create a dialog + * + * @since S60 v3.2 + * @param aReq request + */ + void DoCreateDialogL( CSimpleRequest& aReq ); + + /** + * Handle pending operations after network resume + * + * @since S60 v3.2 + */ + void HandlePendings( ); + + /** + * Update iSipState. + * Recognize if both SIP connection and SIP Profile are active. + * @param aState SIP state + */ + void RecognizeSipState( TSimpleSipState aState ); + + /** + * Handle received message + * + * @since S60 v5.0 + * @param aFrom message received from + * @param aContent message content + * @param aRequest SIMPLE request + * @return error code + */ + void DoHandleReceivedMessageL( const TDesC8& aFrom, + const TDesC8& aContent, CSimpleRequest& aRequest ); + + /** + * Stores ETag to vimpstsettingstore + * + * @since S60 5.0 + */ + void StoreETagL( HBufC8& aTag ); + +private: // Data + + /** + * SIP Engine connection + * Own + */ + CSIP* iSip; + + /** + * SIP connection + * Own + */ + CSIPConnection* iSipConnection; + + /** + * SIP connection observer + * Own + */ + CSimpleSipConnectionObserver* iConnectionObserver; + + /** + * Engine SIP state. + * Active only if both SIP Connection and SIP Profile are active. + */ + TSimpleSipState iSipState; + + /** + * SIP profile observer + * Own + */ + CSimpleSipProfileObserver* iProfileObserver; + + /** + * Queue for client requests + */ + TDblQue iRequestList; + + /** + * Engine settings + */ + TSimpleSettings iSettings; + + /** + * File system + */ + RFs iFs; + + /** + * Current number of subscriptions + */ + TUint iCurrentNbrSubs; + + /** + * Service id of current service + */ + TInt32 iServiceId; + +#ifdef _DEBUG + friend class T_CSimpleSipConnection; +#endif + }; + +#endif + +// End of File