bool get_incomp_mpu_list()

in src/s3fs_xml.cpp [241:323]


bool get_incomp_mpu_list(xmlDocPtr doc, incomp_mpu_list_t& list)
{
    if(!doc){
        return false;
    }

    xmlXPathContextPtr ctx = xmlXPathNewContext(doc);;

    std::string xmlnsurl;
    std::string ex_upload = "//";
    std::string ex_key;
    std::string ex_id;
    std::string ex_date;

    if(!noxmlns && GetXmlNsUrl(doc, xmlnsurl)){
        xmlXPathRegisterNs(ctx, (xmlChar*)"s3", (xmlChar*)xmlnsurl.c_str());
        ex_upload += "s3:";
        ex_key    += "s3:";
        ex_id     += "s3:";
        ex_date   += "s3:";
    }
    ex_upload += "Upload";
    ex_key    += "Key";
    ex_id     += "UploadId";
    ex_date   += "Initiated";

    // get "Upload" Tags
    xmlXPathObjectPtr  upload_xp;
    if(NULL == (upload_xp = xmlXPathEvalExpression((xmlChar*)ex_upload.c_str(), ctx))){
        S3FS_PRN_ERR("xmlXPathEvalExpression returns null.");
        return false;
    }
    if(xmlXPathNodeSetIsEmpty(upload_xp->nodesetval)){
        S3FS_PRN_INFO("upload_xp->nodesetval is empty.");
        S3FS_XMLXPATHFREEOBJECT(upload_xp);
        S3FS_XMLXPATHFREECONTEXT(ctx);
        return true;
    }

    // Make list
    int           cnt;
    xmlNodeSetPtr upload_nodes;
    list.clear();
    for(cnt = 0, upload_nodes = upload_xp->nodesetval; cnt < upload_nodes->nodeNr; cnt++){
        ctx->node = upload_nodes->nodeTab[cnt];

        INCOMP_MPU_INFO part;
        xmlChar*        ex_value;

        // search "Key" tag
        if(NULL == (ex_value = get_exp_value_xml(doc, ctx, ex_key.c_str()))){
            continue;
        }
        if('/' != *((char*)ex_value)){
            part.key = "/";
        }else{
            part.key = "";
        }
        part.key += (char*)ex_value;
        S3FS_XMLFREE(ex_value);

        // search "UploadId" tag
        if(NULL == (ex_value = get_exp_value_xml(doc, ctx, ex_id.c_str()))){
            continue;
        }
        part.id = (char*)ex_value;
        S3FS_XMLFREE(ex_value);

        // search "Initiated" tag
        if(NULL == (ex_value = get_exp_value_xml(doc, ctx, ex_date.c_str()))){
            continue;
        }
        part.date = (char*)ex_value;
        S3FS_XMLFREE(ex_value);

        list.push_back(part);
    }

    S3FS_XMLXPATHFREEOBJECT(upload_xp);
    S3FS_XMLXPATHFREECONTEXT(ctx);

    return true;
}