ali@0: /* ali@0: * This program parses the XML data provided by sourceforge to extract the ali@0: * list of "attached files" (which are not themselves included in the XML ali@0: * stream and therefore need to be seperately downloaded for archiving). ali@0: */ ali@0: ali@0: #include ali@0: #include ali@0: #include ali@0: #include ali@0: #include ali@0: ali@0: struct artifact_type { ali@0: char *name; ali@0: int id; ali@0: } artifact_types[] = { ali@0: "Bugs", 109746, ali@0: "Support Requests", 209746, ali@0: "Patches", 309746, ali@0: "Feature Requests", 359746, ali@0: }; ali@0: ali@0: #ifndef NO_ELEMS ali@0: #define NO_ELEMS(array) (sizeof(array)/sizeof(*(array))) ali@0: #endif ali@0: ali@0: void parse_history(xmlDocPtr doc,const xmlChar *artifact_id, ali@0: const xmlChar *artifact_type,xmlNodePtr node) ali@0: { ali@0: xmlNodePtr field,cur; ali@0: xmlAttrPtr attr; ali@0: xmlChar *name=NULL; ali@0: xmlChar *field_name=NULL; ali@0: xmlChar *text; ali@0: int file_id,i; ali@0: for(field=node->xmlChildrenNode;field;field=field->next) ali@0: if (!xmlStrcmp(field->name,(const xmlChar *)"field")) ali@0: { ali@0: for(attr=field->properties;attr;attr=attr->next) ali@0: if (!xmlStrcmp(attr->name,(const xmlChar *)"name")) ali@0: { ali@0: name=xmlNodeListGetString(doc,attr->children,1); ali@0: if (!xmlStrcmp(name,(const xmlChar *)"field_name")) ali@0: field_name=xmlNodeListGetString(doc,field->children,1); ali@0: if (!xmlStrcmp(field_name,(const xmlChar *)"File Added") && ali@0: !xmlStrcmp(name,(const xmlChar *)"old_value")) ali@0: { ali@0: text=xmlNodeListGetString(doc,field->children,1); ali@0: if (sscanf(text,"%d",&file_id)==1) ali@0: { ali@0: for(i=NO_ELEMS(artifact_types)-1;i>=0;i--) ali@0: if (!strcmp(artifact_types[i].name, ali@0: (const char *)artifact_type)) ali@0: break; ali@0: if (i>=0) ali@0: printf("%d %s %d\n", ali@0: artifact_types[i].id,artifact_id,file_id); ali@0: else ali@0: fprintf(stderr, ali@0: "Warning: Unknown artifact type \"%s\" - " ali@0: "attached file %s ignored\n", ali@0: artifact_type,text); ali@0: } ali@0: xmlFree(text); ali@0: } ali@0: xmlFree(name); ali@0: } ali@0: } ali@0: if (field_name) ali@0: xmlFree(field_name); ali@0: } ali@0: ali@0: void parse_artifact(xmlDocPtr doc,xmlNodePtr node) ali@0: { ali@0: xmlNodePtr field,cur; ali@0: xmlAttrPtr attr; ali@0: xmlChar *name=NULL; ali@0: xmlChar *id=NULL; ali@0: xmlChar *type=NULL; ali@0: xmlChar *text; ali@0: for(field=node->xmlChildrenNode;field;field=field->next) ali@0: if (!xmlStrcmp(field->name,(const xmlChar *)"field")) ali@0: { ali@0: for(attr=field->properties;attr;attr=attr->next) ali@0: if (!xmlStrcmp(attr->name,(const xmlChar *)"name")) ali@0: { ali@0: name=xmlNodeListGetString(doc,attr->children,1); ali@0: if (!xmlStrcmp(name,(const xmlChar *)"artifact_id")) ali@0: id=xmlNodeListGetString(doc,field->children,1); ali@0: if (!xmlStrcmp(name,(const xmlChar *)"artifact_type")) ali@0: type=xmlNodeListGetString(doc,field->children,1); ali@0: } ali@0: if (!xmlStrcmp(name,(const xmlChar *)"artifact_history")) ali@0: for(cur=field->xmlChildrenNode;cur;cur=cur->next) ali@0: if (!xmlStrcmp(cur->name,"history")) ali@0: parse_history(doc,id,type,cur); ali@0: if (name) ali@0: { ali@0: xmlFree(name); ali@0: name=NULL; ali@0: } ali@0: } ali@0: if (id) ali@0: xmlFree(id); ali@0: if (type) ali@0: xmlFree(type); ali@0: } ali@0: ali@0: int main(int argc,char **argv) ali@0: { ali@0: xmlDocPtr doc; ali@0: xmlNodePtr cur; ali@0: doc=xmlParseFile(argv[1]); ali@0: if (!doc) ali@0: { ali@0: fprintf(stderr,"Document not parsed successfully.\n"); ali@0: exit(1); ali@0: } ali@0: cur=xmlDocGetRootElement(doc); ali@0: if (!cur) ali@0: { ali@0: fprintf(stderr,"Empty document.\n"); ali@0: xmlFreeDoc(doc); ali@0: exit(1); ali@0: } ali@0: if (xmlStrcmp(cur->name,(const xmlChar *)"project_export")) ali@0: { ali@0: fprintf(stderr,"%s does not appear to be a project export document.\n", ali@0: argv[1]); ali@0: xmlFreeDoc(doc); ali@0: exit(1); ali@0: } ali@0: for(cur=cur->xmlChildrenNode;cur;cur=cur->next) ali@0: if (!xmlStrcmp(cur->name,(const xmlChar *)"artifacts")) ali@0: break; ali@0: if (!cur) ali@0: { ali@0: fprintf(stderr,"%s does not appear to contain an artifacts node.\n", ali@0: argv[1]); ali@0: xmlFreeDoc(doc); ali@0: exit(1); ali@0: } ali@0: for(cur=cur->xmlChildrenNode;cur;cur=cur->next) ali@0: if (!xmlStrcmp(cur->name,(const xmlChar *)"artifact")) ali@0: parse_artifact(doc,cur); ali@0: xmlFreeDoc(doc); ali@0: exit(0); ali@0: }