浏览代码

* Implemented TWriter.WriteSignature/TReader.ReadSignature (bug ID 27519)

git-svn-id: trunk@30367 -
michael 10 年之前
父节点
当前提交
910a88122f
共有 3 个文件被更改,包括 34 次插入13 次删除
  1. 6 2
      rtl/objpas/classes/classesh.inc
  2. 15 5
      rtl/objpas/classes/reader.inc
  3. 13 6
      rtl/objpas/classes/writer.inc

+ 6 - 2
rtl/objpas/classes/classesh.inc

@@ -1131,6 +1131,7 @@ type
     function ReadInt32: LongInt; virtual; abstract;
     function ReadInt64: Int64; virtual; abstract;
     function ReadSet(EnumType: Pointer): Integer; virtual; abstract;
+    procedure ReadSignature; virtual; abstract;
     function ReadStr: String; virtual; abstract;
     function ReadString(StringType: TValueType): String; virtual; abstract;
     function ReadWideString: WideString;virtual;abstract;
@@ -1183,6 +1184,7 @@ type
     function ReadInt32: LongInt; override;
     function ReadInt64: Int64; override;
     function ReadSet(EnumType: Pointer): Integer; override;
+    procedure ReadSignature; override;
     function ReadStr: String; override;
     function ReadString(StringType: TValueType): String; override;
     function ReadWideString: WideString;override;
@@ -1291,6 +1293,7 @@ type
     procedure ReadListEnd;
     function ReadRootComponent(ARoot: TComponent): TComponent;
     function ReadVariant: Variant;
+    procedure ReadSignature;
     function ReadString: string;
     function ReadWideString: WideString;
     function ReadUnicodeString: UnicodeString;
@@ -1323,6 +1326,7 @@ type
     procedure BeginCollection; virtual; abstract;  { Ends with the next "EndList" }
     procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
       ChildPos: Integer); virtual; abstract;  { Ends after the second "EndList" }
+    procedure WriteSignature; virtual; abstract;
     procedure BeginList; virtual; abstract;
     procedure EndList; virtual; abstract;
     procedure BeginProperty(const PropName: String); virtual; abstract;
@@ -1359,8 +1363,6 @@ type
     FBufSize: Integer;
     FBufPos: Integer;
     FBufEnd: Integer;
-    FSignatureWritten: Boolean;
-
     procedure WriteWord(w : word); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
     procedure WriteDWord(lw : longword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
     procedure WriteQWord(qw : qword); {$ifdef CLASSESINLINE}inline;{$endif CLASSESINLINE}
@@ -1372,6 +1374,7 @@ type
   public
     constructor Create(Stream: TStream; BufSize: Integer);
     destructor Destroy; override;
+    procedure WriteSignature; override;
 
     procedure BeginCollection; override;
     procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
@@ -1468,6 +1471,7 @@ type
     procedure WriteSet(Value: LongInt; SetType: Pointer);
     procedure WriteListBegin;
     procedure WriteListEnd;
+    Procedure WriteSignature;
     procedure WriteRootComponent(ARoot: TComponent);
     procedure WriteString(const Value: string);
     procedure WriteWideString(const Value: WideString);

+ 15 - 5
rtl/objpas/classes/reader.inc

@@ -145,13 +145,9 @@ begin
 end;
 
 procedure TBinaryObjectReader.BeginRootComponent;
-var
-  Signature: LongInt;
 begin
   { Read filer signature }
-  Read(Signature, 4);
-  if Signature <> LongInt(unaligned(FilerSignature)) then
-    raise EReadError.Create(SInvalidImage);
+  ReadSignature;
 end;
 
 procedure TBinaryObjectReader.BeginComponent(var Flags: TFilerFlags;
@@ -314,6 +310,15 @@ begin
   end;
 end;
 
+procedure TBinaryObjectReader.ReadSignature;
+var
+  Signature: LongInt;
+begin
+  Read(Signature, 4);
+  if Signature <> LongInt(unaligned(FilerSignature)) then
+    raise EReadError.Create(SInvalidImage);
+end;
+
 function TBinaryObjectReader.ReadStr: String;
 var
   i: Byte;
@@ -1021,6 +1026,11 @@ begin
     Result := ReadInt64;
 end;
 
+procedure TReader.ReadSignature;
+begin
+  FDriver.ReadSignature;
+end;
+
 function TReader.ReadSingle: Single;
 begin
   if FDriver.NextValue = vaSingle then

+ 13 - 6
rtl/objpas/classes/writer.inc

@@ -118,16 +118,17 @@ begin
   WriteValue(vaCollection);
 end;
 
+procedure TBinaryObjectWriter.WriteSignature;
+
+begin
+  Write(FilerSignature, SizeOf(FilerSignature));
+end;
+
 procedure TBinaryObjectWriter.BeginComponent(Component: TComponent;
   Flags: TFilerFlags; ChildPos: Integer);
 var
   Prefix: Byte;
 begin
-  if not FSignatureWritten then
-  begin
-    Write(FilerSignature, SizeOf(FilerSignature));
-    FSignatureWritten := True;
-  end;
 
   { Only write the flags if they are needed! }
   if Flags <> [] then
@@ -567,6 +568,12 @@ begin
   FLookupRoot := ARoot;
 end;
 
+procedure TWriter.WriteSignature;
+
+begin
+  FDriver.WriteSignature;
+end;
+
 procedure TWriter.WriteBinary(AWriteData: TStreamProc);
 var
   MemBuffer: TMemoryStream;
@@ -762,7 +769,7 @@ begin
   FAncestor := AAncestor;
   FRootAncestor := AAncestor;
   FLookupRoot := ARoot;
-
+  WriteSignature;
   WriteComponent(ARoot);
 end;