/* libzzinet
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_http_h
#define zz_http_h

#include <zz_socket.h>
#include <zz_mime_body.h>
#include <map>
#include <zz_export.h>

#ifdef _WIN32
    using namespace std;
    #pragma warning(disable: 4786)
#endif

// Svars headers
typedef map<short, CzzString > CzzResponseHeaders;

/*
    Description:
    HTTP 1.0 protokoll (user-agent)

    Author: 
    Toni Thomsson, toni@tonjac.org

    Library:
    libzzinet.a (HPUX) libzzinet.lib (win32)

    Platform:
    HPUX, win32
*/
class ZZ_API CzzHTTP
{
public:

    /*
        Description:
        Skapa ett user-agent objekt (HTTP-klient)

        Throws:
        CzzException
    */
    CzzHTTP( const char* host,              // IN, dator
                const char* port,           // IN, port
                const char* user_agent,     // IN, klient namn
                unsigned short s_timeout,   // IN, send-timeout i sekunder
                unsigned short r_timeout ); // IN, recieve-timeout i sekunder

    // Description: Destruktor
    virtual ~CzzHTTP();

    
    /*
        Description:
        GET anrop

        Throws:
        CzzException
    */
    void get( const char* uri,              // IN, sökväg (Unified resource identifier)
                const char* response_file   // IN, svarsfil
                );

    /* 
        Description: 
        POST anrop

        Remarks: 
        Innehållstyp: application/x-www-form-urlencoded

        Throws:
        CzzException
    */
    void post( const char* uri,             // IN, sökväg (Unified resource identifier)
                const char* query,          // IN, fråga
                const char* response_file   // IN, svarsfil
                );

    // Remarks: innehållstyp: multipart/form-data
    void post( const char* uri,             // IN, sökväg (Unified resource identifier)
                CzzMIMEBody& body,          // IN, MIME body
                const char* response_file   // IN, svarsfil 
                );

    /* 
        Description: 
        HEAD anrop
        
        Throws:
        CzzException
    */
    void head( const char* uri // IN, sökväg (Unified resource identifier)
                );

    /* 
        Description: 
        PUT anrop
        
        Throws:
        CzzException
    */
    void put( const char* uri,      // IN, sökväg (Unified resource identifier)
                const char* data,   // IN, data buffert
                unsigned long size  // IN, storlek på data
                );

    /* 
        Description: 
        DELETE anrop
        
        Throws:
        CzzException
    */
    void del( const char* uri       // IN, sökväg (Unified resource identifier)
                );
    
    /* 
        Description: 
        Svars header lista
    */
    CzzResponseHeaders& getResponseHeaders( void ) { return m_ResponseHeaders; };

    
    // Description: Filstorlek (svar) i bytes
    unsigned long getFileSize( void ) { return m_FileSize; };

    // Description: Hämta svar
    // Returns: storlek på svar
    long reply( void );

protected:
    
    // Description: Skicka anrop
    // Remarks: protected
    void send( void );

    // Description: Parsa svar
    // Remarks: protected
    void parseReply( unsigned long size // storlek
                        );

    // Description: Skriv svar till fil
    // Remarks: Överlagra om svaret inte skall skrivas till fil
    virtual void writeToFile( long from,    // IN, position i m_ReplyBuffer
                                long size   // IN, antal bytes som skall skrivas
                                );

    // Description: Lägg till anrop till anrops buffert
    // Remarks: protected
    void addRequest( const char* method,    // IN, anropsmetod
                        const char* uri     // IN, sökväg
                        );

    // Description: Lägg till header till anrops buffert
    // Remarks: protected
    void addHeader( const char* format_header,  // IN, format, se printf()
                    ...                         // IN, parametrar
                    );

    // Description: Lägg till objekt till anrops buffert
    // Remarks: protected
    void addEntityData( const char* data,       // IN, data buffert
                        unsigned long size      // IN, storlek på data
                        );

    // Description: Lägg till slutmakering till anrops buffert
    // Remarks: protected
    void addEndMarker( void );


    unsigned long m_FileSize;
    CzzBuffer* m_SendBuffer;
    char* m_ReplyBuffer;
    CzzString m_Host;
    CzzString m_LocalHost;
    CzzString m_Port;
    CzzString m_UserAgent;
    CzzString m_ResponseFile;
    CzzSocket* m_Socket;
    unsigned short m_SendTimeout;
    unsigned short m_RecTimeout;
    CzzResponseHeaders m_ResponseHeaders;

private:

    CzzString copyReadFromStart( long from, long to );
};

#endif // zz_http_h