BSOne.SFC/Tocsg.Module/RemoteSecu/EXE_RemoteSecuClient/RSecuClient.pas

281 lines
6.7 KiB
Plaintext

{*******************************************************}
{ }
{ CrmOeAgentClient }
{ }
{ Copyright (C) 2022 kku }
{ }
{*******************************************************}
unit RSecuClient;
interface
uses
Tocsg.ClientBase, Tocsg.Packet, Tocsg.PacketDefine, System.Classes, System.SysUtils,
Tocsg.StoredPacket, Winapi.Windows, Winapi.Messages;
const
DIR_TASK = 'Task\';
NAME_STORED_HEAD = 'DcsStd';
WM_CRMCLIENT_NOTIFICATION = WM_USER + 4939;
NOTI_RCV_TEST = 0;
NOTI_CLIENT_CONN = 1;
NOTI_CLIENT_DISCONN = 2;
REQ_RDP_OPEN = 3;
REQ_RDP_CLOSE = 4;
type
TSendStateKind = (sskDirect, sskStored);
TRSecuClient = class(TTgClientBase)
private
SendState_: TSendStateKind;
StdPkt_: TTgStoredPacket;
bSvLocal_: Boolean; // 서버와 연결 해제 시 지정된 패킷을 로컬에 저장할지
// 상태알림 메시지 전송 핸들 22_0411 08:57:10 kku
hRcvHwnd_: THandle;
sEmpNo_: String;
protected
function _ProcessSend(Send: ISendPacket): Boolean; override;
function _ProcessOther: Boolean; override;
procedure _ProcessSendFail(Send: ISendPacket); override;
procedure ConnectedEvent; override;
procedure DisconnectedEvent; override;
procedure ProcessRcvPacket(aRcv: IRcvPacket); override;
public
Constructor Create(hRcvHwnd: HWND; const sHost: String = ''; nPort: Integer = 0;
nReConnTerm: Integer = 2000; nPingTerm: Integer = 60000);
Destructor Destroy; override;
property EmpNo: String read sEmpNo_ write sEmpNo_;
end;
var
gClient: TRSecuClient = nil;
implementation
uses
Tocsg.Path, Tocsg.Encrypt, Tocsg.Network, Tocsg.DateTime, GlobalSocketDefine;
{ TRSecuClient }
Constructor TRSecuClient.Create(hRcvHwnd: HWND; const sHost: String = ''; nPort: Integer = 0;
nReConnTerm: Integer = 2000; nPingTerm: Integer = 60000);
procedure Init;
var
sCurDir: String;
begin
bSvLocal_ := false;
SendState_ := sskStored;
sCurDir := GetRunExePathDir;
StdPkt_ := TTgStoredPacket.Create(sCurDir + NAME_STORED_HEAD, ekAes256cbc);
end;
begin
Inherited Create(sHost, nPort, nReConnTerm, nPingTerm);
ASSERT(gClient = nil);
gClient := Self;
hRcvHwnd_ := hRcvHwnd;
sEmpNo_ := '';
Init;
end;
Destructor TRSecuClient.Destroy;
begin
gClient := nil;
Inherited;
FreeAndNil(StdPkt_);
end;
function TRSecuClient._ProcessSend(Send: ISendPacket): Boolean;
begin
Result := false;
if Send = nil then
exit;
try
// todo : 지연 전송 처리등
if not bConnected_ then
begin
if bSvLocal_ and (StdPkt_ <> nil) then
begin
case Send.Command of
3409345 : ;
else exit; // 로컬에 저장하고 서버에 접속 시 다시 보낼 패킷인지 체크
end;
StdPkt_.PushPacket(Send);
end;
end else
Result := Inherited;
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. _ProcessSend()');
end;
end;
function TRSecuClient._ProcessOther: Boolean;
var
sSend: String;
Send: ISendPacket;
begin
Result := false;
try
if bConnected_ then
begin
if SendState_ = sskStored then
begin
// 암호화 정보 송수신 완료 체크 22_0408 10:47:52 kku
if GetSendPauseState then
exit;
try
Lock;
try
sSend := StdPkt_.PopPacketStr;
finally
Unlock;
end;
except
on E: Exception do
begin
ECrmStoredPacket.TraceException(Self, E, 'Fail .. _ProcessOther() - PopPacketStr()');
exit;
end;
end;
if sSend <> '' then
begin
Result := true;
Send := TTgPacket.Create(sSend);
case Send.Command of
223434 :
begin
// 수집된 데이터 파일큐 처리 전송
Send.PacketKind := pkNormal;
Send.S['S0'] := ''; // 에이전트 식별 정보
end;
else exit;
// todo : 지정된 패킷만 처리 할지 판단
end;
// todo : 수집된 로컬 데이터 전송을 서버에 알림
SendPacket(Send);
end else begin
SendState_ := sskDirect;
// todo : 수집된 로컬 데이터 전송을 끝냈다고 서버에 알림
end;
end;
end;
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. _ProcessOther()');
end;
end;
procedure TRSecuClient._ProcessSendFail(Send: ISendPacket);
begin
try
if Send = nil then
exit;
Lock;
try
if StdPkt_ <> nil then
begin
case Send.Command of
23984239 : ;
else exit; // 다시 전송, 로컬 저장할 패킷인지 체크
end;
end;
finally
Unlock;
end;
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. _ProcessSendFail()');
end;
end;
procedure TRSecuClient.ConnectedEvent;
var
Send: ISendPacket;
begin
try
Inherited;
Send := TTgPacket.Create(RC_RSECU_INFO);
Send.S['EmpNo'] := sEmpNo_;
SendPacket(Send);
if hRcvHwnd_ <> 0 then
SendMessage(hRcvHwnd_, WM_CRMCLIENT_NOTIFICATION, NOTI_CLIENT_CONN, 0);
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. ConnectedEvent()');
end;
end;
procedure TRSecuClient.DisconnectedEvent;
begin
try
SendState_ := sskStored;
Inherited;
if hRcvHwnd_ <> 0 then
SendMessage(hRcvHwnd_, WM_CRMCLIENT_NOTIFICATION, NOTI_CLIENT_DISCONN, 0);
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. DisconnectedEvent()');
end;
end;
procedure TRSecuClient.ProcessRcvPacket(aRcv: IRcvPacket);
procedure process_TOC_TEST;
begin
if hRcvHwnd_ <> 0 then
SendMessage(hRcvHwnd_, WM_CRMCLIENT_NOTIFICATION, NOTI_RCV_TEST, NativeInt(aRcv));
end;
procedure process_RS_REQ_RDP_OPEN;
begin
if hRcvHwnd_ <> 0 then
SendMessage(hRcvHwnd_, WM_CRMCLIENT_NOTIFICATION, REQ_RDP_OPEN, NativeInt(aRcv));
end;
procedure process_RS_REQ_RDP_CLOSE;
begin
if hRcvHwnd_ <> 0 then
SendMessage(hRcvHwnd_, WM_CRMCLIENT_NOTIFICATION, REQ_RDP_CLOSE, NativeInt(aRcv));
SendPacket(TTgPacket.Create(RS_REQ_RDP_CLOSE));
end;
begin
try
case aRcv.Command of
TOC_TEST : process_TOC_TEST;
RS_REQ_RDP_DESTLIST,
RS_REQ_RDP_CONNECT : SendMessage(aRcv.Handle, aRcv.WndMessage, 0, NativeUInt(aRcv));
RS_REQ_RDP_OPEN : process_RS_REQ_RDP_OPEN;
RS_REQ_RDP_CLOSE : process_RS_REQ_RDP_CLOSE;
else Inherited;
end;
except
on E: Exception do
ECrmClient.TraceException(Self, E, 'Fail .. ProcessRcvPacket()');
end;
end;
end.