/***************************************************************************
    copyright            : (C) 2002-2008 by Stefano Barbato
    email                : stefano@codesink.org

    $Id: contenttype.h,v 1.13 2008-10-07 11:06:25 tat Exp $
 ***************************************************************************/
#ifndef _MIMETIC_CONTENT_TYPE_H_
#define _MIMETIC_CONTENT_TYPE_H_
#include <string>
#include <mimetic098/strutils.h>
#include <mimetic098/rfc822/fieldvalue.h>
#include <mimetic098/fieldparam.h>

namespace mimetic
{

/// Content-Type field value
class ContentType: public FieldValue
{
public:
    static const char label[];
    struct Boundary
    {
        Boundary();
        operator const std::string&() const;
    private:
        std::string m_boundary;
        static std::string ms_common_boundary;
        static int ms_i;
    };
    typedef FieldParam Param;
    typedef FieldParamList ParamList;
public:
    ContentType();
    ContentType(const char*);
    ContentType(const std::string&);
    ContentType(const std::string&, const std::string&);

    void set(const std::string&);
    void set(const std::string&, const std::string&);

    bool isMultipart() const;

    const istring& type() const;
    void type(const std::string&);

    void subtype(const std::string&);
    const istring& subtype() const;

    const ParamList& paramList() const;
    ParamList& paramList();

    const std::string& param(const std::string&) const;
    void param(const std::string&, const std::string&);

    std::string str() const;
protected:
    FieldValue* clone() const;
private:
    istring m_type, m_subtype;
    ParamList m_paramList;
};

}

#endif
