diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Codec/inc/sipmessage.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Codec/inc/sipmessage.h Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,358 @@ +/* +* Copyright (c) 2005-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 : sipmessage.h +* Part of : SIP Codec +* Interface : SIP Codec API +* Version : SIP/4.0 +* +*/ + + + + +/** + @internalComponent +*/ + +#ifndef CSIPMESSAGE_H +#define CSIPMESSAGE_H + +// INCLUDES +#include +#include "sipheaderbase.h" +#include "_sipcodecdefs.h" + +// FORWARD DECLARATIONS +class CSIPFromHeader; +class CSIPToHeader; +class CSIPCallIDHeader; +class CSIPCSeqHeader; + +// CLASS DECLARATION +/** +* A base class for SIP messages that provides functions +* for setting and getting headers and SIP version of a SIP message. +* +* @lib sipcodec.lib +*/ +class CSIPMessage : public CBase + { + public: // Constructors and destructor + + /** + * Destructor. + */ + IMPORT_C virtual ~CSIPMessage(); + + public: // New functions + + /** + * Checks if the actual class of this object is CSIPRequest and + * can be safely casted to CSIPRequest + * @return ETrue if the object is of class CSIPRequest + */ + IMPORT_C virtual TBool IsRequest() const = 0; + + /** + * Adds a header to the SIP message. Note that the first header inserted + * within a group of headers with the same name (for example "Route") is + * also guaranteed to appear first in the encoded message. + * + * @pre aSIPHeader != 0 + * @pre !(aSIPHeader->MoreThanOneAllowed()&&HasHeader + * (aSIPHeader->Name()) + * @param aSIPHeader a SIP header to be added, ownership is transferred. + */ + IMPORT_C void AddHeaderL(CSIPHeaderBase* aSIPHeader); + + /** + * Adds a deep copy of a given header to the SIP message. + * Note that the first header inserted + * within a group of headers with the same name (for example "Route") is + * also guaranteed to appear first in the encoded message. + * + * @pre !(aSIPHeader.MoreThanOneAllowed()&&HasHeader(aSIPHeader->Name()) + * @param aSIPHeader a SIP header to be added + */ + IMPORT_C void AddHeaderL(const CSIPHeaderBase& aSIPHeader); + + /** + * Replaces a header to the SIP message based on pointer comparison. + * The updated header has to have the same type. + * This means that a Contact-header cannot replace a To-header. + * Note that the new header will be placed last in the list of headers. + * + * @pre aOldSIPHeader != 0 + * @pre aNewSIPHeader != 0 + * @pre aOldSIPHeader->Name() == aNewSIPHeader->Name() + * @param aOldSIPHeader the header to be replaced. + * Deleted if the function returns without leaving. + * @param aNewSIPHeader the header that replaces the old header. + * The ownership is transferred. + */ + IMPORT_C void ReplaceHeaderL( + CSIPHeaderBase* aOldSIPHeader, + CSIPHeaderBase* aNewSIPHeader); + + /** + * Replaces all the headers with a common name. + * All the headers must be of same type. + * + * @pre aNewHeaders.Count() > 0 + * @param aNewHeaders the headers that will replace the old headers. + * The ownership of the headers is transferred and + * the array is resetted on return. + */ + IMPORT_C void ReplaceHeadersL( + RPointerArray& aNewHeaders); + + /** + * Checks if a one or more headers with aName are present + * @param aName the full or compact name of the header + * @return ETrue if present, otherwise EFalse + */ + IMPORT_C TBool HasHeader(RStringF aName) const; + + /** + * Get a count of headers with a given name in this SIP message. + * @param aName the full or compact name of the header + * @return number of headers with the given name. + */ + IMPORT_C TInt HeaderCount(RStringF aName); + + /** + * Gets an iterator to a list of headers with aName + * @pre HasHeader(aName) == ETrue + * @param aName the full or compact name of the headers to get + * @return an iterator to a list of headers with aName. + * The headers can be modified through the iterator, but are + * supposed to be removed using RemoveHeader. + */ + IMPORT_C TSglQueIter Headers(RStringF aName); + + /** + * Gets a header with aName and an index in list of header with aName + * Note that using HeaderCount(...) and this function to loop through + * the headers with a given name is MUCH less efficient than using + * iterators through Headers(...). + * + * @pre aIndex < HeaderCount(aName) + * @param aName the full or compact name of the header to get + * @param aIndex the index in the header list + * @return 0 if the header with the given name or index was not found, + * otherwise the header. The ownership is NOT transferred. + */ + IMPORT_C CSIPHeaderBase* Header(RStringF aName, TInt aIndex); + + /** + * Removes a header from the SIP message based on pointer comparison + * @param aSIPHeader the header to be removed, ownership is NOT + * transferred, the caller is supposed to do the deletion + * @return KErrNone if succesfully removed, KErrNotFound if the + * header was not found. + */ + IMPORT_C TInt RemoveHeader(const CSIPHeaderBase* aSIPHeader); + + /** + * Removes and deletes all the headers with name aName + * @pre HasHeader(aName)==ETrue + * @param aName the full or compact name of the headers to delete. + * @return KErrNone if succesfully removed and deleted, + * KErrNotFound if headers with aName header were not found. + */ + IMPORT_C TInt DeleteHeaders(RStringF aName); + + /** + * Creates copies of the pointers to all the headers in the SIP message. + * Note that the caller must not delete any of the headers returned. + * @return an array of all the headers in the SIP message. + */ + IMPORT_C const RPointerArray& AllHeadersL(); + + /** + * Gets the From-header in the message. + * @return The From-header or zero if the header is not present. + * The ownership is NOT transferred. + */ + IMPORT_C CSIPFromHeader* From(); + + /** + * Gets the To-header in the message. + * @return The To-header or zero if the header is not present. + * The ownership is NOT transferred. + */ + IMPORT_C CSIPToHeader* To(); + + /** + * Gets the Call-ID-header in the message. + * @return The Call-ID-header or zero if the header is not present. + * The ownership is NOT transferred. + */ + IMPORT_C CSIPCallIDHeader* CallID(); + + /** + * Gets the CSeq-header in the message. + * @return The CSeq-header or zero if the header is not present. + * The ownership is NOT transferred. + */ + IMPORT_C CSIPCSeqHeader* CSeq(); + + /** + * Gets the SIP version + * @return the SIP version as text + */ + IMPORT_C RStringF SIPVersion() const; + + /** + * Set the content + * @param aContent, the ownership is transferred + */ + IMPORT_C void SetContent(HBufC8* aContent); + + /** + * Gets the content. + * @return the content, the ownership is NOT transferred. + */ + IMPORT_C const TDesC8& Content() const; + + /** + * Gets the ownership to the content + * @return the content, the ownership is transferred. + */ + IMPORT_C HBufC8* TakeContentOwnershipL(); + + /** + * Checks if "Content-Length"-header was present + * when the message was decoded. + * @return ETrue if set, otherwise EFalse + */ + IMPORT_C TBool HasAnnouncedContentLength() const; + + /** + * Gets the value of "Content-Length"-header + * that was present when the message was decoded. + * This might be different than the actual length of the message content. + * @pre HasAnnouncedContentLength() == ETrue + * @return the value of "Content-Length"-header + */ + IMPORT_C TUint AnnouncedContentLength() const; + + /** + * Using this function the user can get the length of the + * encoded header part without actually encoding the whole header part. + * Note that this function only saves memory, but not necessarily + * processing time compared to the actual encoding. + * @return the length of the header part when encoded + */ + IMPORT_C TInt EncodedHeaderPartLengthL(); + + /** + * Encodes the header part of the SIP message object + * into its textual representation.. + * @return a textual representation of the object, + * the ownership is transferred + */ + IMPORT_C CBufBase* ToTextHeaderPartL(); + + /** + * Encodes the header part of the SIP message object + * into its textual representation and pushes it to the CleanupStack. + * @return a textual representation of the object, + * the ownership is transferred + */ + IMPORT_C CBufBase* ToTextHeaderPartLC(); + + /** + * Encodes the SIP message object into its textual representation. + * @return a textual representation of the object, + * the ownership is transferred + */ + IMPORT_C CBufBase* ToTextL(); + + /** + * Encodes the SIP message object into its textual representation + * and pushes it to the CleanupStack. + * @return a textual representation of the object, + * the ownership is transferred + */ + IMPORT_C CBufBase* ToTextLC(); + + /** + * Externalizes all the headers that support serialization + * to a write stream. + * @param aWriteStream a stream where the objects will be externalized + */ + IMPORT_C void ExternalizeHeadersL(RWriteStream& aWriteStream); + + /** + * Adds headers to the CSIPMessage from a read stream. + * @param aReadStream a stream containing the values of the + * externalized SIP header objects + */ + IMPORT_C void InternalizeHeadersL(RReadStream& aReadStream); + + public: // New functions, for internal use + + void SetSIPVersionL(const TDesC8& aSIPVersion); + + protected: // Constructors + + void ConstructL(); + CSIPMessage(); + + protected: // New functions + + virtual HBufC8* ToTextFirstLineLC() const = 0; + + private: // New functions + + RStringF ReadFromStreamL (RReadStream& aReadStream) const; + + TBool IsContentLengthHeader(const CSIPHeaderBase& aHeader) const; + + TInt FindHeaderListIndex(RStringF aName) const; + + TInt FindHeaderListIndex(const CSIPHeaderBase& aHeader) const; + + void InsertL(TSglQue& aHeaderList); + + static TInt HeaderOrder( + const TSglQue& aFirstList, + const TSglQue& aSecondList); + + void GetEncodedFirstLineSizeL(TInt& aSize) const; + + void GetEncodedContentLengthHeaderSizeL(TInt& aSize) const; + + HBufC8* ToTextContentLengthLC() const; + + private: // Data + + RStringF iSIPVersion; + RArray > iSIPHeaderListArray; + HBufC8* iContent; + TInt iAnnouncedContentLength; + TBool iAnnouncedContentLengthSet; + RPointerArray iTmpAllHeaders; + + private: // For testing purposes + + UNIT_TEST(CSIPMessageTest) + }; + + +#endif // CSIPMESSAGE_H + +// End of File