--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Registration/inc/CSIPRegistrationMgr.h Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,381 @@
+/*
+* 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:
+* Name : CSIPRegistrationMgr.h
+* Part of : Registration
+* Version : SIP/5.0
+*
+*/
+
+
+
+
+/**
+ @internalComponent
+*/
+
+#ifndef CSIPREGISTRATIONMGR_H
+#define CSIPREGISTRATIONMGR_H
+
+#include <e32base.h>
+#include <in_sock.h>
+#include "MSipRegistrations.h"
+#include "MSipRegistrationContact.h"
+#include "MConnectionStateObserver.h"
+#include "SipStackServerDefs.h"
+#include "_sipcodecdefs.h"
+
+class CSIPRegistrationBindingStore;
+class CSIPRegistrarStore;
+class CSIPRouteHeader;
+class CSIPFromHeader;
+class CSIPRequest;
+class CSIPContactHeader;
+class CURIContainer;
+class CSIPURI;
+class MTransactionUser;
+class MSipRefreshMgr;
+class MTimerManager;
+class CSIPSec;
+class MSIPSecUser;
+class MSigComp;
+class MSIPTransportMgr;
+class MRegistrationOwner;
+class TSIPTransportParams;
+class MTransactionOwner;
+
+
+/**
+ * This class implements interface functions of Sip Registration subsystem.
+ */
+class CSIPRegistrationMgr : public CBase,
+ public MSipRegistrations,
+ public MSipRegistrationContact,
+ public MConnectionStateObserver
+ {
+public: // Constructors and destructor
+
+ static CSIPRegistrationMgr* NewL(MTransactionUser& aTU,
+ MSipRefreshMgr& aRefreshMgr,
+ MTimerManager& aTimerManager,
+ CSIPSec& aSIPSec,
+ MSigComp& aSigComp,
+ MSIPTransportMgr& aTransportMgr);
+
+ ~CSIPRegistrationMgr();
+
+
+public: // From MSipRegistrations
+
+ TBool CheckRequestURI(CURIContainer& aRequestUri);
+
+ const CSIPRouteHeader* OutboundProxy(TRegistrationId aRegistrationId);
+
+ TBool HasOutboundProxy(TRegistrationId aRegistrationId) const;
+
+ TBool IsOutboundProxy(const CURIContainer& aUri);
+
+ void URIFailed(CURIContainer& aUri);
+
+ TBool IsCacheOutboundProxyIPEanbled(
+ TRegistrationId aRegistrationId) const;
+
+ CSIPRouteHeader& OutboundProxyIPL(
+ TRegistrationId aRegistrationId) const;
+
+public: // From MSipRegistrationContact
+
+ void ContactL(TUint32 aIapId,
+ TRegistrationId aRegistrationId,
+ const CSIPFromToHeaderBase* aFromToHeader,
+ CSIPContactHeader& aContact);
+
+
+public: // From MConnectionStateObserver
+
+ void ConnectionStateChangedL (TUint32 aIapId,
+ CSIPConnection::TState aState);
+
+
+public: // New functions
+
+ /**
+ * Function sends a Register request to registration subsystem.
+ *
+ * @pre aRequest!=0
+ * @pre aRegistrationOwner!=0
+ *
+ * @param aTransactionId; On return contains the id
+ * of the created transaction.
+ * @param aRegistrationId; On return contains the id
+ * of the created registration binding object.
+ * @param aRequest; a sip request. the ownership is transferred.
+ * @param aRemoteTarget; a remote target to be copied to the
+ * registrar if it the registrar does not already exist.
+ * The ownership is NOT transferred.
+ * @param aOwner; the ownership is NOT transferred.
+ * @param aSIPSecUser a user for SIPSec
+ * @param aOutboundProxy; an outbound proxy to be used with the
+ * binding to be created. The ownership is transferred.
+ * If 0 no outbound proxy will be used.
+ * @param aSendWithExpires when set to EFalse REGISTER message is sent
+ * without expires value
+ * @param aCacheOutboundProxyIP when set to ETrue outbiund proxy IP
+ * of REGISTER message is cached in registration context
+ * @param aRefresh; If ETrue, the request will be refreshed.
+ */
+ void RegisterL(TTransactionId& aTransactionId,
+ TRegistrationId& aRegistrationId,
+ CSIPRequest* aRequest,
+ CURIContainer& aRemoteTarget,
+ MRegistrationOwner* aOwner,
+ MSIPSecUser& aSIPSecUser,
+ CSIPRouteHeader* aOutboundProxy=0,
+ TBool aRefresh=EFalse,
+ TBool aSendWithExpires=ETrue,
+ TBool aCacheOutboundProxyIP=EFalse);
+
+ /**
+ * Function sends an update request.
+ * Registration fills To, From, Call-ID and CSeq.
+ * Also Contact will be filled if not present.
+ * If a different CSIPAddress is provided in Contact, leaves
+ * with KErrArgument. Leaves with KErrSIPInvalidRegistrationState
+ * if no registration binding was found.
+ *
+ * @pre aRequest!=0
+ * @param aRegistrationId; the id of the registration binding to be
+ * updated.
+ * @param aTransactionId; an empty transaction id that will
+ * be filled by TU.
+ * @param aRequest; a sip request. The ownership is transferred.
+ * @param aOwner the owner that must match to the original owner
+ */
+ void UpdateRegistrationL(const TRegistrationId& aRegistrationId,
+ TTransactionId& aTransactionId,
+ CSIPRequest* aRequest,
+ const MRegistrationOwner* aOwner);
+
+ /**
+ * Function sends an unregister request.
+ * Registration fills To, From, Contact, Call-ID, CSeq.
+ * Contact-header's expire-parameter is updated to 0 by
+ * registration before added to the request.
+ * Leaves with CSIPClient::ENonExistingRegistrationId if
+ * no registration binding was found.
+ *
+ * @pre aRequest!=0
+ * @param aRegistrationId; the id of the registration binding to be
+ * removed by unregistering.
+ * @param aTransactionId; an empty transaction id that will be
+ * filled by TU.
+ * @param aRequest; a sip request. The ownership is transferred.
+ * No Contact is allowed to be present. Panics if there is.
+ * @param aOwner the owner that must match to the original owner
+ */
+ void UnRegisterL(const TRegistrationId& aRegistrationId,
+ TTransactionId& aTransactionId,
+ CSIPRequest* aRequest,
+ const MRegistrationOwner* aOwner);
+
+ /**
+ * Function sets an outbound proxy for a registration binding.
+ * Leaves if the binding was not found.
+ *
+ * @pre aOutboundProxy != 0
+ * @param aRegistrationId; the id of the registration binding
+ * for which the outbound proxy should be set.
+ * @param aOutboundProxy; an outbound proxy to be used with the
+ * binding to be created. The ownership is transferred.
+ * @param aOwner the owner that must match to the original owner
+ */
+ void SetOutboundProxyL(const TRegistrationId& aRegistrationId,
+ CSIPRouteHeader* aOutboundProxy,
+ const MRegistrationOwner* aOwner);
+
+ /**
+ * Function removes an outbound proxy for a specified registration
+ * binding.
+ *
+ * @param aRegistrationId; the id of the registration binding
+ * from where the outbound proxy should be removed.
+ *
+ * @param aOwner the owner that must match to the original owner
+ *
+ * @return KErrNotFound if the binding
+ * with a given id was not found, otherwise KErrNone.
+ */
+ TInt RemoveOutboundProxy(const TRegistrationId& aRegistrationId,
+ const MRegistrationOwner* aOwner);
+
+ /**
+ * Fetch all the registrations. Leaves on failure.
+ *
+ * @pre aRequest!=0
+ * @pre !aRequest.HasHeader(KContactHeaderFullName)
+ * @pre aRemoteTarget!=0
+ * @pre aTransactionOwner!=0
+ *
+ * @param aTransportParams transport parameters to be used by TU
+ * @param aTransactionId; an empty transaction id that is filled by TU.
+ * @param aRequest; a sip request. the ownership is transferred.
+ * @param aRemoteTarget; The remote target to be used.
+ * @param aTransactionOwner; To be passed as such to TU.
+ * The ownership is NOT transferred.
+ *
+ */
+ void FetchRegistrationsL(const TSIPTransportParams& aTransportParams,
+ TTransactionId& aTransactionId,
+ CSIPRequest* aRequest,
+ CURIContainer& aRemoteTarget,
+ MTransactionOwner* aTransactionOwner);
+
+
+ /**
+ * Copies the POINTERS of the Route-set objects for
+ * the given registration-id to the givena array.
+ * If a Route-set was not found, the function silently returns
+ * without filling anything.
+ *
+ * @param aRegistrationId; the id of the registration
+ * for which the Route-set should be filled.
+ * @param aRouteSet. IN: empty array, OUT: array filled with pointers
+ * to the stored Route-headers.
+ * @param aAddOutboundProxy
+ * If ETrue, add pointer to the outbound proxy as the FIRST entry.
+ * If ETrue and there is no Service-Route but an outbound proxy,
+ * do NOT add anything.
+ * If EFalse ignore outbound proxy, but add Service-Route if any.
+ *
+ */
+ void GetRouteL(const TRegistrationId& aRegistrationId,
+ RPointerArray<CSIPRouteHeader>& aRouteSet,
+ TBool aAddOutboundProxy=EFalse);
+
+ /**
+ * Creates a from header by giving registration Id.
+ *
+ * @param aRegistrationId; a registrationId of existing registration,
+ *
+ * @returns a new From-header instance. The ownership is transferred.
+ */
+ CSIPFromHeader* CreateFromLC(const TRegistrationId& aRegistrationId);
+
+ /**
+ * Delete all the registration bindings related to the registration
+ * owner passed as parameter. Does NOT delete the registration owner.
+ *
+ * @param aOwner; a owner
+ *
+ * @return KErrNone if the owner was found and all related bindings
+ * were detached.
+ */
+ TInt ClearRegistrationOwner(const MRegistrationOwner* aOwner);
+
+ /* Terminates a registration with a given registration id abnormally.
+ * Deletes the binding immediately.
+ *
+ * @param aRegistrationId; a registration Id of an existing registration.
+ *
+ * @param aOwner the owner that must match to the original owner
+ *
+ * @returns KErrNotFound if no registration
+ * with the given id was found, otherwise KErrNone.
+ */
+ TInt TerminateRegistration (const TRegistrationId& aRegistrationId,
+ const MRegistrationOwner* aOwner);
+
+ /**
+ * Gets a pointer to the contact header related
+ * to the registration binding having the given ID
+ *
+ * @param aRegistrationId a ID of a registration binding
+ *
+ * @returns a pointer to a Contact-header if the binding was found.
+ * NULL if the binding was not found
+ * The ownership is not transferred.
+ */
+ const CSIPContactHeader* Contact(const TRegistrationId& aRegistrationId);
+
+ /**
+ * Gets the transport parameters used for a registration binding.
+ *
+ * @param aRegistrationId a ID of a registration binding
+ * @param aTransportParams on return contains the
+ * transport parameters if found
+ *
+ * @returns ETrue if the registration binding was found and
+ * the transport parameters were filled, otherwise EFalse.
+ */
+ TBool FillTransportParams(
+ const TRegistrationId& aRegistrationId,
+ TSIPTransportParams& aTransportParams);
+
+ /**
+ * Gets the MSIPSecUser related to the given registration id.
+ *
+ * @param aRegistrationId the registration id
+ *
+ * @returns the user related to the given registration id if found,
+ * otherwise NULL.
+ */
+ const MSIPSecUser* SIPSecUser(const TRegistrationId& aRegistrationId);
+
+ /**
+ * Gets a MSIPSecUser related to a transaction.
+ *
+ * @param aTransactionId the transaction id
+ *
+ * @return MSIPSecUser related to the given transaction id, if found,
+ * otherwise NULL.
+ */
+ const MSIPSecUser* SIPSecUserForTransaction(
+ const TTransactionId& aTransactionId);
+
+
+private: // New functions
+
+ CSIPRegistrationMgr(MTransactionUser& aTU,
+ MSipRefreshMgr& aRefreshMgr,
+ MTimerManager& aTimerManager,
+ CSIPSec& aSIPSec,
+ MSigComp& aSigComp,
+ MSIPTransportMgr& aTransportMgr);
+
+ void ConstructL();
+
+ void FillHostWithLocalIPL (TUint32 aIapId, CSIPURI& aSipUri);
+
+ static void DetachBinding(TAny* aBinding);
+
+
+private: // Data
+
+ MTransactionUser& iTU;
+ MSipRefreshMgr& iRefreshMgr;
+ MTimerManager& iTimerMgr;
+ CSIPSec& iSIPSec;
+ MSigComp& iSigComp;
+ MSIPTransportMgr& iTransportMgr;
+ CSIPRegistrationBindingStore* iBindingStore;
+ CSIPRegistrarStore* iRegistrarStore;
+
+private: // For testing purposes
+
+ UNIT_TEST(CSIPRegistrationMgrTest)
+ };
+
+#endif // CSIPREGISTRATIONMGR_H
+
+// End of File