diff options
author | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2020-01-02 16:09:11 +0100 |
---|---|---|
committer | Thiago Marcos P. Santos <tmpsantos@gmail.com> | 2020-01-08 13:07:12 +0200 |
commit | f14985f783f2f96fc944e397c6c5072f8d3bc9b5 (patch) | |
tree | 35801556b4409547c720ee0540c44b5f293f49e5 /bin/cache.cpp | |
parent | c46f0baa571986a564c3378f928b7269ae2079a2 (diff) | |
download | qtlocation-mapboxgl-f14985f783f2f96fc944e397c6c5072f8d3bc9b5.tar.gz |
[tools] Added cache tool
A tool for adding resources to a cache database, important for
adding fixtures to our render test cache database.
Diffstat (limited to 'bin/cache.cpp')
-rw-r--r-- | bin/cache.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/bin/cache.cpp b/bin/cache.cpp new file mode 100644 index 0000000000..eee1d61b32 --- /dev/null +++ b/bin/cache.cpp @@ -0,0 +1,97 @@ +#include <mbgl/storage/default_file_source.hpp> +#include <mbgl/storage/resource.hpp> +#include <mbgl/util/chrono.hpp> +#include <mbgl/util/run_loop.hpp> + +#include <args.hxx> +#include <mapbox/io.hpp> + +#include <fstream> +#include <iostream> +#include <memory> +#include <string> +#include <unordered_map> + +int main(int argc, char* argv[]) { + args::ArgumentParser p("Mapbox GL cache tool", ""); + args::HelpFlag helpFlag(p, "help", "Display this help menu", {'h'}); + + args::ValueFlag<std::string> urlValue(p, "URL", "Resource URL (required)", {'u'}, args::Options::Required); + args::ValueFlag<std::string> cacheValue( + p, "cache", "Path to the cache database (required)", {'c'}, args::Options::Required); + args::ValueFlag<std::string> dataValue( + p, "data", "Path to the resource data (required)", {'d'}, args::Options::Required); + args::ValueFlag<std::string> etagValue(p, "etag", "Cache eTag, none otherwise", {'t'}); + args::ValueFlag<unsigned long> expiresValue(p, "expires", "Expires date, will use 'now' otherwise", {'e'}); + args::ValueFlag<unsigned long> modifiedValue(p, "modified", "Modified date, will use 'now' otherwise", {'m'}); + + std::unordered_map<std::string, mbgl::Resource::Kind> typeMap{{"glyphs", mbgl::Resource::Glyphs}, + {"image", mbgl::Resource::Image}, + {"source", mbgl::Resource::Source}, + {"sprite-image", mbgl::Resource::SpriteImage}, + {"sprite-json", mbgl::Resource::SpriteJSON}, + {"style", mbgl::Resource::Style}, + {"tile", mbgl::Resource::Tile}}; + + std::string typeHelp("One of the following (required):"); + for (auto key : typeMap) { + typeHelp += " " + key.first; + } + + args::MapFlag<std::string, mbgl::Resource::Kind> typeFlag( + p, "type", typeHelp, {"type"}, typeMap, args::Options::Required); + + args::Group tileIdGroup(p, "Coordinates (required for 'tile')", args::Group::Validators::AllOrNone); + args::ValueFlag<int32_t> xValueFlag(tileIdGroup, "x", "Tile x coordinate", {'x'}); + args::ValueFlag<int32_t> yValueFlag(tileIdGroup, "y", "Tile y coordinate", {'y'}); + args::ValueFlag<int32_t> zValueFlag(tileIdGroup, "z", "The zoom level", {'z'}); + + try { + p.ParseCLI(argc, argv); + } catch (const args::Help&) { + std::cout << p; + exit(0); + } catch (const args::ParseError& e) { + std::cerr << e.what() << std::endl; + std::cerr << p; + exit(1); + } catch (const args::ValidationError& e) { + std::cerr << e.what() << std::endl; + std::cerr << p; + exit(2); + } + + auto file = mapbox::base::io::readFile(args::get(dataValue)); + if (!file) { + std::cerr << file.error() << std::endl; + exit(3); + } + + mbgl::Response response; + response.data = std::make_shared<std::string>(*file); + response.etag = etagValue ? args::get(etagValue) : std::string(); + response.expires = expiresValue ? mbgl::Timestamp(mbgl::Seconds(args::get(expiresValue))) : mbgl::util::now(); + response.modified = modifiedValue ? mbgl::Timestamp(mbgl::Seconds(args::get(modifiedValue))) : mbgl::util::now(); + + mbgl::Resource resource(args::get(typeFlag), args::get(urlValue)); + + if (args::get(typeFlag) == mbgl::Resource::Tile) { + if (!xValueFlag || !yValueFlag || !zValueFlag) { + std::cerr << "Error: -x, -y and -z must be provided for tiles" << std::endl; + exit(1); + } + + resource.tileData = {{args::get(urlValue), + 1, + args::get(xValueFlag), + args::get(yValueFlag), + static_cast<int8_t>(args::get(zValueFlag))}}; + } + + mbgl::util::RunLoop loop; + mbgl::DefaultFileSource fileSource(args::get(cacheValue), "."); + + fileSource.put(resource, response); + + return 0; +} |