Skip to content
Snippets Groups Projects
Commit ab8af576 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

archive: use string_view to match filename

Change-Id: Idd489fcb185966fe421b6d544f4a131230ce35ca
parent 7dd8826c
No related branches found
No related tags found
No related merge requests found
......@@ -51,6 +51,8 @@ extern "C" {
#include <sys/stat.h>
#include <fstream>
using namespace std::literals;
namespace jami {
namespace archiver {
......@@ -283,7 +285,7 @@ uncompressArchive(const std::string& archivePath, const std::string& dir, const
fileutils::removeAll(dir, true);
break;
}
std::string filename(info->filename, (size_t)info->filename_size);
std::string_view filename(info->filename, (size_t)info->filename_size);
const auto& fileMatchPair = f(filename);
if (fileMatchPair.first) {
auto filePath = dir + DIR_SEPARATOR_STR + fileMatchPair.second;
......@@ -348,15 +350,12 @@ uncompressArchive(const std::string& archivePath, const std::string& dir, const
if (r == ARCHIVE_EOF) {
break;
}
std::string fileEntry = archive_entry_pathname(entry) ? archive_entry_pathname(entry)
: "Undefined";
if (r != ARCHIVE_OK) {
throw std::runtime_error("Read file pathname: " + fileEntry + "\t"
+ archive_error_string(archiveReader.get()));
if (r != ARCHIVE_OK && r != ARCHIVE_WARN) {
throw std::runtime_error("Error reading archive: "s + archive_error_string(archiveReader.get()));
}
std::string_view fileEntry(archive_entry_pathname(entry));
// File is ok, copy its header to the ext writer
const auto& fileMatchPair = f(fileEntry);
if (fileMatchPair.first) {
......
......@@ -40,7 +40,7 @@ namespace jami {
*/
namespace archiver {
using FileMatchPair = std::function<std::pair<bool, const std::string>(const std::string&)>;
using FileMatchPair = std::function<std::pair<bool, std::string_view>(std::string_view)>;
/**
* Compress a STL string using zlib with given compression level and return
......
......@@ -167,21 +167,21 @@ readPluginManifestFromArchive(const std::string& jplPath)
return {};
}
std::pair<bool, const std::string>
uncompressJplFunction(const std::string& relativeFileName)
std::pair<bool, std::string_view>
uncompressJplFunction(std::string_view relativeFileName)
{
std::smatch match;
std::svmatch match;
// manifest.json and files under data/ folder remains in the same structure
// but libraries files are extracted from the folder that matches the running ABI to
// the main installation path.
if (relativeFileName == "manifest.json" || std::regex_match(relativeFileName, DATA_REGEX)) {
return std::make_pair(true, relativeFileName);
} else if (regex_search(relativeFileName, match, SO_REGEX)) {
if (match.str(1) == ABI) {
return std::make_pair(true, match.str(2));
} else if (std::regex_search(relativeFileName, match, SO_REGEX)) {
if (std::svsub_match_view(match[1]) == ABI) {
return std::make_pair(true, std::svsub_match_view(match[2]));
}
}
return std::make_pair(false, std::string {""});
return std::make_pair(false, std::string_view {});
}
} // namespace PluginUtils
} // namespace jami
......@@ -102,6 +102,6 @@ std::map<std::string, std::string> readPluginManifestFromArchive(const std::stri
* @param relativeFileName
* @return Pair <bool, string> meaning if file should be extracted and where to.
*/
std::pair<bool, const std::string> uncompressJplFunction(const std::string& relativeFileName);
std::pair<bool, std::string_view> uncompressJplFunction(std::string_view relativeFileName);
} // namespace PluginUtils
} // namespace jami
......@@ -55,6 +55,9 @@ operator+(const string_view& sv, const string& s)
}
using svmatch = match_results<string_view::const_iterator>;
using svsub_match = sub_match<string_view::const_iterator>;
constexpr string_view svsub_match_view(const svsub_match& submatch) noexcept {
return string_view(submatch.first, submatch.second - submatch.first);
}
inline bool
regex_match(string_view sv,
svmatch& m,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment