Add VFS handling logic to mj_openResource.
PiperOrigin-RevId: 653124909 Change-Id: I4d031eb0bfb0070f8493753d2aeaac60ac283b85
This commit is contained in:
committed by
Copybara-Service
parent
7f46e936f6
commit
2cf352c2e6
+19
-27
@@ -173,27 +173,23 @@ static void mjIncludeXML(mjXReader& reader, XMLElement* elem,
|
||||
} else {
|
||||
fullname = filename;
|
||||
}
|
||||
mjResource *resource = mju_openVfsResource(fullname.c_str(), vfs);
|
||||
if (!resource) {
|
||||
// load from provider or OS filesystem
|
||||
std::array<char, 1024> error;
|
||||
resource = mju_openResource(fullname.c_str(), error.data(), error.size());
|
||||
if (!resource) {
|
||||
if (!mjuu_isabspath(filename)) {
|
||||
fullname = std::string(dir) + filename;
|
||||
} else {
|
||||
fullname = filename;
|
||||
}
|
||||
|
||||
// load from provider or OS filesystem
|
||||
std::array<char, 1024> error;
|
||||
resource = mju_openResource(fullname.c_str(), error.data(), error.size());
|
||||
if (!resource) {
|
||||
throw mjXError(elem, "%s", error.data());
|
||||
}
|
||||
// legacy behavior: try to load in top level directory
|
||||
std::array<char, 1024> error;
|
||||
mjResource *resource = mju_openResource(fullname.c_str(), vfs,
|
||||
error.data(), error.size());
|
||||
if (resource == nullptr) {
|
||||
// new behavior: try to load in relative directory
|
||||
if (!mjuu_isabspath(filename)) {
|
||||
fullname = std::string(dir) + filename;
|
||||
resource = mju_openResource(fullname.c_str(), vfs, error.data(), error.size());
|
||||
}
|
||||
}
|
||||
|
||||
if (resource == nullptr) {
|
||||
throw mjXError(elem, "%s", error.data());
|
||||
}
|
||||
|
||||
if (!mjuu_isabspath(filename)) {
|
||||
filename = std::string(dir) + filename;
|
||||
}
|
||||
@@ -293,16 +289,12 @@ mjSpec* mjParseXML(const char* filename, const mjVFS* vfs,
|
||||
|
||||
// get data source
|
||||
const char* xmlstring = nullptr;
|
||||
mjResource* resource = mju_openVfsResource(filename, vfs);
|
||||
|
||||
if (!resource) {
|
||||
// load from provider or fallback to OS filesystem
|
||||
std::array<char, 1024> rerror;
|
||||
resource = mju_openResource(filename, rerror.data(), rerror.size());
|
||||
if (!resource) {
|
||||
std::snprintf(error, error_sz, "mjParseXML: %s", rerror.data());
|
||||
return nullptr;
|
||||
}
|
||||
std::array<char, 1024> rerror;
|
||||
mjResource* resource = mju_openResource(filename, vfs,
|
||||
rerror.data(), rerror.size());
|
||||
if (resource == nullptr) {
|
||||
std::snprintf(error, error_sz, "mjParseXML: %s", rerror.data());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
int buffer_size = mju_readResource(resource, (const void**) &xmlstring);
|
||||
|
||||
+7
-9
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "xml/xml_api.h"
|
||||
|
||||
#include <array>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
@@ -186,15 +187,12 @@ int mj_printSchema(const char* filename, char* buffer, int buffer_sz, int flg_ht
|
||||
|
||||
// load model from binary MJB resource
|
||||
mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
|
||||
mjResource* resource = nullptr;
|
||||
|
||||
// first try vfs, otherwise try a provider or OS filesystem
|
||||
if (!(resource = mju_openVfsResource(filename, vfs))) {
|
||||
char error[1024];
|
||||
if (!(resource = mju_openResource(filename, error, 1024))) {
|
||||
mju_warning("%s", error);
|
||||
return nullptr;
|
||||
}
|
||||
std::array<char, 1024> error;
|
||||
mjResource* resource = mju_openResource(filename, vfs,
|
||||
error.data(), error.size());
|
||||
if (resource == nullptr) {
|
||||
mju_warning("%s", error.data());
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const void* buffer = NULL;
|
||||
|
||||
+2
-1
@@ -169,7 +169,8 @@ static std::string ResolveFilePath(XMLElement* e, std::string filename,
|
||||
// TODO(kylebayes): We first look in the base model directory for files to
|
||||
// remain backwards compatible.
|
||||
std::string full_filename = mjuu_combinePaths(dir, filename);
|
||||
mjResource *resource = mju_openResource(full_filename.c_str(), nullptr, 0);
|
||||
mjResource *resource = mju_openResource(full_filename.c_str(), nullptr,
|
||||
nullptr, 0);
|
||||
if (resource != nullptr) {
|
||||
mju_closeResource(resource);
|
||||
return filename;
|
||||
|
||||
Reference in New Issue
Block a user