10 #include <mrpt/system/filesystem.h>
16 using namespace mvsim;
19 :
mrpt::system::COutputLogger(
"mvsim::RemoteResourcesManager")
25 return 0 == ::strncmp(url.c_str(),
"http://", strlen(
"http://")) ||
26 0 == ::strncmp(url.c_str(),
"https://", strlen(
"https://"));
35 else if (uri.substr(0, 7) ==
"file://")
47 std::string local_directory;
49 local_directory = std::getenv(
"APPDATA");
51 local_directory = std::getenv(
"HOME");
52 local_directory +=
"/.cache/";
55 local_directory +=
"mvsim-storage/";
57 return local_directory;
61 const std::string& uri)
63 auto pos = uri.find(
".zip/");
65 if (pos == std::string::npos)
return {
false, uri,
""};
67 const auto zipUri = uri.substr(0, pos + 4);
68 const auto internalUri = uri.substr(pos + 5);
70 return {
true, zipUri, internalUri};
75 using namespace std::string_literals;
78 std::string cacheUsageStats;
80 if (!mrpt::system::directoryExists(localDir))
83 mrpt::system::createDirectory(localDir);
85 const auto cmd =
"mkdir -p \""s + localDir +
"\""s;
86 if (
int ret = ::system(
cmd.c_str()); ret != 0)
88 MRPT_LOG_ERROR_STREAM(
"Error executing command: " <<
cmd);
91 ASSERT_DIRECTORY_EXISTS_(localDir);
96 if (0 == mrpt::system::executeCommand(
97 mrpt::format(
"du -sh0 \"%s\"", localDir.c_str()), &cacheUsageStats))
103 "Using local storage directory: '"s + localDir +
"' (Usage: "s + cacheUsageStats +
")"s);
105 const auto [isZipPkg, zipOrFileURI, internalURI] =
zip_uri_split(uri);
107 MRPT_LOG_DEBUG_STREAM(
108 "Split URI: isZipPkg=" << isZipPkg <<
" zipOrFileURI=" << zipOrFileURI
109 <<
" internalURI=" << internalURI);
111 const auto fileName = mrpt::system::extractFileName(zipOrFileURI) +
"." +
112 mrpt::system::extractFileExtension(zipOrFileURI);
113 const auto localFil = localDir +
fileName;
116 if (!mrpt::system::fileExists(localFil))
119 mrpt::format(
"wget -q -O \"%s\" %s", localFil.c_str(), zipOrFileURI.c_str());
121 MRPT_LOG_INFO_STREAM(
"Downloading remote resources from: '" << uri <<
"'");
123 if (
int ret = ::system(
cmd.c_str()); ret != 0)
126 "[mvsim] Error (code=%i) executing the following command "
127 "trying to acquire a remote resource:\n%s",
146 const std::string& localZipFil,
const std::string& internalURI)
148 using namespace std::string_literals;
150 ASSERT_FILE_EXISTS_(localZipFil);
152 const auto filExtension = mrpt::system::extractFileExtension(localZipFil);
153 ASSERT_EQUAL_(filExtension,
"zip");
156 const auto zipOutDir = mrpt::system::fileNameChangeExtension(localZipFil,
"out");
158 if (!mrpt::system::directoryExists(zipOutDir))
160 mrpt::system::createDirectory(zipOutDir);
161 ASSERT_DIRECTORY_EXISTS_(zipOutDir);
163 const std::string
cmd =
"unzip -q \""s + localZipFil +
"\" -d \""s + zipOutDir +
"\""s;
165 if (
int ret = ::system(
cmd.c_str()); ret != 0)
168 "[mvsim] Error (code=%i) executing the following command "
169 "trying to unzip a remote resource:\n%s",
174 return zipOutDir +
"/"s + internalURI;