#ifndef OverbyteIcsTcpSrv1IPv6H
#define OverbyteIcsTcpSrv1IPv6H

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

#include "OverbyteIcsWSocket.hpp"
#include "OverbyteIcsWSocketS.hpp"
#include "OverbyteIcsWndControl.hpp"
#include "OverbyteIcsIniFiles.hpp"
#include "OverbyteIcsUtils.hpp"
#include "OverbyteIcsTypes.hpp"

const unsigned WM_APPSTARTUP = WM_USER + 1;

class TTcpSrvClient : public TWSocketClient
{
public:
    String RcvdLine;
    TDateTime ConnectTime;
    int ListeningSocketsPortNum = 0;
    __fastcall virtual TTcpSrvClient(TComponent *AOwner) : TWSocketClient(AOwner) {}
};

class TTcpSrvForm : public TForm
{
__published:
    TPanel *ToolPanel;
    TMemo *DisplayMemo;
    TWSocketServer *WSocketServer1;
    TButton *doStop;
    TButton *doStart;
    void __fastcall FormShow(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
    void __fastcall FormCreate(TObject *Sender);
    void __fastcall WSocketServer1ClientConnect(TObject *Sender, TWSocketClient *Client, System::Word Error);
    void __fastcall WSocketServer1ClientDisconnect(TObject *Sender, TWSocketClient *Client, System::Word Error);
    void __fastcall WSocketServer1BgException(TObject *Sender, Exception *E, bool &CanClose);
    void __fastcall WSocketServer1SessionClosed(TObject *Sender, System::Word ErrCode);
    void __fastcall WSocketServer1SessionAvailable(TObject *Sender, System::Word ErrCode);
    void __fastcall WSocketServer1Exception(TObject *Sender, ESocketException *SocExcept);
    void __fastcall doStartClick(TObject *Sender);
    void __fastcall doStopClick(TObject *Sender);

protected:
    void __fastcall WMAppStartup(TMessage &Msg);

    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_APPSTARTUP, TMessage, WMAppStartup)
    END_MESSAGE_MAP(TForm)

private:
    String FIniFileName;
    bool FInitialized = false;

    void Display(const String &Msg);
    void ProcessData(TTcpSrvClient *Client);
    void __fastcall WSocketServer1DebugDisplay(TObject *Sender, const String Msg);
    void __fastcall ClientDataAvailable(TObject *Sender, System::Word Error);
    void __fastcall ClientBgException(TObject *Sender, Exception *E, bool &CanClose);
    void __fastcall ClientLineLimitExceeded(TObject *Sender, int Cnt, bool &ClearData);

public:
    __fastcall TTcpSrvForm(TComponent *Owner);
    __property String IniFileName = {read = FIniFileName, write = FIniFileName};
};

extern PACKAGE TTcpSrvForm *TcpSrvForm;

#endif
