1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
//------------------------------------------------------------------------------
class procedure Txxx.RemoteMessageIdleEventHandler(Sender: TObject; AIdleSocket: TRemoteMessageSocketHandle);
begin
// Que faire en cas d'échec du KeepAlive ?
if not RemoteMessageSystemKeepAlive(AIdleSocket) then
if Assigned(FOnKeepAliveError) then
FOnKeepAliveError(AIdleSocket);
end;
//------------------------------------------------------------------------------
class function Txxx.RemoteMessageSystemKeepAlive(ATarget: TRemoteMessageSocketHandle = 0): Boolean;
var
rmska: TRemoteMessageSystemKeepAlive;
begin
rmska.TimeStamp := Now();
Result := RemoteMessageSystem(rmstKeepAlive, @rmska, SizeOf(rmska), ATarget);
end;
//------------------------------------------------------------------------------
class function Txxx.RemoteMessageSystem(ASystemType: TRemoteMessageSystemType; ASystemData: Pointer; ASystemDataLen: Integer; ATarget: TRemoteMessageSocketHandle = 0): Boolean;
var
rm: TRemoteMessage;
begin
rm.MessageType := rmtSystem;
rm.System.SystemType := ASystemType;
rm.System.SystemData := ASystemData;
rm.System.SystemDataLen := ASystemDataLen;
Result := RemoteMessage(rm, ATarget);
end;
//------------------------------------------------------------------------------
class function Txxx.RemoteMessage(ARemoteMessage: TRemoteMessage; ATarget: TRemoteMessageSocketHandle = 0): Boolean;
var
MemoryStream: TMemoryStream;
begin
Result := False;
try
case ARemoteMessage.MessageType of
rmtSystem:
begin
MemoryStream := TMemoryStream.Create();
try
MemoryStream.Write(ARemoteMessage.MessageType, SizeOf(ARemoteMessage.MessageType));
MemoryStream.Write(ARemoteMessage.System.SystemType, SizeOf(ARemoteMessage.System.SystemType));
MemoryStream.Write(ARemoteMessage.System.SystemDataLen, SizeOf(ARemoteMessage.System.SystemDataLen));
if Assigned(ARemoteMessage.System.SystemData) and (ARemoteMessage.System.SystemDataLen > 0) then
MemoryStream.WriteBuffer(PByte(ARemoteMessage.System.SystemData)^, ARemoteMessage.System.SystemDataLen);
// Envoi du Message immédiatement ou de façon asynchrone
if FRemoteModuleMessenger.IsClient then
Result := InternalRemoteMessage(AsynchronousMode, rmdClientToServer, MemoryStream.Memory, MemoryStream.Size)
else if FRemoteModuleMessenger.IsServer and (ATarget <> 0) then
Result := InternalRemoteMessage(AsynchronousMode, rmdServerToClient, MemoryStream.Memory, MemoryStream.Size, ATarget)
else if FRemoteModuleMessenger.IsServer and (ATarget = 0) then
Result := InternalRemoteMessage(AsynchronousMode, rmdServerToAllClient, MemoryStream.Memory, MemoryStream.Size);
finally
MemoryStream.Free();
end;
end;
rmtBusiness:
begin
// Envoi du Message immédiatement ou de façon asynchrone
if FRemoteModuleMessenger.IsClient then
Result := InternalRemoteMessage(AsynchronousMode, rmdClientToServer, @ARemoteMessage, SizeOf(ARemoteMessage));
end;
rmtBusinessResponse:
begin
MemoryStream := TMemoryStream.Create();
try
MemoryStream.Write(ARemoteMessage.MessageType, SizeOf(ARemoteMessage.MessageType));
MemoryStream.Write(ARemoteMessage.BusinessResponse.BusinessRequest, SizeOf(ARemoteMessage.BusinessResponse.BusinessRequest));
MemoryStream.Write(ARemoteMessage.BusinessResponse.BusinessResponseState, SizeOf(ARemoteMessage.BusinessResponse.BusinessResponseState));
MemoryStream.Write(ARemoteMessage.BusinessResponse.BusinessResponseTreatStep, SizeOf(ARemoteMessage.BusinessResponse.BusinessResponseTreatStep));
MemoryStream.Write(ARemoteMessage.BusinessResponse.BusinessResponseCode, SizeOf(ARemoteMessage.BusinessResponse.BusinessResponseCode));
MemoryStream.Write(ARemoteMessage.BusinessResponse.BusinessResponseDataLen, SizeOf(ARemoteMessage.BusinessResponse.BusinessResponseDataLen));
if Assigned(ARemoteMessage.BusinessResponse.BusinessResponseData) and (ARemoteMessage.BusinessResponse.BusinessResponseDataLen > 0) then
MemoryStream.WriteBuffer(PByte(ARemoteMessage.BusinessResponse.BusinessResponseData)^, ARemoteMessage.BusinessResponse.BusinessResponseDataLen);
// Envoi du Message immédiatement ou de façon asynchrone
if FRemoteModuleMessenger.IsServer then
Result := InternalRemoteMessage(AsynchronousMode, rmdServerToClient, MemoryStream.Memory, MemoryStream.Size, ATarget);
finally
MemoryStream.Free();
end;
end;
rmtEvent:
begin
// Envoi du Message immédiatement ou de façon asynchrone
if FRemoteModuleMessenger.IsServer then
Result := InternalRemoteMessage(AsynchronousMode, rmdServerToAllClient, @ARemoteMessage, SizeOf(ARemoteMessage));
end;
end;
except
on E: Exception do
begin
OutputDebugString(PChar(Format('Txxx.RemoteMessage() - %s : %s', [E.ClassName(), E.Message])));
Result := False;
end;
end;
end;
//------------------------------------------------------------------------------
class function Txxx.InternalRemoteMessage(AAsynchronousMode: Boolean; ADestination: TRemoteMessageDestination; AData: Pointer; ADataLen: Integer; ATarget: TRemoteMessageSocketHandle = 0): Boolean;
begin
Result := False;
if AAsynchronousMode and Assigned(FAsynchronousSender) then
begin
// Envoi du Message de façon asynchrone
Result := FAsynchronousSender.AddRemoteMessage(ADestination, AData, ADataLen, ATarget);
end
else
begin
// Envoi du Message immédiatement
FRemoteModuleMessengerLock.Acquire();
try
if ADestination = rmdClientToServer then
Result := FRemoteModuleMessenger.SendDataToServer(AData, ADataLen)
else if ADestination = rmdServerToClient then
Result := FRemoteModuleMessenger.SendDataToClient(ATarget, AData, ADataLen)
else if ADestination = rmdServerToAllClient then
Result := FRemoteModuleMessenger.SendDataToAllClient(AData, ADataLen);
finally
FRemoteModuleMessengerLock.Release();
end;
end;
end; |
Partager