From 0470c544d6ced21aad7ed08eb6732667960762f1 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 17 Jul 2010 03:33:28 +0000 Subject: [PATCH] * fixed bug #15838 where chm urls might have a backslash in the url git-svn-id: trunk@15592 - --- packages/chm/src/chmreader.pas | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/packages/chm/src/chmreader.pas b/packages/chm/src/chmreader.pas index db0a3f5e4b..2c3d4d1a89 100644 --- a/packages/chm/src/chmreader.pas +++ b/packages/chm/src/chmreader.pas @@ -268,15 +268,18 @@ end; procedure TChmReader.ReadCommonData; // A little helper proc to make reading a null terminated string easier - function ReadString(const Stream: TStream): String; + function ReadString(const Stream: TStream; StartPos: DWord; FixURL: Boolean): String; var buf: array[0..49] of char; begin Result := ''; + Stream.Position := StartPos; repeat Stream.Read(buf, 50); Result := Result + buf; until Pos(#0, buf) > -1; + if FixURL then + Result := StringReplace(Result, '\', '/', [rfReplaceAll]); end; procedure ReadFromSystem; var @@ -373,7 +376,6 @@ procedure TChmReader.ReadCommonData; EntryCount, EntrySize: DWord; EntryStart: QWord; - StrPosition: DWord; X: Integer; OffSet: QWord; begin @@ -399,27 +401,19 @@ procedure TChmReader.ReadCommonData; EntryStart := OffSet + (X*EntrySize); if fTitle = '' then begin fWindows.Position := EntryStart + $14; - StrPosition := LEtoN(fWindows.ReadDWord); - fStrings.Position := StrPosition; - fTitle := '/'+ReadString(fStrings); + fTitle := '/'+ReadString(fStrings, LEtoN(fWindows.ReadDWord), False); end; if fTOCFile = '' then begin fWindows.Position := EntryStart + $60; - StrPosition := LEtoN(fWindows.ReadDWord); - fStrings.Position := StrPosition; - fTOCFile := '/'+ReadString(fStrings); + fTOCFile := '/'+ReadString(fStrings, LEtoN(fWindows.ReadDWord), True); end; if fIndexFile = '' then begin fWindows.Position := EntryStart + $64; - StrPosition := LEtoN(fWindows.ReadDWord); - fStrings.Position := StrPosition; - fIndexFile := '/'+ReadString(fStrings); + fIndexFile := '/'+ReadString(fStrings, LEtoN(fWindows.ReadDWord), True); end; if fDefaultPage = '' then begin fWindows.Position := EntryStart + $68; - StrPosition := LEtoN(fWindows.ReadDWord); - fStrings.Position := StrPosition; - fDefaultPage := '/'+ReadString(fStrings); + fDefaultPage := '/'+ReadString(fStrings, LEtoN(fWindows.ReadDWord), True); end; end; ReadWindows(FWindows); @@ -445,8 +439,7 @@ procedure TChmReader.ReadCommonData; while fIVB.Position < fIVB.Size do begin Value := LEtoN(fIVB.ReadDWord); OffSet := LEtoN(fIVB.ReadDWord); - fStrings.Position := Offset; - Str := '/'+ReadString(fStrings); + Str := '/'+ ReadString(fStrings, Offset, True); fContextList.AddContext(Value, Str); end; end;