static rc_t XML_Open(const char* path, const FSNode** tree) { rc_t rc = 0; char errmsg[4096] = ""; KDirectory *dir = NULL; PLOGMSG(klogInfo, (klogInfo, "Reading XML file '$(x)'", PLOG_S(x), path)); if( (rc = KDirectoryNativeDir(&dir)) == 0 ) { const KFile* file = NULL; if( (rc = KDirectoryOpenFileRead(dir, &file, "%s", path)) == 0 ) { if( (rc = FSNode_Make((FSNode**)tree, "ROOT", &RootNode_vtbl)) == 0 ) { const KXMLDoc* xmldoc = NULL; if( (rc = KXMLMgrMakeDocRead(g_xmlmgr, &xmldoc, file)) == 0 ) { const KXMLNodeset* ns = NULL; if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/FUSE/*")) == 0 ) { uint32_t count = 0; if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) { if( count == 0 ) { rc = RC(rcExe, rcDoc, rcValidating, rcData, rcEmpty); } else { uint32_t i = 0; while(rc == 0 && i < count) { const KXMLNode* n = NULL; if( (rc = KXMLNodesetGetNodeRead(ns, &n, i++)) == 0 ) { SRAConfigFlags flags = ~0; errmsg[0] = '\0'; rc = XML_ValidateNode((FSNode*)*tree, n, flags, errmsg); ReleaseComplain(KXMLNodeRelease, n); } } if( rc == 0 ) { rc = SRAList_NextVersion(); } } } ReleaseComplain(KXMLNodesetRelease, ns); } ReleaseComplain(KXMLDocRelease, xmldoc); } if( rc != 0 ) { FSNode_Release(*tree); *tree = NULL; } } ReleaseComplain(KFileRelease, file); } ReleaseComplain(KDirectoryRelease, dir); } if( rc == 0 ) { PLOGMSG(klogInfo, (klogInfo, "XML file '$(x)' ok", PLOG_S(x), path)); } else { if( strlen(errmsg) < 1 ) { strcpy(errmsg, path); } LOGERR(klogErr, rc, errmsg); } return rc; }
static rc_t TarNode_Touch(const TarNode* cself) { rc_t rc = 0; if( cself->xml_path != NULL ) { KDirectory* dir = NULL; if( (rc = KDirectoryNativeDir(&dir)) == 0 ) { KTime_t dt; if( (rc = KDirectoryDate(dir, &dt, "%s", cself->xml_path)) == 0 ) { if( dt != cself->mtime ) { const KFile* kfile = NULL; DEBUG_MSG(8, ("%s: updating tar %s\n", __func__, cself->xml_path)); if( (rc = KDirectoryOpenFileRead(dir, &kfile, "%s", cself->xml_path)) == 0 ) { const KXMLMgr* xmlmgr; if( (rc = XML_MgrGet(&xmlmgr)) == 0 ) { const KXMLDoc* xmldoc = NULL; if( (rc = KXMLMgrMakeDocRead(xmlmgr, &xmldoc, kfile)) == 0 ) { const KXMLNodeset* ns = NULL; if( (rc = KXMLDocOpenNodesetRead(xmldoc, &ns, "/TAR")) == 0 ) { uint32_t count = 0; if( (rc = KXMLNodesetCount(ns, &count)) == 0 ) { if( count != 1 ) { rc = RC(rcExe, rcDoc, rcValidating, rcData, rcInvalid); } else { const KXMLNode* n = NULL; if( (rc = KXMLNodesetGetNodeRead(ns, &n, 0)) == 0 ) { char errmsg[4096]; const TarFileList* new_files; if( (rc = TarNode_MakeFileList(n, &new_files, errmsg, cself->rel_path, cself->node.name)) != 0 ) { LOGERR(klogErr, rc, errmsg); } else { TarFileList_Release(cself->files); ((TarNode*)cself)->files = new_files; ((TarNode*)cself)->mtime = dt; } ReleaseComplain(KXMLNodeRelease, n); } } } ReleaseComplain(KXMLNodesetRelease, ns); } ReleaseComplain(KXMLDocRelease, xmldoc); } } ReleaseComplain(KFileRelease, kfile); } } } ReleaseComplain(KDirectoryRelease, dir); } } return rc; }
static rc_t XmlMetaInitMembers(BSTree* tr, const KXMLNode* node) { rc_t rc = 0; const char path[] = "Member"; uint32_t count = 0; uint32_t idx = 0; const KXMLNodeset *members = NULL; if (rc == 0) { rc = KXMLNodeOpenNodesetRead(node, &members, path); DISP_RC(rc, path); } if (rc == 0) { rc = KXMLNodesetCount(members, &count); DISP_RC(rc, path); } for (idx = 0; idx < count && rc == 0; ++idx) { const KXMLNode *node = NULL; char member_name[256] = ""; if (rc == 0) { rc = KXMLNodesetGetNodeRead(members, &node, idx); DISP_RC(rc, path); } if (rc == 0) { size_t size = 0; rc = KXMLNodeReadAttrCString(node, "member_name", member_name, sizeof member_name, &size); if (rc) { if (GetRCState(rc) == rcInsufficient) { member_name[sizeof member_name - 1] = '\0'; rc = 0; } } } if (rc == 0) { rc = XmlMetaInitMemser(tr, node, path, member_name); } RELEASE(KXMLNode, node); } RELEASE(KXMLNodeset, members); return rc; }
rc_t XTocParseXml(struct XTocEntry* xRoot, const KFile* file) { rc_t rc = 0; const KXMLMgr* mgr = NULL; const KXMLDoc* doc = NULL; const KXMLNodeset* root = NULL; const char rootName[] = "/ROOT"; /**** INIT ****/ if (rc == 0) { rc = KXMLMgrMakeRead(&mgr); DISP_RC(rc, "while calling KXMLMgrMakeRead"); } if (rc == 0) { KXMLMgrMakeDocRead(mgr, &doc, file); DISP_RC(rc, "while calling KXMLMgrMakeDocRead"); } if (rc == 0) { rc = KXMLDocOpenNodesetRead(doc, &root, rootName); if (rc != 0) { /* PLOGERR(klogErr, (klogErr, rc, "while calling KXMLDocOpenNodesetRead $(name)", "name=%s", rootName));*/ } } if (rc == 0) { uint32_t count = 0; rc = KXMLNodesetCount(root, &count); if (rc != 0) { /* PLOGERR(klogErr, (klogErr, rc, "while calling KXMLNodesetCount($(name))", "name=%s", rootName));*/ } else if (count != 1) { rc = RC(rcFS, rcXmlDoc, rcReading, rcTag, count ? rcExcessive : rcNotFound); /* PLOGERR(klogErr, (klogErr, rc, "$(name)", "name=%s", rootName));*/ } else if (false) { DBGMSG(DBG_APP,DBG_COND_1, ("KXMLNodesetCount(%s)=%d\n", rootName, count)); } } /**** READ AND PROCESS THE ROOT XML NODE ****/ if (rc == 0) { uint32_t i = 0; const KXMLNode *node = NULL; rc = KXMLNodesetGetNodeRead(root, &node, i); if (rc == 0) { ProcessNode(node, rootName, i, xRoot, xRoot); } /* else { * PLOGERR(klogErr, (klogErr, rc, "while calling KXMLNodesetGetNodeRead($(name), $(i))", "name=%s,i=%d", rootName, i)); }*/ { rc_t rc2 = KXMLNodeRelease(node); if (rc == 0) { rc = rc2; } node = NULL; } } /**** RELEASE ****/ { rc_t rc2 = KXMLDocRelease(doc); if (rc == 0) { rc = rc2; } doc = NULL; } { rc_t rc2 = KXMLNodesetRelease(root); if (rc == 0) { rc = rc2; } root = NULL; } { rc_t rc2 = KXMLMgrRelease(mgr); if (rc == 0) { rc = rc2; } mgr = NULL; } return rc; }