Ver código fonte

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

Michael VAN CANNEYT 2 anos atrás
pai
commit
be8e86f382
2 arquivos alterados com 48 adições e 8 exclusões
  1. 6 2
      rtl/objpas/classes/classesh.inc
  2. 42 6
      rtl/objpas/classes/streams.inc

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

@@ -1129,11 +1129,13 @@ type
     function ReadDWord : Cardinal;
     function ReadQWord : QWord;
     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 : AnsiString); virtual;
+    Procedure WriteUnicodeString (const S : UnicodeString); virtual;
     property Position: Int64 read GetPosition write SetPosition;
     property Size: Int64 read GetSize write SetSize64;
   end;
@@ -1254,7 +1256,8 @@ type
   private
     FEncoding: TEncoding;
     FOwnsEncoding : Boolean;
-    function GetDataString: string;
+    function GetAnsiDataString: AnsiString;
+    function GetDataString: RTLString;
     function GetUnicodeDataString: UnicodeString;
   protected
   public
@@ -1275,7 +1278,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;

+ 42 - 6
rtl/objpas/classes/streams.inc

@@ -1218,7 +1218,7 @@ end;
 
     end;
 
-  Function TStream.ReadAnsiString : AnsiString;
+  function TStream.ReadAnsiString: AnsiString;
 
   Var
     TheSize : Longint;
@@ -1236,7 +1236,24 @@ end;
      end;
    end;
 
-  Procedure TStream.WriteAnsiString (const S : AnsiString);
+  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;
@@ -1649,21 +1684,22 @@ begin
   inherited Create(BytesOf(AString));
 end;
 
-constructor TStringStream.Create(const AString: AnsiString; AEncoding: TEncoding; AOwnsEncoding: Boolean);
+constructor TStringStream.Create(const AString: Ansistring;
+  AEncoding: TEncoding; AOwnsEncoding: Boolean);
 begin
   FOwnsEncoding:=AOwnsEncoding and not TEncoding.IsStandardEncoding(AEncoding);
   FEncoding:=AEncoding;
   Inherited Create(AEncoding.GetAnsiBytes(AString));
 end;
 
-constructor TStringStream.Create(const AString: AnsiString; ACodePage: Integer);
+constructor TStringStream.Create(const AString: Ansistring; ACodePage: Integer);
 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);