static rc_t resolve_accession( VFSManager * vfs_mgr, const char * accession, const String ** path ) { VResolver * resolver; rc_t rc = VFSManagerGetResolver( vfs_mgr, &resolver ); if ( rc == 0 ) { const VPath * vpath; rc = VPathMakeSysPath( ( VPath** )&vpath, accession ); if ( rc == 0 ) { const VPath * rpath; rc = VResolverLocal( resolver, vpath, &rpath ); if ( GetRCState( rc ) == rcNotFound ) rc = VResolverRemote( resolver, vpath, &rpath, NULL ); if ( rc == 0 ) { const String * s; rc = VPathMakeString( rpath, &s ); if ( rc == 0 ) { rc = StringCopy ( path, s ); free ((void*)s); } VPathRelease ( rpath ); } VPathRelease ( vpath ); } VResolverRelease( resolver ); } return rc; }
string CVResolver::Resolve(const string& acc_or_path) const { if ( !CVPath::IsPlainAccession(acc_or_path) ) { // already a path return acc_or_path; } CVPath acc(m_Mgr, acc_or_path, CVPath::eAcc); const VPath* path; rc_t rc = VResolverLocal(*this, acc, &path); if ( rc ) { rc = VResolverRemote(*this, eProtocolNone, acc, &path); } if ( rc ) { if ( CDirEntry(acc_or_path).Exists() ) { // local file return acc_or_path; } NCBI_THROW2_FMT(CSraException, eNotFound, "Cannot find acc path: "<<acc_or_path, rc); } return CVPath(path).ToString(); }