diff --git a/rtl/objpas/classes/classesh.inc b/rtl/objpas/classes/classesh.inc index 6b464147f8..771d5592cd 100644 --- a/rtl/objpas/classes/classesh.inc +++ b/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; diff --git a/rtl/objpas/classes/streams.inc b/rtl/objpas/classes/streams.inc index 6f4d27fbcb..e5c4599fbd 100644 --- a/rtl/objpas/classes/streams.inc +++ b/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);