Browse Source

* Renamed TDOMParseOptions to TXMLReaderSettings (TDOMParseOptions left as alias).
- ResolveExternals option removed, it never actually worked and its functionality should be implemented by means of OnResolveEntity event.
* Moved OnError handler from TDOMParser to TXMLReaderSettings, TDOMParser.OnError redirected to set Options.OnError.
* TDOMParser replaced by TXMLReaderSettings in parameters of TXMLTextReader constructors.

git-svn-id: trunk@20708 -

sergei 13 years ago
parent
commit
cc3023d55d
1 changed files with 64 additions and 54 deletions
  1. 64 54
      packages/fcl-xml/src/xmlread.pp

+ 64 - 54
packages/fcl-xml/src/xmlread.pp

@@ -57,18 +57,20 @@ procedure ReadDTDFile(out ADoc: TXMLDocument; f: TStream); overload;
 procedure ReadDTDFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String); overload;
 procedure ReadDTDFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String); overload;
 
 
 type
 type
-  TDOMParseOptions = class(TObject)
+  TXMLErrorEvent = procedure(Error: EXMLReadError) of object;
+
+  TXMLReaderSettings = class(TObject)
   private
   private
     FValidate: Boolean;
     FValidate: Boolean;
     FPreserveWhitespace: Boolean;
     FPreserveWhitespace: Boolean;
     FExpandEntities: Boolean;
     FExpandEntities: Boolean;
     FIgnoreComments: Boolean;
     FIgnoreComments: Boolean;
     FCDSectionsAsText: Boolean;
     FCDSectionsAsText: Boolean;
-    FResolveExternals: Boolean;
     FNamespaces: Boolean;
     FNamespaces: Boolean;
     FDisallowDoctype: Boolean;
     FDisallowDoctype: Boolean;
     FCanonical: Boolean;
     FCanonical: Boolean;
     FMaxChars: Cardinal;
     FMaxChars: Cardinal;
+    FOnError: TXMLErrorEvent;
     function GetCanonical: Boolean;
     function GetCanonical: Boolean;
     procedure SetCanonical(aValue: Boolean);
     procedure SetCanonical(aValue: Boolean);
   public
   public
@@ -77,13 +79,15 @@ type
     property ExpandEntities: Boolean read FExpandEntities write FExpandEntities;
     property ExpandEntities: Boolean read FExpandEntities write FExpandEntities;
     property IgnoreComments: Boolean read FIgnoreComments write FIgnoreComments;
     property IgnoreComments: Boolean read FIgnoreComments write FIgnoreComments;
     property CDSectionsAsText: Boolean read FCDSectionsAsText write FCDSectionsAsText;
     property CDSectionsAsText: Boolean read FCDSectionsAsText write FCDSectionsAsText;
-    property ResolveExternals: Boolean read FResolveExternals write FResolveExternals;
     property Namespaces: Boolean read FNamespaces write FNamespaces;
     property Namespaces: Boolean read FNamespaces write FNamespaces;
     property DisallowDoctype: Boolean read FDisallowDoctype write FDisallowDoctype;
     property DisallowDoctype: Boolean read FDisallowDoctype write FDisallowDoctype;
     property MaxChars: Cardinal read FMaxChars write FMaxChars;
     property MaxChars: Cardinal read FMaxChars write FMaxChars;
     property CanonicalForm: Boolean read GetCanonical write SetCanonical;
     property CanonicalForm: Boolean read GetCanonical write SetCanonical;
+    property OnError: TXMLErrorEvent read FOnError write FOnError;
   end;
   end;
 
 
+  TDOMParseOptions = TXMLReaderSettings;
+
   // NOTE: DOM 3 LS ACTION_TYPE enumeration starts at 1
   // NOTE: DOM 3 LS ACTION_TYPE enumeration starts at 1
   TXMLContextAction = (
   TXMLContextAction = (
     xaAppendAsChildren = 1,
     xaAppendAsChildren = 1,
@@ -92,8 +96,6 @@ type
     xaInsertAfter,
     xaInsertAfter,
     xaReplace);
     xaReplace);
 
 
-  TXMLErrorEvent = procedure(Error: EXMLReadError) of object;
-
   TXMLInputSource = class(TObject)
   TXMLInputSource = class(TObject)
   private
   private
     FStream: TStream;
     FStream: TStream;
@@ -116,7 +118,8 @@ type
   TDOMParser = class(TObject)
   TDOMParser = class(TObject)
   private
   private
     FOptions: TDOMParseOptions;
     FOptions: TDOMParseOptions;
