瀏覽代碼

* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible

Michaël Van Canneyt 2 年之前
父節點
當前提交
ec65ed9e64
共有 2 個文件被更改,包括 56 次插入8 次删除
  1. 8 4
      rtl/objpas/classes/classesh.inc
  2. 48 4
      rtl/objpas/classes/streams.inc

+ 8 - 4
rtl/objpas/classes/classesh.inc

@@ -1131,12 +1131,14 @@ type
     function ReadWord : Word;
     function ReadDWord : Cardinal;
     function ReadQWord : QWord;
-    function ReadAnsiString : String;
+    function ReadAnsiString : AnsiString;
+    function ReadUnicodeString : WideString;
     procedure WriteByte(b : Byte);
     procedure WriteWord(w : Word);
     procedure WriteDWord(d : Cardinal);
     procedure WriteQWord(q : QWord);
-    Procedure WriteAnsiString (const S : String); virtual;
+    Procedure WriteAnsiString (const S : AnsiString); virtual;
+    Procedure WriteUnicodeString (const S : UnicodeString); virtual;
     property Position: Int64 read GetPosition write SetPosition;
     property Size: Int64 read GetSize write SetSize64;
   end;
@@ -1257,7 +1259,8 @@ type
   private
     FEncoding: TEncoding;
     FOwnsEncoding : Boolean;
-    function GetDataString: string;
+    function GetAnsiDataString: AnsiString;
+    function GetDataString: RTLString;
     function GetUnicodeDataString: UnicodeString;
   protected
   public
@@ -1277,7 +1280,8 @@ type
     procedure WriteAnsiString(const AString: AnsiString); override;
     function ReadString(Count: Longint): string; 
     procedure WriteString(const AString: string);
-    property DataString: string read GetDataString;
+    property DataString: RTLString read GetDataString;
+    Property AnsiDataString : AnsiString Read GetAnsiDataString;
     Property UnicodeDataString : UnicodeString Read GetUnicodeDataString;
     Property OwnsEncoding : Boolean Read FOwnsEncoding;
     Property Encoding : TEncoding Read FEncoding;

+ 48 - 4
rtl/objpas/classes/streams.inc

@@ -1218,7 +1218,7 @@ end;
 
     end;
 
-    function TStream.ReadAnsiString: String;
+  function TStream.ReadAnsiString: AnsiString;
 
   Var
     TheSize : Longint;
@@ -1236,7 +1236,24 @@ end;
      end;
    end;
 
-    procedure TStream.WriteAnsiString(const S: String);
+  function TStream.ReadUnicodeString: WideString;
+  Var
+    TheSize : Longint;
+    P : PByte ;
+  begin
+    Result:='';
+    ReadBuffer (TheSize,SizeOf(TheSize));
+    SetLength(Result,TheSize);
+    // Illegal typecast if no AnsiStrings defined.
+    if TheSize>0 then
+     begin
+       ReadBuffer (Pointer(Result)^,TheSize*SizeOf(unicodeChar));
+       P:=Pointer(Result)+TheSize*SizeOf(UnicodeChar);
+       PWord(p)^:=0;
+     end;
+  end;
+
+  procedure TStream.WriteAnsiString(const S: AnsiString);
 
   Var L : Longint;
 
@@ -1246,6 +1263,15 @@ end;
     WriteBuffer (Pointer(S)^,L);
   end;
 
+  procedure TStream.WriteUnicodeString(const S: UnicodeString);
+  Var L : Longint;
+
+  begin
+    L:=Length(S);
+    WriteBuffer (L,SizeOf(L));
+    WriteBuffer (Pointer(S)^,L*SizeOf(UnicodeChar));
+  end;
+
   procedure TStream.WriteByte(b : Byte);
 
     begin
@@ -1601,7 +1627,16 @@ end;
 {*                             TStringStream                                *}
 {****************************************************************************}
 
-function TStringStream.GetDataString: string;
+function TStringStream.GetDataString: RTLString;
+begin
+{$IF SIZEOF(CHAR)=1}
+  Result:=GetAnsiDataString;
+{$ELSE}
+  Result:=GetUnicodeDataString;
+{$ENDIF}
+end;
+
+function TStringStream.GetAnsiDataString: AnsiString;
 begin
   Result:=FEncoding.GetAnsiString(Bytes,0,Size);
 end;
@@ -1644,21 +1679,30 @@ begin
   inherited Create(BytesOf(AString));
 end;
 
+<<<<<<< HEAD
 constructor TStringStream.Create(const AString: string; AEncoding: TEncoding; AOwnsEncoding: Boolean);
+=======
+constructor TStringStream.Create(const AString: Ansistring;
+  AEncoding: TEncoding; AOwnsEncoding: Boolean);
+>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
 begin
   FOwnsEncoding:=AOwnsEncoding and not TEncoding.IsStandardEncoding(AEncoding);
   FEncoding:=AEncoding;
   Inherited Create(AEncoding.GetAnsiBytes(AString));
 end;
 
+<<<<<<< HEAD
 constructor TStringStream.Create(const AString: string; ACodePage: Integer);
+=======
+constructor TStringStream.Create(const AString: Ansistring; ACodePage: Integer);
+>>>>>>> be8e86f382 (* Better Ansi/WideString support for TStream. Fix StringStream with unicode to be delphi compatible)
 begin
   Create(AString,TEncoding.GetEncoding(ACodePage),true);
 end;
 
 constructor TStringStream.Create(const AString: UnicodeString);
 begin
-  Create(AString,TEncoding.Unicode,false);
+  Create(AString,TEncoding.Default,false);
 end;
 
 constructor TStringStream.Create(const AString: UnicodeString; AEncoding: TEncoding; AOwnsEncoding: Boolean);