diff -r 000000000000 -r bde4ae8d615e os/ossrv/lowlevellibsandfws/apputils/multipartparser/inc/multipartparser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/lowlevellibsandfws/apputils/multipartparser/inc/multipartparser.h Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,238 @@ +// 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: +// Implementation of the Multipart Parser +// + + + +/** + @file + @publishedPartner + @prototype +*/ +#ifndef MULTIPARTPARSER_H +#define MULTIPARTPARSER_H + +#include + +class CBodyPart; + +/** +Provides a RFC2045 MIME multipart parser and composer. Each body part of a multipart +message is represented by CBodyPart. +*/ +NONSHARABLE_CLASS(MultipartParser) + { + public: + /** + Controls which top level headers are used when composing a multipart message. + */ + enum TMultipartTopLevelHeader + { + /** Content-type: */ + EMultipartTopLevelHeaderContentType = 0x0001, + /** Content-length: */ + EMultipartTopLevelHeaderContentLength = 0x0002, + /** Last-modified: */ + EMultipartTopLevelHeaderLastModified = 0x0004, + /** All top level headers */ + EMultipartTopLevelHeaderAll = 0x0007 // make SURE to change this when adding new header types + }; + + /** + Identifies the MIME multipart subtype + */ + enum TMultipartSubtype + { + /** multipart/mixed */ + EMultipartSubtypeMixed = 0 + }; + + public: + + /** + Parse a multipart message + @param aMultipartBody The multipart file to be parsed + @param aContentType The content type of multipart file: mixed, related etc. + @param aBoundary The boundary of the multipart file + @param aUrl The url of the multipart file + @param aBodyPartsArray The array contains parsed body parts of the multipart file + @param aMaxToParse The max number of body parts to be parsed + @post aBodyPartsArray contains the parsed body parts + @leave KErrNotSupported aContentType is not multipart/mixed or multipart/related + @leave - One of the system-wide error codes + */ + IMPORT_C static void ParseL( const TDesC8& aMultipartBody, + const TDesC8& aContentType, + const TDesC8& aBoundary, + const TDesC16& aUrl, + RPointerArray & aBodyPartsArray, + TInt aMaxToParse = -1 ); + + /** + Composes a multipart document + @param aBodyArray Array of BodyPart objects to be combined into a multipart message + @param aBoundary A string containing the boundary to be used in construction of multipart document + @param aSubtype Enumerated value of multipart subtype + @param aHeaderMask Integer mask of TTopLevelHeaders to indicate which top-level headers should be included + @return multipart document; the ownership of buffer is transferred to caller. + @leave - One of the system-wide error codes + */ + IMPORT_C static HBufC8* ComposeL( RPointerArray& aBodyPartsArray, + const TDesC8& aBoundary, + TMultipartSubtype aSubtype, + TInt aHeaderMask ); + + private: + /** Default constructor */ + MultipartParser(); + + /** + Get the buffer of the next body part + @param aStartPosition The starting position to parse + param aMultipartBody The full buffer of multipart file + @param aMultipartLen The length of the multipart file buffer + @param aBoundary The boundary of the multipart file + @param aSingleEolChar The single EOL of the multipart file + @param aBodyPartBuffer The buffer of this body part + @return Length of aBodyPartBuffer + */ + static TUint32 GetNextBodyPartBuffer( TUint32 startPosition, + const TUint8* aMultipartBody, + TUint32 aMultipartLen, + const TDesC8& aBoundary, + char* aSingleEolChar, + TUint8** aBodyPartBuffer ); + + /** + Set the single and double EOL of the multipart file + @param aMultipartBody The full buffer of multipart file + @param aMultipartLen The length of the multipart file buffer + @param aBoundary The boundary of the multipart file + @param aSingleEolChar The single EOL of the multipart file + @param aDoubleEolChar The double EOL of the multipart file + */ + static void SetEolCharacters( const TUint8* aMultipartBody, + TUint32 aMultipartLen, + const TDesC8& aBoundary, + char** aSingleEolChar, + char** aDoubleEolChar ); + + /** + Parse the body part + @param aBodyPartBuffer The buffer of this body part + @param aBodyPartBufferLength The length of this body part buffer + @param aSingleEolChar The single EOL of the multipart file + @param aDoubleEolChar The double EOL of the multipart file + @param aResponseUrl The url requested for the multipart file + @param aBodyPart The body part parsed and returned + @leave - One of the system-wide error codes + */ + static void ParseBodyPartL( TUint8* aBodyPartBuffer, + TUint32 aBodyPartBufferLength, + char* aSingleEolChar, + char* aDoubleEolChar, + const TDesC16& aResponseUrl, + CBodyPart* aBodyPart ); + + /** + Checks if a Content-Transfer-Encoding is specified + @param aContentTransferEncodingValue The transfer encoding of this body part + @return true if contentTransferEncodingValue is neither NULL nor a domain. + */ + static TBool IsEncoded( TUint8* aContentTransferEncodingValue ); + + /** + Decode text given the Content-Transfer-Encoding + @param aContentTransferEncodingValue The transfer encoding of this body part + @param aEncodedBody The encoded body of this body part + @param aDecodedBody The decoded body returned + @return KErrNone if successful, otherwise one of the system wide error codes. + */ + static TInt DecodeContentTransferEncoding( TUint8* aContentTransferEncodingValue, + const TDesC8& aEncodedBody, + TPtr8& aDecodedBody ); + + /** + Checks if the Content-Encoding-Type is application/x-gzip + @param aContentTypeValue The content type of this body part + @return ETrue if the Content-Encoding-Type is application/x-gzip. + */ + static TBool IsZipped( TUint8* aContentTypeValue ); + + /** + Unzip the body + @param aContentTypeValue The content type of this body part + @param aZippedBody The zipped body of this body part + @param aUnzippedBody The unzipped body returned + @return KErrNone if successful, otherwise one of the system wide error codes. + @pre aZippedBody has a Content-Encoding-Type of application/x-gzip + @pre aContentTypeValue is application/x-gzip + */ + static TInt Unzip( TUint8* aContentType, + const TDesC8& aZippedBody, + TPtr8& aUnzippedBody ); + + /** + Remove the charset value from the Content-Type header + @param aBodyPart The body part which contains the content type + */ + static void CutOffContentTypeAttributes( CBodyPart* aBodyPart ); + + /** + Forms a URL that refers to this body part + @param aContentBaseValue The content base of this body part + @param aContentLocationValue The content location of this body part + @param aResponseUrl The url requested for the multipart file + @return URL + @leave - One of the system-wide error codes + */ + static HBufC16* GetBodyPartUrlL( const TDesC8& aContentBaseValue, + const TDesC8& aContentLocationValue, + const TDesC16& aResponseUrl ); + + /** + Checks whether a URL is relative or not + @param aUrl The URL to check + @return ETrue if the URL is relative + @leave - One of the system-wide error codes + */ + static TBool IsUrlRelativeL( const TDesC8& aUrl ); + + /** + Create an absolute URL from a relative URL + @param aBase The base URL + @param aRelativeUrl The relative URL + @return absolute URL + @leave - One of the system-wide error codes + */ + static HBufC16* UrlRelToAbsL( TDesC16& aBase, + const TDesC8& aRelativeUrl ); + + /** + Composes multipart/mixed document + @param aBodyArray Array of CBodyPart objects to be included in the output + @param aBoundary A string containing boundary to be used in construction of multipart document + @param aHeaderMask Integer mask of TMultipartTopLevelHeader to indicate which top-level headers should be included + @return multipart document; the ownership of buffer is transferred to caller. + @leave - One of the system-wide error codes + */ + static HBufC8* ComposeMixedL( RPointerArray& aBodyArray, + const TDesC8& aBoundary, + TInt aHeaderMask ); + + }; + +#endif // MULTIPARTPARSER_H +