#ifndef OverbyteIcsSslNewsRdr1H
#define OverbyteIcsSslNewsRdr1H

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

#include "OverbyteIcsNntpCli.hpp"
#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsWndControl.hpp"
#include "OverbyteIcsSslBase.hpp"
#include "OverbyteIcsTypes.hpp"

#include <memory>

class TNNTPForm : public TForm
{
__published:
    TSslNntpCli *NntpCli1;
    TPanel *Panel1;
    TEdit *ServerEdit;
    TButton *ConnectButton;
    TLabel *Label1;
    TMemo *DisplayMemo;
    TButton *AbortButton;
    TButton *GroupButton;
    TEdit *GroupEdit;
    TEdit *ArticleNumEdit;
    TButton *ArticleByNumberButton;
    TButton *ArticleByIDButton;
    TButton *NextButton;
    TButton *LastButton;
    TButton *HeadByNumberButton;
    TButton *HeadByIDButton;
    TButton *BodyByNumberButton;
    TButton *BodyByIDButton;
    TButton *StatByNumberButton;
    TButton *StatByIDButton;
    TButton *ListButton;
    TEdit *ArticleIDEdit;
    TLabel *Label2;
    TLabel *Label3;
    TLabel *Label4;
    TButton *PostButton;
    TButton *QuitButton;
    TEdit *FileEdit;
    TLabel *Label5;
    TButton *NewGroupsButton;
    TButton *NewNewsButton;
    TButton *HelpButton;
    TButton *XOverButton;
    TButton *OverViewFmtButton;
    TButton *DateButton;
    TEdit *UserEdit;
    TLabel *Label6;
    TLabel *Label7;
    TEdit *UserNameEdit;
    TLabel *Label8;
    TEdit *PasswordEdit;
    TButton *AuthenticateButton;
    TButton *ModeReaderButton;
    TButton *XHdrButton;
    TButton *ListMotdButton;
    TLabel *Label9;
    TEdit *PortEdit;
    TSslContext *SslContext1;
    void __fastcall ConnectButtonClick(TObject *Sender);
    void __fastcall NntpCli1SessionConnected(TObject *Sender, System::Word ErrCode);
    void __fastcall NntpCli1SessionClosed(TObject *Sender, System::Word ErrCode);
    void __fastcall AbortButtonClick(TObject *Sender);
    void __fastcall GroupButtonClick(TObject *Sender);
    void __fastcall NntpCli1RequestDone(TObject *Sender, TNntpRequest RqType, System::Word ErrCode);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall ArticleByNumberButtonClick(TObject *Sender);
    void __fastcall NntpCli1DataAvailable(TObject *Sender, System::Word ErrCode);
    void __fastcall NntpCli1MessageLine(TObject *Sender);
    void __fastcall NntpCli1MessageBegin(TObject *Sender);
    void __fastcall NntpCli1MessageEnd(TObject *Sender);
    void __fastcall ArticleByIDButtonClick(TObject *Sender);
    void __fastcall NextButtonClick(TObject *Sender);
    void __fastcall LastButtonClick(TObject *Sender);
    void __fastcall HeadByIDButtonClick(TObject *Sender);
    void __fastcall HeadByNumberButtonClick(TObject *Sender);
    void __fastcall BodyByIDButtonClick(TObject *Sender);
    void __fastcall BodyByNumberButtonClick(TObject *Sender);
    void __fastcall StatByIDButtonClick(TObject *Sender);
    void __fastcall StatByNumberButtonClick(TObject *Sender);
    void __fastcall ListButtonClick(TObject *Sender);
    void __fastcall PostButtonClick(TObject *Sender);
    void __fastcall QuitButtonClick(TObject *Sender);
    void __fastcall NewGroupsButtonClick(TObject *Sender);
    void __fastcall NewNewsButtonClick(TObject *Sender);
    void __fastcall HelpButtonClick(TObject *Sender);
    void __fastcall XOverButtonClick(TObject *Sender);
    void __fastcall OverViewFmtButtonClick(TObject *Sender);
    void __fastcall DateButtonClick(TObject *Sender);
    void __fastcall AuthenticateButtonClick(TObject *Sender);
    void __fastcall ModeReaderButtonClick(TObject *Sender);
    void __fastcall XHdrButtonClick(TObject *Sender);
    void __fastcall NntpCli1XHdrBegin(TObject *Sender);
    void __fastcall NntpCli1XHdrEnd(TObject *Sender);
    void __fastcall NntpCli1XHdrLine(TObject *Sender);
    void __fastcall ListMotdButtonClick(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);

private:
    String FIniFileName;
    bool FInitialized = false;
    std::unique_ptr<TStream> FDataStream;

    TStream *GetStream();
    void Display(const String &Msg);
    void LineToStream(TStream &Stream, const AnsiString &Buf);

public:
    __fastcall TNNTPForm(TComponent *Owner);
    __fastcall ~TNNTPForm();
};

extern PACKAGE TNNTPForm *NNTPForm;

#endif
