fpxmlrep.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  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. { TFPXMLRepositoryHandler }
  17. TFPXMLRepositoryHandler = 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. // The DO versions do not check the node type. They do the actual work
  27. // for the public XMLtoXYZ versions..
  28. Function DoXMLToCPUs(N : TDomElement) : TCPUs; virtual;
  29. Function DoXMLToOSes(N : TDomElement) : TOSes; virtual;
  30. Procedure DoXMLToVersion(E : TDomElement; V : TFPVersion); virtual;
  31. Procedure DoXMLToDependency(E : TDomElement; D : TFPDependency); virtual;
  32. Procedure DoXMLToDependencies(E : TDomElement; DS : TFPDependencies); virtual;
  33. Procedure DoXMLToPackage(E : TDomElement; P : TFPPackage); virtual;
  34. Procedure DoXMLToPackages(E : TDomElement; PS: TFPPackages); virtual;
  35. Procedure DoXMLToRepository(E : TDomElement; R: TFPRepository); virtual;
  36. Public
  37. // Saving
  38. Function VersionToXML(V : TFPVersion; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  39. Function DependencyToXML(D : TFPDependency; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  40. Function DependenciesToXML(DS : TFPDependencies; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  41. Function PackageToXML(P : TFPPackage; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  42. Function PackagesToXML(PS: TFPPackages; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  43. Function RepositoryToXML(R : TFPRepository; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement; virtual;
  44. Procedure SaveToXml(D : TFPDependency; Stream : TStream);
  45. Procedure SaveToXml(DS : TFPDependencies; Stream : TStream);
  46. Procedure SaveToXml(P : TFPPackage; Stream : TStream);
  47. Procedure SaveToXml(PS : TFPPackages; Stream : TStream);
  48. Procedure SaveToXml(R : TFPRepository; Stream : TStream);
  49. Procedure SaveToXml(D : TFPDependency; FileName : String);
  50. Procedure SaveToXml(DS : TFPDependencies; FileName : String);
  51. Procedure SaveToXml(P : TFPPackage; FileName : String);
  52. Procedure SaveToXml(PS : TFPPackages; FileName : String);
  53. Procedure SaveToXml(R : TFPRepository; FileName : String);
  54. // Loading
  55. Procedure XMLToVersion(E : TDomElement; V : TFPVersion);
  56. Procedure XMLToDependency(E : TDomElement; D : TFPDependency);
  57. Procedure XMLToDependencies(E : TDomElement; DS : TFPDependencies);
  58. Procedure XMLToPackage(E : TDomElement; P : TFPPackage);
  59. Procedure XMLToPackages(E : TDomElement; PS: TFPPackages);
  60. Procedure XMLToRepository(E : TDomElement; R: TFPRepository);
  61. Procedure LoadFromXml(D : TFPDependency; Stream : TStream);
  62. Procedure LoadFromXml(DS : TFPDependencies; Stream : TStream);
  63. Procedure LoadFromXml(P : TFPPackage; Stream : TStream);
  64. Procedure LoadFromXml(PS : TFPPackages; Stream : TStream);
  65. Procedure LoadFromXml(R : TFPRepository; Stream : TStream);
  66. Procedure LoadFromXml(D : TFPDependency; FileName : String);
  67. Procedure LoadFromXml(DS : TFPDependencies; FileName : String);
  68. Procedure LoadFromXml(P : TFPPackage; FileName : String);
  69. Procedure LoadFromXml(PS : TFPPackages; FileName : String);
  70. Procedure LoadFromXml(R : TFPRepository; FileName : String);
  71. property IgnoreUnknownNodes : Boolean Read FIgnoreUnknownNodes Write FIgnoreUnknownNodes;
  72. end;
  73. EXMLPackage = Class(EPackage);
  74. implementation
  75. uses xmlwrite,xmlread,typinfo;
  76. Const
  77. SNodeRepository = 'repository';
  78. SNodePackages = 'packages';
  79. SNodePackage = 'package';
  80. SNodeAuthor = 'author';
  81. SNodeLicense = 'license';
  82. SNodeExternalURL = 'externalurl';
  83. SNodeFileName = 'filename';
  84. SNodeEmail = 'email';
  85. SNodeVersion = 'version';
  86. SNodeDescription = 'description';
  87. SNodeDependencies = 'dependencies';
  88. SNodeDependency = 'dependency';
  89. SNodeOSes = 'oses';
  90. SNodeCPUS = 'cpus';
  91. SNodeOS = 'os';
  92. SNodeCPU = 'cpu';
  93. SAttrName = 'name';
  94. SAttrPackageName = 'packagename';
  95. SAttrMinVersion = 'minversion';
  96. SAttrRelease = 'release';
  97. SAttrMajor = 'major';
  98. SAttrMinor = 'minor';
  99. SAttrSuffix = 'suffix';
  100. ResourceString
  101. SErrInvalidXMLDocument = 'Wrong root tag in XML document. Expected "%s", got "%s".';
  102. SErrUnknownPackageNode = 'Unknown XML tag ("%s") encountered while reading package "%s".';
  103. SErrInvalidDependencyXML = 'Invalid XMl encountered when reading dependency.';
  104. { TFPXMLRepositoryHandler }
  105. function TFPXMLRepositoryHandler.VersionToXML(V : TFPVersion;
  106. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  107. begin
  108. Result:=XML.CreateElement(SNodeVersion);
  109. try
  110. If Not Assigned(Parent) then
  111. Parent:=XML;
  112. Parent.AppendChild(Result);
  113. Result[SAttrRelease]:=IntToStr(V.Release);
  114. Result[SAttrMajor]:=IntToStr(V.Major);
  115. Result[SAttrMinor]:=IntToStr(V.Minor);
  116. Result[SAttrSuffix]:=V.Suffix;
  117. except
  118. Parent.RemoveChild(Result);
  119. Result.Free;
  120. Raise;
  121. end;
  122. end;
  123. function TFPXMLRepositoryHandler.DependencyToXML(D: TFPDependency;
  124. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  125. Var
  126. E : TDOMElement;
  127. begin
  128. Result:=XML.CreateElement(SNodeDependency);
  129. Try
  130. If Not Assigned(Parent) then
  131. Parent:=XML;
  132. Parent.AppendChild(Result);
  133. E:=XML.CreateElement(SNodePackage);
  134. E[SAttrPackageName]:=D.PackageName;
  135. If Not D.MinVersion.Empty then
  136. E[SAttrMinVersion]:=D.MinVersion.AsString;
  137. Result.AppendChild(E);
  138. Except
  139. Parent.RemoveChild(Result);
  140. Result.Free;
  141. Raise;
  142. end;
  143. end;
  144. function TFPXMLRepositoryHandler.DependenciesToXML(DS: TFPDependencies;
  145. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  146. Var
  147. I : Integer;
  148. begin
  149. If (DS.Count>0) then
  150. begin
  151. Result:=XML.CreateElement(SNodeDependencies);
  152. Try
  153. If Not Assigned(Parent) then
  154. Parent:=XML;
  155. Parent.AppendChild(Result);
  156. For I:=0 to DS.Count-1 do
  157. DependencyToXML(DS[i],XML,Result);
  158. except
  159. Parent.RemoveChild(Result);
  160. Result.Free;
  161. Raise;
  162. end;
  163. end;
  164. end;
  165. function TFPXMLRepositoryHandler.AddTextNode(Const NodeName,NodeContent : String; XML : TXMLDocument; Parent : TDomNode_WithChildren) : TDomElement;
  166. begin
  167. Result:=XML.CreateElement(NodeName);
  168. Try
  169. Result.AppendChild(XML.CreateTextNode(NodeContent));
  170. If Assigned(Parent) then
  171. Parent.AppendChild(Result);
  172. Except
  173. Parent.RemoveChild(Result);
  174. Result.Free;
  175. Raise;
  176. end;
  177. end;
  178. function TFPXMLRepositoryHandler.GetNextElement(Start: TDomNode): TDomElement;
  179. begin
  180. Result:=Nil;
  181. While (Start<>Nil) and (Start.NodeType<>ELEMENT_NODE) do
  182. Start:=Start.NextSibling;
  183. If (Start<>Nil) then
  184. Result:=Start as TDomElement;
  185. end;
  186. function TFPXMLRepositoryHandler.FindNextElement(Start: TDomNode; NodeName: String): TDomElement;
  187. begin
  188. Result:=GetNextElement(Start);
  189. While (Result<>Nil) and (Result.NodeName<>NodeName) do
  190. Result:=GetNextElement(Result);
  191. end;
  192. procedure TFPXMLRepositoryHandler.CheckNodeType(E : TDomElement; NodeName : String);
  193. begin
  194. If (E.NodeName<>NodeName) then
  195. Raise EXMLPackage.CreateFmt(SErrInvalidXMLDocument,[NodeName,E.NodeName]);
  196. end;
  197. Function TFPXMLRepositoryHandler.NodeText(E : TDomElement) : String;
  198. Var
  199. N : TDomNode;
  200. begin
  201. N:=E.FirstChild;
  202. While (N<>Nil) and (N.NodeType<>TEXT_NODE) do
  203. N:=N.NextSibling;
  204. If (N<>Nil) then
  205. Result:=N.NodeValue;
  206. end;
  207. function TFPXMLRepositoryHandler.PackageToXML(P: TFPPackage;
  208. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  209. Var
  210. E,ES : TDomElement;
  211. O : TOS;
  212. C : TCPU;
  213. begin
  214. Result:=XML.CreateElement(SNodePackage);
  215. Try
  216. If Not Assigned(Parent) then
  217. Parent:=XMl;
  218. Parent.AppendChild(Result);
  219. Result[SAttrName]:=P.Name;
  220. // Version
  221. VersionToXML(P.Version,XML,Result);
  222. AddTextNode(SNodeAuthor,P.Author,XML,Result);
  223. AddTextNode(SNodeExternalURL,P.ExternalURL,XML,Result);
  224. AddTextNode(SNodeFileName,P.FileName,XML,Result);
  225. AddTextNode(SNodeEmail,P.Email,XML,Result);
  226. AddTextNode(SNodeDescription,P.Description,XML,Result);
  227. AddTextNode(SNodeLicense,P.License,XML,Result);
  228. // OSes
  229. E:=XML.CreateElement(SNodeOSes);
  230. Result.AppendChild(E);
  231. For O:=Low(TOS) to High(TOS) do
  232. If (O in P.OSes) then
  233. begin
  234. ES:=XML.CreateElement(SNodeOS);
  235. ES[SAttrName]:=GetEnumName(TypeInfo(TOS),Ord(O));
  236. E.AppendChild(ES);
  237. end;
  238. // CPUs
  239. E:=XML.CreateElement(SNodeCPUs);
  240. Result.AppendChild(E);
  241. For C:=Low(TCPU) to High(TCPU) do
  242. If (C in P.CPUS) then
  243. begin
  244. ES:=XML.CreateElement(SNodeCPU);
  245. ES[SAttrName]:=GetEnumName(TypeInfo(TCPU),Ord(C));
  246. E.AppendChild(ES);
  247. end;
  248. If P.HasDependencies then
  249. DependenciesToXML(P.Dependencies,XML,Result);
  250. Except
  251. Parent.RemoveChild(Result);
  252. Result.Free;
  253. Raise;
  254. end;
  255. end;
  256. function TFPXMLRepositoryHandler.PackagesToXML(PS: TFPPackages;
  257. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  258. Var
  259. I : Integer;
  260. begin
  261. Result:=XML.CreateElement(SNodePackages);
  262. Try
  263. If Not Assigned(Parent) then
  264. Parent:=XML;
  265. Parent.AppendChild(Result);
  266. For I:=0 to PS.Count-1 do
  267. PackageToXML(PS[i],XML,Result);
  268. except
  269. Parent.RemoveChild(Result);
  270. Result.Free;
  271. Raise;
  272. end;
  273. end;
  274. function TFPXMLRepositoryHandler.RepositoryToXML(R: TFPRepository;
  275. XML: TXMLDocument; Parent : TDomNode_WithChildren): TDomElement;
  276. Var
  277. I : Integer;
  278. P : TDomElement;
  279. begin
  280. Result:=XML.CreateElement(sNodeRepository);
  281. Try
  282. If Not Assigned(Parent) then
  283. Parent:=XML;
  284. Parent.AppendChild(Result);
  285. If (R.PackageCount>0) then
  286. begin
  287. P:=XML.CreateElement(SNodePackages);
  288. Try
  289. Result.AppendChild(P);
  290. For I:=0 to R.PackageCount-1 do
  291. PackageToXML(R.Packages[i],XML,P);
  292. except
  293. Result.RemoveChild(P);
  294. P.Free;
  295. Raise;
  296. end;
  297. end;
  298. except
  299. Parent.RemoveChild(Result);
  300. Result.Free;
  301. Raise;
  302. end;
  303. end;
  304. procedure TFPXMLRepositoryHandler.SaveToXml(D: TFPDependency; Stream: TStream);
  305. Var
  306. X : TXMLDocument;
  307. begin
  308. X:=TXMLDocument.Create;
  309. Try
  310. DependencyToXML(D,X,Nil);
  311. WriteXMLFile(X,Stream);
  312. Finally
  313. D.Free;
  314. end;
  315. end;
  316. procedure TFPXMLRepositoryHandler.SaveToXml(DS: TFPDependencies; Stream: TStream);
  317. Var
  318. D : TXMLDocument;
  319. begin
  320. D:=TXMLDocument.Create;
  321. Try
  322. DependenciesToXML(DS,D,Nil);
  323. WriteXMLFile(D,Stream);
  324. Finally
  325. D.Free;
  326. end;
  327. end;
  328. procedure TFPXMLRepositoryHandler.SaveToXml(P: TFPPackage; Stream: TStream);
  329. Var
  330. D : TXMLDocument;
  331. begin
  332. D:=TXMLDocument.Create;
  333. Try
  334. PackageToXML(P,D,Nil);
  335. WriteXMLFile(D,Stream);
  336. Finally
  337. D.Free;
  338. end;
  339. end;
  340. procedure TFPXMLRepositoryHandler.SaveToXml(PS: TFPPackages; Stream: TStream);
  341. Var
  342. D : TXMLDocument;
  343. begin
  344. D:=TXMLDocument.Create;
  345. Try
  346. PackagesToXML(PS,D,Nil);
  347. WriteXMLFile(D,Stream);
  348. Finally
  349. D.Free;
  350. end;
  351. end;
  352. procedure TFPXMLRepositoryHandler.SaveToXml(R: TFPRepository; Stream: TStream);
  353. Var
  354. D : TXMLDocument;
  355. begin
  356. D:=TXMLDocument.Create;
  357. Try
  358. RepositoryToXML(R,D,Nil);
  359. WriteXMLFile(D,Stream);
  360. Finally
  361. D.Free;
  362. end;
  363. end;
  364. procedure TFPXMLRepositoryHandler.SaveToXml(D: TFPDependency; FileName: String);
  365. Var
  366. F : TFileStream;
  367. begin
  368. F:=TFileStream.Create(FileName,fmCreate);
  369. try
  370. SaveToXML(D,F);
  371. finally
  372. F.Free;
  373. end;
  374. end;
  375. procedure TFPXMLRepositoryHandler.SaveToXml(DS: TFPDependencies; FileName: String);
  376. Var
  377. F : TFileStream;
  378. begin
  379. F:=TFileStream.Create(FileName,fmCreate);
  380. try
  381. SaveToXML(DS,F);
  382. finally
  383. F.Free;
  384. end;
  385. end;
  386. procedure TFPXMLRepositoryHandler.SaveToXml(P: TFPPackage; FileName: String);
  387. Var
  388. F : TFileStream;
  389. begin
  390. F:=TFileStream.Create(FileName,fmCreate);
  391. try
  392. SaveToXML(P,F);
  393. finally
  394. F.Free;
  395. end;
  396. end;
  397. procedure TFPXMLRepositoryHandler.SaveToXml(PS: TFPPackages; FileName: String);
  398. Var
  399. F : TFileStream;
  400. begin
  401. F:=TFileStream.Create(FileName,fmCreate);
  402. try
  403. SaveToXML(PS,F);
  404. finally
  405. F.Free;
  406. end;
  407. end;
  408. procedure TFPXMLRepositoryHandler.SaveToXml(R: TFPRepository; FileName: String);
  409. Var
  410. F : TFileStream;
  411. begin
  412. F:=TFileStream.Create(FileName,fmCreate);
  413. try
  414. SaveToXML(R,F);
  415. finally
  416. F.Free;
  417. end;
  418. end;
  419. procedure TFPXMLRepositoryHandler.XMLToVersion(E: TDomElement; V: TFPVersion);
  420. begin
  421. CheckNodeType(E,SNodeVersion);
  422. DoXMLToVersion(E,V);
  423. end;
  424. procedure TFPXMLRepositoryHandler.DoXMLToVersion(E: TDomElement; V: TFPVersion);
  425. begin
  426. V.Release:=Abs(StrToIntDef(E[SAttrRelease],0));
  427. V.Major:=Abs(StrToIntDef(E[SAttrMajor],0));
  428. V.Minor:=Abs(StrToIntDef(E[SAttrMinor],0));
  429. V.Suffix:=E[SAttrSuffix];
  430. end;
  431. procedure TFPXMLRepositoryHandler.XMLToDependency(E: TDomElement; D: TFPDependency);
  432. begin
  433. CheckNodeType(E,SNodeDependency);
  434. DoXMLToDependency(E,D);
  435. end;
  436. procedure TFPXMLRepositoryHandler.DoXMLToDependency(E: TDomElement; D: TFPDependency);
  437. begin
  438. E:=FindNextElement(E.FirstChild,SNodePackage);
  439. If (E=Nil) then
  440. Raise EXMLpackage.Create(SErrInvalidDependencyXML);
  441. D.PackageName:=E[SAttrPackageName];
  442. D.MinVersion.AsString:=E[SAttrMinVersion];
  443. end;
  444. procedure TFPXMLRepositoryHandler.XMLToDependencies(E: TDomElement; DS: TFPDependencies);
  445. begin
  446. CheckNodeType(E,SNodeDependencies);
  447. DoXMLToDependencies(E,DS)
  448. end;
  449. procedure TFPXMLRepositoryHandler.DoXMLToDependencies(E: TDomElement;
  450. DS: TFPDependencies);
  451. Var
  452. DN : TDomElement;
  453. D : TFPDependency;
  454. begin
  455. DN:=FindNextElement(E.FirstChild,SNodeDependency);
  456. While (DN<>Nil) do
  457. begin
  458. D:=DS.AddDependency('','');
  459. Try
  460. DoXMLToDependency(DN,D);
  461. except
  462. D.Free;
  463. Raise;
  464. end;
  465. DN:=FindNextElement(DN.NextSibling,SNodeDependency);
  466. end;
  467. end;
  468. procedure TFPXMLRepositoryHandler.XMLToPackage(E: TDomElement; P: TFPPackage);
  469. begin
  470. CheckNodeType(E,sNodePackage);
  471. DoXMLToPackage(E,P);
  472. end;
  473. Function TFPXMLRepositoryHandler.DoXMLToOSes(N : TDomElement) : TOSes;
  474. Var
  475. E : TDomElement;
  476. J : Integer;
  477. begin
  478. Result:=[];
  479. E:=FindNextElement(N.FirstChild,SNodeOS);
  480. While (E<>Nil) do
  481. begin
  482. J:=GetEnumValue(TypeInfo(TOS),E[SAttrName]);
  483. If (J<>-1) then
  484. Include(Result,TOS(J));
  485. E:=FindNextElement(E.NextSibling,SNodeOS);
  486. end;
  487. end;
  488. Function TFPXMLRepositoryHandler.DoXMLToCPUs(N : TDomElement) : TCPUS;
  489. Var
  490. E : TDomElement;
  491. J : Integer;
  492. begin
  493. Result:=[];
  494. E:=FindNextElement(N.FirstChild,SNodeCPU);
  495. While (E<>Nil) do
  496. begin
  497. J:=GetEnumValue(TypeInfo(TCPU),E[SAttrName]);
  498. If (J<>-1) then
  499. Include(Result,TCPU(J));
  500. E:=FindNextElement(E.NextSibling,SNodeCPU);
  501. end;
  502. end;
  503. procedure TFPXMLRepositoryHandler.DoXMLToPackage(E: TDomElement; P: TFPPackage);
  504. Var
  505. N : TDomElement;
  506. begin
  507. P.Name:=E[sAttrName];
  508. N:=GetNextElement(E.FirstChild);
  509. While (N<>Nil) do
  510. begin
  511. if (N.NodeName=sNodeAuthor) then
  512. P.Author:=NodeText(N)
  513. else if (N.NodeName=sNodeExternalURL) then
  514. P.ExternalURL:=NodeText(N)
  515. else if (N.NodeName=sNodeFileName) then
  516. P.FileName:=NodeText(N)
  517. else if (N.NodeName=sNodeEmail) then
  518. P.Email:=NodeText(N)
  519. else if (N.NodeName=sNodeDescription) then
  520. P.Description:=NodeText(N)
  521. else if (N.NodeName=sNodeLicense) then
  522. P.License:=NodeText(N)
  523. else if (N.NodeName=sNodeVersion) then
  524. DoXMlToVersion(N,P.Version)
  525. else if (N.NodeName=sNodeOSes) then
  526. P.OSes:=DoXMLToOSes(N)
  527. else if (N.NodeName=sNodeCPUS) then
  528. P.CPUs:=DoXMLToCPUs(N)
  529. else if (N.NodeName=sNodeDependencies) then
  530. DoXMlToDependencies(N,P.Dependencies)
  531. else if Not IgnoreUnknownNodes then
  532. Raise EXMLPackage.CreateFmt(SErrUnknownPackageNode,[N.NodeName,P.Name]);
  533. N:=GetNextElement(N.NextSibling);
  534. end;
  535. end;
  536. procedure TFPXMLRepositoryHandler.XMLToPackages(E: TDomElement; PS: TFPPackages);
  537. begin
  538. CheckNodeType(E,SNodePackages);
  539. DoXMLToPackages(E,PS);
  540. end;
  541. procedure TFPXMLRepositoryHandler.DoXMLToPackages(E: TDomElement; PS: TFPPackages);
  542. Var
  543. PN : TDomElement;
  544. P : TFPPackage;
  545. begin
  546. PN:=FindNextElement(E.FirstChild,SNodePackage);
  547. While (PN<>Nil) do
  548. begin
  549. P:=PS.AddPackage('');
  550. try
  551. DoXMLToPackage(PN,P);
  552. except
  553. P.Free;
  554. Raise;
  555. end;
  556. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  557. end;
  558. end;
  559. procedure TFPXMLRepositoryHandler.XMLToRepository(E: TDomElement; R: TFPRepository);
  560. begin
  561. CheckNodeType(E,SNodeRepository);
  562. DoXMLToRepository(E,R);
  563. end;
  564. procedure TFPXMLRepositoryHandler.DoXMLToRepository(E: TDomElement; R: TFPRepository);
  565. Var
  566. PSN,PN : TDomElement;
  567. P : TFPPackage;
  568. begin
  569. PSN:=FindNextElement(E.FirstChild,SNodePackages);
  570. If (PSN<>Nil) then
  571. begin
  572. PN:=FindNextElement(PSN.FirstChild,SNodePackage);
  573. While (PN<>Nil) do
  574. begin
  575. P:=R.AddPackage('');
  576. try
  577. DoXMLToPackage(PN,P);
  578. except
  579. P.Free;
  580. Raise;
  581. end;
  582. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  583. end;
  584. end;
  585. end;
  586. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; Stream: TStream);
  587. Var
  588. XML : TXMLDocument;
  589. begin
  590. XML:=TXMLDocument.Create;
  591. try
  592. Xmlread.ReadXMLFile(XML,Stream);
  593. XmlToDependency(XML.DocumentElement,D);
  594. finally
  595. XML.Free;
  596. end;
  597. end;
  598. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies;
  599. Stream: TStream);
  600. Var
  601. XML : TXMLDocument;
  602. begin
  603. XML:=TXMLDocument.Create;
  604. try
  605. xmlread.ReadXMLFile(XML,Stream);
  606. XmlToDependencies(XML.DocumentElement,DS);
  607. finally
  608. XML.Free;
  609. end;
  610. end;
  611. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; Stream: TStream);
  612. Var
  613. XML : TXMLDocument;
  614. begin
  615. XML:=TXMLDocument.Create;
  616. try
  617. xmlread.ReadXMLFile(XML,Stream);
  618. XmlToPackage(XML.DocumentElement,P);
  619. finally
  620. XML.Free;
  621. end;
  622. end;
  623. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; Stream: TStream);
  624. Var
  625. XML : TXMLDocument;
  626. begin
  627. XML:=TXMLDocument.Create;
  628. try
  629. xmlread.ReadXMLFile(XML,Stream);
  630. XmlToPackages(XML.DocumentElement,PS);
  631. finally
  632. XML.Free;
  633. end;
  634. end;
  635. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; Stream: TStream);
  636. Var
  637. XML : TXMLDocument;
  638. begin
  639. XML:=TXMLDocument.Create;
  640. try
  641. xmlread.ReadXMLFile(XML,Stream);
  642. XmlToRepository(XML.DocumentElement,R);
  643. finally
  644. XML.Free;
  645. end;
  646. end;
  647. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; FileName: String);
  648. Var
  649. F : TFileStream;
  650. begin
  651. F:=TFileStream.Create(FileName,fmOpenRead);
  652. try
  653. LoadFromXMl(D,F);
  654. finally
  655. F.Free;
  656. end;
  657. end;
  658. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies; FileName: String);
  659. Var
  660. F : TFileStream;
  661. begin
  662. F:=TFileStream.Create(FileName,fmOpenRead);
  663. try
  664. LoadFromXMl(DS,F);
  665. finally
  666. F.Free;
  667. end;
  668. end;
  669. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; FileName: String);
  670. Var
  671. F : TFileStream;
  672. begin
  673. F:=TFileStream.Create(FileName,fmOpenRead);
  674. try
  675. LoadFromXMl(P,F);
  676. finally
  677. F.Free;
  678. end;
  679. end;
  680. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; FileName: String);
  681. Var
  682. F : TFileStream;
  683. begin
  684. F:=TFileStream.Create(FileName,fmOpenRead);
  685. try
  686. LoadFromXMl(PS,F);
  687. finally
  688. F.Free;
  689. end;
  690. end;
  691. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; FileName: String);
  692. Var
  693. F : TFileStream;
  694. begin
  695. F:=TFileStream.Create(FileName,fmOpenRead);
  696. try
  697. LoadFromXMl(R,F);
  698. finally
  699. F.Free;
  700. end;
  701. end;
  702. end.