williamr@2: /* williamr@2: * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: * All rights reserved. williamr@2: * This component and the accompanying materials are made available williamr@4: * under the terms of "Eclipse Public License v1.0" williamr@2: * which accompanies this distribution, and is available williamr@4: * at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: * williamr@2: * Initial Contributors: williamr@2: * Nokia Corporation - initial contribution. williamr@2: * williamr@2: * Contributors: williamr@2: * williamr@2: * Description: williamr@2: * Name : siptransactionbase.h williamr@2: * Part of : SIP Client williamr@2: * Interface : SDK API, SIP Client API williamr@2: * Version : 1.0 williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: williamr@2: #ifndef CSIPTRANSACTIONBASE_H williamr@2: #define CSIPTRANSACTIONBASE_H williamr@2: williamr@2: // INCLUDES williamr@2: #include williamr@2: #include williamr@2: williamr@2: // FORWARD DECLARATIONS williamr@2: class CSIPResponseElements; williamr@2: class MTransactionAssociation; williamr@2: williamr@2: // CLASS DECLARATION williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * williamr@2: * Base class for managing SIP transactions. williamr@2: * It provides services for querying transaction type and its state. williamr@2: * williamr@2: * This class is an abstract class and cannot be instantiated. williamr@2: * @lib sipclient williamr@2: */ williamr@2: class CSIPTransactionBase: public CBase williamr@2: { williamr@2: public: williamr@2: /** SIP transaction state */ williamr@2: enum TState williamr@2: { williamr@2: /** Trying state */ williamr@2: ETrying, williamr@2: /** Calling state */ williamr@2: ECalling, williamr@2: /** Proceeding state */ williamr@2: EProceeding, williamr@2: /** Completed state */ williamr@2: ECompleted, williamr@2: /** Confirmed state */ williamr@2: EConfirmed, williamr@2: /** Terminated state */ williamr@2: ETerminated, williamr@2: /** Object is being constructed and is not yet ready for use */ williamr@2: EConstructing williamr@2: }; williamr@2: williamr@2: public: // Destructor williamr@2: /** williamr@2: * Destructor williamr@2: * @internalComponent williamr@2: */ williamr@2: virtual ~CSIPTransactionBase(); williamr@2: williamr@2: public: // New functions williamr@2: /** williamr@2: * Gets the SIP transaction type williamr@2: * @return SIP transaction type williamr@2: */ williamr@2: IMPORT_C RStringF Type() const; williamr@2: williamr@2: /** williamr@2: * Gets SIP transaction state williamr@2: * @return SIP transaction state williamr@2: * @leave KErrSIPResourceNotAvailable if a required SIP Client API williamr@2: * object has been deleted williamr@2: */ williamr@2: IMPORT_C CSIPTransactionBase::TState StateL(); williamr@2: williamr@2: /** williamr@2: * Checks the if the actual object williamr@2: * is of type CSIPClientTransaction. williamr@2: * @return ETrue if object is of type CSIPClientTransaction and williamr@2: * EFalse otherwise williamr@2: */ williamr@2: IMPORT_C TBool IsSIPClientTransaction() const; williamr@2: williamr@2: /** williamr@2: * Compares this object to another object also having williamr@2: * CSIPTransactionBase base class williamr@2: * The function has to be implemented in each of the sub-classes. williamr@2: * @param aTransaction a CSIPTransactionBase object to compare williamr@2: * @return ETrue if the objects are equal otherwise EFalse williamr@2: */ williamr@2: IMPORT_C TBool williamr@2: operator==(const CSIPTransactionBase& aTransaction) const; williamr@2: williamr@2: public: // New functions, for internal use williamr@2: /** williamr@2: * Obtains the RequestId of the transaction. williamr@2: * williamr@2: * @return RequestId williamr@2: */ williamr@2: TUint32 RequestId() const; williamr@2: williamr@2: /** williamr@2: * Clears the MTransactionAssociation. After this the object can't be williamr@2: * used anymore and it is expected that user will delete it soon. williamr@2: * williamr@2: * @param aAssociation Object requesting the detach williamr@2: * @internalComponent williamr@2: */ williamr@2: virtual void Detach(const MTransactionAssociation& aAssociation); williamr@2: williamr@2: /** williamr@2: * Changes the transaction state. williamr@2: * williamr@2: * @param aNextState State into which transaction moves williamr@2: */ williamr@2: void ChangeState(CSIPTransactionBase::TState aNextState); williamr@2: williamr@2: /** williamr@2: * Determines whether this transaction has an effect on the associated williamr@2: * dialog's state. williamr@2: * williamr@2: * @return ETrue if transaction has an effect on the dialog's state, williamr@2: * EFalse otherwise. williamr@2: */ williamr@2: TBool AffectsDialogState() const; williamr@2: williamr@2: /** williamr@2: * Sets this transaction to affect the dialog state. williamr@2: */ williamr@2: void SetAffectsDialogState(); williamr@2: williamr@2: /** williamr@2: * Determines whether the transaction type is a target refresh request. williamr@2: * williamr@2: * @param aType Type of transaction williamr@2: * @return ETrue If the transaction is a target refresh request, EFalse williamr@2: * otherwise. williamr@2: */ williamr@2: static TBool IsTargetRefresh(RStringF aType); williamr@2: williamr@2: /** williamr@2: * Stores response elements. Depending on the status code, transaction williamr@2: * may enter another state. williamr@2: * williamr@2: * @param aElements Response elements, ownership is transferred. williamr@2: */ williamr@2: void SetResponseElements(CSIPResponseElements* aElements); williamr@2: williamr@2: protected: // Constructors williamr@2: CSIPTransactionBase(TBool aIsClientTransaction, williamr@2: TUint32 aRequestId, williamr@2: MTransactionAssociation& aAssociation); williamr@2: williamr@2: void ConstructL(RStringF aType); williamr@2: williamr@2: protected: // New functions, for internal use williamr@2: /** williamr@2: * Checks that iAssociation is available (not NULL). If iAssociation is williamr@2: * NULL, it means user has deleted a resource needed by williamr@2: * CSIPTransactionBase, and this function leaves. williamr@2: */ williamr@2: void CheckAssociationL() const; williamr@2: williamr@2: /** williamr@2: * Gets response elements. williamr@2: * williamr@2: * @return Response elements. Ownership isn't transferred. williamr@2: */ williamr@2: const CSIPResponseElements* ResponseElements() const; williamr@2: williamr@2: protected: // Data williamr@2: williamr@2: /** williamr@2: * RequestId received from SIP client williamr@2: * @internalComponent williamr@2: */ williamr@2: TUint32 iRequestId; williamr@2: williamr@2: /** williamr@2: * Every transaction is associated to exactly one other object: williamr@2: * CSIP, CSIPConnection, CSIPRegistrationBinding or CSIPDialogAssocBase williamr@2: * @internalComponent williamr@2: */ williamr@2: MTransactionAssociation* iAssociation; williamr@2: williamr@2: private: // Data williamr@2: RStringF iType; williamr@2: williamr@2: //ETrue is the transaction is a client transaction, EFalse otherwise williamr@2: TBool iIsClientTransaction; williamr@2: williamr@2: //Current transaction state williamr@2: CSIPTransactionBase::TState iState; williamr@2: williamr@2: //ETrue if the transaction has an effect on the dialog state in case williamr@2: //the transaction is associated with a dialog. williamr@2: //EFalse otherwise. williamr@2: TBool iAffectsDialogState; williamr@2: williamr@2: //SIP response elements williamr@2: CSIPResponseElements* iResponseElements; williamr@2: williamr@2: private: // For testing purposes williamr@4: #ifdef CPPUNIT_TEST williamr@4: friend class CSIP_Test; williamr@4: friend class CSIPServerTransaction_Test; williamr@4: friend class CSIPSubscribeDialogAssoc_Test; williamr@4: friend class CSIPInviteDialogAssoc_Test; williamr@4: friend class CSIPNotifyDialogAssoc_Test; williamr@4: friend class CSIPConnection_Test; williamr@4: #endif williamr@4: void __DbgTestInvariant() const; williamr@2: williamr@2: }; williamr@2: williamr@2: #endif