123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- {
- $Id$
- This file is part of the Free Component Library
- XML serialisation driver
- Copyright (c) 2000 by Sebastian Guenther, [email protected]
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit XMLStreaming;
- {$MODE objfpc}
- {$H+}
- interface
- uses SysUtils, Classes, DOM;
- type
- TXMLObjectWriterStackElType = (elUnknown, elPropertyList, elChildrenList);
- TXMLObjectWriterStackEl = class
- public
- Element, Parent: TDOMElement;
- ElType: TXMLObjectWriterStackElType;
- CurName: String;
- end;
- TXMLObjectWriter = class(TAbstractObjectWriter)
- private
- FDoc: TDOMDocument;
- FRootEl: TDOMElement;
- FStack: TList;
- StackEl: TXMLObjectWriterStackEl;
- procedure StackPush;
- procedure StackPop;
- function GetPropertyElement(const TypeName: String): TDOMElement;
- public
- constructor Create(ADoc: TDOMDocument);
- procedure BeginCollection; override;
- procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
- ChildPos: Integer); override;
- procedure BeginList; override;
- procedure EndList; override;
- procedure BeginProperty(const PropName: String); override;
- procedure EndProperty; override;
- procedure WriteBinary(const Buffer; Count: Longint); override;
- procedure WriteBoolean(Value: Boolean); override;
- // procedure WriteChar(Value: Char);
- procedure WriteFloat(const Value: Extended); override;
- procedure WriteSingle(const Value: Single); override;
- {!!!: procedure WriteCurrency(const Value: Currency); override;}
- procedure WriteDate(const Value: TDateTime); override;
- procedure WriteIdent(const Ident: string); override;
- procedure WriteInteger(Value: Int64); override;
- procedure WriteMethodName(const Name: String); override;
- procedure WriteSet(Value: LongInt; SetType: Pointer); override;
- procedure WriteString(const Value: String); override;
- end;
- implementation
- procedure TXMLObjectWriter.StackPush;
- var
- Parent: TDOMElement;
- begin
- if Assigned(FStack) then
- begin
- Parent := StackEl.Element;
- FStack.Add(StackEl);
- StackEl := TXMLObjectWriterStackEl.Create;
- StackEl.Parent := Parent;
- end else
- begin
- FStack := TList.Create;
- StackEl := TXMLObjectWriterStackEl.Create;
- StackEl.Parent := FRootEl;
- end;
- end;
- procedure TXMLObjectWriter.StackPop;
- begin
- StackEl.Free;
- if FStack.Count > 0 then
- begin
- StackEl := TXMLObjectWriterStackEl(FStack[FStack.Count - 1]);
- FStack.Delete(FStack.Count - 1);
- end else
- begin
- FStack.Free;
- FStack := nil;
- StackEl := nil;
- end;
- end;
- function TXMLObjectWriter.GetPropertyElement(const TypeName: String): TDOMElement;
- begin
- if not Assigned(StackEl.Element) then
- begin
- StackEl.Element := FDoc.CreateElement(TypeName);
- StackEl.Parent.AppendChild(StackEl.Element);
- StackEl.Element['name'] := StackEl.CurName;
- Result := StackEl.Element;
- end else
- Result := nil;
- end;
- constructor TXMLObjectWriter.Create(ADoc: TDOMDocument);
- begin
- inherited Create;
- FDoc := ADoc;
- FRootEl := FDoc.CreateElement('fcl-persistent');
- FDoc.AppendChild(FRootEl);
- end;
- procedure TXMLObjectWriter.BeginCollection;
- begin
- WriteLn('BeginCollection');
- end;
- procedure TXMLObjectWriter.BeginComponent(Component: TComponent; Flags: TFilerFlags;
- ChildPos: Integer);
- begin
- StackPush;
- StackEl.Element := FDoc.CreateElement('component');
- StackEl.Parent.AppendChild(StackEl.Element);
- if Length(Component.Name) > 0 then
- StackEl.Element['name'] := Component.Name;
- StackEl.Element['class'] := Component.ClassName;
- StackPush;
- StackEl.Element := FDoc.CreateElement('properties');
- StackEl.Parent.AppendChild(StackEl.Element);
- StackEl.ElType := elPropertyList;
- end;
- procedure TXMLObjectWriter.BeginList;
- begin
- WriteLn('BeginList');
- end;
- procedure TXMLObjectWriter.EndList;
- begin
- if StackEl.ElType = elPropertyList then
- begin
- if not StackEl.Element.HasChildNodes then
- StackEl.Parent.RemoveChild(StackEl.Element);
- StackPop;
- StackPush;
- StackEl.Element := FDoc.CreateElement('children');
- StackEl.Parent.AppendChild(StackEl.Element);
- StackEl.ElType := elChildrenList;
- end else if StackEl.ElType = elChildrenList then
- begin
- if not StackEl.Element.HasChildNodes then
- StackEl.Parent.RemoveChild(StackEl.Element);
- StackPop;
- end else
- StackPop;
- end;
- procedure TXMLObjectWriter.BeginProperty(const PropName: String);
- begin
- StackPush;
- StackEl.CurName := PropName;
- end;
- procedure TXMLObjectWriter.EndProperty;
- begin
- StackPop;
- end;
- procedure TXMLObjectWriter.WriteBinary(const Buffer; Count: Longint);
- begin
- WriteLn('WriteBinary (', Count, ' Bytes)');
- end;
- procedure TXMLObjectWriter.WriteBoolean(Value: Boolean);
- begin
- WriteLn('WriteBoolean: ', Value);
- end;
- procedure TXMLObjectWriter.WriteFloat(const Value: Extended);
- begin
- WriteLn('WriteFloat: ', Value);
- end;
- procedure TXMLObjectWriter.WriteSingle(const Value: Single);
- begin
- WriteLn('WriteSingle: ', Value);
- end;
- procedure TXMLObjectWriter.WriteDate(const Value: TDateTime);
- begin
- WriteLn('WriteDate: ', Value);
- end;
- procedure TXMLObjectWriter.WriteIdent(const Ident: string);
- begin
- GetPropertyElement('ident')['value'] := Ident;
- end;
- procedure TXMLObjectWriter.WriteInteger(Value: Int64);
- begin
- GetPropertyElement('integer')['value'] := IntToStr(Value);
- end;
- procedure TXMLObjectWriter.WriteMethodName(const Name: String);
- begin
- GetPropertyElement('method-name')['value'] := Name;
- end;
- procedure TXMLObjectWriter.WriteSet(Value: LongInt; SetType: Pointer);
- begin
- WriteLn('WriteSet: ', Value);
- end;
- procedure TXMLObjectWriter.WriteString(const Value: String);
- begin
- GetPropertyElement('string')['value'] := Value;
- end;
- end.
- {
- $Log$
- Revision 1.3 2000-07-29 14:52:25 sg
- * Modified the copyright notice to remove ambiguities
- Revision 1.2 2000/07/13 11:33:08 michael
- + removed logs
-
- }
|