-    FOnError: TXMLErrorEvent;
+    function GetOnError: TXMLErrorEvent;
+    procedure SetOnError(value: TXMLErrorEvent);
   public
   public
     constructor Create;
     constructor Create;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -125,7 +128,7 @@ type
     function ParseWithContext(Src: TXMLInputSource; Context: TDOMNode;
     function ParseWithContext(Src: TXMLInputSource; Context: TDOMNode;
       Action: TXMLContextAction): TDOMNode;
       Action: TXMLContextAction): TDOMNode;
     property Options: TDOMParseOptions read FOptions;
     property Options: TDOMParseOptions read FOptions;
-    property OnError: TXMLErrorEvent read FOnError write FOnError;
+    property OnError: TXMLErrorEvent read GetOnError write SetOnError;
   end;
   end;
 
 
   TDecoder = record
   TDecoder = record
@@ -274,7 +277,6 @@ type
   private
   private
     FSource: TXMLCharSource;
     FSource: TXMLCharSource;
     FNameTable: THashTable;
     FNameTable: THashTable;
-    FCtrl: TDOMParser;
     FXML11: Boolean;
     FXML11: Boolean;
     FNameTableOwned: Boolean;
     FNameTableOwned: Boolean;
     FState: TXMLReadState;
     FState: TXMLReadState;
@@ -311,11 +313,11 @@ type
     FExpandEntities: Boolean;
     FExpandEntities: Boolean;
     FIgnoreComments: Boolean;
     FIgnoreComments: Boolean;
     FCDSectionsAsText: Boolean;
     FCDSectionsAsText: Boolean;
-    FResolveExternals: Boolean;
     FNamespaces: Boolean;
     FNamespaces: Boolean;
     FDisallowDoctype: Boolean;
     FDisallowDoctype: Boolean;
     FCanonical: Boolean;
     FCanonical: Boolean;
     FMaxChars: Cardinal;
     FMaxChars: Cardinal;
+    FOnError: TXMLErrorEvent;
     FCurrAttrIndex: Integer;
     FCurrAttrIndex: Integer;
 
 
     FOnEntity: TEntityEvent;
     FOnEntity: TEntityEvent;
@@ -456,15 +458,14 @@ type
     procedure ValidationErrorWithName(const Msg: string; LineOffs: Integer = -1);
     procedure ValidationErrorWithName(const Msg: string; LineOffs: Integer = -1);
     procedure DTDReloadHook;
     procedure DTDReloadHook;
     procedure ConvertSource(SrcIn: TXMLInputSource; out SrcOut: TXMLCharSource);
     procedure ConvertSource(SrcIn: TXMLInputSource; out SrcOut: TXMLCharSource);
-    procedure SetOptions(AParser: TDOMParser);
+    procedure SetOptions(AValue: TXMLReaderSettings);
     procedure SetNametable(ANameTable: THashTable);
     procedure SetNametable(ANameTable: THashTable);
   public
   public
-    constructor Create; overload;
     constructor Create(var AFile: Text; ANameTable: THashTable); overload;
     constructor Create(var AFile: Text; ANameTable: THashTable); overload;
     constructor Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable); overload;
     constructor Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable); overload;
     constructor Create(ASrc: TXMLCharSource; AParent: TXMLTextReader); 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;
+    constructor Create(const uri: XMLString; ANameTable: THashTable; ASettings: TXMLReaderSettings); overload;
+    constructor Create(ASrc: TXMLInputSource; ANameTable: THashTable; ASettings: TXMLReaderSettings); overload;
     destructor Destroy; override;
     destructor Destroy; override;
     procedure AfterConstruction; override;
     procedure AfterConstruction; override;
     property OnEntity: TEntityEvent read FOnEntity write FOnEntity;
     property OnEntity: TEntityEvent read FOnEntity write FOnEntity;
@@ -530,16 +531,16 @@ begin
 end;
 end;
 
 
 
 
-{ TDOMParseOptions }
+{ TXMLReaderSettings }
 
 
-function TDOMParseOptions.GetCanonical: Boolean;
+function TXMLReaderSettings.GetCanonical: Boolean;
 begin
 begin
   Result := FCanonical and FExpandEntities and FCDSectionsAsText and
   Result := FCanonical and FExpandEntities and FCDSectionsAsText and
   { (not normalizeCharacters) and } FNamespaces and
   { (not normalizeCharacters) and } FNamespaces and
   { namespaceDeclarations and } FPreserveWhitespace;
   { namespaceDeclarations and } FPreserveWhitespace;
 end;
 end;
 
 
-procedure TDOMParseOptions.SetCanonical(aValue: Boolean);
+procedure TXMLReaderSettings.SetCanonical(aValue: Boolean);
 begin
 begin
   FCanonical := aValue;
   FCanonical := aValue;
   if aValue then
   if aValue then
