/* 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> 
*/

#ifdef _WIN32
#pragma warning(disable: 4786)
#endif

#ifndef zz_mime_body_h
#define zz_mime_body_h

#include <zz_buffer.h>
#include <zz_string.h>
#include <map>
#include <zz_export.h>
#include <zz_log.h>

// Block storlek för MIME buffert
#define ZZ_MIME_WBLOCK_SIZE 10240

// Vagnretur + radbrytning
#define CRLF char(13), char(10)

/*
    Description:
    MIME body, parsning/skrivning

    Author: 
    Toni Thomsson, toni@tonjac.org

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

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

    /*
        Description: Skapar ett MIME-body objekt

        Remarks:
        Skapa MIME body för skrivning
    */
    CzzMIMEBody();

    /*
        Description: Skapar ett MIME-body objekt

        Remarks:
        Skapa MIME body för parsning
    */
    CzzMIMEBody( char* body,            // IN, bodybuffert
                    long size,          // IN, storlek på body
                    const char* type    // IN, innehålls typ
                    );

    // Description: Destruktor
    virtual ~CzzMIMEBody();

    // Description: Läs boundary från body
    static CzzString parseBoundary( const char* body // IN, body
                                    );

    /*
        Description: 
        Sökväg till uppladdad fil
        
        See Also:
        CzzCGI::getFile

        Throws:
        CzzException
    */
    CzzString getFile( const CzzString& name // IN, variabel namn
                        );

    /*
        Description: 
        Läs variabel
        
        See Also:
        CzzCGI::operator[]

        Throws:
        CzzException
    */
    CzzString operator[]( const CzzString& var // IN, variabel namn
                            );

    // Description: Lägg till header till body-buffert
    void addHeader( const char* name, // IN, variabelnamn
                    const char* value // IN, värde
                    );

    // Description: Lägg till fil-header till body-buffert
    void addFileHeader( const char* name,   // IN, variabelnamn
                        const char* file    // IN, sökväg
                        );

    // Description: Lägg till slutmarkering till body-buffert
    void addEndMarker( void );

    // Description: Läs boundary
    CzzString& getBoundary( void ) { return m_Boundary; }

    // Description: Pekare till skrivbuffert
    const char* getData( void ) { return m_Buffer.getData(); };

    // Description: Storlek på skrivbuffert
    long getSize( void ) { return m_Buffer.getSize(); };

    char* getRawBody( void );
    long getRawSize( void );

protected:
    
    // Description: Parsar MIME body
    void parseMe( void );
    
    // Description: Genererar en unik boundary nyckel
    void genBoundary( void );

    CzzString m_Boundary;
    CzzString m_LastFileElement;
    char* m_RawBody;
    long m_RawSize;
    map<CzzString, CzzString > m_ElementMap;
    map<CzzString, CzzString > m_FileMap;
    CzzBuffer m_Buffer;
    
private:

    CzzString copyReadFromStart( long from, long to );
    long parseElementName( long pos, const CzzString& elem );
    long writeToFile( long pos );
    CzzLog m_Log;
};

#endif // zz_mime_body_h