1 ////////////////////////////////////////////////////////
5 // Loading of the package tree
8 // Maarten Bosma, 09.01.2004
9 // maarten.paul@bosma.de
11 ////////////////////////////////////////////////////////////////////
13 #include "package.hpp"
18 int LoadOptions (TREE
* tree
);
20 void tree_end (void* tree
, const char* tag
);
21 void tree_start (void* usrdata
, const char* tag
, const char** arg
);
23 int PML_XmlDownload (pTree tree
, const char* file
, void* usrdata
, XML_StartElementHandler start
,
24 XML_EndElementHandler end
, XML_CharacterDataHandler text
=0);
28 extern "C" int PML_LoadTree (TREE
** tree
, char* url
, PML_AddItem AddItem
)
34 memset((*tree
), 0, sizeof((*tree
)));
36 // set addItem callback
37 (*tree
)->addItem
= AddItem
;
41 return PML_XmlDownload (*tree
, url
, (void*)(*tree
), tree_start
, tree_end
);
44 // expat callback for start of a "node" tag
45 void tree_start (void* usrdata
, const char* tag
, const char** arg
)
50 TREE
* tree
= (TREE
*)usrdata
;
52 // ignore if tag is the root tag ("tree")
53 if(!strcmp(tag
, "tree"))
56 // set the package memory
57 tree
->packages
.resize(id
+1);
58 memset(&tree
->packages
[id
], 0, sizeof(tree
->packages
[id
]));
60 tree
->packages
[id
].loaded
= FALSE
;
61 tree
->packages
[id
].icon
= FALSE
;
62 tree
->packages
[id
].none
= TRUE
;
63 tree
->packages
[id
].path
= NULL
;
64 tree
->packages
[id
].name
= "\0";
67 for (i
=0; arg
[i
]; i
+=2)
69 if(!strcmp(arg
[i
], "name"))
71 tree
->packages
[id
].name
= new char [strlen(arg
[i
+1])+1];
72 strcpy(tree
->packages
[id
].name
, arg
[i
+1]);
75 if(!strcmp(arg
[i
], "icon"))
77 icon
= atoi(arg
[i
+1]);
78 tree
->packages
[id
].icon
= TRUE
;
81 if(!strcmp(arg
[i
], "file"))
83 tree
->packages
[id
].path
= new char [strlen(arg
[i
+1])+1];
84 strcpy(tree
->packages
[id
].path
, arg
[i
+1]);
86 if(strcmp(tag
, "bin"))
87 tree
->packages
[id
].inst
= TRUE
;
89 if(strcmp(tag
, "src"))
90 tree
->packages
[id
].src_inst
= TRUE
;
94 if(tree
->packages
[id
].name
[0] == '\0') return;
100 tree
->addItem(id
, tree
->packages
[id
].name
, 0, icon
);
103 // do some manipulation at the parent
107 tree
->addItem(id
, tree
->packages
[id
].name
, parents
.back(), icon
);
109 // list as child in the parent node
110 tree
->packages
[parents
.back()].children
.push_back(id
);
112 // this is for the buttons
113 tree
->packages
[parents
.back()].inst
= tree
->packages
[parents
.back()].inst
|| tree
->packages
[id
].inst
;
114 tree
->packages
[parents
.back()].src_inst
= tree
->packages
[parents
.back()].src_inst
|| tree
->packages
[id
].src_inst
;
117 parents
.push_back(id
++);
120 // expat callback for end of a "node" tag
121 void tree_end (void* tree
, const char* tag
)