#ifndef OverbyteIcsSslFtpTst1H
#define OverbyteIcsSslFtpTst1H

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

#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsWndControl.hpp"
#include "OverbyteIcsFtpCli.hpp"
#include "OverbyteIcsFtpSrvT.hpp"
#include "OverbyteIcsSslBase.hpp"
#include "OverbyteIcsTypes.hpp"

#include <memory>

typedef bool __fastcall (__closure *TSyncCmd)();
typedef void __fastcall (__closure *TAsyncCmd)();

class TFtpReceiveForm : public TForm
{
__published:
    TMemo *DisplayMemo;
    TSslFtpClient *FtpClient1;
    TPanel *Panel1;
    TButton *ExitButton;
    TButton *OpenAsyncButton;
    TButton *QuitAsyncButton;
    TButton *CwdAsyncButton;
    TButton *UserAsyncButton;
    TButton *PassAsyncButton;
    TButton *ConnectAsyncButton;
    TButton *GetAsyncButton;
    TButton *ReceiveAsyncButton;
    TButton *AbortAsyncButton;
    TButton *DirAsyncButton;
    TButton *DirectoryAsyncButton;
    TButton *LsAsyncButton;
    TButton *ListAsyncButton;
    TButton *SystAsyncButton;
    TButton *SystemAsyncButton;
    TButton *FileSizeAsyncButton;
    TButton *SizeAsyncButton;
    TButton *MkdAsyncButton;
    TButton *MkdirAsyncButton;
    TButton *RmdAsyncButton;
    TButton *RmdirAsyncButton;
    TButton *RenAsyncButton;
    TButton *RenameAsyncButton;
    TButton *DeleAsyncButton;
    TButton *DeleteAsyncButton;
    TButton *PwdAsyncButton;
    TButton *QuoteAsyncButton;
    TButton *DoQuoteAsyncButton;
    TButton *PutAsyncButton;
    TButton *TransmitAsyncButton;
    TButton *TypeSetAsyncButton;
    TButton *RestGetAsyncButton;
    TButton *RestartGetAsyncButton;
    TButton *CDupAsyncButton;
    TPanel *Panel2;
    TLabel *Label1;
    TLabel *Label3;
    TLabel *Label4;
    TLabel *Label5;
    TLabel *Label2;
    TLabel *Label6;
    TEdit *HostNameEdit;
    TEdit *HostFileEdit;
    TEdit *UserNameEdit;
    TEdit *PassWordEdit;
    TCheckBox *DisplayCheckBox;
    TEdit *LocalFileEdit;
    TCheckBox *BinaryCheckBox;
    TEdit *HostDirEdit;
    TEdit *PortEdit;
    TLabel *InfoLabel;
    TLabel *StateLabel;
    TButton *ClearButton;
    TCheckBox *SyncCheckBox;
    TButton *AppendFileAsyncButton;
    TButton *AppendAsyncButton;
    TCheckBox *PassiveCheckBox;
    TButton *Button1;
    TButton *RestPutAsyncButton;
    TButton *RestartPutAsyncButton;
    TEdit *ResumeAtEdit;
    TLabel *Label7;
    TCheckBox *NoAutoResumeAtCheckBox;
    TButton *TransmitUsingStreamButton;
    TButton *ReceiveUsingStreamButton;
    TButton *StressPutButton;
    TButton *AbortXferAsyncButton;
    TLabel *Label8;
    TEdit *DataPortRangeStartEdit;
    TEdit *DataPortRangeEndEdit;
    TLabel *Label9;
    TButton *AuthButton;
    TButton *AcctAsyncButton;
    TLabel *Label10;
    TEdit *AccountEdit;
    TLabel *Label11;
    TEdit *CertFileEdit;
    TLabel *Label12;
    TEdit *CAFileEdit;
    TEdit *CAPathEdit;
    TEdit *PrivKeyFileEdit;
    TLabel *Label13;
    TLabel *Label14;
    TEdit *PassPhraseEdit;
    TCheckBox *VerifyPeerCheckBox;
    TLabel *Label15;
    TLabel *Label16;
    TEdit *AcceptableHostsEdit;
    TButton *ProtButton;
    TButton *PbszButton;
    TLabel *Label17;
    TLabel *Label18;
    TEdit *PbszSizeEdit;
    TEdit *ProtLevelEdit;
    TSslContext *SslContext1;
    TButton *FeatButton;
    TCheckBox *SessCacheCheckBox;
    TComboBox *SslTypeComboBox;
    TLabel *Label19;
    TLabel *Label20;
    TEdit *SslPortEdit;
    TLabel *Label21;
    TButton *SslRenegotiateButton;
    TButton *CccButton;
    TComboBox *OptsEdit;
    TButton *ClearTraceButton;
    TLabel *Label23;
    TButton *OptsAsyncButton;
    TEdit *MaxKbEdit;
    TLabel *Label22;
    void __fastcall ExitButtonClick(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall OpenAsyncButtonClick(TObject *Sender);
    void __fastcall FtpClient1RequestDone(TObject *Sender, TFtpRequest RqType, System::Word ErrCode);
    void __fastcall QuitAsyncButtonClick(TObject *Sender);
    void __fastcall CwdAsyncButtonClick(TObject *Sender);
    void __fastcall UserAsyncButtonClick(TObject *Sender);
    void __fastcall PassAsyncButtonClick(TObject *Sender);
    void __fastcall ConnectAsyncButtonClick(TObject *Sender);
    void __fastcall FtpClient1StateChange(TObject *Sender);
    void __fastcall GetAsyncButtonClick(TObject *Sender);
    void __fastcall ReceiveAsyncButtonClick(TObject *Sender);
    void __fastcall AbortAsyncButtonClick(TObject *Sender);
    void __fastcall DirAsyncButtonClick(TObject *Sender);
    void __fastcall DirectoryAsyncButtonClick(TObject *Sender);
    void __fastcall LsAsyncButtonClick(TObject *Sender);
    void __fastcall ListAsyncButtonClick(TObject *Sender);
    void __fastcall SystAsyncButtonClick(TObject *Sender);
    void __fastcall SystemAsyncButtonClick(TObject *Sender);
    void __fastcall FileSizeAsyncButtonClick(TObject *Sender);
    void __fastcall SizeAsyncButtonClick(TObject *Sender);
    void __fastcall MkdAsyncButtonClick(TObject *Sender);
    void __fastcall MkdirAsyncButtonClick(TObject *Sender);
    void __fastcall RmdAsyncButtonClick(TObject *Sender);
    void __fastcall RmdirAsyncButtonClick(TObject *Sender);
    void __fastcall RenAsyncButtonClick(TObject *Sender);
    void __fastcall RenameAsyncButtonClick(TObject *Sender);
    void __fastcall DeleAsyncButtonClick(TObject *Sender);
    void __fastcall DeleteAsyncButtonClick(TObject *Sender);
    void __fastcall PwdAsyncButtonClick(TObject *Sender);
    void __fastcall QuoteAsyncButtonClick(TObject *Sender);
    void __fastcall DoQuoteAsyncButtonClick(TObject *Sender);
    void __fastcall PutAsyncButtonClick(TObject *Sender);
    void __fastcall TransmitAsyncButtonClick(TObject *Sender);
    void __fastcall TypeSetAsyncButtonClick(TObject *Sender);
    void __fastcall RestGetAsyncButtonClick(TObject *Sender);
    void __fastcall RestartGetAsyncButtonClick(TObject *Sender);
    void __fastcall CDupAsyncButtonClick(TObject *Sender);
    void __fastcall ClearButtonClick(TObject *Sender);
    void __fastcall AppendAsyncButtonClick(TObject *Sender);
    void __fastcall AppendFileAsyncButtonClick(TObject *Sender);
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall RestPutAsyncButtonClick(TObject *Sender);
    void __fastcall RestartPutAsyncButtonClick(TObject *Sender);
    void __fastcall TransmitUsingStreamButtonClick(TObject *Sender);
    void __fastcall ReceiveUsingStreamButtonClick(TObject *Sender);
    void __fastcall StressPutButtonClick(TObject *Sender);
    void __fastcall AbortXferAsyncButtonClick(TObject *Sender);
    void __fastcall AcctAsyncButtonClick(TObject *Sender);
    void __fastcall FtpClient1DisplayFile(TObject *Sender, String &Msg);
    void __fastcall ProtButtonClick(TObject *Sender);
    void __fastcall PbszButtonClick(TObject *Sender);
    void __fastcall FtpClient1SslCliNewSession(TObject *Sender, void *SslSession, bool WasReused, bool &IncRefCount);
    void __fastcall FtpClient1SslCliGetSession(TObject *Sender, void *&SslSession, bool &FreeSession);
    void __fastcall FeatButtonClick(TObject *Sender);
    void __fastcall FtpClient1SslCliCertRequest(TObject *Sender, TX509Base *&Cert);
    void __fastcall AuthButtonClick(TObject *Sender);
    void __fastcall SslRenegotiateButtonClick(TObject *Sender);
    void __fastcall CccButtonClick(TObject *Sender);
    void __fastcall OptsAsyncButtonClick(TObject *Sender);
    void __fastcall FtpClient1Progress64(TObject *Sender, __int64 Count, bool &Abort);

private:
    String FIniFileName;
    bool FInitialized = false;
    unsigned __int64 FLastProgress = 0;
    __int64 FProgressCount = 0;
    bool FRunning = false;
    void *FCachedSession = nullptr;
    std::unique_ptr<TX509List> FClientCerts;
    void __fastcall DisplayHandler(TObject *Sender, String &Msg);
    void DisplayFile(const String &FileName);
    void ExecuteCmd(TSyncCmd SyncCmd, TAsyncCmd AsyncCmd, bool DirListing = false);
    bool SendFile();
    void Display(const String &Msg);

public:
    __fastcall TFtpReceiveForm(TComponent *Owner);
    __fastcall virtual ~TFtpReceiveForm();
};

extern PACKAGE TFtpReceiveForm *FtpReceiveForm;

#endif
