--- /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__