Преглед изворни кода

* xmlread.pp, changed constructor using TXMLCharSource into two constructors using TStream and Text, in order to simplify the upcoming public usage of this class.

git-svn-id: trunk@20698 -
sergei пре 13 година
родитељ
комит
69802878c6
1 измењених фајлова са 32 додато и 28 уклоњено
  1. 32 28
      packages/fcl-xml/src/xmlread.pp

+ 32 - 28
packages/fcl-xml/src/xmlread.pp

@@ -260,7 +260,7 @@ type
 
   TCheckNameFlags = set of (cnOptional, cnToken);
 
-  TXMLToken = (xtNone, xtEOF, xtText, xtWhitespace, xtElement, xtEndElement,
+  TXMLToken = (xtNone, xtEOF, xtText, xtElement, xtEndElement,
     xtCDSect, xtComment, xtPI, xtDoctype, xtEntity, xtEntityEnd, xtPopElement,
     xtPopEmptyElement, xtPushElement, xtPushEntity, xtPopEntity, xtFakeLF);
 
@@ -457,9 +457,11 @@ type
     procedure DTDReloadHook;
     procedure ConvertSource(SrcIn: TXMLInputSource; out SrcOut: TXMLCharSource);
     procedure SetOptions(AParser: TDOMParser);
+    procedure SetNametable(ANameTable: THashTable);
   public
     constructor Create; overload;
-    constructor Create(ASrc: TXMLCharSource; ANameTable: THashTable); overload;
+    constructor Create(var AFile: Text; ANameTable: THashTable); overload;
+    constructor Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable); overload;
     constructor Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); overload;
     constructor Create(const uri: XMLString; ANameTable: THashTable; AParser: TDOMParser); overload;
     constructor Create(ASrc: TXMLInputSource; ANameTable: THashTable; AParser: TDOMParser); overload;
@@ -1339,8 +1341,6 @@ begin
   Create;
   SetOptions(AParser);
   FNameTable := ANameTable;
-  { TODO: should not open file in ResolveResource, but do it when Read() is called
-    for the first time }
   if ResolveResource(uri, '', '', FSource) then
     FSource.FReader := Self
   else
@@ -1348,7 +1348,7 @@ begin
 end;
 
 
-constructor TXMLTextReader.Create(ASrc: TXMLCharSource; ANameTable: THashTable);
+procedure TXMLTextReader.SetNametable(ANameTable: THashTable);
 begin
   if ANameTable = nil then
   begin
@@ -1356,14 +1356,31 @@ begin
     FNameTableOwned := True;
   end;
   FNameTable := ANameTable;
+end;
+
+constructor TXMLTextReader.Create(var AFile: Text; ANameTable: THashTable);
+begin
+  SetNametable(ANameTable);
   Create;
-  FSource := ASrc;
+  FSource := TXMLFileInputSource.Create(AFile);
+  FSource.FReader := Self;
+end;
+
+constructor TXMLTextReader.Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable);
+begin
+  SetNametable(ANameTable);
+  Create;
+  FSource := TXMLStreamInputSource.Create(AStream, False);
+  FSource.SourceURI := ABaseUri;
   FSource.FReader := Self;
 end;
 
 constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader);
 begin
-  Create(ASrc, AParent.FNameTable);
+  FNameTable := AParent.FNameTable;
+  Create;
+  FSource := ASrc;
+  FSource.FReader := Self;
   SetOptions(AParent.FCtrl);
 end;
 
@@ -1487,7 +1504,8 @@ var
 begin
   if reader.ReadState = rsInitial then
   begin
-    reader.Read;
+    if not reader.Read then
+      Exit;
     if cursor is TDOMNode_TopLevel then
     begin
       if reader.FSource.FXMLVersion <> xmlVersionUnknown then
@@ -4280,12 +4298,10 @@ end;
 procedure ReadXMLFile(out ADoc: TXMLDocument; var f: Text);
 var
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Src := TXMLFileInputSource.Create(f);
-  Reader := TXMLTextReader.Create(Src, ADoc.Names);
+  Reader := TXMLTextReader.Create(f, ADoc.Names);
   try
     ldr.ProcessXML(ADoc,Reader);
   finally
@@ -4296,13 +4312,10 @@ end;
 procedure ReadXMLFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String);
 var
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Src := TXMLStreamInputSource.Create(f, False);
-  Src.SourceURI := ABaseURI;
-  Reader := TXMLTextReader.Create(Src, ADoc.Names);
+  Reader := TXMLTextReader.Create(f, ABaseURI, ADoc.Names);
   try
     ldr.ProcessXML(ADoc, Reader);
   finally
@@ -4331,11 +4344,9 @@ end;
 procedure ReadXMLFragment(AParentNode: TDOMNode; var f: Text);
 var
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
 begin
-  Src := TXMLFileInputSource.Create(f);
-  Reader := TXMLTextReader.Create(Src, AParentNode.OwnerDocument.Names);
+  Reader := TXMLTextReader.Create(f, AParentNode.OwnerDocument.Names);
   try
     ldr.ProcessFragment(AParentNode, Reader);
   finally
@@ -4346,12 +4357,9 @@ end;
 procedure ReadXMLFragment(AParentNode: TDOMNode; f: TStream; const ABaseURI: String);
 var
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
 begin
-  Src := TXMLStreamInputSource.Create(f, False);
-  Src.SourceURI := ABaseURI;
-  Reader := TXMLTextReader.Create(Src, AParentNode.OwnerDocument.Names);
+  Reader := TXMLTextReader.Create(f, ABaseURI, AParentNode.OwnerDocument.Names);
   try
     ldr.ProcessFragment(AParentNode, Reader);
   finally
@@ -4380,12 +4388,10 @@ end;
 procedure ReadDTDFile(out ADoc: TXMLDocument; var f: Text);
 var
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Src := TXMLFileInputSource.Create(f);
-  Reader := TXMLTextReader.Create(Src, ADoc.Names);
+  Reader := TXMLTextReader.Create(f, ADoc.Names);
   try
     ldr.ProcessDTD(ADoc,Reader);
   finally
@@ -4400,9 +4406,7 @@ var
   ldr: TLoader;
 begin
   ADoc := TXMLDocument.Create;
-  Src := TXMLStreamInputSource.Create(f, False);
-  Src.SourceURI := ABaseURI;
-  Reader := TXMLTextReader.Create(Src, ADoc.Names);
+  Reader := TXMLTextReader.Create(f, ABaseURI, ADoc.Names);
   try
     ldr.ProcessDTD(ADoc,Reader);
   finally