multimediacommsengine/tsrc/testdriver/siptester/src/TTcSIPCommandBase.h
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/testdriver/siptester/src/TTcSIPCommandBase.h	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,592 @@
+/*
+* Copyright (c) 2004 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:  See class definition below.
+*
+*/
+
+#ifndef __TTCSIPCOMMANDBASE_H__
+#define __TTCSIPCOMMANDBASE_H__
+
+// INCLUDES
+#include "TTcCommandBase.h"
+
+#include <sipheaderbase.h>
+#include <_sipcodecdefs.h>
+
+// FORWARD DECLARATIONS
+class CSIPAddress;
+class CSIPClientTransaction;
+class CSIPContactHeader;
+class CSIPDialog;
+class CSIPDialogAssocBase;
+class CSIPExpiresHeader;
+class CSIPFromHeader;
+class CSIPHeaderBase;
+class CSIPInviteDialogAssoc;
+class CSIPManagedProfile;
+class CSIPMessageElements;
+class CSIPProfile;
+class CSIPRefresh;
+class CSIPRegistrationBinding;
+class CSIPRouteHeader;
+class CSIPServerTransaction;
+class CSIPSubscribeDialogAssoc;
+class CSIPToHeader;
+class CSIPURI;
+class CTcSIPConnectionContainer;
+class CTcSIPProfileContainer;
+class CTcSIPContext;
+class CSIPNotifyDialogAssoc;
+class CSIPReferDialogAssoc;
+class CSIPSubscriptionStateHeader;
+class CSIPEventHeader;
+class CSIPReferToHeader;
+class CSIPContentTypeHeader;
+class CUri8;
+
+
+// CLASS DEFINITION
+/**
+ * TTcSIPCommandBase implements the base class for all SIP commands.
+ * It provides common SIP related functionality for
+ * accessing request and creating responses.
+ */
+class TTcSIPCommandBase
+	: public TTcCommandBase
+	{
+	protected:	// Constructors and destructor
+
+		/**
+		 * Constructor.
+		 *
+		 * @param aContext SIP test context
+		 */
+		TTcSIPCommandBase( MTcTestContext& aContext );
+
+	protected: // New methods
+
+		/**
+		 * Finds and extracts a SIP To-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found.
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPToHeader* ExtractToHeaderLC( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP Contact-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPContactHeader* ExtractContactHeaderLC(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP Route-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPRouteHeader* ExtractRouteHeaderLC( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP From-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPFromHeader* ExtractFromHeaderLC( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP Expires-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPExpiresHeader* ExtractExpiresHeaderLC(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP ReferTo-header parameter from 
+		 * the CTRL request. 
+		 * Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPReferToHeader* ExtractReferToHeaderLC( 
+												TBool aIsMandatory = ETrue );
+		
+		/**
+		 * Finds and extracts a SIP Subscriptionstate-header parameter from 
+		 * the CTRL request. 
+		 * Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPSubscriptionStateHeader* ExtractSubStateHeaderLC(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Finds and extracts a SIP Event-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPEventHeader* ExtractEventHeaderLC( TBool aIsMandatory = ETrue );
+
+        
+        /**
+		 * Finds and extracts a SIP ContentType-header parameter from the CTRL
+		 * request. Leaves pointer to cleanup stack if header is found
+		 *
+		 * @param aIsMandatory ETrue if the Header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if
+		 *			   a required Header cannot be found.
+		 */
+		CSIPContentTypeHeader* ExtractContentTypeHeaderLC( TBool aIsMandatory = ETrue );
+		
+		/**
+		 * Extracts any and all headers that are still left in the CTRL
+		 * request (ExtractXXXHeaderLC() functions have removed found
+		 * headers). Creates a SIP message elements object to contain
+		 * the headers (it's created even if there are not headers).
+		 *
+		 * Uses ExtractHeadersAndContentL() with the created elements
+		 * container.
+		 *
+		 * @return SIP message elements object.
+		 */
+		CSIPMessageElements* ExtractHeadersAndContentLC();
+
+		/**
+		 * Extracts any and all headers that are still left in the CTRL
+		 * request (ExtractXXXHeaderLC() functions have removed found
+		 * headers) to an existing message elements container.
+		 *
+		 * Uses also ExtractContentL() to get Content + Content-Type from
+		 * CTRL request.
+		 *
+		 * @param aElements Container to be populated.
+		 */
+		void ExtractHeadersAndContentL( CSIPMessageElements& aElements );
+
+		/**
+		 * Search for a "Refresh" parameter from the CTRL request.
+		 * Create a SIP refresh object if the parameter is found.
+		 * Leaves pointer to cleanup stack if object is created.
+		 *
+		 * @return SIP refresh object or NULL if parameter cannot be found.
+		 */
+		CSIPRefresh* ExtractRefreshLC();
+
+		/**
+		 * Search for a "RemoteURI" parameter from the CTRL request.
+		 * Create a SIP URI object if the parameter is found.
+		 * Leaves pointer to cleanup stack if object is created.
+		 *
+		 * @return SIP URI object or NULL if parameter cannot be found.
+		 * or leave if aIsMandatory is true and parameter cannot be found
+		 */
+		CUri8* ExtractRemoteURILC( TBool aIsMandatory = EFalse );
+
+        /**
+		 * Search for a "Proxy" parameter from the CTRL request.
+		 * Create a SIP RouteHeader object if the parameter is found.
+		 * Leaves pointer to cleanup stack if object is created.
+		 *
+		 * @return SIP RouteHeader object or NULL if parameter cannot be found.
+		 */
+		CSIPRouteHeader* ExtractProxyLC();
+		
+		/**
+		 * Search for a aParamName parameter from the CTRL request.
+		 * Extract the value of a found parameter to a heap descriptor
+		 * and return it.
+		 *
+		 * @param aParamName Parameter name to be searched for
+		 * @return Created heap descriptor or NULL
+		 */
+		HBufC8* ExtractHBufLC( const TDesC8& aParamName );
+
+        /**
+         * Extracts profileId and returns it as a integer
+         *
+         * @return profileId
+         */
+        TInt ExtractProfileIdL();
+        
+        /**
+         * Extracts Uid
+         *
+         * @return uid
+         */
+        TUid ExtractUidL( const TDesC8& aName, TBool aIsMandatory = ETrue  );
+        
+		/**
+		 * Returns the default connection, or a user defined connection
+		 * if a ConnectionId is present in the CTLR request.
+		 *
+		 * @return Reference to a connection container.
+		 */
+		CTcSIPConnectionContainer& SelectConnectionL();
+
+		/**
+		 * Returns the default profile, or a user defined connection
+		 * if a RegistryId is present in the CTLR request.
+		 *
+		 * @return Reference to a profile container.
+		 */
+		CTcSIPProfileContainer& SelectProfileL();
+
+		/**
+		 * Adds a TestClientId item to the CTRL response. Ownership is
+		 * is transferred.
+		 *
+		 * NOTE!! This function uses CleanupStack for safe array insertion.
+		 * You must not call CleanupStack::PushL()/Pop() when calling this!!
+		 *
+		 * @param aName Id name (e.g. "RequestId")
+		 * @param aObject Id of this object is looked up from the registry
+		 *				  and added to the response. aObject is registered
+		 *				  if it's not already in the registry.
+		 */
+		void AddIdResponseL( const TDesC8& aName, const CBase* aObject );
+
+        /**
+		 * Adds a TestClientId item to the CTRL response. Ownership is
+		 * is NOT transferred.
+		 *
+		 * @param aName Id name (e.g. "RequestId")
+		 * @param aObject Id of this object is looked up from the registry
+		 *				  and added to the response. aObject is registered
+		 *				  if it's not already in the registry.
+		 */
+        void AddIdResponseL( const TDesC8& aName, const CBase& aObject );
+        
+		/**
+		 * Adds a ProfileId item to the CTRL response. Ownership is
+		 * is transferred.
+		 *
+		 * @param aProfile Profile Id of this object is looked added
+		 *				   to the response. aProfile is registered
+		 *				   if it's not already in the registry.
+		 */
+		void AddProfileIdResponseL( CSIPProfile* aProfile );
+		
+		/**
+		 * Adds a ProfileId item to the CTRL response. Ownership is
+		 * is NOT transferred.
+		 *
+		 * @param aProfile Profile Id of this object is looked added
+		 *				   to the response. aProfile is registered
+		 *				   if it's not already in the registry.
+		 */
+		void AddProfileIdResponseL( CSIPProfile& aProfile );
+
+		/**
+		 * Try to find an existing TestClientIds structure from the
+		 * CTRL response. Create one if it cannot be found and add
+		 * all possible Id items to it.
+		 *
+		 * @return Reference to the structure parameter containing
+		 *		   pre-created TestClient Ids.
+		 */
+		CTcStructure& FindCreateTestClientIdsL();
+
+		/**
+		 * Searches for a DialogId field from the CTRL request. Fetches the
+		 * associated SIP object from the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPDialog* GetDialogL( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a InviteDialogId or SubscribeDialogId field from
+		 * the CTRL request. Fetches the associated SIP object from
+		 * the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPDialogAssocBase* GetAnyDialogAssocL( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a InviteDialogId field from the CTRL request. Fetches
+		 * the associated SIP object from the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPInviteDialogAssoc* GetInviteDialogAssocL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a SubscribeDialogId field from the CTRL request.
+		 * Fetches the associated SIP object from the test context's object
+		 * registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPSubscribeDialogAssoc* GetSubscribeDialogAssocL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a CSIPNotifyDialogAssoc field from the CTRL request.
+		 * Fetches the associated SIP object from the test context's object
+		 * registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPNotifyDialogAssoc* GetNotifyDialogAssocL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a CSIPReferDialogAssoc field from the CTRL request.
+		 * Fetches the associated SIP object from the test context's object
+		 * registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPReferDialogAssoc* GetReferDialogAssocL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a TransactionId field from the CTRL request. Fetches
+		 * the associated SIP object from the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPClientTransaction* GetClientTransactionL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a ServerTransactionId field from the CTRL request.
+		 * Fetches the associated SIP object from the test context's object
+		 * registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPServerTransaction* GetServerTransactionL(
+												TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a RegistrationId field from the CTRL request. Fetches
+		 * the associated SIP object from the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPRegistrationBinding* GetRegistrationL( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a RefreshId field from the CTRL request. Fetches
+		 * the associated SIP object from the test context's object registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return SIP object, or NULL if aIsMandatory = EFalse
+		 *		   and object id was not found.
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPRefresh* GetRefreshL( TBool aIsMandatory = ETrue );
+
+		/**
+		 * Searches for a ProfileId field from the CTRL request. Fetches
+		 * the associated ManagerProfile object from the test context's managed
+		 * profile registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return reference to Profile object or leaves if profile for wanted
+		 *         id is not found
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPManagedProfile& GetManagedProfileL( CTcSIPProfileContainer& aProfileContainer );
+
+		/**
+		 * Searches for a ProfileId field from the CTRL request. Fetches
+		 * the associated Profile object from the test context's managed
+		 * profile registry.
+		 *
+		 * @return reference to Profile object or leaves if profile for wanted
+		 *         id is not found
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPProfile& GetProfileL( CTcSIPProfileContainer& aProfileContainer );
+		
+		/**
+		 * Searches for a ProfileId field from the CTRL request. Fetches
+		 * the associated Profile object from the test context's managed
+		 * profile registry.
+		 *
+		 * @param aIsMandatory ETrue if the object is required.
+		 * @return pointer to Profile object or NULL
+		 * @exceptions Leaves with KTcErrMandatoryIdNotFound if
+		 *			   a required object or object id cannot be found.
+		 */
+		CSIPProfile* GetProfileL( CTcSIPProfileContainer& aProfileContainer, TBool aIsMandatory );
+
+		/**
+		 * Returns a SIP profile if a ProfileId is present in the CTLR request.
+		 *
+		 * @return pointer to Profile object or NULL, 
+		 *         the ownership is not transferred.
+		 */
+		CSIPProfile* GetProfileL();
+
+
+	private: // New methods
+
+		/**
+		 * Search for a "Content" parameter from the CTRL request.
+		 * Create a SIP content object if the parameter is found and
+		 * pass it to the provided CSIPMessageElements object.
+		 *
+		 * @param aElements Reference to an initialized SIP message elements
+		 *					container. Found content is placed here.
+		 */
+		void ExtractContentL( CSIPMessageElements& aElements );
+
+		/**
+		 * Extracts the named SIP header from the CTRL request parameters.
+		 *
+		 * @param aHeaderName SIP header name (e.g. "To")
+		 * @param aIsMandatory ETrue if the header is required.
+		 * @return SIP header object, or NULL if aIsMandatory = EFalse
+		 *		   and header was not found.
+		 * @exceptions Leaves with KTcErrMandatoryHeaderNotFound if a required
+		 *			   header cannot be found.
+		 */
+		CSIPHeaderBase* ExtractHeaderLC( const TDesC8& aHeaderName,
+										 TBool aIsMandatory );
+
+		/**
+		 * Extracts all user/extension headers from the CTRL request.
+		 * Used by ExtractUserHeadersLC() to do the work.
+		 *
+		 * @param aHeaders Reference to a CTRL request header array
+		 * @param aHeaderArray Reference to a SIP header array
+		 */
+		void ExtractUserHeadersL(
+								CTcArray& aHeaders,
+								RPointerArray< CSIPHeaderBase >& aHeaderArray );
+
+        
+		/**
+		 * Extract the Name field from a SIP header
+		 *
+		 * @param aHeader Complete SIP header (e.g. "To: <sip:jesse@dot.net>"
+		 * @return Pointer descriptor to Name field (e.g. "To")
+		 */
+		TPtrC8 NameFromHeader( const TDesC8& aHeader ) const;
+
+		/**
+		 * Extract the Value field from a SIP header
+		 *
+		 * @param aHeader Complete SIP header (e.g. "To: <sip:jesse@dot.net>"
+		 * @return Pointer descriptor to Value field (e.g. "<sip:jesse@dot.net>")
+		 */
+		TPtrC8 ValueFromHeader( const TDesC8& aHeader ) const;
+
+		/**
+		 * Check if the specified SIP header is allowed to be passed through
+		 * the SIP API.
+		 *
+		 * @param aName Header full name (e.g. "From")
+		 * @return ETrue if header is allowed, EFalse if it is not allowed
+		 *		   (i.e. it is private to the SIP stack)
+		 */
+		TBool IsHeaderAllowed( RStringF aName ) ;
+
+	protected:	// Data
+
+		/// Reference to the SIP test context. Not owned.
+		CTcSIPContext& iContext;
+
+		/// CleanupStack push count
+		TInt iPushed;
+
+	};
+
+#endif // __TTCSIPCOMMANDBASE_H__