#ifndef OverbyteIcsMimeDemo1H
#define OverbyteIcsMimeDemo1H

#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.Buttons.hpp>
#include <Vcl.Dialogs.hpp>
#include <Vcl.Forms.hpp>

#include "OverbyteIcsMimeDec.hpp"
#include "OverbyteIcsMimeUtils.hpp"
#include "OverbyteIcsTypes.hpp"

#include <memory>

class TMimeDecodeForm : public TForm
{
__published:
    TPanel *Panel1;
    TEdit *FileEdit;
    TButton *DecodeButton;
    TMimeDecodeW *MimeDecode1;
    TLabel *Label1;
    TButton *ClearButton;
    TEdit *TextEdit;
    TLabel *Label2;
    TButton *Decode64Button;
    TButton *Encode64Button;
    TButton *DecAutoHeaderButton;
    TButton *DecOneHeaderButton;
    TButton *EncodeOneHdrButton;
    TButton *DecodeFileExButton;
    TMimeDecodeEx *MimeDecodeEx1;
    TCheckBox *IgnoreBlankParts;
    TButton *doCreateMimeList;
    TButton *doMimefromReg;
    TButton *doMimeFromTypes;
    TButton *doMimeTestExtn;
    TButton *doMimeTestContent;
    TMimeTypesList *MimeTypesList1;
    TBitBtn *SelectFile;
    TOpenDialog *OpenDialog;
    TCheckBox *LooseRFC;
    TButton *CloseButton;
    TButton *doTestHttpHdrs;
    TButton *doEncHttpParam;
    TButton *doDecHttpParam;
    void __fastcall DecodeButtonClick(TObject *Sender);
    void __fastcall MimeDecode1PartBegin(TObject *Sender);
    void __fastcall MimeDecode1PartEnd(TObject *Sender);
    void __fastcall MimeDecode1PartHeaderLine(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall ClearButtonClick(TObject *Sender);
    void __fastcall MimeDecode1HeaderLine(TObject *Sender);
    void __fastcall MimeDecode1PartLine(TObject *Sender, void *Data, int DataLen);
    void __fastcall MimeDecode1HeaderBegin(TObject *Sender);
    void __fastcall MimeDecode1HeaderEnd(TObject *Sender);
    void __fastcall MimeDecode1PartHeaderBegin(TObject *Sender);
    void __fastcall MimeDecode1PartHeaderEnd(TObject *Sender);
    void __fastcall MimeDecode1InlineDecodeBegin(TObject *Sender, AnsiString Filename);
    void __fastcall MimeDecode1InlineDecodeEnd(TObject *Sender, AnsiString Filename);
    void __fastcall MimeDecode1InlineDecodeLine(TObject *Sender, void *Line, int Len);
    void __fastcall Decode64ButtonClick(TObject *Sender);
    void __fastcall Encode64ButtonClick(TObject *Sender);
    void __fastcall DecAutoHeaderButtonClick(TObject *Sender);
    void __fastcall DecOneHeaderButtonClick(TObject *Sender);
    void __fastcall EncodeOneHdrButtonClick(TObject *Sender);
    void __fastcall DecodeFileExButtonClick(TObject *Sender);
    void __fastcall doCreateMimeListClick(TObject *Sender);
    void __fastcall doMimefromRegClick(TObject *Sender);
    void __fastcall doMimeFromTypesClick(TObject *Sender);
    void __fastcall doMimeTestExtnClick(TObject *Sender);
    void __fastcall doMimeTestContentClick(TObject *Sender);
    void __fastcall SelectFileClick(TObject *Sender);
    void __fastcall CloseButtonClick(TObject *Sender);
    void __fastcall doTestHttpHdrsClick(TObject *Sender);
    void __fastcall doEncHttpParamClick(TObject *Sender);
    void __fastcall doDecHttpParamClick(TObject *Sender);

private:
    TMemo *Memo1 = nullptr;
    bool FInitialized = false;
    String FIniFileName;
    char FLineBuf[256];
    int FCharCnt = 0;
    std::unique_ptr<TFileStream> FFileStream;
    String FFileName;

    void Display(const String &Msg);
    void DisplayBuffer();
    void ListMimeTypes();
    String DemosDataPath(const String &FileName);

public:
    __fastcall TMimeDecodeForm(TComponent *Owner);
};

extern PACKAGE TMimeDecodeForm *MimeDecodeForm;

#endif
