Browse Source

* fixed a possible chm compiler crash when a chm without .ht* files is created but full search is enabled.

git-svn-id: trunk@15573 -
andrew 15 years ago
parent
commit
28041f3e3f
2 changed files with 17 additions and 1 deletions
  1. 7 0
      packages/chm/src/chmfiftimain.pas
  2. 10 1
      packages/chm/src/chmwriter.pas

+ 7 - 0
packages/chm/src/chmfiftimain.pas

@@ -86,11 +86,13 @@ type
     FStream: TStream;
     FStream: TStream;
     FWordList: TIndexedWordList;
     FWordList: TIndexedWordList;
     FActiveLeafNode: TFIftiNode;
     FActiveLeafNode: TFIftiNode;
+    function GetHasData: Boolean;
     procedure ProcessWords;
     procedure ProcessWords;
     procedure WriteHeader(IsPlaceHolder: Boolean);
     procedure WriteHeader(IsPlaceHolder: Boolean);
     procedure WriteAWord(AWord: TIndexedWord);
     procedure WriteAWord(AWord: TIndexedWord);
   public
   public
     procedure WriteToStream;
     procedure WriteToStream;
+    property  HasData: Boolean read GetHasData;
     constructor Create(AStream: TStream; AWordList: TIndexedWordList);
     constructor Create(AStream: TStream; AWordList: TIndexedWordList);
     destructor Destroy; override;
     destructor Destroy; override;
   end;
   end;
@@ -261,6 +263,11 @@ begin
     FActiveLeafNode.Flush(False); // causes the unwritten parts of the tree to be written
     FActiveLeafNode.Flush(False); // causes the unwritten parts of the tree to be written
 end;
 end;
 
 
+function TChmSearchWriter.GetHasData: Boolean;
+begin
+  Result := FActiveLeafNode <> nil;
+end;
+
 
 
 procedure TChmSearchWriter.WriteHeader ( IsPlaceHolder: Boolean ) ;
 procedure TChmSearchWriter.WriteHeader ( IsPlaceHolder: Boolean ) ;
 var
 var

+ 10 - 1
packages/chm/src/chmwriter.pas

@@ -137,6 +137,7 @@ Type
     FDefaultFont: String;
     FDefaultFont: String;
     FDefaultPage: String;
     FDefaultPage: String;
     FFullTextSearch: Boolean;
     FFullTextSearch: Boolean;
+    FFullTextSearchAvailable: Boolean;
     FSearchTitlesOnly: Boolean;
     FSearchTitlesOnly: Boolean;
     FStringsStream: TMemoryStream; // the #STRINGS file
     FStringsStream: TMemoryStream; // the #STRINGS file
     FTopicsStream: TMemoryStream;  // the #TOPICS file
     FTopicsStream: TMemoryStream;  // the #TOPICS file
@@ -970,7 +971,7 @@ begin
 
 
   FSection0.WriteDWord(NToLE(DWord($0409)));
   FSection0.WriteDWord(NToLE(DWord($0409)));
   FSection0.WriteDWord(1);
   FSection0.WriteDWord(1);
-  FSection0.WriteDWord(NToLE(DWord(Ord(FFullTextSearch))));
+  FSection0.WriteDWord(NToLE(DWord(Ord(FFullTextSearch and FFullTextSearchAvailable))));
   FSection0.WriteDWord(0);
   FSection0.WriteDWord(0);
   FSection0.WriteDWord(0);
   FSection0.WriteDWord(0);
 
 
@@ -1256,6 +1257,14 @@ begin
   if FTopicsStream.Size = 0 then
   if FTopicsStream.Size = 0 then
     Exit;
     Exit;
   SearchWriter := TChmSearchWriter.Create(FFiftiMainStream, FIndexedFiles);
   SearchWriter := TChmSearchWriter.Create(FFiftiMainStream, FIndexedFiles);
+  // do not add an empty $FIftiMain
+  if not SearchWriter.HasData then
+  begin
+    FFullTextSearchAvailable := False;
+    SearchWriter.Free;
+    Exit;
+  end;
+  FFullTextSearchAvailable := True;
   SearchWriter.WriteToStream;
   SearchWriter.WriteToStream;
   SearchWriter.Free;
   SearchWriter.Free;