⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preximtrans.pas

📁 一个很好的学习例子,有需要的请下载研究,
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  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 + -