fpxmlrep.pp 24 KB

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