📄 preximtrans.pas
字号:
DataSize: integer);
var
ATmpStream: TTempFileStream;
AResponse: TResponseHead;
AFlag: boolean;
AErrMsg: string;
begin
// check current state
if CheckStateIsAuth(AThread) then // not logged
begin
AResponse.VResult := VR_STATEERROR;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
exit;
end;
if assigned(FOnReceived) then
begin
// notify client to send data
AResponse.VResult := VR_SUCCESS;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
// read data from client
ATmpStream := TTempFileStream.Create(Temp_Prefix);
try
AThread.Connection.ReadStream(ATmpStream, DataSize);
// notify a OnReceived event
AFlag := true;
ATmpStream.Position := 0;
FOnOperate(ATmpStream, AThread.Username, AFlag, AErrMsg);
AThread.LastErrorMsg := AErrMsg;
// AFlag is true means processing stream successfully
if AFlag then
begin
AResponse.VResult := VR_SUCCESS;
AResponse.Length := Zero_Length;
end
else begin
AResponse.VResult := VR_FAILURE;
AResponse.Length := Zero_Length;
end;
// return
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
finally
ATmpStream.Free;
end;
end
else begin // not implementation OnReceived event
AResponse.VResult := VR_UNIMPLEMENTATION;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
end;
end;
procedure TImageTransServer.DoReceived(AThread: TImageServerThread;
DataSize: integer);
var
ATmpStream: TTempFileStream;
AResponse: TResponseHead;
AFlag: boolean;
AErrMsg: string;
begin
// check current state
if CheckStateIsAuth(AThread) then // not logged
begin
AResponse.VResult := VR_STATEERROR;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
exit;
end;
if assigned(FOnReceived) then
begin
// notify client to send data
AResponse.VResult := VR_SUCCESS;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
// read data from client
ATmpStream := TTempFileStream.Create(Temp_Prefix);
try
AThread.Connection.ReadStream(ATmpStream, DataSize);
// notify a OnReceived event
AFlag := true;
ATmpStream.Position := 0;
FOnReceived(ATmpStream, AThread.Username, AFlag, AErrMsg);
AThread.LastErrorMsg := AErrMsg;
// AFlag is true means processing stream successfully
if AFlag then
begin
AResponse.VResult := VR_SUCCESS;
AResponse.Length := Zero_Length;
end
else begin
AResponse.VResult := VR_FAILURE;
AResponse.Length := Zero_Length;
end;
// return
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
finally
ATmpStream.Free;
end;
end
else begin // not implementation OnReceived event
AResponse.VResult := VR_UNIMPLEMENTATION;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
end;
end;
procedure TImageTransServer.DoRetrieve(AThread: TImageServerThread;
DataSize: integer);
var
AResponse: TResponseHead;
Flag: boolean;
ATempStream: TTempFileStream;
AErrMsg: string;
begin
// check current state
if CheckStateIsAuth(AThread) then
begin
AResponse.VResult := VR_STATEERROR;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
exit;
end;
// process request
if assigned(OnRetrieve) then
begin
// notify client to send data
AResponse.VResult := VR_SUCCESS;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
ATempStream := TTempFileStream.Create(Temp_Prefix);
try
AThread.Connection.ReadStream(ATempStream, DataSize);
Flag := true;
FOnRetrieve(ATempStream, AThread.Username, Flag, AErrMsg);
AThread.LastErrorMsg := AErrMsg;
// make a response
if Flag then
begin
ATempStream.Position := 0;
AResponse.VResult := VR_SUCCESS;
AResponse.Length := ATempStream.Size;
end
else begin
AResponse.VResult := VR_FAILURE;
AResponse.Length := ATempStream.Size;
end;
with AThread.Connection do
begin
WriteBuffer(AResponse, Sizeof(AResponse));
if AResponse.Length > 0 then
WriteStream(ATempStream);
end;
finally
ATempStream.Free;
end;
end
else begin
AResponse.VResult := VR_UNIMPLEMENTATION;
AResponse.Length := Zero_Length;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
end;
end;
procedure TImageTransServer.DoUnknown(AThread: TImageServerThread);
var
AResponse: TResponseHead;
begin
if assigned(fOnUnknown) then
FOnUnknown(AThread)
else begin
AResponse.VResult := VR_UNKNOWN;
AResponse.Length := ZERO_LENGTH;
AThread.Connection.WriteBuffer(AResponse, Sizeof(AResponse));
end;
end;
function TImageTransServer.GetCryptKey(hSeed: integer): TPrivateKey;
begin
Result[0] := BaseKey[0] and (hSeed shl 1);
Result[1] := BaseKey[1] or (hSeed shl 2);
Result[2] := BaseKey[2] xor (hSeed shl 3);
Result[3] := BaseKey[3] and (hSeed shr 1);
Result[4] := BaseKey[4] or (hSeed shr 2);
Result[5] := BaseKey[5] xor (hSeed shr 3);
Result[6] := BaseKey[6] and (hSeed shl 1);
Result[7] := BaseKey[7] xor (hSeed shl 2);
Result[8] := BaseKey[8] or (hSeed shl 3);
Result[9] := BaseKey[9] and (hSeed shr 1);
Result[10] := BaseKey[10] and (hSeed shr 2);
Result[11] := BaseKey[11] xor (hSeed shr 3);
Result[12] := BaseKey[12] and (hSeed shl 1);
Result[13] := BaseKey[13] or (hSeed shr 2);
Result[14] := BaseKey[14] and (hSeed shr 1);
Result[15] := BaseKey[15] xor (hSeed shl 2);
end;
function TImageTransServer.GetEncryptType(hSeed: integer): TEncryptType;
var
AMod: integer;
begin
AMod := hSeed mod 3;
case AMod of
1: Result := etCBC ;
2: Result := etOFB ;
else Result := etECB
end;
end;
function TImageTransServer.GetLastError: string;
begin
Result := FErrorMsg;
end;
{ TImageTransClient }
constructor TImageTransClient.Create;
begin
inherited;
FillChar(fRequest, SizeOf(TRequestHead), 0);
FillChar(fConnRep, SizeOf(TLoginResponse), 0);
FillChar(fResponse, SizeOf(TResponseHead), 0);
FErrorCode := VR_SUCCESS;
fRequest.Operate := opOperateNone;
end;
procedure TImageTransClient.DoOnConnected;
begin
inherited;
if Connected then
ReadBuffer(fConnRep, Sizeof(fConnRep));
end;
procedure TImageTransClient.GetErrorMsg;
begin
// Make a request
fRequest.Operate := opGetLastError;
fRequest.Length := Zero_Length;
// Send request
WriteBuffer(fRequest, Sizeof(fRequest));
FErrorMsg := Readln;
end;
function TImageTransClient.GetLastError(var ErrorCode: integer): string;
begin
Result := FErrorMsg;
ErrorCode := FErrorCode;
end;
function TImageTransClient.GetUserProfile(Stream: TStream): boolean;
begin
// Make a request
fRequest.Operate := opGetUserProfile;
fRequest.Length := Zero_Length;
// Send request
WriteBuffer(fRequest, Sizeof(fRequest));
// get response from server for get current user's profile
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
if FResponse.VResult=VR_SUCCESS then
// read user's profiles
ReadStream(Stream, FResponse.Length);
Result := FResponse.VResult=VR_SUCCESS;
if not Result then
begin
GetErrorMsg;
Raise Exception.Create(FErrorMsg);
end;
end;
function TImageTransClient.Login(const Username,
Password: string; var UserRight: TUserRight): Boolean;
var
ALgnData: TLoginData;
AKey: TPrivateKey;
buf: string;
AStream: TMemoryStream;
begin
UserRight := [];
// Make a request
fRequest.Operate := opLogin;
fRequest.Length := Zero_Length;
// Send log request
WriteBuffer(fRequest, Sizeof(fRequest));
AKey := fConnRep.EncryptKey;
Encrypt(@AKey, 16, Password, Length(Password), fConnRep.EncryptType, buf);
// Send log information
ALgnData.Username := Username;
ALgnData.PwdCrypt := Buf;
WriteBuffer(ALgnData, Sizeof(TLoginData));
// get response from server for login
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
// Read User Right
if (FResponse.VResult=VR_SUCCESS) and (FResponse.Length>Zero_Length) then
begin
AStream := TMemoryStream.Create;
try
ReadStream(AStream, FResponse.Length);
AStream.Position := 0;
ReadUserRightFromStream(AStream, UserRight);
finally
AStream.Free;
end;
end;
FErrorCode := FResponse.VResult;
Result := FErrorCode=VR_SUCCESS;
if not Result then
begin
GetErrorMsg;
Raise Exception.Create(FErrorMsg);
end;
end;
procedure TImageTransClient.Logout;
begin
fRequest.Operate := opLogout;
fRequest.Length := Zero_Length;
WriteBuffer(fRequest, Sizeof(fRequest));
if Connected then Disconnect;
end;
function TImageTransClient.Operate(Stream: TStream): Boolean;
begin
// Make a request
fRequest.Operate := opControl;
fRequest.Length := Stream.Size;
// Send request
WriteBuffer(fRequest, Sizeof(fRequest));
// get response from server for prepare retrieving data
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
if FResponse.VResult=VR_SUCCESS then
begin
// send data
WriteStream(Stream);
// get response from server for retrieving data
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
end;
Result := FResponse.VResult=VR_SUCCESS;
if not Result then
begin
GetErrorMsg;
Raise Exception.Create(FErrorMsg);
end;
end;
function TImageTransClient.Retrieve(Stream: TStream): boolean;
begin
// Make a request
fRequest.Operate := opRetrieve;
fRequest.Length := Stream.Size;
// Send request
WriteBuffer(fRequest, Sizeof(fRequest));
// get response from server for retrieving request data
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
if FResponse.VResult=VR_SUCCESS then
begin
// Send request data to stream
WriteStream(Stream);
Stream.Position := 0;
// get response from server for retrieving data
Fillchar(FResponse, Sizeof(FResponse), 0);
ReadBuffer(FResponse, Sizeof(FResponse));
// retrieve data
if FResponse.VResult=VR_SUCCESS then
ReadStream(Stream, FResponse.Length);
end;
Result := FResponse.VResult=VR_SUCCESS;
if not Result then
begin
GetErrorMsg;
Raise Exception.Create(FErrorMsg);
end;
end;
function TImageTransClient.Send(Stream: TStream): boolean;
begin
// Make a request
fRequest.Operate := opSend;
fRequest.Length := Stream.Size;
// Send a request to query whether send stream to server or not
WriteBuffer(fRequest, Sizeof(fRequest));
// Read response from server for request
Fillchar(fResponse, Sizeof(fResponse), 0);
ReadBuffer(fResponse, Sizeof(fResponse));
FErrorCode := fResponse.VResult;
// Can send stream?
if fResponse.VResult=VR_SUCCESS then
begin
// Send stream
WriteStream(Stream);
// get response from server
Fillchar(fResponse, Sizeof(fResponse), 0);
ReadBuffer(fResponse, Sizeof(fResponse));
FErrorCode := fResponse.VResult;
end;
Result := FErrorCode=VR_SUCCESS;
if not Result then
begin
GetErrorMsg;
Raise Exception.Create(FErrorMsg);
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -