Browse Source

LoadAccountFromStream

PascalCoin 6 years ago
parent
commit
2779ca9458
2 changed files with 32 additions and 1 deletions
  1. 31 0
      src/core/UAccounts.pas
  2. 1 1
      src/core/UNetProtocol.pas

+ 31 - 0
src/core/UAccounts.pas

@@ -147,6 +147,7 @@ Type
     Class Function AccountInfo2RawString(const AccountInfo : TAccountInfo) : TRawBytes; overload;
     Class Function AccountInfo2RawString(const AccountInfo : TAccountInfo) : TRawBytes; overload;
     Class procedure AccountInfo2RawString(const AccountInfo : TAccountInfo; var dest : TRawBytes); overload;
     Class procedure AccountInfo2RawString(const AccountInfo : TAccountInfo; var dest : TRawBytes); overload;
     Class procedure SaveAccountToAStream(Stream: TStream; const Account : TAccount);
     Class procedure SaveAccountToAStream(Stream: TStream; const Account : TAccount);
+    Class function LoadAccountFromStream(Stream: TStream; var Account : TAccount) : Boolean;
     Class Function RawString2AccountInfo(const rawaccstr: TRawBytes): TAccountInfo; overload;
     Class Function RawString2AccountInfo(const rawaccstr: TRawBytes): TAccountInfo; overload;
     Class procedure RawString2AccountInfo(const rawaccstr: TRawBytes; var dest : TAccountInfo); overload;
     Class procedure RawString2AccountInfo(const rawaccstr: TRawBytes; var dest : TAccountInfo); overload;
     Class Function IsAccountLocked(const AccountInfo : TAccountInfo; blocks_count : Cardinal) : Boolean;
     Class Function IsAccountLocked(const AccountInfo : TAccountInfo; blocks_count : Cardinal) : Boolean;
@@ -430,6 +431,7 @@ Type
     Function Add(Const account : TAccount) : Integer;
     Function Add(Const account : TAccount) : Integer;
     Function Count : Integer;
     Function Count : Integer;
     Function Get(index : Integer) : TAccount;
     Function Get(index : Integer) : TAccount;
+    Function IndexOf(account_number: Cardinal) : Integer;
   End;
   End;
 
 
   TAccountPreviousBlockInfoData = Record
   TAccountPreviousBlockInfoData = Record
@@ -1049,7 +1051,10 @@ begin
 end;
 end;
 
 
 class procedure TAccountComp.SaveAccountToAStream(Stream: TStream; const Account: TAccount);
 class procedure TAccountComp.SaveAccountToAStream(Stream: TStream; const Account: TAccount);
+var w : Word;
 begin
 begin
+  w := CT_PROTOCOL_4;
+  Stream.Write(w,SizeOf(w));
   Stream.Write(Account.account,Sizeof(Account.account));
   Stream.Write(Account.account,Sizeof(Account.account));
   TStreamOp.WriteAnsiString(Stream,AccountInfo2RawString(Account.accountInfo));
   TStreamOp.WriteAnsiString(Stream,AccountInfo2RawString(Account.accountInfo));
   Stream.Write(Account.balance,Sizeof(Account.balance));
   Stream.Write(Account.balance,Sizeof(Account.balance));
@@ -1059,6 +1064,27 @@ begin
   Stream.Write(Account.account_type,SizeOf(Account.account_type));
   Stream.Write(Account.account_type,SizeOf(Account.account_type));
 end;
 end;
 
 
+class function TAccountComp.LoadAccountFromStream(Stream: TStream; var Account: TAccount): Boolean;
+var w : Word;
+  s : AnsiString;
+begin
+  Account := CT_Account_NUL;
+  Result := False;
+  if (Stream.Size - Stream.Position<8) then Exit;
+  Stream.Read(w,SizeOf(w));
+  if Not (w in [CT_PROTOCOL_4]) then Exit;
+  Stream.Read(Account.account,Sizeof(Account.account));
+  if TStreamOp.ReadAnsiString(Stream,s) < 0 then Exit;
+  TAccountComp.RawString2AccountInfo(s,Account.accountInfo);
+  if (Stream.Size - Stream.Position<20) then Exit;
+  Stream.Read(Account.balance,Sizeof(Account.balance));
+  Stream.Read(Account.updated_block,Sizeof(Account.updated_block));
+  Stream.Read(Account.n_operation,Sizeof(Account.n_operation));
+  if TStreamOp.ReadAnsiString(Stream,Account.name)<0 then Exit;
+  if Stream.Read(Account.account_type,SizeOf(Account.account_type)) <> 2 then Exit;
+  Result := True;
+end;
+
 class function TAccountComp.AccountKey2RawString(const account: TAccountKey): TRawBytes;
 class function TAccountComp.AccountKey2RawString(const account: TAccountKey): TRawBytes;
 begin
 begin
   AccountKey2RawString(account,Result);
   AccountKey2RawString(account,Result);
@@ -4547,6 +4573,11 @@ begin
   Result := PAccount(FList.Items[index])^;
   Result := PAccount(FList.Items[index])^;
 end;
 end;
 
 
+function TOrderedAccountList.IndexOf(account_number: Cardinal): Integer;
+begin
+  If Not Find(account_number,Result) then Result := -1;
+end;
+
 { TOrderedAccountKeysList }
 { TOrderedAccountKeysList }
 Type
 Type
   TOrderedAccountKeyList = Record
   TOrderedAccountKeyList = Record

+ 1 - 1
src/core/UNetProtocol.pas

@@ -375,7 +375,6 @@ Type
     procedure SetConnected(const Value: Boolean);
     procedure SetConnected(const Value: Boolean);
     procedure TcpClient_OnConnect(Sender: TObject);
     procedure TcpClient_OnConnect(Sender: TObject);
     procedure TcpClient_OnDisconnect(Sender: TObject);
     procedure TcpClient_OnDisconnect(Sender: TObject);
-    Function DoSendAndWaitForResponse(operation: Word; RequestId: Integer; SendDataBuffer, ReceiveDataBuffer: TStream; MaxWaitTime : Cardinal; var HeaderData : TNetHeaderData) : Boolean;
     procedure DoProcessBuffer;
     procedure DoProcessBuffer;
     Procedure DoProcess_Hello(HeaderData : TNetHeaderData; DataBuffer: TStream);
     Procedure DoProcess_Hello(HeaderData : TNetHeaderData; DataBuffer: TStream);
     Procedure DoProcess_Message(HeaderData : TNetHeaderData; DataBuffer: TStream);
     Procedure DoProcess_Message(HeaderData : TNetHeaderData; DataBuffer: TStream);
@@ -400,6 +399,7 @@ Type
   public
   public
     Constructor Create(AOwner : TComponent); override;
     Constructor Create(AOwner : TComponent); override;
     Destructor Destroy; override;
     Destructor Destroy; override;
+    Function DoSendAndWaitForResponse(operation: Word; RequestId: Integer; SendDataBuffer, ReceiveDataBuffer: TStream; MaxWaitTime : Cardinal; var HeaderData : TNetHeaderData) : Boolean;
     Function ConnectTo(ServerIP: String; ServerPort:Word) : Boolean;
     Function ConnectTo(ServerIP: String; ServerPort:Word) : Boolean;
     Property Connected : Boolean read GetConnected write SetConnected;
     Property Connected : Boolean read GetConnected write SetConnected;
     Property IsConnecting : Boolean read FIsConnecting;
     Property IsConnecting : Boolean read FIsConnecting;