diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/dlnawebserver/inc/upnphttpbuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/dlnawebserver/inc/upnphttpbuffer.h Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,274 @@ +/** @file +* Copyright (c) 2005-2006 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: HTTPBuffer is used to buffer incoming HTTP messages. +* +*/ + + +#ifndef C_CUPNPHTTPBUFFER_H +#define C_CUPNPHTTPBUFFER_H + +// INCLUDES + +#include +#include +#include "upnplist.h" +#include "upnphttpmessage.h" + +// FORWARD DECLARATIONS +class CUpnpHttpSession; +class CUpnpHttpFileAccess; +class CUpnpHttpChunkParser; + +// CONSTANTS + +// CLASS DECLARATION + +/** +* @brief HTTPBuffer is used to buffer incoming HTTP messages. +* @since Series60 2.6 +*/ +NONSHARABLE_CLASS (CUpnpHttpBuffer) : public CBase + { +public: // Constructor and destructor + /** + * Constructor function. + * @since Series60 2.6 + * @param aSession Pointer to session that owns this buffer. + * @param aToBeSavedInFile ETrue, if incoming content should be saved + * in a file, EFalse otherwise. + * @return A new CUpnpHttpBuffer instance + **/ + static CUpnpHttpBuffer* NewL( CUpnpHttpSession* aSession,TBool aToBeSavedInFile ); + + /** + * Virtual destructor function. + **/ + virtual ~CUpnpHttpBuffer(); + +public: // New funtions + + /** + * This function appends the aBuffer data at the end of this HTTPBuffer. + * @since Series60 2.6 + * @param aBuffer Buffer to append after current data. + * @param aToBeSavedInFile. + **/ + + TInt AppendL( TDesC8& aBuffer, TBool aToBeSavedInFile ); + /** + * This function appends only headers from the aBuffer at the end of this HTTPBuffer. + * @since Series60 2.6 + * @param aBuffer Buffer to append after current data. + * @param aToBeSavedInFile. + * @return position of double line feed + **/ + TInt AppendHeadersL( TDesC8& aBuffer, TBool aToBeSavedInFile ); + + /** + * Decodes chunked messages. + * @since Series60 2.6 + **/ + TInt ParseL( TDesC8& aBuffer ); + + /** + * Returns ETrue, if buffer is ready to be converted to HTTPMessage, + * else returns EFalse. + * @since Series60 2.6 + * @return ETrue, if message is ready; EFalse otherwise. + **/ + TBool IsReadyL(); + + /** + * Returns ETrue, if header part of HTTPMessage is ready, else returns + * EFalse. + * @since Series60 2.6 + * @return ETrue, if header ready; EFalse otherwise. + **/ + TBool IsHeaderReady(); + + /** + * Returns ETrue, if body part of HTTPMessage is ready, else returns EFalse. + * @since Series60 2.6 + * @return ETrue, if body ready; EFalse otherwise. + **/ + TBool IsBodyReadyL(); + + /** + * Returns the length of entire buffer. + * @since Series60 2.6 + * @return Length of buffer. + **/ + TInt BytesInBuffer(); + + /** + * This function deletes aLength bytes from the beginning of HTTPBuffer. + * @since Series60 2.6 + * @param aLength Number of bytes to remove. + **/ + void RemoveL( TInt aLength ); + + /** + * Returns ETrue, if chunk encoded message is finished. + * @since Series60 2.6 + * @return ETrue, if message is ready; EFalse otherwise. + */ + TBool ChunkTransferFinished(); + + /** + * Returns ETrue, if message has body, else returns EFalse. + * @since Series60 2.6 + * @return ETrue, if message has body; EFalse otherwise. + **/ + TBool HasBody(); + + /** + * Returns ETrue, if message's header contains + * "Transfer-encoding: Chunked" header. + * @since Series60 2.6 + * @return ETrue, if message's header contains + * "Transfer-encoding: Chunked" -header; EFalse otherwise. + **/ + TBool IsChunked(); + + /** + * Returns Headers of the first message in the buffer. + * @since Series60 2.6 + * @return Message headers. + **/ + TPtrC8 Headers(); + + /** + * Returns the content of buffer. + * @since Series60 2.6 + * @return Message body. + **/ + TPtrC8 Content(); + + /** + * Returns the content length of first message in the buffer. + * @since Series60 2.6 + * @return Length of message. + * @leave KErrOverflow if Content-Length > 2^32 + **/ + TInt ContentLengthL(); + + /** + * Returns ETrue, if message's header contains "Connection: close" -header. + * @since Series60 2.6 + * @return ETrue, if message's header contains "Connection: close" -header; + * EFalse otherwise. + **/ + TBool UsesConnectionClose(); + + /** + * Returns the error code of message in buffer. + * @param aBuffer Buffer to check the error code (buffer that contains the) + * HTTP message). + * @since Series60 2.6 + **/ + TInt MessageErrorCode( TDesC8& aBuffer ); + + /** + * Returns the method (GET, POST ...) of message in buffer. + * @since Series60 2.6 + **/ + TPtrC8 Method(); + + /** + * Returns the method target of message in buffer. + * Target in this context means the url of message (like in GET / HTTP/1.1 the middle part) + * @since Series60 2.6 + **/ + TPtrC8 Target(); + + /** + * Returns True if message content is going to be saved in file. + * @since Series60 2.6 + * @return ETrue if message content will be saved in file, EFalse if not. + */ + TBool IsToFile(); + + /** + * Sets if body of message contained in buffer should be saved in file. + * @since Series60 2.6 + * @param aToFile - should message content be saved in file. + */ + void SetToFile( TBool aToFile ); + + +private: // Constructors + + /** + * First phase constructor. + * @param aSession Handle to session that owns CUpnpHttpBuffer instance. + * @param aToBeSaveInFile Should content be saved to the file. + **/ + CUpnpHttpBuffer( CUpnpHttpSession* aSession, TBool aToBeSavedInFile ); + + /** + * By default Symbian 2nd phase constructor is private + */ + void ConstructL(); + + /** + * Parse - decodes chunked-encoding + * @since S60 3.2 + * @param buffer + * @param position in the buffer + * @return error code + */ + TInt Parse( TDes8& aBuffer, TInt& aPos ); + +protected: + + // Buffer that contains the messages, owned + RBuf8 iBuffer; + + // ETrue if message has content-type -header, EFalse otherwise, owned + TBool iHasContentType; + + // ETrue, if content of message should be saved to a file; EFalse otherwise, owned + TBool iToFile; + + // Pointer to the session that owns this CUpnpHttpFileAccess, owned + CUpnpHttpSession* iSession; + + // If message is not chunked, contains the current length of message, owned + TInt iContentLengthCounter; + + // If message is not chunked, contains the total length of message given + // in Content-Length -header, owned + TInt iContentLength; + + // Checking that responses with error codes ( = error code not 200) + // are not saved to files. + TBool iErrorCodeCheckedForSaving; + + // ETrue, if it is allowed to save given buffer to file + // EFalse if it is not allowed (HTTP error other than 200). + TBool iOkToSaveToFile; + + TInt iFileReadBufferSize; + + // Position in buffer + TInt iPos; + + // Chunk parser + CUpnpHttpChunkParser *iChunkParser; + }; + +#endif // C_CUPNPHTTPBUFFER_H + +// End Of File