Skip to content

Commit 38f400b

Browse files
author
outchy
committed
Mantis 5491: TJclSimpleXml.SaveToString generates garbage when saving UTF-16 strings (in Delphi XE).
1 parent 339c09d commit 38f400b

File tree

2 files changed

+4
-11
lines changed

2 files changed

+4
-11
lines changed

jcl/source/common/JclSimpleXml.pas

+1-1
Original file line numberDiff line numberDiff line change
@@ -1325,7 +1325,7 @@ function TJclSimpleXML.SaveToString: string;
13251325
var
13261326
Stream: TStringStream;
13271327
begin
1328-
Stream := TStringStream.Create('');
1328+
Stream := TStringStream.Create('' {$IFDEF SUPPORTS_UNICODE}, CP_UTF16LE{$ENDIF});
13291329
try
13301330
SaveToStream(Stream);
13311331
Result := Stream.DataString;

jcl/source/common/JclStreams.pas

+3-10
Original file line numberDiff line numberDiff line change
@@ -2402,7 +2402,7 @@ function TJclStringStream.InternalSetNextBuffer(S: TStream;
24022402

24032403
procedure TJclStringStream.InvalidateBuffers;
24042404
begin
2405-
FStrBufferStart := FStream.Seek(Length(FBOM), soCurrent);
2405+
FStrBufferStart := FStream.Seek(0, soCurrent);
24062406
FStrBufferNext := FStrBufferStart;
24072407
FStrBufferPosition := 0;
24082408
FStrBufferCurrentSize := 0;
@@ -2953,8 +2953,6 @@ function TJclUTF16Stream.InternalSetNextChar(S: TStream; Ch: UCS4): Boolean;
29532953

29542954
constructor TJclAutoStream.Create(AStream: TStream; AOwnsStream: Boolean);
29552955
var
2956-
ResetPos: Boolean;
2957-
Pos: Int64;
29582956
I, MaxLength, ReadLength: Integer;
29592957
BOM: array of Byte;
29602958
begin
@@ -2963,9 +2961,6 @@ constructor TJclAutoStream.Create(AStream: TStream; AOwnsStream: Boolean);
29632961
if MaxLength < Length(BOM_UTF16_LSB) then
29642962
MaxLength := Length(BOM_UTF16_LSB);
29652963

2966-
ResetPos := False;
2967-
Pos := FStream.Seek(0, soCurrent);
2968-
29692964
SetLength(BOM, MaxLength);
29702965
ReadLength := FStream.Read(BOM[0], Length(BOM) * SizeOf(BOM[0])) div SizeOf(BOM[0]);
29712966

@@ -2980,7 +2975,6 @@ constructor TJclAutoStream.Create(AStream: TStream; AOwnsStream: Boolean);
29802975
if BOM[I - Low(BOM_UTF8)] <> BOM_UTF8[I] then
29812976
begin
29822977
FEncoding := seAuto;
2983-
ResetPos := True;
29842978
Break;
29852979
end;
29862980
end;
@@ -2994,7 +2988,6 @@ constructor TJclAutoStream.Create(AStream: TStream; AOwnsStream: Boolean);
29942988
if BOM[I - Low(BOM_UTF8)] <> BOM_UTF16_LSB[I] then
29952989
begin
29962990
FEncoding := seAuto;
2997-
ResetPos := True;
29982991
Break;
29992992
end;
30002993
end;
@@ -3023,8 +3016,7 @@ constructor TJclAutoStream.Create(AStream: TStream; AOwnsStream: Boolean);
30233016
SetLength(FBOM, 0);
30243017
end;
30253018
end;
3026-
if ResetPos then
3027-
FStream.Seek(Pos, soBeginning);
3019+
FStream.Seek(Length(FBOM) - ReadLength, soCurrent);
30283020
InvalidateBuffers;
30293021
end;
30303022

@@ -3090,6 +3082,7 @@ function TJclAutoStream.SkipBOM: LongInt;
30903082
begin
30913083
// already skipped to determine encoding
30923084
Result := 0;
3085+
InvalidateBuffers;
30933086
end;
30943087

30953088
{$IFDEF UNITVERSIONING}

0 commit comments

Comments
 (0)