This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-tfe/cache/tango_cache_xml.cpp
zhangchengwei 0bfd49194e 创建
2018-10-08 19:33:01 +08:00

74 lines
1.7 KiB
C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <libxml/parser.h>
#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 buffer_cache_list *list;
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(list, &ctx->cache_head, node)
{
sprintf(number, "%u", list->part_number);
child = xmlNewChild(root, NULL, (const xmlChar*)"Part", NULL);
xmlNewChild(child, NULL, (const xmlChar*)"ETag", (const xmlChar*)list->etag);
xmlNewChild(child, NULL, (const xmlChar*)"PartNumber", (const xmlChar*)number);
}
xmlDocDumpFormatMemory(pdoc, (xmlChar **)xml, len, 1);
xmlFreeDoc(pdoc);
return 0;
}