@@ -581,13 +582,23 @@ begin
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
+function TDOMParser.GetOnError: TXMLErrorEvent;
+begin
+  result := Options.OnError;
+end;
+
+procedure TDOMParser.SetOnError(value: TXMLErrorEvent);
+begin
+  Options.OnError := value;
+end;
+
 procedure TDOMParser.Parse(Src: TXMLInputSource; out ADoc: TXMLDocument);
 procedure TDOMParser.Parse(Src: TXMLInputSource; out ADoc: TXMLDocument);
 var
 var
   Reader: TXMLTextReader;
   Reader: TXMLTextReader;
   ldr: TLoader;
   ldr: TLoader;
 begin
 begin
   ADoc := TXMLDocument.Create;
   ADoc := TXMLDocument.Create;
-  Reader := TXMLTextReader.Create(Src, ADoc.Names, Self);
+  Reader := TXMLTextReader.Create(Src, ADoc.Names, Options);
   try
   try
     ldr.ProcessXML(ADoc, Reader);
     ldr.ProcessXML(ADoc, Reader);
   finally
   finally
@@ -601,7 +612,7 @@ var
   ldr: TLoader;
   ldr: TLoader;
 begin
 begin
   ADoc := TXMLDocument.Create;
   ADoc := TXMLDocument.Create;
-  Reader := TXMLTextReader.Create(URI, ADoc.Names, Self);
+  Reader := TXMLTextReader.Create(URI, ADoc.Names, Options);
   try
   try
     ldr.ProcessXML(ADoc, Reader)
     ldr.ProcessXML(ADoc, Reader)
   finally
   finally
@@ -628,7 +639,7 @@ begin
   if not (node.NodeType in [ELEMENT_NODE, DOCUMENT_FRAGMENT_NODE]) then
   if not (node.NodeType in [ELEMENT_NODE, DOCUMENT_FRAGMENT_NODE]) then
     raise EDOMHierarchyRequest.Create('DOMParser.ParseWithContext');
     raise EDOMHierarchyRequest.Create('DOMParser.ParseWithContext');
 
 
-  reader := TXMLTextReader.Create(Src, Context.OwnerDocument.Names, Self);
+  reader := TXMLTextReader.Create(Src, Context.OwnerDocument.Names, Options);
   try
   try
     Frag := Context.OwnerDocument.CreateDocumentFragment;
     Frag := Context.OwnerDocument.CreateDocumentFragment;
     try
     try
@@ -1180,8 +1191,8 @@ end;
 procedure TXMLTextReader.CallErrorHandler(E: EXMLReadError);
 procedure TXMLTextReader.CallErrorHandler(E: EXMLReadError);
 begin
 begin
   try
   try
-    if Assigned(FCtrl) and Assigned(FCtrl.FOnError) then
-      FCtrl.FOnError(E);
+    if Assigned(FOnError) then
+      FOnError(E);
     if E.Severity = esFatal then
     if E.Severity = esFatal then
       raise E;
       raise E;
   except
   except
@@ -1297,49 +1308,36 @@ end;
 const
 const
   PrefixDefault: array[0..4] of WideChar = ('x','m','l','n','s');
   PrefixDefault: array[0..4] of WideChar = ('x','m','l','n','s');
 
 
-constructor TXMLTextReader.Create;
+procedure TXMLTextReader.SetOptions(AValue: TXMLReaderSettings);
 begin
 begin
-  inherited Create;
-  BufAllocate(FName, 128);
-  BufAllocate(FValue, 512);
-
-  SetLength(FNodeStack, 16);
-  SetLength(FValidators, 16);
+  FValidate := AValue.Validate;
+  FPreserveWhitespace := AValue.PreserveWhitespace;
+  FExpandEntities := AValue.ExpandEntities;
+  FCDSectionsAsText := AValue.CDSectionsAsText;
+  FIgnoreComments := AValue.IgnoreComments;
+  FNamespaces := AValue.Namespaces;
+  FDisallowDoctype := AValue.DisallowDoctype;
+  FCanonical := AValue.CanonicalForm;
+  FMaxChars := AValue.MaxChars;
+  FOnError := AValue.OnError;
 end;
 end;
 
 
-procedure TXMLTextReader.SetOptions(AParser: TDOMParser);
-begin
-  FCtrl := AParser;
-  if FCtrl = nil then
-    Exit;
-  FValidate := FCtrl.Options.Validate;
-  FPreserveWhitespace := FCtrl.Options.PreserveWhitespace;
-  FExpandEntities := FCtrl.Options.ExpandEntities;
-  FCDSectionsAsText := FCtrl.Options.CDSectionsAsText;
-  FIgnoreComments := FCtrl.Options.IgnoreComments;
-  FResolveExternals := FCtrl.Options.ResolveExternals;
-  FNamespaces := FCtrl.Options.Namespaces;
-  FDisallowDoctype := FCtrl.Options.DisallowDoctype;
-  FCanonical := FCtrl.Options.CanonicalForm;
-  FMaxChars := FCtrl.Options.MaxChars;
-end;
-
-constructor TXMLTextReader.Create(ASrc: TXMLInputSource; ANameTable: THashTable; AParser: TDOMParser);
+constructor TXMLTextReader.Create(ASrc: TXMLInputSource; ANameTable: THashTable; ASettings: TXMLReaderSettings);
 var
 var
   InputSrc: TXMLCharSource;
   InputSrc: TXMLCharSource;
 begin
 begin
   Create;
   Create;
