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 : sipmessageelements.h williamr@2: * Part of : SIP Client williamr@2: * Interface : SDK API, SIP API williamr@2: * Version : 1.0 williamr@2: * williamr@2: */ williamr@2: williamr@2: williamr@2: williamr@2: #ifndef CSIPMESSAGEELEMENTS_H williamr@2: #define CSIPMESSAGEELEMENTS_H williamr@2: williamr@2: // INCLUDES williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: // FORWARD DECLARATIONS williamr@2: class CSIPHeaderBase; williamr@2: class CSIPContentTypeHeader; williamr@2: class CSIPFromHeader; williamr@2: class CSIPToHeader; williamr@2: class CSIPCSeqHeader; williamr@2: class CSIPExtensionHeader; williamr@2: williamr@2: // CLASS DECLARATION williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * williamr@2: * Class for creation and manipulation optional elements in a SIP message. williamr@2: * williamr@2: * Class provides functions for setting and getting optional elements in a williamr@2: * SIP message. Optional elements include user SIP message headers, williamr@2: * content and content type. williamr@2: * Following headers are not considered to be user SIP message headers and williamr@2: * cannot be set or retrieved using functions of this class: williamr@2: * "Authentication-Info", "Call-Id", "CSeq", "From" williamr@2: * "Max-Forwards", "Min-Expires", "Record-Route", williamr@2: * "Security-Verify", "Service-Route", "To", "Via", "Security-Server" and williamr@2: * "Proxy-Authorization". williamr@2: * williamr@2: * @lib sipclient.lib williamr@2: */ williamr@2: class CSIPMessageElements : public CBase williamr@2: { williamr@2: public: // Constructors and destructor williamr@2: /** williamr@2: * Two-phased constructor. williamr@2: */ williamr@2: IMPORT_C static CSIPMessageElements* NewL(); williamr@2: williamr@2: /** williamr@2: * Two-phased constructor. williamr@2: */ williamr@2: IMPORT_C static CSIPMessageElements* NewLC(); williamr@2: williamr@2: /** williamr@2: * Destructor. williamr@2: */ williamr@2: IMPORT_C ~CSIPMessageElements(); williamr@2: williamr@2: public: //new functions williamr@2: /** williamr@2: * Sets an array of user headers i.e. headers that user is allowed williamr@2: * manipulate to a SIP message. An empty array resets the user headers. williamr@2: * Note that the Content-Type header must be set using SetContentL. williamr@2: * williamr@2: * @param aHeaders an array of SIP headers. williamr@2: * The ownership of objects in the array is transferred. williamr@2: */ williamr@2: IMPORT_C void SetUserHeadersL(RPointerArray& aHeaders); williamr@2: williamr@2: /** williamr@2: * Gets all user SIP headers this class contains williamr@2: * @return SIP headers. Ownership is not transferred. williamr@2: */ williamr@2: IMPORT_C const RPointerArray& UserHeaders() const; williamr@2: williamr@2: /** williamr@2: * Sets the SIP message content and its type. williamr@2: * A zero length content can be set by providing a pointer williamr@2: * to a zero length HBufC8 instance (the ownership is transferred). williamr@2: * @pre aContent != 0 && aContentType != 0 williamr@2: * @param aContent the content of a SIP message, williamr@2: * the ownership is transferred williamr@2: * @param aContentType the SIP message content type, williamr@2: * the ownership is transferred williamr@2: * @leave KErrArgument if aContent == 0 or williamr@2: * aContentType == 0 williamr@2: */ williamr@2: IMPORT_C void SetContentL(HBufC8* aContent, williamr@2: CSIPContentTypeHeader* aContentType); williamr@2: williamr@2: /** williamr@2: * Gets the SIP message content williamr@2: * @return SIP message content. If content does not exist, an empty williamr@2: * descriptor is returned. williamr@2: */ williamr@2: IMPORT_C const TDesC8& Content() const; williamr@2: williamr@2: /** williamr@2: * Gets the content type williamr@2: * @return Content-Type-header or a 0-pointer if not present; the ownership williamr@2: * is not transferred. williamr@2: */ williamr@2: IMPORT_C const CSIPContentTypeHeader* ContentType() const; williamr@2: williamr@2: /* williamr@2: * Removes the SIP message content and destroys williamr@2: * Content-Type header as well. williamr@2: * @return SIP message content; the ownership is transferred. williamr@2: */ williamr@2: IMPORT_C HBufC8* ExtractContent(); williamr@2: williamr@2: public: // New functions, for internal use williamr@2: williamr@2: static CSIPMessageElements* InternalizeL(RReadStream& aReadStream); williamr@2: void ExternalizeL(RWriteStream& aWriteStream) const; williamr@2: TInt UserHeaderCount(RStringF aName) const; williamr@2: const RPointerArray UserHeadersL(RStringF aName) const; williamr@2: TInt RemoveHeaders(RStringF aName); williamr@2: void DetachUserHeader(CSIPHeaderBase* aHeader); williamr@2: void AddHeaderL(CSIPHeaderBase* aHeader); williamr@2: void SetToL(CSIPToHeader* aTo); williamr@2: const CSIPToHeader* To() const; williamr@2: void SetFromL (CSIPFromHeader* aFrom); williamr@2: const CSIPFromHeader* From() const; williamr@2: const CSIPCSeqHeader* CSeq() const; williamr@2: void SetContent(HBufC8* aContent); williamr@2: void DetachContent(); williamr@2: williamr@2: private: williamr@2: williamr@2: CSIPMessageElements(); williamr@2: void ConstructL(); williamr@2: void DoInternalizeL(RReadStream& aReadStream); williamr@2: void CheckUserHeaderL(const CSIPHeaderBase* aHeader) const; williamr@2: void ExternalizeUserHeadersL(RWriteStream& aWriteStream) const; williamr@2: void ExternalizeL(const CSIPExtensionHeader* aHeader, williamr@2: RWriteStream& aWriteStream) const; williamr@2: williamr@2: private: // Data williamr@2: williamr@2: RPointerArray iUserHeaders; williamr@2: HBufC8* iContent; williamr@2: CSIPFromHeader* iFromHeader; williamr@2: CSIPToHeader* iToHeader; williamr@2: CSIPCSeqHeader* iCSeqHeader; williamr@2: CSIPContentTypeHeader* iContentTypeHeader; williamr@2: TBool iHeaderLookupOpen; williamr@2: williamr@2: private: // For testing purposes williamr@4: #ifdef CPPUNIt_TEST williamr@4: friend class CSIPMessageElementsTest; williamr@4: #endif williamr@2: }; williamr@2: williamr@2: #endif