xmlstreaming.pp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. {
  2. $Id$
  3. This file is part of the Free Component Library
  4. XML serialisation driver
  5. Copyright (c) 2000 by Sebastian Guenther, [email protected]
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit XMLStreaming;
  13. {$MODE objfpc}
  14. {$H+}
  15. interface
  16. uses SysUtils, Classes, DOM;
  17. type
  18. TXMLObjectWriterStackElType = (elUnknown, elPropertyList, elChildrenList);
  19. TXMLObjectWriterStackEl = class
  20. public
  21. Element, Parent: TDOMElement;
  22. ElType: TXMLObjectWriterStackElType;
  23. CurName: String;
  24. end;
  25. TXMLObjectWriter = class(TAbstractObjectWriter)
  26. private
  27. FDoc: TDOMDocument;
  28. FRootEl: TDOMElement;
  29. FStack: TList;
  30. StackEl: TXMLObjectWriterStackEl;
  31. procedure StackPush;
  32. procedure StackPop;
  33. function GetPropertyElement(const TypeName: String): TDOMElement;
  34. public
  35. constructor Create(ADoc: TDOMDocument);
  36. procedure BeginCollection; override;
  37. procedure BeginComponent(Component: TComponent; Flags: TFilerFlags;
  38. ChildPos: Integer); override;
  39. procedure BeginList; override;
  40. procedure EndList; override;
  41. procedure BeginProperty(const PropName: String); override;
  42. procedure EndProperty; override;
  43. procedure WriteBinary(const Buffer; Count: Longint); override;
  44. procedure WriteBoolean(Value: Boolean); override;
  45. // procedure WriteChar(Value: Char);
  46. procedure WriteFloat(const Value: Extended); override;
  47. procedure WriteSingle(const Value: Single); override;
  48. {!!!: procedure WriteCurrency(const Value: Currency); override;}
  49. procedure WriteDate(const Value: TDateTime); override;
  50. procedure WriteIdent(const Ident: string); override;
  51. procedure WriteInteger(Value: Int64); override;
  52. procedure WriteMethodName(const Name: String); override;
  53. procedure WriteSet(Value: LongInt; SetType: Pointer); override;
  54. procedure WriteString(const Value: String); override;
  55. end;
  56. implementation
  57. procedure TXMLObjectWriter.StackPush;
  58. var
  59. Parent: TDOMElement;
  60. begin
  61. if Assigned(FStack) then
  62. begin
  63. Parent := StackEl.Element;
  64. FStack.Add(StackEl);
  65. StackEl := TXMLObjectWriterStackEl.Create;
  66. StackEl.Parent := Parent;
  67. end else
  68. begin
  69. FStack := TList.Create;
  70. StackEl := TXMLObjectWriterStackEl.Create;
  71. StackEl.Parent := FRootEl;
  72. end;
  73. end;
  74. procedure TXMLObjectWriter.StackPop;
  75. begin
  76. StackEl.Free;
  77. if FStack.Count > 0 then
  78. begin
  79. StackEl := TXMLObjectWriterStackEl(FStack[FStack.Count - 1]);
  80. FStack.Delete(FStack.Count - 1);
  81. end else
  82. begin
  83. FStack.Free;
  84. FStack := nil;
  85. StackEl := nil;
  86. end;
  87. end;
  88. function TXMLObjectWriter.GetPropertyElement(const TypeName: String): TDOMElement;
  89. begin
  90. if not Assigned(StackEl.Element) then
  91. begin
  92. StackEl.Element := FDoc.CreateElement(TypeName);
  93. StackEl.Parent.AppendChild(StackEl.Element);
  94. StackEl.Element['name'] := StackEl.CurName;
  95. Result := StackEl.Element;
  96. end else
  97. Result := nil;
  98. end;
  99. constructor TXMLObjectWriter.Create(ADoc: TDOMDocument);
  100. begin
  101. inherited Create;
  102. FDoc := ADoc;
  103. FRootEl := FDoc.CreateElement('fcl-persistent');
  104. FDoc.AppendChild(FRootEl);
  105. end;
  106. procedure TXMLObjectWriter.BeginCollection;
  107. begin
  108. WriteLn('BeginCollection');
  109. end;
  110. procedure TXMLObjectWriter.BeginComponent(Component: TComponent; Flags: TFilerFlags;
  111. ChildPos: Integer);
  112. begin
  113. StackPush;
  114. StackEl.Element := FDoc.CreateElement('component');
  115. StackEl.Parent.AppendChild(StackEl.Element);
  116. if Length(Component.Name) > 0 then
  117. StackEl.Element['name'] := Component.Name;
  118. StackEl.Element['class'] := Component.ClassName;
  119. StackPush;
  120. StackEl.Element := FDoc.CreateElement('properties');
  121. StackEl.Parent.AppendChild(StackEl.Element);
  122. StackEl.ElType := elPropertyList;
  123. end;
  124. procedure TXMLObjectWriter.BeginList;
  125. begin
  126. WriteLn('BeginList');
  127. end;
  128. procedure TXMLObjectWriter.EndList;
  129. begin
  130. if StackEl.ElType = elPropertyList then
  131. begin
  132. if not StackEl.Element.HasChildNodes then
  133. StackEl.Parent.RemoveChild(StackEl.Element);
  134. StackPop;
  135. StackPush;
  136. StackEl.Element := FDoc.CreateElement('children');
  137. StackEl.Parent.AppendChild(StackEl.Element);
  138. StackEl.ElType := elChildrenList;
  139. end else if StackEl.ElType = elChildrenList then
  140. begin
  141. if not StackEl.Element.HasChildNodes then
  142. StackEl.Parent.RemoveChild(StackEl.Element);
  143. StackPop;
  144. end else
  145. StackPop;
  146. end;
  147. procedure TXMLObjectWriter.BeginProperty(const PropName: String);
  148. begin
  149. StackPush;
  150. StackEl.CurName := PropName;
  151. end;
  152. procedure TXMLObjectWriter.EndProperty;
  153. begin
  154. StackPop;
  155. end;
  156. procedure TXMLObjectWriter.WriteBinary(const Buffer; Count: Longint);
  157. begin
  158. WriteLn('WriteBinary (', Count, ' Bytes)');
  159. end;
  160. procedure TXMLObjectWriter.WriteBoolean(Value: Boolean);
  161. begin
  162. WriteLn('WriteBoolean: ', Value);
  163. end;
  164. procedure TXMLObjectWriter.WriteFloat(const Value: Extended);
  165. begin
  166. WriteLn('WriteFloat: ', Value);
  167. end;
  168. procedure TXMLObjectWriter.WriteSingle(const Value: Single);
  169. begin
  170. WriteLn('WriteSingle: ', Value);
  171. end;
  172. procedure TXMLObjectWriter.WriteDate(const Value: TDateTime);
  173. begin
  174. WriteLn('WriteDate: ', Value);
  175. end;
  176. procedure TXMLObjectWriter.WriteIdent(const Ident: string);
  177. begin
  178. GetPropertyElement('ident')['value'] := Ident;
  179. end;
  180. procedure TXMLObjectWriter.WriteInteger(Value: Int64);
  181. begin
  182. GetPropertyElement('integer')['value'] := IntToStr(Value);
  183. end;
  184. procedure TXMLObjectWriter.WriteMethodName(const Name: String);
  185. begin
  186. GetPropertyElement('method-name')['value'] := Name;
  187. end;
  188. procedure TXMLObjectWriter.WriteSet(Value: LongInt; SetType: Pointer);
  189. begin
  190. WriteLn('WriteSet: ', Value);
  191. end;
  192. procedure TXMLObjectWriter.WriteString(const Value: String);
  193. begin
  194. GetPropertyElement('string')['value'] := Value;
  195. end;
  196. end.
  197. {
  198. $Log$
  199. Revision 1.3 2000-07-29 14:52:25 sg
  200. * Modified the copyright notice to remove ambiguities
  201. Revision 1.2 2000/07/13 11:33:08 michael
  202. + removed logs
  203. }