bool deps_resolver_t::try_roll_forward(const deps_entry_t& entry, const pal::string_t& probe_dir, bool patch_roll_fwd, bool prerelease_roll_fwd, pal::string_t* candidate) { trace::verbose(_X("Attempting a roll forward for [%s/%s/%s] in [%s]"), entry.library_name.c_str(), entry.library_version.c_str(), entry.relative_path.c_str(), probe_dir.c_str()); const pal::string_t& lib_ver = entry.library_version; fx_ver_t cur_ver(-1, -1, -1); if (!fx_ver_t::parse(lib_ver, &cur_ver, false)) { trace::verbose(_X("No roll forward as specified version [%s] could not be parsed"), lib_ver.c_str()); return false; } pal::string_t path = probe_dir; append_path(&path, entry.library_name.c_str()); pal::string_t max_str = lib_ver; if (cur_ver.is_prerelease() && prerelease_roll_fwd) { pal::string_t maj_min_pat_star = cur_ver.prerelease_glob(); pal::string_t cache_key = path; append_path(&cache_key, maj_min_pat_star.c_str()); if (m_prerelease_roll_forward_cache.count(cache_key)) { max_str = m_prerelease_roll_forward_cache[cache_key]; trace::verbose(_X("Found cached roll forward version [%s] -> [%s]"), lib_ver.c_str(), max_str.c_str()); } else { try_prerelease_roll_forward_in_dir(path, cur_ver, &max_str); m_prerelease_roll_forward_cache[cache_key] = max_str; } } if (!cur_ver.is_prerelease() && patch_roll_fwd) { // Extract glob string of the form: 1.0.* from the version 1.0.0-prerelease-00001. pal::string_t maj_min_star = cur_ver.patch_glob(); pal::string_t cache_key = path; append_path(&cache_key, maj_min_star.c_str()); if (m_patch_roll_forward_cache.count(cache_key)) { max_str = m_patch_roll_forward_cache[cache_key]; trace::verbose(_X("Found cached roll forward version [%s] -> [%s]"), lib_ver.c_str(), max_str.c_str()); } else { try_patch_roll_forward_in_dir(path, cur_ver, &max_str); m_patch_roll_forward_cache[cache_key] = max_str; } } append_path(&path, max_str.c_str()); return entry.to_rel_path(path, candidate); }
map<tstring,tstring> CVersionInfo::GetUpdateList(vector<tstring>& m_services) { map<tstring,tstring> updatelist; //check the remote version file in update folder file<> fdoc(m_update_ver_path.c_str()); //TiXmlDocument ver; //TiXmlDocument remote_ver; if (fdoc.size() > 0) { //TiXmlNode* root = remote_ver.RootElement(); //TiXmlElement* pver_elem = root->FirstChildElement(); xml_document<> xdoc; xdoc.parse<0>(fdoc.data()); xml_node<>* pver_elem = xdoc.first_node(); while (pver_elem) { //get ver id which > cur version //tstring cur_ver_str = pver_elem->Attribute("no"); tstring cur_ver_str = pver_elem->first_attribute("no")->value(); DWORD marj,subj,ssubj,sssubj; marj=subj=ssubj=sssubj=0; sscanf(cur_ver_str.c_str(),"%d.%d.%d.%d",&marj,&subj,&ssubj,&sssubj); CVersion cur_ver(marj,subj,ssubj,sssubj); if(cur_ver > m_local) { //TiXmlElement* pitem = pver_elem->FirstChildElement(); xml_node<>* pitem = pver_elem->first_node(); while (pitem) { tstring filepath = pitem->first_attribute("path")->value(); tstring filename = pitem->first_attribute("name")->value(); //res.push_back(filepath); updatelist[filename] = filepath; const char* pservice = pitem->first_attribute("service")->value(); if(pservice) { m_services.push_back(filename); } pitem = pitem->next_sibling(); } } pver_elem = pver_elem->next_sibling(); } } return updatelist; }