-  SetOptions(AParser);
+  SetOptions(ASettings);
   FNameTable := ANameTable;
   FNameTable := ANameTable;
   ConvertSource(ASrc, InputSrc);
   ConvertSource(ASrc, InputSrc);
   FSource := InputSrc;
   FSource := InputSrc;
   FSource.FReader := Self;
   FSource.FReader := Self;
 end;
 end;
 
 
-constructor TXMLTextReader.Create(const uri: XMLString; ANameTable: THashTable; AParser: TDOMParser);
+constructor TXMLTextReader.Create(const uri: XMLString; ANameTable: THashTable; ASettings: TXMLReaderSettings);
 begin
 begin
   Create;
   Create;
-  SetOptions(AParser);
+  SetOptions(ASettings);
   FNameTable := ANameTable;
   FNameTable := ANameTable;
   if ResolveResource(uri, '', '', FSource) then
   if ResolveResource(uri, '', '', FSource) then
     FSource.FReader := Self
     FSource.FReader := Self
@@ -1361,7 +1359,6 @@ end;
 constructor TXMLTextReader.Create(var AFile: Text; ANameTable: THashTable);
 constructor TXMLTextReader.Create(var AFile: Text; ANameTable: THashTable);
 begin
 begin
   SetNametable(ANameTable);
   SetNametable(ANameTable);
-  Create;
   FSource := TXMLFileInputSource.Create(AFile);
   FSource := TXMLFileInputSource.Create(AFile);
   FSource.FReader := Self;
   FSource.FReader := Self;
 end;
 end;
@@ -1369,7 +1366,6 @@ end;
 constructor TXMLTextReader.Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable);
 constructor TXMLTextReader.Create(AStream: TStream; const ABaseUri: XMLString; ANameTable: THashTable);
 begin
 begin
   SetNametable(ANameTable);
   SetNametable(ANameTable);
-  Create;
   FSource := TXMLStreamInputSource.Create(AStream, False);
   FSource := TXMLStreamInputSource.Create(AStream, False);
   FSource.SourceURI := ABaseUri;
   FSource.SourceURI := ABaseUri;
   FSource.FReader := Self;
   FSource.FReader := Self;
@@ -1378,10 +1374,19 @@ end;
 constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader);
 constructor TXMLTextReader.Create(ASrc: TXMLCharSource; AParent: TXMLTextReader);
 begin
 begin
   FNameTable := AParent.FNameTable;
   FNameTable := AParent.FNameTable;
-  Create;
   FSource := ASrc;
   FSource := ASrc;
   FSource.FReader := Self;
   FSource.FReader := Self;
-  SetOptions(AParent.FCtrl);
+
+  FValidate := AParent.FValidate;
+  FPreserveWhitespace := AParent.FPreserveWhitespace;
+  FExpandEntities := AParent.FExpandEntities;
+  FCDSectionsAsText := AParent.FCDSectionsAsText;
+  FIgnoreComments := AParent.FIgnoreComments;
+  FNamespaces := AParent.FNamespaces;
+  FDisallowDoctype := AParent.FDisallowDoctype;
+  FCanonical := AParent.FCanonical;
+  FMaxChars := AParent.FMaxChars;
+  FOnError := AParent.FOnError;
 end;
 end;
 
 
 destructor TXMLTextReader.Destroy;
 destructor TXMLTextReader.Destroy;
@@ -1419,6 +1424,12 @@ end;
 
 
 procedure TXMLTextReader.AfterConstruction;
 procedure TXMLTextReader.AfterConstruction;
 begin
 begin
+  BufAllocate(FName, 128);
+  BufAllocate(FValue, 512);
+
+  SetLength(FNodeStack, 16);
+  SetLength(FValidators, 16);
+
   FNesting := 0;
   FNesting := 0;
   FValidatorNesting := 0;
   FValidatorNesting := 0;
   FCurrNode := @FNodeStack[0];
   FCurrNode := @FNodeStack[0];
@@ -4402,7 +4413,6 @@ end;
 procedure ReadDTDFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String);
 procedure ReadDTDFile(out ADoc: TXMLDocument; f: TStream; const ABaseURI: String);
 var
 var
   Reader: TXMLTextReader;
   Reader: TXMLTextReader;
-  Src: TXMLCharSource;
   ldr: TLoader;
   ldr: TLoader;
 begin
 begin
   ADoc := TXMLDocument.Create;
   ADoc := TXMLDocument.Create;