legatt 32f4597c4d Base frontend module
- Naming style migrated to camel-case
- P7lib logger sources added
- Vcpkg manifest, CMake presets and build moved to root
- SDL2, Vulkan and RmlUi dependencies added
- Logger LOG macro added
- Logger  configuration
- SDL2 window configuration
- Vulkan configuration
- RmlUi configuration
- SDL event loop
2025-08-08 00:07:32 +03:00

185 lines
7.0 KiB
C++

////////////////////////////////////////////////////////////////////////////////
// /
// 2012-2020 (c) Baical /
// /
// This library is free software; you can redistribute it and/or /
// modify it under the terms of the GNU Lesser General Public /
// License as published by the Free Software Foundation; either /
// version 3.0 of the License, or (at your option) any later version. /
// /
// This library is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU /
// Lesser General Public License for more details. /
// /
// You should have received a copy of the GNU Lesser General Public /
// License along with this library. /
// /
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// This header file provide functionality to deliver data to baical server /
// over UDP /
////////////////////////////////////////////////////////////////////////////////
#ifndef CLBAICAL_H
#define CLBAICAL_H
class CClBaical:
public CClient
{
tINT32 volatile m_lReject_Mem;
tINT32 volatile m_lReject_Con;
tINT32 volatile m_lReject_Int;
tBOOL m_bIs_Winsock;
CUDP_Socket *m_pSocket;
tUINT16 m_wClient_ID;
CBuffers_Pool *m_pBPool;
CBList<CTPacket*> *m_pData_Wnd;
pAList_Cell m_pData_Wnd_Cell;
tBOOL m_bData_Wnd_Fixed;
tUINT32 m_dwData_Wnd_Max_Count;
tUINT32 m_dwData_Wnd_Size;
tUINT32 m_dwData_Wnd_TimeStamp;
tUINT32 m_dwData_Wnd_First_ID;
tUINT32 m_dwData_Wnd_Last_ID;
tBOOL m_bData_Resending;
tUINT32 m_dwDelivery_Fails;
tBOOL m_bIs_Response_Waiting;
CBList<CTPacket*> *m_pData_Queue_Out;
//need to synchronize updating m_pData_Queue by user and requests from internal threads
tLOCK m_hCS_Data_Out;
CBList<CTPacket*> *m_pData_Queue_In;
tLOCK m_hCS_Data_In;
tUINT32 m_dwLast_Packet_ID;
tUINT32 m_dwServiceTimeStamp;
tUINT32 m_dwExit_TimeOut;
//permanent packets, they do not consume a lot of memory and more
//practical have them always instead of taking them from pool
CTPacket *m_pPacket_Control;
CTPClient_Hello m_cPacket_Hello;
CTPData_Window m_cPacket_Data_Report;
CTPClient_Ping m_cPacket_Alive;
CTPClient_Bye m_cPacket_Bye;
tBOOL m_bBig_Endian;
CMEvent m_cConn_Event;
tBOOL m_bConn_Event;
CMEvent m_cComm_Event;
tBOOL m_bComm_Thread;
CThShell::tTHREAD m_hComm_Thread;
CMEvent m_cChnl_Event;
tBOOL m_bChnl_Thread;
CThShell::tTHREAD m_hChnl_Thread;
tBOOL m_bLocalHost;
tBOOL m_bExtension;
void *m_pHdrUsrData;
CTPacket *m_pHdrUsrPacket;
tUINT32 m_uHdrUsrSize;
tUINT32 m_uHdrUsrChannel;
public:
CClBaical(tXCHAR **i_pArgs,
tINT32 i_iCount
);
virtual ~CClBaical();
private:
eClient_Status Init_Base(tXCHAR **i_pArgs,
tINT32 i_iCount
);
eClient_Status Init_Log(tXCHAR **i_pArgs,
tINT32 i_iCount
);
eClient_Status Init_Sockets(tXCHAR **i_pArgs,
tINT32 i_iCount
);
eClient_Status Init_Pool(tXCHAR **i_pArgs,
tINT32 i_iCount
);
eClient_Status Init_Members(tXCHAR **i_pArgs,
tINT32 i_iCount
);
//eClient_Status Init_Threads(tXCHAR **i_pArgs,
// tINT32 i_iCount
// );
void Inc_Packet_ID(tUINT32 * o_pPacketID);
tBOOL Process_Incoming_Packet(CTPacket *i_pPacket);
CTPacket *Get_Delivered_Packet();
tBOOL Is_Ready_To_Exit();
void Set_Connected(tBOOL i_bConnected);
void Reset_Connetion();
CTPacket *Create_Data_Wnd_Report();
inline CTPacket *Pull_Firt_Data_Packet();
inline CTPacket *Reuse_Data_Packet(CTPData &i_rData, tUINT32 i_uChannel, tUINT32 i_uSize);
inline tBOOL Push_Last_Data_Packet(CTPacket *i_pPacket);
inline void Parse_Extensions(tUINT8 *i_pBuffer, size_t i_szBuffer);
inline void Parse_User_Data(tUINT8 *i_pBuffer, size_t i_szBuffer);
inline void Update_Channels_Status(tBOOL i_bConnected, tUINT32 i_dwResets);
void Comm_Routine();
void Chnl_Routine();
public:
tBOOL Connection_Wait(tUINT32 i_dwMilliseconds);
eClient_Status Sent(tUINT32 i_dwChannel_ID,
sP7C_Data_Chunk *i_pChunks,
tUINT32 i_dwCount,
tUINT32 i_dwSize
);
tBOOL Get_Info(sP7C_Info *o_pInfo);
tBOOL Close();
virtual void Flush();
private:
static THSHELL_RET_TYPE THSHELL_CALL_TYPE Static_Comm_Routine(void *i_pContext)
{
CClBaical *l_pRoutine = static_cast<CClBaical *>(i_pContext);
if (l_pRoutine)
{
l_pRoutine->Comm_Routine();
}
CThShell::Cleanup();
return THSHELL_RET_OK;
}
static THSHELL_RET_TYPE THSHELL_CALL_TYPE Static_Chnl_Routine(void *i_pContext)
{
CClBaical *l_pRoutine = static_cast<CClBaical *>(i_pContext);
if (l_pRoutine)
{
l_pRoutine->Chnl_Routine();
}
CThShell::Cleanup();
return THSHELL_RET_OK;
}
};
#endif //CLBAICAL_H