1 /* PROJECT: ReactOS Downloader
2 * LICENSE: GPL - See COPYING in the top level directory
3 * FILE: base\applications\downloader\xml.c
4 * PURPOSE: Parsing of application information xml files
5 * PROGRAMMERS: Maarten Bosma, Lester Kortenhoeven
8 #include <libs/expat/expat.h>
13 #include "structures.h"
14 #include "resources.h"
17 struct Category
* Current
;
18 struct Application
* CurrentApplication
;
19 char CurrentTag
[0x100];
20 extern WCHAR Strings
[STRING_COUNT
][MAX_STRING_LENGHT
];
22 void tag_opened (void* usrdata
, const char* tag
, const char** arg
)
26 if(!strcmp(tag
, "tree") && !CurrentApplication
)
31 else if(!strcmp(tag
, "category") && !CurrentApplication
)
35 Current
= malloc(sizeof(struct Category
));
36 memset(Current
, 0, sizeof(struct Category
));
40 Current
->Children
= malloc(sizeof(struct Category
));
41 memset(Current
->Children
, 0, sizeof(struct Category
));
42 Current
->Children
->Parent
= Current
;
43 Current
= Current
->Children
;
47 Current
->Next
= malloc(sizeof(struct Category
));
48 memset(Current
->Next
, 0, sizeof(struct Category
));
49 Current
->Next
->Parent
= Current
->Parent
;
50 Current
= Current
->Next
;
54 for (i
=0; arg
[i
]; i
+=2)
56 if(!strcmp(arg
[i
], "name"))
58 MultiByteToWideChar(CP_UTF8
, 0, arg
[i
+1], -1, Current
->Name
, 0x100);
60 if(!strcmp(arg
[i
], "icon"))
62 Current
->Icon
= atoi(arg
[i
+1]);
67 else if(!strcmp(tag
, "application") && !CurrentApplication
)
71 CurrentApplication
= Current
->Apps
;
72 while(CurrentApplication
->Next
)
73 CurrentApplication
= CurrentApplication
->Next
;
74 CurrentApplication
->Next
= malloc(sizeof(struct Application
));
75 memset(CurrentApplication
->Next
, 0, sizeof(struct Application
));
76 CurrentApplication
= CurrentApplication
->Next
;
80 Current
->Apps
= malloc(sizeof(struct Application
));
81 memset(Current
->Apps
, 0, sizeof(struct Application
));
82 CurrentApplication
= Current
->Apps
;
85 for (i
=0; arg
[i
]; i
+=2)
87 if(!strcmp(arg
[i
], "name"))
89 MultiByteToWideChar(CP_UTF8
, 0, arg
[i
+1], -1, CurrentApplication
->Name
, 0x100);
93 else if (CurrentApplication
)
95 strncpy(CurrentTag
, tag
, 0x100);
98 MessageBoxW(0,Strings
[IDS_XMLERROR_2
],0,0);
102 void text (void* usrdata
, const char* data
, int len
)
104 if (!CurrentApplication
)
107 if(!strcmp(CurrentTag
, "maintainer"))
109 int currentlengt
= lstrlenW(CurrentApplication
->Maintainer
);
110 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Maintainer
[currentlengt
], 0x100-currentlengt
);
112 else if(!strcmp(CurrentTag
, "regname"))
114 int currentlengt
= lstrlenW(CurrentApplication
->RegName
);
115 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->RegName
[currentlengt
], 0x100-currentlengt
);
117 else if(!strcmp(CurrentTag
, "description"))
119 int currentlengt
= lstrlenW(CurrentApplication
->Description
);
120 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Description
[currentlengt
], 0x400-currentlengt
);
122 else if(!strcmp(CurrentTag
, "location"))
124 int currentlengt
= lstrlenW(CurrentApplication
->Location
);
125 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Location
[currentlengt
], 0x100-currentlengt
);
127 else if(!strcmp(CurrentTag
, "version"))
129 int currentlengt
= lstrlenW(CurrentApplication
->Version
);
130 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Version
[currentlengt
], 0x400-currentlengt
);
132 else if(!strcmp(CurrentTag
, "licence"))
134 int currentlengt
= lstrlenW(CurrentApplication
->Licence
);
135 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Licence
[currentlengt
], 0x100-currentlengt
);
137 else if(!strcmp(CurrentTag
, "depends"))
139 int currentlengt
= lstrlenW(CurrentApplication
->Depends
);
140 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->Depends
[currentlengt
], 0x100-currentlengt
);
142 else if(!strcmp(CurrentTag
, "postinstallaction"))
144 int currentlengt
= lstrlenW(CurrentApplication
->PostInstallAction
);
145 MultiByteToWideChar(CP_UTF8
, 0, data
, len
, &CurrentApplication
->PostInstallAction
[currentlengt
], 0x100-currentlengt
);
149 void tag_closed (void* tree
, const char* tag
)
153 if(!strcmp(tag
, "category"))
161 Current
= Current
->Parent
;
164 else if(!strcmp(tag
, "application"))
166 CurrentApplication
= NULL
;
170 BOOL
ProcessXML (const char* filename
, struct Category
* Root
)
183 file
= fopen("downloader.xml", "r");
186 file
= fopen(filename
, "r");
189 MessageBoxW(0,Strings
[IDS_XMLERROR_1
],0,0);
194 parser
= XML_ParserCreate(NULL
);
195 XML_SetElementHandler(parser
, tag_opened
, tag_closed
);
196 XML_SetCharacterDataHandler(parser
, text
);
200 size_t len
= fread (buffer
, 1, sizeof(buffer
), file
);
201 done
= len
< sizeof(buffer
);
203 if(!XML_Parse(parser
, buffer
, len
, done
))
205 MessageBoxW(0,Strings
[IDS_XMLERROR_2
],0,0);
211 XML_ParserFree(parser
);
217 void FreeApps (struct Application
* Apps
)
220 FreeApps(Apps
->Next
);
225 void FreeTree (struct Category
* Node
)
228 FreeTree(Node
->Children
);
231 FreeTree(Node
->Next
);
234 FreeApps(Node
->Apps
);