fpxmlrep.pp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  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, fpmktype;
  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. PSN,PN : TDomElement;
  544. P : TFPPackage;
  545. begin
  546. PN:=FindNextElement(PSN.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. end;
  555. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  556. end;
  557. end;
  558. procedure TFPXMLRepositoryHandler.XMLToRepository(E: TDomElement; R: TFPRepository);
  559. begin
  560. CheckNodeType(E,SNodeRepository);
  561. DoXMLToRepository(E,R);
  562. end;
  563. procedure TFPXMLRepositoryHandler.DoXMLToRepository(E: TDomElement; R: TFPRepository);
  564. Var
  565. PSN,PN : TDomElement;
  566. P : TFPPackage;
  567. begin
  568. PSN:=FindNextElement(E.FirstChild,SNodePackages);
  569. If (PSN<>Nil) then
  570. begin
  571. PN:=FindNextElement(PSN.FirstChild,SNodePackage);
  572. While (PN<>Nil) do
  573. begin
  574. P:=R.AddPackage('');
  575. try
  576. DoXMLToPackage(PN,P);
  577. except
  578. P.Free;
  579. end;
  580. PN:=FindNextElement(PN.NextSibling,SNodePackage);
  581. end;
  582. end;
  583. end;
  584. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; Stream: TStream);
  585. Var
  586. XML : TXMLDocument;
  587. begin
  588. XML:=TXMLDocument.Create;
  589. try
  590. Xmlread.ReadXMLFile(XML,Stream);
  591. XmlToDependency(XML.DocumentElement,D);
  592. finally
  593. XML.Free;
  594. end;
  595. end;
  596. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies;
  597. Stream: TStream);
  598. Var
  599. XML : TXMLDocument;
  600. begin
  601. XML:=TXMLDocument.Create;
  602. try
  603. xmlread.ReadXMLFile(XML,Stream);
  604. XmlToDependencies(XML.DocumentElement,DS);
  605. finally
  606. XML.Free;
  607. end;
  608. end;
  609. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; Stream: TStream);
  610. Var
  611. XML : TXMLDocument;
  612. begin
  613. XML:=TXMLDocument.Create;
  614. try
  615. xmlread.ReadXMLFile(XML,Stream);
  616. XmlToPackage(XML.DocumentElement,P);
  617. finally
  618. XML.Free;
  619. end;
  620. end;
  621. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; Stream: TStream);
  622. Var
  623. XML : TXMLDocument;
  624. begin
  625. XML:=TXMLDocument.Create;
  626. try
  627. xmlread.ReadXMLFile(XML,Stream);
  628. XmlToPackages(XML.DocumentElement,PS);
  629. finally
  630. XML.Free;
  631. end;
  632. end;
  633. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; Stream: TStream);
  634. Var
  635. XML : TXMLDocument;
  636. begin
  637. XML:=TXMLDocument.Create;
  638. try
  639. xmlread.ReadXMLFile(XML,Stream);
  640. XmlToRepository(XML.DocumentElement,R);
  641. finally
  642. XML.Free;
  643. end;
  644. end;
  645. procedure TFPXMLRepositoryHandler.LoadFromXml(D: TFPDependency; FileName: String);
  646. Var
  647. F : TFileStream;
  648. begin
  649. F:=TFileStream.Create(FileName,fmOpenRead);
  650. try
  651. LoadFromXMl(D,F);
  652. finally
  653. F.Free;
  654. end;
  655. end;
  656. procedure TFPXMLRepositoryHandler.LoadFromXml(DS: TFPDependencies; FileName: String);
  657. Var
  658. F : TFileStream;
  659. begin
  660. F:=TFileStream.Create(FileName,fmOpenRead);
  661. try
  662. LoadFromXMl(DS,F);
  663. finally
  664. F.Free;
  665. end;
  666. end;
  667. procedure TFPXMLRepositoryHandler.LoadFromXml(P: TFPPackage; FileName: String);
  668. Var
  669. F : TFileStream;
  670. begin
  671. F:=TFileStream.Create(FileName,fmOpenRead);
  672. try
  673. LoadFromXMl(P,F);
  674. finally
  675. F.Free;
  676. end;
  677. end;
  678. procedure TFPXMLRepositoryHandler.LoadFromXml(PS: TFPPackages; FileName: String);
  679. Var
  680. F : TFileStream;
  681. begin
  682. F:=TFileStream.Create(FileName,fmOpenRead);
  683. try
  684. LoadFromXMl(PS,F);
  685. finally
  686. F.Free;
  687. end;
  688. end;
  689. procedure TFPXMLRepositoryHandler.LoadFromXml(R: TFPRepository; FileName: String);
  690. Var
  691. F : TFileStream;
  692. begin
  693. F:=TFileStream.Create(FileName,fmOpenRead);
  694. try
  695. LoadFromXMl(R,F);
  696. finally
  697. F.Free;
  698. end;
  699. end;
  700. end.