* Added support for binary toc and index support from fpc

git-svn-id: trunk@22097 -
This commit is contained in:
andrew 2009-10-11 16:36:22 +00:00
parent 1f47e04ef2
commit b7d39f719c
3 changed files with 40 additions and 30 deletions

View File

@ -5,9 +5,15 @@ unit chmcontentprovider;
//{$if (fpc_version=2) and (fpc_release>2) ((fpc_version=2) and (fpc_release=2) and (fpc_patch>2))} //{$if (fpc_version=2) and (fpc_release>2) ((fpc_version=2) and (fpc_release=2) and (fpc_patch>2))}
{$Note Compiling lhelp with search support} {$Note Compiling lhelp with search support}
{$DEFINE CHM_SEARCH} {$DEFINE CHM_SEARCH}
//{$else} //{$else}
//{$Note Compiling lhelp *without* search support since your fpc version is not new enough} //{$Note Compiling lhelp *without* search support since your fpc version is not new enough}
//{$endif} //{$endif}
{$if (fpc_version=2) and (fpc_release>5) ((fpc_version=2) and (fpc_release=5) and (fpc_patch>0))}
{$Note Compiling lhelp *with* binary index and toc support}
{$DEFINE CHM_BINARY_INDEX_TOC}
{$endif}
{off $DEFINE CHM_DEBUG_TIME} {off $DEFINE CHM_DEBUG_TIME}
{off $DEFINE CHM_SEARCH} {off $DEFINE CHM_SEARCH}
@ -96,7 +102,7 @@ type
implementation implementation
uses ChmSpecialParser{$IFDEF CHM_SEARCH}, chmFIftiMain{$ENDIF}, LCLType; uses ChmSpecialParser{$IFDEF CHM_SEARCH}, chmFIftiMain{$ENDIF}, chmsitemap, LCLType;
function GetURIFileName(AURI: String): String; function GetURIFileName(AURI: String): String;
var var
@ -289,6 +295,7 @@ var
fChm: TChmReader; fChm: TChmReader;
ParentNode: TTreeNode; ParentNode: TTreeNode;
i: Integer; i: Integer;
SM: TChmSiteMap;
HasSearchIndex: Boolean = False; HasSearchIndex: Boolean = False;
begin begin
if fFillingToc = True then begin if fFillingToc = True then begin
@ -307,17 +314,26 @@ begin
ParentNode := fContentsTree.Items.AddChildObject(nil, fChm.Title, fChm); ParentNode := fContentsTree.Items.AddChildObject(nil, fChm.Title, fChm);
ParentNode.ImageIndex := 0; ParentNode.ImageIndex := 0;
ParentNode.SelectedIndex := 0; ParentNode.SelectedIndex := 0;
{$IFDEF CHM_BINARY_INDEX_TOC}
SM := fChm.GetTOCSitemap;
{$ELSE}
Stream := TMemoryStream(fchm.GetObject(fChm.TOCFile)); Stream := TMemoryStream(fchm.GetObject(fChm.TOCFile));
if Stream <> nil then begin if Stream <> nil then begin
Stream.position := 0; SM := TChmSiteMap.Create(stTOC);
SM.LoadFromStream(Stream);
Stream.Free;
end;
{$ENDIF}
if SM <> nil then begin
{$IFDEF CHM_DEBUG_TIME} {$IFDEF CHM_DEBUG_TIME}
writeln('Stream read: ',FormatDateTime('hh:nn:ss.zzz', Now)); writeln('Stream read: ',FormatDateTime('hh:nn:ss.zzz', Now));
{$ENDIF} {$ENDIF}
with TContentsFiller.Create(fContentsTree, Stream, @fStopTimer, fChm) do begin
with TContentsFiller.Create(fContentsTree, SM, @fStopTimer, fChm) do begin
DoFill(ParentNode); DoFill(ParentNode);
Free; Free;
end; end;
Stream.Free; SM.Free;
if (fContentsTree.Selected = nil) and (fHistory.Count > 0) then if (fContentsTree.Selected = nil) and (fHistory.Count > 0) then
SelectTreeItemFromURL(fHistory.Strings[fHistoryIndex]); SelectTreeItemFromURL(fHistory.Strings[fHistoryIndex]);
end; end;
@ -326,14 +342,22 @@ begin
// we fill the index here too but only for the main file // we fill the index here too but only for the main file
if fChms.IndexOfObject(fChm) < 1 then if fChms.IndexOfObject(fChm) < 1 then
begin begin
Stream := fchms.GetObject(fChm.IndexFile); {$IFDEF CHM_BINARY_INDEX_TOC}
SM := fChm.GetTOCSitemap;
{$ELSE}
Stream := TMemoryStream(fchm.GetObject(fChm.TOCFile));
if Stream <> nil then begin if Stream <> nil then begin
Stream.position := 0; SM := TChmSiteMap.Create(stTOC);
with TIndexFiller.Create(fIndexView, Stream, fChm) do begin; SM.LoadFromStream(Stream);
Stream.Free;
end;
{$ENDIF}
if SM <> nil then begin
with TIndexFiller.Create(fIndexView, SM, fChm) do begin
DoFill; DoFill;
Free; Free;
end; end;
Stream.Free; SM.Free;
end; end;
end; end;
end; end;

