upnp/upnpstack/dlnawebserver/inc/upnphttpbuffer.h
changeset 0 f5a58ecadc66
--- /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 <e32base.h>
+#include <in_sock.h>
+#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