fpxmlrep.pp 25 KB

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