View File

@ -56,8 +56,7 @@ type
procedure CustomCreateContentTreeItem(Sender: TCustomTreeView; var ATreeNode: TTreenode); procedure CustomCreateContentTreeItem(Sender: TCustomTreeView; var ATreeNode: TTreenode);
procedure AddItem(AItem: TChmSiteMapItem; AParentNode: TTreeNode); procedure AddItem(AItem: TChmSiteMapItem; AParentNode: TTreeNode);
public public
constructor Create(ATreeView: TTreeView; AStream: TStream; StopBoolean: PBoolean; AChm: TObject); constructor Create(ATreeView: TTreeView; ASitemap: TChmSiteMap; StopBoolean: PBoolean; AChm: TObject);
destructor Destroy; override;
procedure DoFill(ParentNode: TTreeNode); procedure DoFill(ParentNode: TTreeNode);
end; end;
@ -70,8 +69,7 @@ type
fChm: Tobject; fChm: Tobject;
procedure AddItem(Item: TChmSiteMapItem; ASubItem: Boolean); procedure AddItem(Item: TChmSiteMapItem; ASubItem: Boolean);
public public
constructor Create(AListView: TListView; AStream: TStream; AChm: TObject); constructor Create(AListView: TListView; ASiteMap: TChmSiteMap; AChm: TObject);
destructor Destroy; override;
procedure DoFill; procedure DoFill;
end; end;
@ -123,22 +121,15 @@ begin
AddItem(AItem.Children.Item[X], NewNode); AddItem(AItem.Children.Item[X], NewNode);
end; end;
constructor TContentsFiller.Create(ATreeView: TTreeView; AStream: TStream; StopBoolean: PBoolean; AChm: TObject); constructor TContentsFiller.Create(ATreeView: TTreeView; ASitemap: TChmSiteMap; StopBoolean: PBoolean; AChm: TObject);
begin begin
inherited Create; inherited Create;
fTreeView := ATreeView; fTreeView := ATreeView;
fSitemap := TChmSiteMap.Create(stTOC); fSitemap := ASitemap;
fSitemap.LoadFromStream(AStream);
fStop := StopBoolean; fStop := StopBoolean;
fChm := AChm; fChm := AChm;
end; end;
destructor TContentsFiller.Destroy;
begin
fSitemap.Free;
inherited Destroy;
end;
procedure TContentsFiller.DoFill(ParentNode: TTreeNode); procedure TContentsFiller.DoFill(ParentNode: TTreeNode);
var var
OrigEvent: TTVCustomCreateNodeEvent; OrigEvent: TTVCustomCreateNodeEvent;
@ -178,19 +169,13 @@ begin
end; end;
constructor TIndexFiller.Create(AListView: TListView; AStream: TStream; AChm: TObject); constructor TIndexFiller.Create(AListView: TListView; ASiteMap: TChmSiteMap; AChm: TObject);
begin begin
inherited Create; inherited Create;
fListView := AListView; fListView := AListView;
fSitemap := TChmSiteMap.Create(stIndex); fSitemap := ASiteMap;
fSitemap.LoadFromStream(AStream);
fChm := AChm; fChm := AChm;
end;
destructor TIndexFiller.Destroy;
begin
fSitemap.Free;
inherited Destroy;
end; end;
procedure TIndexFiller.DoFill; procedure TIndexFiller.DoFill;

View File

@ -254,7 +254,8 @@ begin
//WriteLn('LeftLoop'); //WriteLn('LeftLoop');
Result:= fHttpClient.Stream; Result:= fHttpClient.Stream;
Result.Position := 0; if Result <> nil then
Result.Position := 0;
//fDataStream.SaveToFile('temp.txt'); //fDataStream.SaveToFile('temp.txt');
//Application.Terminate; //Application.Terminate;
fHttpClient.Free; fHttpClient.Free;