fpxmlrep.pp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. {
  2. This file is part of the Free Pascal Utilities
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. unit fpxmlrep;
  11. {$mode objfpc}{$H+}
  12. interface
  13. uses
  14. Classes, SysUtils, dom, fprepos;
  15. Type
  16. { TFPXMLHandler }
  17. TFPXMLHandler = Class(TObject)
  18. private
  19. FIgnoreUnknownNodes: Boolean;
  20. Protected
  21. Function AddTextNode(Const NodeName,NodeContent : String; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement;
  22. Function GetNextElement(Start : TDomNode) : TDomElement;
  23. Function FindNextElement(Start : TDomNode; NodeName : String) : TDomElement;
  24. Function NodeText(E : TDomElement) : String;
  25. procedure CheckNodeType(E : TDomElement; NodeName : String);
  26. public
  27. property IgnoreUnknownNodes : Boolean Read FIgnoreUnknownNodes Write FIgnoreUnknownNodes;
  28. end;
  29. { TFPXMLRepositoryHandler }
  30. TFPXMLRepositoryHandler = Class(TFPXMLHandler)
  31. private
  32. // The DO versions do not check the node type. They do the actual work
  33. // for the public XMLtoXYZ versions..
  34. Function DoXMLToCPUs(N : TDomElement) : TCPUs; virtual;
  35. Function DoXMLToOSes(N : TDomElement) : TOSes; virtual;
  36. Procedure DoXMLToVersion(E : TDomElement; V : TFPVersion); virtual;
  37. Procedure DoXMLToDependency(E : TDomElement; D : TFPDependency); virtual;
  38. Procedure DoXMLToDependencies(E : TDomElement; DS : TFPDependencies); virtual;
  39. Procedure DoXMLToPackage(E : TDomElement; P : TFPPackage); virtual;
  40. Procedure DoXMLToPackages(E : TDomElement; PS: TFPPackages); virtual;
  41. Procedure DoXMLToRepository(E : TDomElement; R: TFPRepository); virtual;
  42. Public
  43. // Saving
  44. Function VersionToXML(V : TFPVersion; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  45. function OSesToXML(OSes:TOSes; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement; virtual;
  46. function CPUsToXML(CPUs:TCPUs; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement; virtual;
  47. Function DependencyToXML(D : TFPDependency; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  48. Function DependenciesToXML(DS : TFPDependencies; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  49. Function PackageToXML(P : TFPPackage; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  50. Function PackagesToXML(PS: TFPPackages; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  51. Function RepositoryToXML(R : TFPRepository; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  52. Procedure SaveToXml(D : TFPDependency; Stream : TStream);
  53. Procedure SaveToXml(DS : TFPDependencies; Stream : TStream);
  54. Procedure SaveToXml(P : TFPPackage; Stream : TStream);
  55. Procedure SaveToXml(PS : TFPPackages; Stream : TStream);
  56. Procedure SaveToXml(R : TFPRepository; Stream : TStream);
  57. Procedure SaveToXml(D : TFPDependency; const FileName: String);
  58. Procedure SaveToXml(DS : TFPDependencies; const FileName: String);
  59. Procedure SaveToXml(P : TFPPackage; const FileName: String);
  60. Procedure SaveToXml(PS : TFPPackages; const FileName: String);
  61. Procedure SaveToXml(R : TFPRepository; const FileName: String);
  62. // Loading
  63. Procedure XMLToVersion(E : TDomElement; V : TFPVersion);
  64. Procedure XMLToDependency(E : TDomElement; D : TFPDependency);
  65. Procedure XMLToDependencies(E : TDomElement; DS : TFPDependencies);
  66. Procedure XMLToPackage(E : TDomElement; P : TFPPackage);
  67. Procedure XMLToPackages(E : TDomElement; PS: TFPPackages);
  68. Procedure XMLToRepository(E : TDomElement; R: TFPRepository);
  69. Procedure LoadFromXml(D : TFPDependency; Stream : TStream);
  70. Procedure LoadFromXml(DS : TFPDependencies; Stream : TStream);
  71. Procedure LoadFromXml(P : TFPPackage; Stream : TStream);
  72. Procedure LoadFromXml(PS : TFPPackages; Stream : TStream);
  73. Procedure LoadFromXml(R : TFPRepository; Stream : TStream);
  74. Procedure LoadFromXml(D : TFPDependency; const FileName: String);
  75. Procedure LoadFromXml(DS : TFPDependencies; const FileName: String);
  76. Procedure LoadFromXml(P : TFPPackage; const FileName: String);
  77. Procedure LoadFromXml(PS : TFPPackages; const FileName: String);
  78. Procedure LoadFromXml(R : TFPRepository; const FileName: String);
  79. end;
  80. { TFPXMLMirrorHandler }
  81. TFPXMLMirrorHandler = Class(TFPXMLHandler)
  82. private
  83. procedure DoXMLToMirror(E: TDomElement; P: TFPMirror);
  84. procedure DoXMLToMirrors(E: TDomElement; PS: TFPMirrors);
  85. Public
  86. // Loading
  87. Procedure XMLToMirrors(E : TDomElement; PS: TFPMirrors);
  88. Procedure LoadFromXml(PS : TFPMirrors; Stream : TStream);
  89. Procedure LoadFromXml(PS : TFPMirrors; const FileName : String);
  90. end;
  91. EXMLPackage = Class(EPackage);
  92. implementation
  93. uses xmlwrite,xmlread,typinfo;
  94. Const
  95. SNodeRepository = 'repository';
  96. SNodePackages = 'packages';
  97. SNodePackage = 'package';
  98. SNodeAuthor = 'author';
  99. SNodeLicense = 'license';
  100. SNodeExternalURL = 'externalurl';
  101. SNodeFileName = 'filename';
  102. SNodeEmail = 'email';
  103. SNodeVersion = 'version';
  104. SNodeDescription = 'description';
  105. SNodeDependencies = 'dependencies';
  106. SNodeDependency = 'dependency';
  107. SNodeOSes = 'oses';
  108. SNodeCPUS = 'cpus';
  109. SNodeOS = 'os';
  110. SNodeCPU = 'cpu';
  111. // Mirrors
  112. SNodeURL = 'url';
  113. SNodeContact = 'contact';
  114. SNodeWeight = 'weight';
  115. SNodeMirror = 'mirror';
  116. SNodeMirrors = 'mirrors';
  117. SAttrName = 'name';
  118. SAttrPackageName = 'packagename';
  119. SAttrMinVersion = 'minversion';
  120. SAttrMajor = 'major';
  121. SAttrMinor = 'minor';
  122. SAttrMicro = 'micro';
  123. SAttrBuild = 'build';
  124. ResourceString
  125. SErrInvalidXMLDocument = 'Wrong root tag in XML document. Expected "%s", got "%s".';
  126. SErrUnknownNode = 'Unknown XML tag ("%s") encountered while reading %s "%s".';
  127. {****************************************************************************
  128. TFPXMLHandler
  129. ****************************************************************************}
  130. function TFPXMLHandler.AddTextNode(Const NodeName,NodeContent : String; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement;
  131. begin
  132. Result:=XML.CreateElement(NodeName);
  133. Try
  134. Result.AppendChild(XML.CreateTextNode(NodeContent));
  135. If Assigned(Parent) then
  136. Parent.AppendChild(Result);
  137. Except
  138. Parent.RemoveChild(Result);
  139. Result.Free;
  140. Raise;
  141. end;
  142. end;
  143. function TFPXMLHandler.GetNextElement(Start: TDomNode): TDomElement;
  144. begin
  145. Result:=Nil;
  146. While (Start<>Nil) and (Start.NodeType<>ELEMENT_NODE) do
  147. Start:=Start.NextSibling;
  148. If (Start<>Nil) then
  149. Result:=Start as TDomElement;
  150. end;
  151. function TFPXMLHandler.FindNextElement(Start: TDomNode; NodeName: String): TDomElement;
  152. begin
  153. Result:=GetNextElement(Start);
  154. While (Result<>Nil) and (Result.NodeName<>NodeName) do
  155. Result:=GetNextElement(Result.NextSibling);
  156. end;
  157. procedure TFPXMLHandler.CheckNodeType(E : TDomElement; NodeName : String);
  158. begin
  159. If (E.NodeName<>NodeName) then
  160. Raise EXMLPackage.CreateFmt(SErrInvalidXMLDocument,[NodeName,E.NodeName]);
  161. end;
  162. Function TFPXMLHandler.NodeText(E : TDomElement) : String;
  163. Var
  164. N : TDomNode;
  165. begin
  166. N:=E.FirstChild;
  167. While (N<>Nil) and (N.NodeType<>TEXT_NODE) do
  168. N:=N.NextSibling;
  169. If (N<>Nil) then
  170. Result:=N.NodeValue;
  171. end;
  172. {****************************************************************************
  173. TFPXMLRepositoryHandler
  174. ****************************************************************************}
  175. function TFPXMLRepositoryHandler.VersionToXML(V : TFPVersion; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  176. begin
  177. Result:=XML.CreateElement(SNodeVersion);
  178. try
  179. If Not Assigned(Parent) then
  180. Parent:=XML;
  181. Parent.AppendChild(Result);
  182. Result[SAttrMajor]:=IntToStr(V.Major);
  183. Result[SAttrMinor]:=IntToStr(V.Minor);
  184. Result[SAttrMicro]:=IntToStr(V.Micro);
  185. Result[SAttrBuild]:=IntToStr(V.Build);
  186. except
  187. Parent.RemoveChild(Result);
  188. Result.Free;
  189. Raise;
  190. end;
  191. end;
  192. function TFPXMLRepositoryHandler.DependencyToXML(D: TFPDependency; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  193. Var
  194. E : TDOMElement;
  195. begin
  196. Result:=XML.CreateElement(SNodeDependency);
  197. Try
  198. If Not Assigned(Parent) then
  199. Parent:=XML;
  200. Parent.AppendChild(Result);
  201. E:=XML.CreateElement(SNodePackage);
  202. E[SAttrPackageName]:=D.PackageName;
  203. Result.AppendChild(E);
  204. if not D.MinVersion.Empty then
  205. VersionToXML(D.MinVersion,XML,Result);
  206. if D.OSes<>AllOSes then
  207. OSesToXML(D.OSes,XML,Result);
  208. if D.CPUs<>AllCPUs then
  209. CPUsToXML(D.CPUs,XML,Result);
  210. Except
  211. Parent.RemoveChild(Result);
  212. Result.Free;
  213. Raise;
  214. end;
  215. end;
  216. function TFPXMLRepositoryHandler.DependenciesToXML(DS: TFPDependencies; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  217. Var
  218. I : Integer;
  219. begin
  220. If (DS.Count>0) then
  221. begin
  222. Result:=XML.CreateElement(SNodeDependencies);
  223. Try
  224. If Not Assigned(Parent) then
  225. Parent:=XML;
  226. Parent.AppendChild(Result);
  227. For I:=0 to DS.Count-1 do
  228. DependencyToXML(DS[i],XML,Result);
  229. except
  230. Parent.RemoveChild(Result);
  231. Result.Free;
  232. Raise;
  233. end;
  234. end;
  235. end;
  236. function TFPXMLRepositoryHandler.OSesToXML(OSes:TOSes; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  237. Var
  238. ES : TDomElement;
  239. O : TOS;
  240. begin
  241. Result:=XML.CreateElement(SNodeOSes);
  242. Parent.AppendChild(Result);
  243. For O:=Low(TOS) to High(TOS) do
  244. If (O in OSes) then
  245. begin
  246. ES:=XML.CreateElement(SNodeOS);
  247. ES[SAttrName]:=GetEnumName(TypeInfo(TOS),Ord(O));
  248. Result.AppendChild(ES);
  249. end;
  250. end;
  251. function TFPXMLRepositoryHandler.CPUsToXML(CPUs:TCPUs; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  252. Var
  253. ES : TDomElement;
  254. C : TCPU;
  255. begin
  256. Result:=XML.CreateElement(SNodeCPUs);
  257. Parent.AppendChild(Result);
  258. For C:=Low(TCPU) to High(TCPU) do
  259. If (C in CPUs) then
  260. begin
  261. ES:=XML.CreateElement(SNodeCPU);
  262. ES[SAttrName]:=GetEnumName(TypeInfo(TCPU),Ord(C));
  263. Result.AppendChild(ES);
  264. end;
  265. end;
  266. function TFPXMLRepositoryHandler.PackageToXML(P: TFPPackage; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  267. begin
  268. Result:=XML.CreateElement(SNodePackage);
  269. Try
  270. If Not Assigned(Parent) then
  271. Parent:=XMl;
  272. Parent.AppendChild(Result);
  273. Result[SAttrName]:=P.Name;
  274. // Version
  275. VersionToXML(P.Version,XML,Result);
  276. AddTextNode(SNodeAuthor,P.Author,XML,Result);
  277. AddTextNode(SNodeExternalURL,P.ExternalURL,XML,Result);
  278. AddTextNode(SNodeFileName,P.FileName,XML,Result);
  279. AddTextNode(SNodeEmail,P.Email,XML,Result);
  280. AddTextNode(SNodeDescription,P.Description,XML,Result);
  281. AddTextNode(SNodeLicense,P.License,XML,Result);
  282. if P.OSes<>AllOSes then
  283. OSesToXML(P.OSes,XML,Result);
  284. if P.CPUs<>AllCPUs then
  285. CPUsToXML(P.CPUs,XML,Result);
  286. If P.Dependencies.Count>0 then
  287. DependenciesToXML(P.Dependencies,XML,Result);
  288. Except
  289. Parent.RemoveChild(Result);
  290. Result.Free;
  291. Raise;
  292. end;
  293. end;
  294. function TFPXMLRepositoryHandler.PackagesToXML(PS: TFPPackages; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  295. Var
  296. I : Integer;
  297. begin
  298. Result:=XML.CreateElement(SNodePackages);
  299. Try
  300. If Not Assigned(Parent) then
  301. Parent:=XML;
  302. Parent.AppendChild(Result);
  303. For I:=0 to PS.Count-1 do
  304. PackageToXML(PS[i],XML,Result);
  305. except
  306. Parent.RemoveChild(Result);
  307. Result.Free;
  308. Raise;
  309. end;
  310. end;
  311. function TFPXMLRepositoryHandler.RepositoryToXML(R: TFPRepository; XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  312. Var
  313. I : Integer;
  314. P : TDomElement;
  315. begin
  316. Result:=XML.CreateElement(sNodeRepository);
  317. Try
  318. If Not Assigned(Parent) then
  319. Parent:=XML;
  320. Parent.AppendChild(Result);
  321. If (R.PackageCount>0) then
  322. begin
  323. P:=XML.CreateElement(SNodePackages);
  324. Try
  325. Result.AppendChild(P);
  326. For I:=0 to R.PackageCount-1 do
  327. PackageToXML(R.Packages[i],XML,P);
  328. except
  329. Result.RemoveChild(P);
  330. P.Free;
  331. Raise;
  332. end;
  333. end;
  334. except
  335. Parent.RemoveChild(Result);
  336. Result.Free;
  337. Raise;
  338. end;
  339. end;
  340. procedure TFPXMLRepositoryHandler.SaveToXml(D: TFPDependency; Stream: TStream);
  341. Var
  342. X : TXMLDocument;
  343. begin
  344. X:=TXMLDocument.Create;
  345. Try
  346. DependencyToXML(D,X,Nil);
  347. WriteXMLFile(X,Stream);
  348. Finally
  349. D.Free;
  350. end;
  351. end;
  352. procedure TFPXMLRepositoryHandler.SaveToXml(DS: TFPDependencies; Stream: TStream);
  353. Var
  354. D : TXMLDocument;
  355. begin
  356. D:=TXMLDocument.Create;
  357. Try
  358. DependenciesToXML(DS,D,Nil);
  359. WriteXMLFile(D,Stream);
  360. Finally
  361. D.Free;
  362. end;
  363. end;
  364. procedure TFPXMLRepositoryHandler.SaveToXml(P: TFPPackage; Stream: TStream);
  365. Var
  366. D : TXMLDocument;
  367. begin
  368. D:=TXMLDocument.Create;
  369. Try
  370. PackageToXML(P,D,Nil);
  371. WriteXMLFile(D,Stream);
  372. Finally
  373. D.Free;
  374. end;
  375. end;
  376. procedure TFPXMLRepositoryHandler.SaveToXml(PS: TFPPackages; Stream: TStream);
  377. Var
  378. D : TXMLDocument;
  379. begin
  380. D:=TXMLDocument.Create;
  381. Try
  382. PackagesToXML(PS,D,Nil);
  383. WriteXMLFile(D,Stream);
  384. Finally
  385. D.Free;
  386. end;
  387. end;
  388. procedure TFPXMLRepositoryHandler.SaveToXml(R: TFPRepository; Stream: TStream);
  389. Var
  390. D : TXMLDocument;
  391. begin
  392. D:=TXMLDocument.Create;
  393. Try
  394. RepositoryToXML(R,D,Nil);
  395. WriteXMLFile(D,Stream);
  396. Finally
  397. D.Free;
  398. end;
  399. end;
  400. procedure TFPXMLRepositoryHandler.SaveToXml(D: TFPDependency; const FileName: String);
  401. Var
  402. F : TFileStream;
  403. begin
  404. F:=TFileStream.Create(FileName,fmCreate);
  405. try
  406. SaveToXML(D,F);
  407. finally
  408. F.Free;
  409. end;
  410. end;
  411. procedure TFPXMLRepositoryHandler.SaveToXml(DS: TFPDependencies; const FileName: String);
  412. Var
  413. F : TFileStream;
  414. begin
  415. F:=TFileStream.Create(FileName,fmCreate);
  416. try
  417. SaveToXML(DS,F);
  418. finally
  419. F.Free;
  420. end;
  421. end;
  422. procedure TFPXMLRepositoryHandler.SaveToXml(P: TFPPackage; const FileName: String);
  423. Var
  424. F : TFileStream;
  425. begin
  426. F:=TFileStream.Create(FileName,fmCreate);
  427. try
  428. SaveToXML(P,F);
  429. finally
  430. F.Free;
  431. end;
  432. end;
  433. procedure TFPXMLRepositoryHandler.SaveToXml(PS: TFPPackages; const FileName: String);
  434. Var
  435. F : TFileStream;
  436. begin
  437. F:=TFileStream.Create(FileName,fmCreate);
  438. try
  439. SaveToXML(PS,F);
  440. finally
  441. F.Free;
  442. end;
  443. end;
  444. procedure TFPXMLRepositoryHandler.SaveToXml(R: TFPRepository; const FileName: String);
  445. Var
  446. F : TFileStream;
  447. begin
  448. F:=TFileStream.Create(FileName,fmCreate);
  449. try
  450. SaveToXML(R,F);
  451. finally
  452. F.Free;
  453. end;
  454. end;
  455. procedure TFPXMLRepositoryHandler.XMLToVersion(E: TDomElement; V: TFPVersion);
  456. begin
  457. CheckNodeType(E,SNodeVersion);
  458. DoXMLToVersion(E,V);
  459. end;
  460. procedure TFPXMLRepositoryHandler.DoXMLToVersion(E: TDomElement; V: TFPVersion);
  461. begin
  462. V.Major:=Abs(StrToIntDef(E[SAttrMajor],0));
  463. V.Minor:=Abs(StrToIntDef(E[SAttrMinor],0));
  464. V.Micro:=Abs(StrToIntDef(E[SAttrMicro],0));
  465. V.Build:=Abs(StrToIntDef(E[SAttrBuild],0));
  466. end;
  467. procedure TFPXMLRepositoryHandler.XMLToDependency(E: TDomElement; D: TFPDependency);
  468. begin
  469. CheckNodeType(E,SNodeDependency);
  470. DoXMLToDependency(E,D);
  471. end;
  472. procedure TFPXMLRepositoryHandler.DoXMLToDependency(E: TDomElement; D: TFPDependency);
  473. var
  474. N : TDomElement;
  475. begin
  476. N:=GetNextElement(E.FirstChild);
  477. While (N<>Nil) do
  478. begin
  479. if (N.NodeName=sNodePackage) then
  480. D.PackageName:=N[SAttrPackageName]
  481. else if (N.NodeName=sNodeVersion) then
  482. DoXMlToVersion(N,D.MinVersion)
  483. else if (N.NodeName=sNodeOSes) then
  484. D.OSes:=DoXMLToOSes(N)
  485. else if (N.NodeName=sNodeCPUS) then
  486. D.CPUs:=DoXMLToCPUs(N)
  487. else if Not IgnoreUnknownNodes then
  488. Raise EXMLPackage.CreateFmt(SErrUnknownNode,[N.NodeName,sNodeDependency,'']);
  489. N:=GetNextElement(N.NextSibling);
  490. end;
  491. end;
  492. procedure TFPXMLRepositoryHandler.XMLToDependencies(E: TDomElement; DS: TFPDependencies);
  493. begin
  494. CheckNodeType(E,SNodeDependencies);
  495. DoXMLToDependencies(E,DS)
  496. end;
  497. procedure TFPXMLRepositoryHandler.DoXMLToDependencies(E: TDomElement; DS: TFPDependencies);
  498. Var
  499. DN : TDomElement;
  500. D : TFPDependency;
  501. begin
  502. DN:=FindNextElement(E.FirstChild,SNodeDependency);
  503. While (DN<>Nil) do
  504. begin
  505. D:=DS.AddDependency('','');
  506. Try
  507. DoXMLToDependency(DN,D);
  508. except
  509. D.Free;
  510. Raise;
  511. end;
  512. DN:=FindNextElement(DN.NextSibling,SNodeDependency);
  513. end;
  514. end;
  515. procedure TFPXMLRepositoryHandler.XMLToPackage(E: TDomElement; P: TFPPackage);
  516. begin
  517. CheckNodeType(E,sNodePackage);
  518. DoXMLToPackage(E,P);
  519. end;
  520. Function TFPXMLRepositoryHandler.DoXMLToOSes(N : TDomElement) : TOSes;
  521. Var
  522. E : TDomElement;
  523. J : Integer;
  524. begin
  525. Result:=[];
  526. E:=FindNextElement(N.FirstChild,SNodeOS);
  527. While (E<>Nil) do
  528. begin
  529. J:=GetEnumValue(TypeInfo(TOS),E[SAttrName]);
  530. If (J<>-1) then
  531. Include(Result,TOS(J));
  532. E:=FindNextElement(E.NextSibling,SNodeOS);
  533. end;
  534. end;
  535. Function TFPXMLRepositoryHandler.DoXMLToCPUs(N : TDomElement) : TCPUS;
  536. Var
  537. E : TDomElement;
  538. J : Integer;
  539. begin
  540. Result:=[];
  541. E:=FindNextElement(N.FirstChild,SNodeCPU);
  542. While (E<>Nil) do
  543. begin
  544. J:=GetEnumValue(TypeInfo(TCPU),E[SAttrName]);
  545. If (J<>-1) then
  546. Include(Result,TCPU(J));
  547. E:=FindNextElement(E.NextSibling,SNodeCPU);
  548. end;
  549. end;
  550. procedure TFPXMLRepositoryHandler.DoXMLToPackage(E: TDomElement; P: TFPPackage);
  551. Var
  552. N : TDomElement;
  553. begin
  554. P.Name:=E[sAttrName];
  555. N:=GetNextElement(E.FirstChild);
  556. While (N<>Nil) do
  557. begin
  558. if (N.NodeName=sNodeAuthor) then
  559. P.Author:=NodeText(N)
  560. else if (N.NodeName=sNodeExternalURL) then
  561. P.ExternalURL:=NodeText(N)
  562. else if (N.NodeName=sNodeFileName) then
  563. P.FileName:=NodeText(N)
  564. else if (N.NodeName=sNodeEmail) then
  565. P.Email:=NodeText(N)
  566. else if (N.NodeName=sNodeDescription) then
  567. P.Description:=NodeText(N)
  568. else if (N.NodeName=sNodeLicense) then
  569. P.License:=NodeText(N)
  570. else if (N.NodeName=sNodeVersion) then
  571. DoXMlToVersion(N,P.Version)
  572. else if (N.NodeName=sNodeOSes) then
  573. P.OSes:=DoXMLToOSes(N)
  574. else if (N.NodeName=sNodeCPUS) then
  575. P.CPUs:=DoXMLToCPUs(N)
  576. else if (N.NodeName=sNodeDependencies) then
  577. DoXMlToDependencies(N,P.Dependencies)
  578. else if Not IgnoreUnknownNodes then
  579. Raise EXMLPackage.CreateFmt(SErrUnknownNode,[N.NodeName,sNodePackage,P.Name]);
  580. N:=GetNextElement(N.NextSibling);
  581. end;
  582. end;
  583. procedure TFPXMLRepositoryHandler.XMLToPackages(E: TDomElement; PS: TFPPackages);
  584. begin
  585. CheckNodeType(E,SNodePackages);
  586. DoXMLToPackages(E,PS);
  587. end;
  588. procedure TFPXMLRepositoryHandler.DoXMLToPackages(E: TDomElement; PS: TFPPackages);
  589. Var
  590. PN : TDomElement;
  591. P : TFPPackage;
  592. begin
  593. PN:=FindNextElement(E.FirstChild,SNodePackage);
  594. While (PN<>Nil) do
  595. begin
  596. P:=PS.AddPackage('');
  597. try
  598. DoXMLToPackage(PN,P);
  599. except
  600. P.Free;
  601. Raise;
  602. end;
  603. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  604. end;
  605. end;
  606. procedure TFPXMLRepositoryHandler.XMLToRepository(E: TDomElement; R: TFPRepository);
  607. begin
  608. CheckNodeType(E,SNodeRepository);
  609. DoXMLToRepository(E,R);
  610. end;
  611. procedure TFPXMLRepositoryHandler.DoXMLToRepository(E: TDomElement; R: TFPRepository);
  612. Var
  613. PSN,PN : TDomElement;
  614. P : TFPPackage;
  615. begin
  616. PSN:=FindNextElement(E.FirstChild,SNodePackages);
  617. If (PSN<>Nil) then
  618. begin
  619. PN:=FindNextElement(PSN.FirstChild,SNodePackage);
  620. While (PN<>Nil) do
  621. begin
  622. P:=R.AddPackage('');
  623. try
  624. DoXMLToPackage(PN,P);
  625. except
  626. P.Free;
  627. Raise;
  628. end;
  629. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  630. end;
  631. end;
  632. end;
  633. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; Stream: TStream);
  634. Var
  635. XML : TXMLDocument;
  636. begin
  637. XML:=TXMLDocument.Create;
  638. try
  639. Xmlread.ReadXMLFile(XML,Stream);
  640. XmlToDependency(XML.DocumentElement,D);
  641. finally
  642. XML.Free;
  643. end;
  644. end;
  645. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies; Stream: TStream);
  646. Var
  647. XML : TXMLDocument;
  648. begin
  649. XML:=TXMLDocument.Create;
  650. try
  651. xmlread.ReadXMLFile(XML,Stream);
  652. XmlToDependencies(XML.DocumentElement,DS);
  653. finally
  654. XML.Free;
  655. end;
  656. end;
  657. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; Stream: TStream);
  658. Var
  659. XML : TXMLDocument;
  660. begin
  661. XML:=TXMLDocument.Create;
  662. try
  663. xmlread.ReadXMLFile(XML,Stream);
  664. XmlToPackage(XML.DocumentElement,P);
  665. finally
  666. XML.Free;
  667. end;
  668. end;
  669. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; Stream: TStream);
  670. Var
  671. XML : TXMLDocument;
  672. begin
  673. XML:=TXMLDocument.Create;
  674. try
  675. xmlread.ReadXMLFile(XML,Stream);
  676. XmlToPackages(XML.DocumentElement,PS);
  677. finally
  678. XML.Free;
  679. end;
  680. end;
  681. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; Stream: TStream);
  682. Var
  683. XML : TXMLDocument;
  684. begin
  685. XML:=TXMLDocument.Create;
  686. try
  687. xmlread.ReadXMLFile(XML,Stream);
  688. XmlToRepository(XML.DocumentElement,R);
  689. finally
  690. XML.Free;
  691. end;
  692. end;
  693. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; const FileName: String);
  694. Var
  695. F : TFileStream;
  696. begin
  697. F:=TFileStream.Create(FileName,fmOpenRead);
  698. try
  699. LoadFromXMl(D,F);
  700. finally
  701. F.Free;
  702. end;
  703. end;
  704. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies; const FileName: String);
  705. Var
  706. F : TFileStream;
  707. begin
  708. F:=TFileStream.Create(FileName,fmOpenRead);
  709. try
  710. LoadFromXMl(DS,F);
  711. finally
  712. F.Free;
  713. end;
  714. end;
  715. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; const FileName: String);
  716. Var
  717. F : TFileStream;
  718. begin
  719. F:=TFileStream.Create(FileName,fmOpenRead);
  720. try
  721. LoadFromXMl(P,F);
  722. finally
  723. F.Free;
  724. end;
  725. end;
  726. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; const FileName: String);
  727. Var
  728. F : TFileStream;
  729. begin
  730. F:=TFileStream.Create(FileName,fmOpenRead);
  731. try
  732. LoadFromXMl(PS,F);
  733. finally
  734. F.Free;
  735. end;
  736. end;
  737. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; const FileName: String);
  738. Var
  739. F : TFileStream;
  740. begin
  741. F:=TFileStream.Create(FileName,fmOpenRead);
  742. try
  743. LoadFromXMl(R,F);
  744. finally
  745. F.Free;
  746. end;
  747. end;
  748. {****************************************************************************
  749. TFPXMLMirrorHandler
  750. ****************************************************************************}
  751. procedure TFPXMLMirrorHandler.DoXMLToMirror(E: TDomElement; P: TFPMirror);
  752. Var
  753. N : TDomElement;
  754. begin
  755. P.Name:=E[sAttrName];
  756. N:=GetNextElement(E.FirstChild);
  757. While (N<>Nil) do
  758. begin
  759. if (N.NodeName=sNodeURL) then
  760. P.URL:=NodeText(N)
  761. else if (N.NodeName=sNodeContact) then
  762. P.Contact:=NodeText(N)
  763. else if (N.NodeName=sNodeWeight) then
  764. P.Weight:=StrToInt(NodeText(N))
  765. else if Not IgnoreUnknownNodes then
  766. Raise EXMLPackage.CreateFmt(SErrUnknownNode,[N.NodeName,sNodeMirror,P.Name]);
  767. N:=GetNextElement(N.NextSibling);
  768. end;
  769. end;
  770. procedure TFPXMLMirrorHandler.DoXMLToMirrors(E: TDomElement; PS: TFPMirrors);
  771. Var
  772. PN : TDomElement;
  773. P : TFPMirror;
  774. begin
  775. PN:=FindNextElement(E.FirstChild,SNodeMirror);
  776. While (PN<>Nil) do
  777. begin
  778. P:=PS.AddMirror('');
  779. try
  780. DoXMLToMirror(PN,P);
  781. except
  782. P.Free;
  783. Raise;
  784. end;
  785. PN:=FindNextElement(PN.NextSibling,SNodeMirror);
  786. end;
  787. end;
  788. procedure TFPXMLMirrorHandler.XMLToMirrors(E: TDomElement; PS: TFPMirrors);
  789. begin
  790. CheckNodeType(E,SNodeMirrors);
  791. DoXMLToMirrors(E,PS);
  792. end;
  793. procedure TFPXMLMirrorHandler.LoadFromXml(PS: TFPMirrors; Stream: TStream);
  794. Var
  795. XML : TXMLDocument;
  796. begin
  797. XML:=TXMLDocument.Create;
  798. try
  799. xmlread.ReadXMLFile(XML,Stream);
  800. XmlToMirrors(XML.DocumentElement,PS);
  801. finally
  802. XML.Free;
  803. end;
  804. end;
  805. procedure TFPXMLMirrorHandler.LoadFromXml(PS: TFPMirrors; const FileName: String);
  806. Var
  807. F : TFileStream;
  808. begin
  809. F:=TFileStream.Create(FileName,fmOpenRead);
  810. try
  811. LoadFromXMl(PS,F);
  812. finally
  813. F.Free;
  814. end;
  815. end;
  816. end.