#include #include #include #include #include #include #include "tango_cache_xml.h" bool parse_uploadID_xml(const char *content, int len, char **uploadID) { xmlDoc *pdoc; xmlNode *pcur; if((pdoc = xmlParseMemory(content, len)) == NULL) { return false; } if((pcur = xmlDocGetRootElement(pdoc)) == NULL) { xmlFreeDoc(pdoc); return false; } while(pcur->type != XML_ELEMENT_NODE) pcur = pcur->next; if(xmlStrcmp(pcur->name, (const xmlChar *)"InitiateMultipartUploadResult")) { xmlFreeDoc(pdoc); return false; } pcur = pcur->children; while(pcur != NULL) { if(pcur->type != XML_ELEMENT_NODE || xmlStrcmp(pcur->name, (const xmlChar *)"UploadId")) { pcur = pcur->next; continue; } *uploadID = (char *)xmlNodeGetContent(pcur); xmlFreeDoc(pdoc); return true; } xmlFreeDoc(pdoc); return false; } int construct_complete_xml(struct tango_cache_ctx *ctx, char **xml, int *len) { struct multipart_etag_list *etag; xmlDoc *pdoc; xmlNode *root, *child; char number[20]; pdoc = xmlNewDoc((const xmlChar *)"1.0"); root = xmlNewNode(NULL, (const xmlChar *)"CompleteMultipartUpload"); xmlNewProp(root, (const xmlChar *)"xmlns",(const xmlChar *)"http://s3.amazonaws.com/doc/2006-03-01/"); xmlDocSetRootElement(pdoc, root); TAILQ_FOREACH(etag, &ctx->put.etag_head, node) { sprintf(number, "%u", etag->part_number); child = xmlNewChild(root, NULL, (const xmlChar*)"Part", NULL); xmlNewChild(child, NULL, (const xmlChar*)"ETag", (const xmlChar*)etag->etag); xmlNewChild(child, NULL, (const xmlChar*)"PartNumber", (const xmlChar*)number); } xmlDocDumpFormatMemory(pdoc, (xmlChar **)xml, len, 1); xmlFreeDoc(pdoc); return 0; }