diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Inc/CSIPRegEventHandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/IMS_Agent/Inc/CSIPRegEventHandler.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,281 @@ +/* +* Copyright (c) 2005-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: +* Name : CSIPRegEventHandler.h +* Part of : SIP Profile Agent +* Interface : +* Version : 1.0 +* +*/ + + + + +/** + @internalComponent +*/ + +#ifndef CSIPREGEVENTHANDLER_H +#define CSIPREGEVENTHANDLER_H + +// INCLUDES +#include +#include +#include +#include "sipregeventsubscriberobserver.h" +#include "sipregeventobserver.h" +#include "sipdialog.h" +#include "sipclienttransaction.h" +#include "sipservertransaction.h" +#include "_sipcodecdefs.h" +#include +// FORWARD DECLARATIONS +class CSIPConnection; +class MSIPRegistrationContext; +class CSIPNotifyXmlBodyParser; +class CSIPRegEventSubscriber; +class CSIPRegistrationElement; +class CSIPContactElement; + +// CLASS DECLARATION +// +class CSIPRegEventHandler : public CBase, + public MSIPRegEventSubscriberObserver + { + public: // Constructors and destructor + + /** + * Creates a new instance of CSIPRegEventHandler. + * + * @pre aConnection::State() == CSIPConnection::EActive + * @pre aContext.IsContextActive() == ETrue + * + * @param aXMLParser a XML parser for NOTIFY bodies + * @param aLocalIP the local IP address of the related CSIPConnection + * @param aDeltaTimer an object used for ordering timer events + * @param aConnection an active SIP connection + * @param aContext an active context + * @param aUserIdentity a URI received in the topmost + * P-Associated-URI-header in the 200 OK for the registration. + * @param a observer for the network initiated re-/de-registration. + * @return a new instance of CSIPRegEventHandler. + * The ownership is transferred. + */ + static CSIPRegEventHandler* NewL(CSIPNotifyXmlBodyParser& aXMLParser, + const TDesC8& aLocalIP, + CDeltaTimer& aDeltaTimer, + CSIPConnection& aConnection, + MSIPRegistrationContext& aContext, + CUri8& aUserIdentity, + MSIPRegEventObserver& aObserver, + CSipProfileAgentConfigExtension& aConfigExtension); + + /** + * Creates a new instance of CSIPRegEventHandler and + * puts it to CleanupStack. + * + * @pre aConnection::State() == CSIPConnection::EActive + * @pre aContext.IsContextActive() == ETrue + * + * @param aXMLParser a XML parser for NOTIFY bodies + * @param aLocalIP the local IP address of the related CSIPConnection + * @param aDeltaTimer an object used for ordering timer events + * @param aConnection an active SIP connection + * @param aContext an active context + * @param aUserIdentity a URI received in the topmost + * P-Associated-URI-header in the 200 OK for the registration. + * @param a observer for the network initiated re-/de-registration. + * @return a new instance of CSIPRegEventHandler. + * The ownership is transferred. + */ + static CSIPRegEventHandler* NewLC(CSIPNotifyXmlBodyParser& aXMLParser, + const TDesC8& aLocalIP, + CDeltaTimer& aDeltaTimer, + CSIPConnection& aConnection, + MSIPRegistrationContext& aContext, + CUri8& aUserIdentity, + MSIPRegEventObserver& aObserver, + CSipProfileAgentConfigExtension& aConfigExtension); + + /** + * Destructor. + */ + ~CSIPRegEventHandler(); + + public: // New functions + + /** + * Sends the SUBCRIBE for the registration state event to the network. + */ + void SubscribeL(); + + /** + * Refreshes the subscription for the registration state event. + * In other words send an immediate updated SUBSRIBE to the network. + */ + void RefreshL(); + + /** + * Checks whether this handler owns the transaction given. + * + * @param aTransaction the transaction to be checked + * @return ETrue if this handler owns the transaction. Otherwise EFalse. + */ + TBool HasTransaction(const CSIPTransactionBase& aTransaction) const; + + /** + * Checks whether this handler owns the refresh given. + * + * @param aRefresh the refresh to be checked + * @return ETrue if this handler owns the refresh. Otherwise EFalse. + */ + TBool HasRefresh(const CSIPRefresh& aRefresh) const; + + /** + * Checks whether this handler has created the dialog given. + * + * @param aDialog the dialog to be checked + * @return ETrue if this handler owns the dialog. Otherwise EFalse. + */ + TBool HasDialog(const CSIPDialog& aDialog) const; + + /** + * A response has been received from the network. + * In practice this should be a response for + * the SUBSCRIBE that was sent for the registration state event. + * + * @pre HasTransaction(aTransaction) == ETrue + * + * @param aTransaction an existing transaction + */ + void ResponseReceivedL(CSIPClientTransaction& aTransaction); + + /** + * A request within a dialog has been received from the network. + * In practice this should be a NOTIFY for the registration state event. + * + * @pre HasDialog(aDialog) == ETrue + * + * @param aTransaction a new transaction. The ownership is transferred. + * @param aDialog an existing dialog related to the transaction + */ + void RequestReceivedL(CSIPServerTransaction* aTransaction, + CSIPDialog& aDialog); + + /** + * An error has occured related to an existing transaction. + * This can be an error related to a SUBSCRIBE send to network or + * a response sent for a NOTIFY. + * + * @pre HasTransaction(aTransaction) == ETrue + * + * @param aError the error + * @param aTransaction an existing transaction + */ + void ErrorOccured(TInt aError, + CSIPTransactionBase& aTransaction); + + /** + * An error has occured related to an existing transaction. + * In practice this error is related + * to a refreshed SUBSCRIBE send to network. + * + * @pre HasDialog(aDialog) == ETrue + * + * @param aError the error + * @param aDialog an existing dialog + */ + void ErrorOccured(TInt aError, + CSIPDialog& aDialog); + + + public: // From MSIPRegEventSubscriberObserver + + void SubscriptionFailedL(); + + void SubscriptionFailedL(TInt aRetryAfter); + + void RegEventNotSupportedByNetworkL(); + + void ReRegister(); + + void NotifyReceivedL(CSIPRegInfoElement& aNotifyData); + + void TerminatedL(CSIPRegInfoElement& aNotifyData,TInt aRetryAfter); + + public: // A callback for CDeltaTimer + + static TInt ReSubscribeTimerExpired(TAny* aPtr); + + private: // New functions + + void ReSubscribeAfterL(TInt aRetryAfter); + + void ReSubscribeL(); + + void HandleRegInfoL(CSIPRegInfoElement& aElement, + TBool& aTerminated); + + void HandleRegistrationElementL(CSIPRegistrationElement& aElement, + TBool& aTerminated, + TBool& aLocalIPFound); + + TBool AllLocalContactsTerminated(CSIPRegInfoElement& aNotifyData) const; + + TBool HasLocalIP(const CSIPContactElement& aContact) const; + + private: // Second phase constructors + + void ConstructL(const TDesC8& aLocalIP, + CUri8& aUserIdentity, + CSipProfileAgentConfigExtension& aConfigExtension); + + CSIPRegEventHandler(CSIPNotifyXmlBodyParser& aXMLParser, + CDeltaTimer& aDeltaTimer, + CSIPConnection& aConnection, + MSIPRegistrationContext& aContext, + MSIPRegEventObserver& aObserver); + + private: // Data + + CSIPNotifyXmlBodyParser& iXMLParser; + CDeltaTimer& iDeltaTimer; + CSIPConnection& iConnection; + MSIPRegistrationContext& iRegistrationContext; + MSIPRegEventObserver& iObserver; + HBufC8* iLocalIP; + CUri8* iUserId; + CSIPRegEventSubscriber* iSubscriber; + TCallBack iDeltaTimerCallBack; + TDeltaTimerEntry iDeltaTimerEntry; + TUint iRegEventVersion; + TBool iFirstNotifyProcessed; + // String constants + RString iStrFull; + RString iStrActive; + RString iStrShortened; + RString iStrRejected; + RString iStrTerminated; + RString iStrDeactivated; + RString iStrUnregistered; + RString iStrProbation; + RString iStrExpired; + + private: // Unit test + + UNIT_TEST(CSIPRegEventHandlerTest) + UNIT_TEST(CSIPIMSProfileContextTest) + }; + +#endif // CSIPREGEVENTHANDLER_H