diff --git a/CHANGELOG.md b/CHANGELOG.md index f3cca3ffc..d62db52b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ ### ✨ New features - *...Add new stuff here...* +- [core] Add `ClientOptions` to configure client information [#365](https://github.com/maplibre/maplibre-gl-native/pull/365). +- [qt] Build user agent based on `ClientOptions`, if available [#365](https://github.com/maplibre/maplibre-gl-native/pull/365). - Bump maplibre-native-base from 2.0.0 to 2.1.0 [#397](https://github.com/maplibre/maplibre-gl-native/pull/397) ### 🐞 Bug fixes diff --git a/CMakeLists.txt b/CMakeLists.txt index ca18c2c6f..0c58a0b8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -255,6 +255,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/include/mbgl/util/async_task.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/char_array_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/chrono.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/util/client_options.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/color.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/compression.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/util/constants.hpp @@ -774,6 +775,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/bounding_volumes.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/chrono.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/util/client_options.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/color.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/constants.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/util/convert.cpp diff --git a/bin/offline.cpp b/bin/offline.cpp index ed5ea10aa..b4840bbf8 100644 --- a/bin/offline.cpp +++ b/bin/offline.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -172,12 +173,13 @@ int main(int argc, char *argv[]) { FileSourceType::Database, ResourceOptions().withApiKey(apiKey) .withTileServerOptions(mapTilerConfiguration) - .withCachePath(output)))); + .withCachePath(output), + ClientOptions()))); std::unique_ptr region; if (inputDb && mergePath) { - DatabaseFileSource inputSource(ResourceOptions().withCachePath(*inputDb)); + DatabaseFileSource inputSource(ResourceOptions().withCachePath(*inputDb), ClientOptions()); int retCode = 0; std::cout << "Start Merge" << std::endl; diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index 809073329..392bea596 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -35,7 +36,8 @@ public: explicit Map(RendererFrontend&, MapObserver&, const MapOptions&, - const ResourceOptions&); + const ResourceOptions&, + const ClientOptions& = ClientOptions()); ~Map(); // Register a callback that will get called (on the render thread) when all resources have diff --git a/include/mbgl/storage/database_file_source.hpp b/include/mbgl/storage/database_file_source.hpp index c1e99e277..0a2902438 100644 --- a/include/mbgl/storage/database_file_source.hpp +++ b/include/mbgl/storage/database_file_source.hpp @@ -4,16 +4,16 @@ #include #include #include -#include namespace mbgl { +class ClientOptions; class ResourceOptions; // TODO: Split DatabaseFileSource into Ambient cache and Database interfaces. class DatabaseFileSource : public FileSource { public: - explicit DatabaseFileSource(const ResourceOptions& options); + explicit DatabaseFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~DatabaseFileSource() override; // FileSource overrides @@ -236,6 +236,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: class Impl; const std::unique_ptr impl; diff --git a/include/mbgl/storage/file_source.hpp b/include/mbgl/storage/file_source.hpp index 21b6a4358..c2cee1999 100644 --- a/include/mbgl/storage/file_source.hpp +++ b/include/mbgl/storage/file_source.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include @@ -92,6 +93,11 @@ public: // gets the resource options virtual ResourceOptions getResourceOptions() = 0; + // sets the client options + virtual void setClientOptions(ClientOptions) = 0; + // gets the client options + virtual ClientOptions getClientOptions() = 0; + protected: FileSource() = default; }; diff --git a/include/mbgl/storage/file_source_manager.hpp b/include/mbgl/storage/file_source_manager.hpp index e62d321af..1f6ed8e22 100644 --- a/include/mbgl/storage/file_source_manager.hpp +++ b/include/mbgl/storage/file_source_manager.hpp @@ -5,6 +5,7 @@ namespace mbgl { +class ClientOptions; class ResourceOptions; /** @@ -18,7 +19,7 @@ class ResourceOptions; */ class FileSourceManager { public: - using FileSourceFactory = std::function(const ResourceOptions&)>; + using FileSourceFactory = std::function(const ResourceOptions&, const ClientOptions&)>; /** * @brief A singleton getter. @@ -30,7 +31,7 @@ public: // Returns shared instance of a file source for (type, options) tuple. // Creates new instance via registered factory if needed. If new instance cannot be // created, nullptr would be returned. - PassRefPtr getFileSource(FileSourceType, const ResourceOptions&) noexcept; + PassRefPtr getFileSource(FileSourceType, const ResourceOptions&, const ClientOptions& = ClientOptions()) noexcept; // Registers file source factory for a provided FileSourceType type. If factory for the // same type was already registered, will unregister previously registered factory. diff --git a/include/mbgl/storage/online_file_source.hpp b/include/mbgl/storage/online_file_source.hpp index 599fe3a94..ba36b898a 100644 --- a/include/mbgl/storage/online_file_source.hpp +++ b/include/mbgl/storage/online_file_source.hpp @@ -2,16 +2,19 @@ #include #include +#include #include namespace mbgl { class OnlineFileSource : public FileSource { public: - OnlineFileSource(const ResourceOptions& options); + OnlineFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~OnlineFileSource() override; void setResourceOptions(ResourceOptions) override; - ResourceOptions getResourceOptions() override; + ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; private: // FileSource overrides diff --git a/include/mbgl/util/client_options.hpp b/include/mbgl/util/client_options.hpp new file mode 100644 index 000000000..99c13457d --- /dev/null +++ b/include/mbgl/util/client_options.hpp @@ -0,0 +1,62 @@ +#pragma once + +#include +#include + +namespace mbgl { + +/** + * @brief Holds values for client options. + */ +class ClientOptions final { +public: + /** + * @brief Constructs a ClientOptions object with default values. + */ + ClientOptions(); + ~ClientOptions(); + + ClientOptions(ClientOptions&&) noexcept; + ClientOptions& operator=(const ClientOptions& options); + ClientOptions& operator=(ClientOptions&& options); + + ClientOptions clone() const; + + /** + * @brief Sets the client name. + * + * @param name Client name. + * @return ClientOptions for chaining options together. + */ + ClientOptions& withName(std::string name); + + /** + * @brief Gets the previously set (or default) client name. + * + * @return client name + */ + const std::string& name() const; + + /** + * @brief Sets the client version. + * + * @param version Client version. + * @return ClientOptions for chaining options together. + */ + ClientOptions& withVersion(std::string version); + + /** + * @brief Gets the previously set (or default) client version. + * + * @return client version + */ + const std::string& version() const; + +private: + ClientOptions(const ClientOptions&); + + class Impl; + std::unique_ptr impl_; +}; + +} // namespace mbgl diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.cpp index aebe6eda1..1c9e4f99b 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.cpp @@ -16,8 +16,9 @@ namespace mbgl { class AssetManagerFileSource::Impl { public: - Impl(ActorRef, AAssetManager* assetManager_, const ResourceOptions options) : - resourceOptions(options.clone()), + Impl(ActorRef, AAssetManager* assetManager_, const ResourceOptions resourceOptions_, const ClientOptions clientOptions_) : + resourceOptions(resourceOptions_.clone()), + clientOptions(clientOptions_.clone()), assetManager(assetManager_) {} void request(const std::string& url, ActorRef req) { @@ -46,20 +47,31 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + clientOptions = options; + } + + ClientOptions getClientOptions() { + return clientOptions.clone(); + } + private: AAssetManager* assetManager; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, const jni::Object& assetManager_, - const ResourceOptions options) + const ResourceOptions resourceOptions, + const ClientOptions clientOptions) : assetManager(jni::NewGlobal(env, assetManager_)), impl(std::make_unique>( util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "AssetManagerFileSource", AAssetManager_fromJava(&env, jni::Unwrap(assetManager.get())), - options.clone())) {} + resourceOptions.clone(), + clientOptions.clone())) {} AssetManagerFileSource::~AssetManagerFileSource() = default; @@ -82,4 +94,13 @@ void AssetManagerFileSource::setResourceOptions(ResourceOptions options) { ResourceOptions AssetManagerFileSource::getResourceOptions() { return impl->actor().ask(&Impl::getResourceOptions).get(); } + +void AssetManagerFileSource::setClientOptions(ClientOptions options) { + impl->actor().invoke(&Impl::setClientOptions, options.clone()); +} + +ClientOptions AssetManagerFileSource::getClientOptions() { + return impl->actor().ask(&Impl::getClientOptions).get(); +} + } // namespace mbgl diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.hpp b/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.hpp index 7467e39cc..edfe0a8e4 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.hpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/asset_manager_file_source.hpp @@ -2,6 +2,7 @@ #include #include +#include #include "asset_manager.hpp" @@ -15,7 +16,7 @@ template class Thread; class AssetManagerFileSource : public FileSource { public: - AssetManagerFileSource(jni::JNIEnv&, const jni::Object&, const ResourceOptions); + AssetManagerFileSource(jni::JNIEnv&, const jni::Object&, const ResourceOptions, const ClientOptions); ~AssetManagerFileSource() override; std::unique_ptr request(const Resource&, Callback) override; @@ -24,6 +25,9 @@ public: void setResourceOptions(ResourceOptions options) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions options) override; + ClientOptions getClientOptions() override; + private: class Impl; diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.cpp index 74980e493..e07a10c95 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -25,12 +26,12 @@ FileSource::FileSource(jni::JNIEnv& _env, const jni::String& apiKey, const jni:: mapbox::sqlite::setTempPath(path); mbgl::FileSourceManager::get()->registerFileSourceFactory( - mbgl::FileSourceType::Asset, [](const mbgl::ResourceOptions& opts) { + mbgl::FileSourceType::Asset, [](const mbgl::ResourceOptions& resourceOptions, const mbgl::ClientOptions& clientOptions) { auto env{android::AttachEnv()}; std::unique_ptr assetFileSource; if (android::Mapbox::hasInstance(*env)) { auto assetManager = android::Mapbox::getAssetManager(*env); - assetFileSource = std::make_unique(*env, assetManager, opts.clone()); + assetFileSource = std::make_unique(*env, assetManager, resourceOptions.clone(), clientOptions.clone()); } return assetFileSource; }); @@ -44,10 +45,10 @@ FileSource::FileSource(jni::JNIEnv& _env, const jni::String& apiKey, const jni:: // Create a core file sources // TODO: Split Android FileSource API to smaller interfaces resourceLoader = - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions, clientOptions); databaseSource = std::static_pointer_cast(std::shared_ptr( - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions))); - onlineSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions, clientOptions))); + onlineSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions, clientOptions); } FileSource::~FileSource() { @@ -199,6 +200,17 @@ mbgl::ResourceOptions FileSource::getSharedResourceOptions(jni::JNIEnv& env, return {}; } +mbgl::ClientOptions FileSource::getSharedClientOptions(jni::JNIEnv& env, + const jni::Object& jFileSource) { + FileSource* fileSource = FileSource::getNativePeer(env, jFileSource); + // Core could be compiled without support for any sources. + if (fileSource) { + return fileSource->clientOptions.clone(); + } + + return {}; +} + // FileSource::ResourcesCachePathChangeCallback // void FileSource::ResourcesCachePathChangeCallback::onSuccess(jni::JNIEnv& env, diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.hpp b/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.hpp index a4849cf87..bc3ae1a5c 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.hpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/file_source.hpp @@ -72,12 +72,15 @@ public: static mbgl::ResourceOptions getSharedResourceOptions(jni::JNIEnv&, const jni::Object&); + static mbgl::ClientOptions getSharedClientOptions(jni::JNIEnv&, const jni::Object&); + static void registerNative(jni::JNIEnv&); private: const std::string DATABASE_FILE = "/mbgl-offline.db"; optional activationCounter; mbgl::ResourceOptions resourceOptions; + mbgl::ClientOptions clientOptions; std::unique_ptr> resourceTransform; std::function pathChangeCallback; std::shared_ptr databaseSource; diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/http_file_source.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/http_file_source.cpp index b276985ce..df4a403d9 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/http_file_source.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/http_file_source.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -17,15 +18,20 @@ namespace mbgl { class HTTPFileSource::Impl { public: - Impl(const ResourceOptions options): resourceOptions(options.clone()){}; + Impl(const ResourceOptions resourceOptions_, const ClientOptions clientOptions_) + : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {}; android::UniqueEnv env { android::AttachEnv() }; void setResourceOptions(ResourceOptions options) {resourceOptions = options;}; ResourceOptions getResourceOptions() {return resourceOptions.clone(); }; + void setClientOptions(ClientOptions options) {clientOptions = options;}; + ClientOptions getClientOptions() {return clientOptions.clone();}; + private: ResourceOptions resourceOptions; + ClientOptions clientOptions; }; class HTTPRequest : public AsyncRequest { @@ -191,8 +197,8 @@ void HTTPRequest::onFailure(jni::JNIEnv& env, int type, const jni::String& messa async.send(); } -HTTPFileSource::HTTPFileSource(const ResourceOptions& options) - : impl(std::make_unique(options.clone())) { +HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : impl(std::make_unique(resourceOptions.clone(), clientOptions.clone())) { } HTTPFileSource::~HTTPFileSource() = default; @@ -209,4 +215,12 @@ ResourceOptions HTTPFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void HTTPFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions HTTPFileSource::getClientOptions() { + return impl->getClientOptions(); +} + } // namespace mbgl diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/native_map_view.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/native_map_view.cpp index 08cea7e63..64f78c18e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/native_map_view.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/native_map_view.cpp @@ -85,7 +85,8 @@ NativeMapView::NativeMapView(jni::JNIEnv& _env, // Create the core map map = std::make_unique( *rendererFrontend, *this, options, - mbgl::android::FileSource::getSharedResourceOptions(_env, jFileSource)); + mbgl::android::FileSource::getSharedResourceOptions(_env, jFileSource), + mbgl::android::FileSource::getSharedClientOptions(_env, jFileSource)); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_manager.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_manager.cpp index 74176b0e4..e2f94eddf 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_manager.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_manager.cpp @@ -27,7 +27,9 @@ void handleException(std::exception_ptr exception, OfflineManager::OfflineManager(jni::JNIEnv& env, const jni::Object& jFileSource) : fileSource(std::static_pointer_cast( std::shared_ptr(mbgl::FileSourceManager::get()->getFileSource( - mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource))))) { + mbgl::FileSourceType::Database, + FileSource::getSharedResourceOptions(env, jFileSource), + FileSource::getSharedClientOptions(env, jFileSource))))) { if (!fileSource) { ThrowNew(env, jni::FindClass(env, "java/lang/IllegalStateException"), "Offline functionality is disabled."); } diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_region.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_region.cpp index 75734b5d1..498f52353 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_region.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/offline/offline_region.cpp @@ -18,7 +18,9 @@ OfflineRegion::OfflineRegion(jni::JNIEnv& env, jni::jlong offlineRegionPtr, cons : region(reinterpret_cast(offlineRegionPtr)), fileSource(std::static_pointer_cast( std::shared_ptr(mbgl::FileSourceManager::get()->getFileSource( - mbgl::FileSourceType::Database, FileSource::getSharedResourceOptions(env, jFileSource))))) { + mbgl::FileSourceType::Database, + FileSource::getSharedResourceOptions(env, jFileSource), + FileSource::getSharedClientOptions(env, jFileSource))))) { if (!fileSource) { ThrowNew(env, jni::FindClass(env, "java/lang/IllegalStateException"), "Offline functionality is disabled."); } diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/snapshotter/map_snapshotter.cpp b/platform/android/MapboxGLAndroidSDK/src/cpp/snapshotter/map_snapshotter.cpp index 159da809f..b0e9cda0c 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/snapshotter/map_snapshotter.cpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/snapshotter/map_snapshotter.cpp @@ -46,6 +46,7 @@ MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, size, pixelRatio, mbgl::android::FileSource::getSharedResourceOptions(_env, _jFileSource), + mbgl::android::FileSource::getSharedClientOptions(_env, _jFileSource), *this, _localIdeographFontFamily ? jni::Make(_env, _localIdeographFontFamily) : optional{}); diff --git a/platform/android/src/test/http_file_source_test_stub.cpp b/platform/android/src/test/http_file_source_test_stub.cpp index 13c20dc4c..53648c3fd 100644 --- a/platform/android/src/test/http_file_source_test_stub.cpp +++ b/platform/android/src/test/http_file_source_test_stub.cpp @@ -7,7 +7,7 @@ namespace mbgl { class HTTPFileSource::Impl {}; -HTTPFileSource::HTTPFileSource(const ResourceOptions& /*options*/) +HTTPFileSource::HTTPFileSource(const ResourceOptions& /*resourceOptions*/, const ClientOptions& /*clientOptions*/) : impl(std::make_unique()) { } @@ -20,6 +20,13 @@ ResourceOptions HTTPFileSource::getResourceOptions() { return ResourceOptions::Default(); } +void HTTPFileSource::setClientOptions(ClientOptions /*options*/) { +} + +ClientOptions HTTPFileSource::getClientOptions() { + return ClientOptions(); +} + std::unique_ptr HTTPFileSource::request(const Resource&, Callback) { return std::make_unique(); } diff --git a/platform/darwin/src/http_file_source.mm b/platform/darwin/src/http_file_source.mm index 08f8667e3..35bba09d0 100644 --- a/platform/darwin/src/http_file_source.mm +++ b/platform/darwin/src/http_file_source.mm @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -83,7 +84,8 @@ private: class HTTPFileSource::Impl { public: - Impl(const ResourceOptions& options): resourceOptions(options.clone()) { + Impl(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) { @autoreleasepool { NSURLSessionConfiguration *sessionConfig = MGLNativeNetworkManager.sharedManager.sessionConfiguration; session = [NSURLSession sessionWithConfiguration:sessionConfig]; @@ -95,6 +97,9 @@ public: void setResourceOptions(ResourceOptions options); ResourceOptions getResourceOptions(); + void setClientOptions(ClientOptions options); + ClientOptions getClientOptions(); + NSURLSession* session = nil; NSString* userAgent = nil; @@ -102,6 +107,7 @@ private: NSString* getUserAgent() const; NSBundle* getSDKBundle() const; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; void HTTPFileSource::Impl::setResourceOptions(ResourceOptions options) { @@ -112,6 +118,14 @@ ResourceOptions HTTPFileSource::Impl::getResourceOptions() { return resourceOptions.clone(); } +void HTTPFileSource::Impl::setClientOptions(ClientOptions options) { + clientOptions = options; +} + +ClientOptions HTTPFileSource::Impl::getClientOptions() { + return clientOptions.clone(); +} + NSString *HTTPFileSource::Impl::getUserAgent() const { NSMutableArray *userAgentComponents = [NSMutableArray array]; @@ -193,8 +207,8 @@ NSBundle *HTTPFileSource::Impl::getSDKBundle() const { return bundle; } -HTTPFileSource::HTTPFileSource(const ResourceOptions& options) - : impl(std::make_unique(options)) { +HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : impl(std::make_unique(resourceOptions, clientOptions)) { } HTTPFileSource::~HTTPFileSource() = default; @@ -403,5 +417,12 @@ ResourceOptions HTTPFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void HTTPFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions HTTPFileSource::getClientOptions() { + return impl->getClientOptions(); +} } diff --git a/platform/default/include/mbgl/map/map_snapshotter.hpp b/platform/default/include/mbgl/map/map_snapshotter.hpp index 3c2df2028..6bb3ca40c 100644 --- a/platform/default/include/mbgl/map/map_snapshotter.hpp +++ b/platform/default/include/mbgl/map/map_snapshotter.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -12,6 +13,7 @@ namespace mbgl { struct CameraOptions; +class ClientOptions; class LatLngBounds; class ResourceOptions; @@ -34,10 +36,11 @@ public: MapSnapshotter(Size size, float pixelRatio, const ResourceOptions&, + const ClientOptions&, MapSnapshotterObserver&, optional localFontFamily = nullopt); - MapSnapshotter(Size size, float pixelRatio, const ResourceOptions&); + MapSnapshotter(Size size, float pixelRatio, const ResourceOptions&, const ClientOptions& = ClientOptions()); ~MapSnapshotter(); diff --git a/platform/default/src/mbgl/map/map_snapshotter.cpp b/platform/default/src/mbgl/map/map_snapshotter.cpp index 39d2dd00d..572f0d0ef 100644 --- a/platform/default/src/mbgl/map/map_snapshotter.cpp +++ b/platform/default/src/mbgl/map/map_snapshotter.cpp @@ -151,6 +151,7 @@ public: Impl(Size size, float pixelRatio, const ResourceOptions& resourceOptions, + const ClientOptions& clientOptions, MapSnapshotterObserver& observer_, optional localFontFamily) : observer(observer_), @@ -158,7 +159,8 @@ public: map(frontend, *this, MapOptions().withMapMode(MapMode::Static).withSize(size).withPixelRatio(pixelRatio), - resourceOptions) {} + resourceOptions, + clientOptions) {} void setRegion(const LatLngBounds& region) { mbgl::EdgeInsets insets{0, 0, 0, 0}; @@ -252,13 +254,14 @@ private: MapSnapshotter::MapSnapshotter(Size size, float pixelRatio, const ResourceOptions& resourceOptions, + const ClientOptions& clientOptions, MapSnapshotterObserver& observer, optional localFontFamily) : impl(std::make_unique( - size, pixelRatio, resourceOptions, observer, std::move(localFontFamily))) {} + size, pixelRatio, resourceOptions, clientOptions, observer, std::move(localFontFamily))) {} -MapSnapshotter::MapSnapshotter(Size size, float pixelRatio, const ResourceOptions& resourceOptions) - : MapSnapshotter(size, pixelRatio, resourceOptions, MapSnapshotterObserver::nullObserver()) {} +MapSnapshotter::MapSnapshotter(Size size, float pixelRatio, const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : MapSnapshotter(size, pixelRatio, resourceOptions, clientOptions, MapSnapshotterObserver::nullObserver()) {} MapSnapshotter::~MapSnapshotter() = default; diff --git a/platform/default/src/mbgl/storage/asset_file_source.cpp b/platform/default/src/mbgl/storage/asset_file_source.cpp index 2355d74cd..828407b63 100644 --- a/platform/default/src/mbgl/storage/asset_file_source.cpp +++ b/platform/default/src/mbgl/storage/asset_file_source.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -20,9 +21,10 @@ namespace mbgl { class AssetFileSource::Impl { public: - Impl(const ActorRef&, const ResourceOptions& options): - root (options.assetPath()), - resourceOptions (options.clone()) {} + Impl(const ActorRef&, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_): + root (resourceOptions_.assetPath()), + resourceOptions (resourceOptions_.clone()), + clientOptions (clientOptions_.clone()) {} void request(const std::string& url, const ActorRef& req) { if (!acceptsURL(url)) { @@ -49,15 +51,27 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + private: std::string root; mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; -AssetFileSource::AssetFileSource(const ResourceOptions& options) +AssetFileSource::AssetFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) : impl(std::make_unique>( - util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "AssetFileSource", options.clone())) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "AssetFileSource", resourceOptions.clone(), clientOptions.clone())) {} AssetFileSource::~AssetFileSource() = default; @@ -90,5 +104,13 @@ ResourceOptions AssetFileSource::getResourceOptions() { return impl->actor().ask(&Impl::getResourceOptions).get(); } +void AssetFileSource::setClientOptions(ClientOptions options) { + impl->actor().invoke(&Impl::setClientOptions, options.clone()); +} + +ClientOptions AssetFileSource::getClientOptions() { + return impl->actor().ask(&Impl::getClientOptions).get(); +} + } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/database_file_source.cpp b/platform/default/src/mbgl/storage/database_file_source.cpp index f1e95ddfb..3e7729edd 100644 --- a/platform/default/src/mbgl/storage/database_file_source.cpp +++ b/platform/default/src/mbgl/storage/database_file_source.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -154,13 +155,14 @@ private: class DatabaseFileSource::Impl { public: - Impl(std::shared_ptr onlineFileSource, const ResourceOptions& options) : + Impl(std::shared_ptr onlineFileSource, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) : thread(std::make_unique>( util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_DATABASE), "DatabaseFileSource", std::move(onlineFileSource), - options.cachePath())), - resourceOptions(options.clone()) {} + resourceOptions_.cachePath())), + resourceOptions(resourceOptions_.clone()), + clientOptions(clientOptions_.clone()) {} ActorRef actor() const { return thread->actor(); } @@ -177,16 +179,29 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + private: const std::unique_ptr> thread; mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; -DatabaseFileSource::DatabaseFileSource(const ResourceOptions& options) +DatabaseFileSource::DatabaseFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) : impl(std::make_unique( - FileSourceManager::get()->getFileSource(FileSourceType::Network, options), - options)) {} + FileSourceManager::get()->getFileSource(FileSourceType::Network, resourceOptions, clientOptions), + resourceOptions, + clientOptions)) {} DatabaseFileSource::~DatabaseFileSource() = default; @@ -322,4 +337,12 @@ ResourceOptions DatabaseFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void DatabaseFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions DatabaseFileSource::getClientOptions() { + return impl->getClientOptions(); +} + } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/file_source_manager.cpp b/platform/default/src/mbgl/storage/file_source_manager.cpp index 3db95fd07..ceddf13f5 100644 --- a/platform/default/src/mbgl/storage/file_source_manager.cpp +++ b/platform/default/src/mbgl/storage/file_source_manager.cpp @@ -12,27 +12,28 @@ namespace mbgl { class DefaultFileSourceManagerImpl final : public FileSourceManager { public: DefaultFileSourceManagerImpl() { - registerFileSourceFactory(FileSourceType::ResourceLoader, [](const ResourceOptions& options) { - return std::make_unique(options); + registerFileSourceFactory(FileSourceType::ResourceLoader, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); }); - registerFileSourceFactory(FileSourceType::Asset, [](const ResourceOptions& options) { - return std::make_unique(options); + registerFileSourceFactory(FileSourceType::Asset, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); }); - registerFileSourceFactory(FileSourceType::Database, [](const ResourceOptions& options) { - return std::make_unique(options); + registerFileSourceFactory(FileSourceType::Database, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); }); - registerFileSourceFactory(FileSourceType::FileSystem, - [](const ResourceOptions& options) { return std::make_unique(options); }); + registerFileSourceFactory(FileSourceType::FileSystem, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); + }); - registerFileSourceFactory(FileSourceType::Mbtiles, - [](const ResourceOptions& options) { return std::make_unique(options); }); + registerFileSourceFactory(FileSourceType::Mbtiles, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); + }); - registerFileSourceFactory(FileSourceType::Network, [](const ResourceOptions& options) { - std::unique_ptr networkSource = std::make_unique(options); - return networkSource; + registerFileSourceFactory(FileSourceType::Network, [](const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) { + return std::make_unique(resourceOptions, clientOptions); }); } }; diff --git a/platform/default/src/mbgl/storage/http_file_source.cpp b/platform/default/src/mbgl/storage/http_file_source.cpp index 687ac49f7..6abc4b9cd 100644 --- a/platform/default/src/mbgl/storage/http_file_source.cpp +++ b/platform/default/src/mbgl/storage/http_file_source.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -37,7 +38,7 @@ namespace mbgl { class HTTPFileSource::Impl { public: - Impl(const ResourceOptions& options); + Impl(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_); ~Impl(); static int handleSocket(CURL *handle, curl_socket_t s, int action, void *userp, void *socketp); @@ -66,9 +67,14 @@ public: void setResourceOptions(ResourceOptions options); ResourceOptions getResourceOptions(); + void setClientOptions(ClientOptions options); + ClientOptions getClientOptions(); + private: mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; class HTTPRequest : public AsyncRequest { @@ -99,7 +105,8 @@ private: char error[CURL_ERROR_SIZE] = { 0 }; }; -HTTPFileSource::Impl::Impl(const ResourceOptions& options): resourceOptions (options.clone()) { +HTTPFileSource::Impl::Impl(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions (resourceOptions_.clone()), clientOptions (clientOptions_.clone()) { if (curl_global_init(CURL_GLOBAL_ALL)) { throw std::runtime_error("Could not init cURL"); } @@ -242,6 +249,16 @@ ResourceOptions HTTPFileSource::Impl::getResourceOptions() { return resourceOptions.clone(); } +void HTTPFileSource::Impl::setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; +} + +ClientOptions HTTPFileSource::Impl::getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); +} + HTTPRequest::HTTPRequest(HTTPFileSource::Impl* context_, Resource resource_, FileSource::Callback callback_) : context(context_), resource(std::move(resource_)), @@ -424,8 +441,8 @@ void HTTPRequest::handleResult(CURLcode code) { callback_(response_); } -HTTPFileSource::HTTPFileSource(const ResourceOptions& options) - : impl(std::make_unique(options)) { +HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : impl(std::make_unique(resourceOptions, clientOptions)) { } HTTPFileSource::~HTTPFileSource() = default; @@ -442,4 +459,12 @@ ResourceOptions HTTPFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void HTTPFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions HTTPFileSource::getClientOptions() { + return impl->getClientOptions(); +} + } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/local_file_source.cpp b/platform/default/src/mbgl/storage/local_file_source.cpp index 21189c0ab..2df1f4e80 100644 --- a/platform/default/src/mbgl/storage/local_file_source.cpp +++ b/platform/default/src/mbgl/storage/local_file_source.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -20,7 +21,8 @@ namespace mbgl { class LocalFileSource::Impl { public: - explicit Impl(const ActorRef&, const ResourceOptions& options): resourceOptions (options.clone()) {} + explicit Impl(const ActorRef&, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions (resourceOptions_.clone()), clientOptions (clientOptions_.clone()) {} void request(const std::string& url, const ActorRef& req) { if (!acceptsURL(url)) { @@ -46,14 +48,27 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + + private: mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; -LocalFileSource::LocalFileSource(const ResourceOptions& options): +LocalFileSource::LocalFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions): impl(std::make_unique>( - util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "LocalFileSource", options.clone())) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "LocalFileSource", resourceOptions.clone(), clientOptions.clone())) {} LocalFileSource::~LocalFileSource() = default; @@ -85,5 +100,13 @@ ResourceOptions LocalFileSource::getResourceOptions() { return impl->actor().ask(&Impl::getResourceOptions).get(); } +void LocalFileSource::setClientOptions(ClientOptions options) { + impl->actor().invoke(&Impl::setClientOptions, options.clone()); +} + +ClientOptions LocalFileSource::getClientOptions() { + return impl->actor().ask(&Impl::getClientOptions).get(); +} + } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/main_resource_loader.cpp b/platform/default/src/mbgl/storage/main_resource_loader.cpp index 2d980c482..5d051e796 100644 --- a/platform/default/src/mbgl/storage/main_resource_loader.cpp +++ b/platform/default/src/mbgl/storage/main_resource_loader.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -133,7 +134,8 @@ private: class MainResourceLoader::Impl { public: - Impl(const ResourceOptions& options, + Impl(const ResourceOptions& resourceOptions_, + const ClientOptions& clientOptions_, std::shared_ptr assetFileSource_, std::shared_ptr databaseFileSource_, std::shared_ptr localFileSource_, @@ -153,7 +155,8 @@ public: localFileSource, onlineFileSource, mbtilesFileSource)), - resourceOptions (options.clone()) {} + resourceOptions (resourceOptions_.clone()), + clientOptions (clientOptions_.clone()) {} std::unique_ptr request(const Resource& resource, Callback callback) { auto req = std::make_unique(std::move(callback)); @@ -194,6 +197,21 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + assetFileSource->setClientOptions(options.clone()); + databaseFileSource->setClientOptions(options.clone()); + localFileSource->setClientOptions(options.clone()); + onlineFileSource->setClientOptions(options.clone()); + mbtilesFileSource->setClientOptions(options.clone()); + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + private: const std::shared_ptr assetFileSource; const std::shared_ptr databaseFileSource; @@ -204,15 +222,18 @@ private: const std::unique_ptr> thread; mutable std::mutex resourceOptionsMutex; ResourceOptions resourceOptions; + mutable std::mutex clientOptionsMutex; + ClientOptions clientOptions; }; -MainResourceLoader::MainResourceLoader(const ResourceOptions& options): - impl(std::make_unique(options.clone(), - FileSourceManager::get()->getFileSource(FileSourceType::Asset, options), - FileSourceManager::get()->getFileSource(FileSourceType::Database, options), - FileSourceManager::get()->getFileSource(FileSourceType::FileSystem, options), - FileSourceManager::get()->getFileSource(FileSourceType::Network, options), - FileSourceManager::get()->getFileSource(FileSourceType::Mbtiles, options))) {} +MainResourceLoader::MainResourceLoader(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions): + impl(std::make_unique(resourceOptions.clone(), + clientOptions.clone(), + FileSourceManager::get()->getFileSource(FileSourceType::Asset, resourceOptions, clientOptions), + FileSourceManager::get()->getFileSource(FileSourceType::Database, resourceOptions, clientOptions), + FileSourceManager::get()->getFileSource(FileSourceType::FileSystem, resourceOptions, clientOptions), + FileSourceManager::get()->getFileSource(FileSourceType::Network, resourceOptions, clientOptions), + FileSourceManager::get()->getFileSource(FileSourceType::Mbtiles, resourceOptions, clientOptions))) {} MainResourceLoader::~MainResourceLoader() = default; @@ -244,4 +265,12 @@ ResourceOptions MainResourceLoader::getResourceOptions() { return impl->getResourceOptions(); } +void MainResourceLoader::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions MainResourceLoader::getClientOptions() { + return impl->getClientOptions(); +} + } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/mbtiles_file_source.cpp b/platform/default/src/mbgl/storage/mbtiles_file_source.cpp index aeeba1679..64bccb599 100644 --- a/platform/default/src/mbgl/storage/mbtiles_file_source.cpp +++ b/platform/default/src/mbgl/storage/mbtiles_file_source.cpp @@ -42,7 +42,8 @@ using namespace rapidjson; class MBTilesFileSource::Impl { public: - explicit Impl(const ActorRef&, const ResourceOptions& options): resourceOptions (options.clone()) {} + explicit Impl(const ActorRef&, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions (resourceOptions_.clone()), clientOptions (clientOptions_.clone()) {} std::vector &split(const std::string &s, char delim, std::vector &elems) { std::stringstream ss(s); @@ -235,6 +236,17 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + std::lock_guard lock(clientOptionsMutex); + clientOptions = options; + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return clientOptions.clone(); + } + + private: std::map db_cache; @@ -261,13 +273,15 @@ private: } mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; -MBTilesFileSource::MBTilesFileSource(const ResourceOptions& options) : +MBTilesFileSource::MBTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) : thread(std::make_unique>( - util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "MBTilesFileSource", options.clone())) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE), "MBTilesFileSource", resourceOptions.clone(), clientOptions.clone())) {} std::unique_ptr MBTilesFileSource::request(const Resource &resource, FileSource::Callback callback) { auto req = std::make_unique(std::move(callback)); @@ -318,4 +332,12 @@ ResourceOptions MBTilesFileSource::getResourceOptions() { return thread->actor().ask(&Impl::getResourceOptions).get(); } +void MBTilesFileSource::setClientOptions(ClientOptions options) { + thread->actor().invoke(&Impl::setClientOptions, options.clone()); +} + +ClientOptions MBTilesFileSource::getClientOptions() { + return thread->actor().ask(&Impl::getClientOptions).get(); +} + } diff --git a/platform/default/src/mbgl/storage/online_file_source.cpp b/platform/default/src/mbgl/storage/online_file_source.cpp index 0b5b975ec..ce1d1fa1a 100644 --- a/platform/default/src/mbgl/storage/online_file_source.cpp +++ b/platform/default/src/mbgl/storage/online_file_source.cpp @@ -3,10 +3,11 @@ #include #include #include +#include #include #include +#include #include -#include #include #include @@ -74,7 +75,8 @@ struct OnlineFileRequest { class OnlineFileSourceThread { public: - OnlineFileSourceThread(const ResourceOptions& options): resourceOptions(options.clone()), httpFileSource(options) { + OnlineFileSourceThread(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()), httpFileSource(resourceOptions_, clientOptions_) { NetworkStatus::Subscribe(&reachability); setMaximumConcurrentRequests(util::DEFAULT_MAXIMUM_CONCURRENT_REQUESTS); } @@ -172,6 +174,14 @@ public: return resourceOptions; } + void setClientOptions(ClientOptions options) { + clientOptions = options; + } + + const ClientOptions& getClientOptions() const { + return clientOptions; + } + void setOnlineStatus(bool status) { online = status; if (online) { @@ -280,6 +290,7 @@ private: ResourceTransform resourceTransform; ResourceOptions resourceOptions; + ClientOptions clientOptions; /** * The lifetime of a request is: @@ -307,10 +318,11 @@ private: class OnlineFileSource::Impl { public: - Impl(const ResourceOptions& options) : - cachedResourceOptions(options.clone()), + Impl(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) : + cachedResourceOptions(resourceOptions.clone()), + cachedClientOptions(clientOptions.clone()), thread(std::make_unique>( - util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_NETWORK), "OnlineFileSource", options.clone())) {} + util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_NETWORK), "OnlineFileSource", resourceOptions.clone(), clientOptions.clone())) {} std::unique_ptr request(Callback callback, Resource res) { auto req = std::make_unique(std::move(callback)); @@ -341,6 +353,19 @@ public: return cachedResourceOptions.clone(); } + void setClientOptions(ClientOptions options) { + thread->actor().invoke(&OnlineFileSourceThread::setClientOptions, options.clone()); + { + std::lock_guard lock(clientOptionsMutex); + cachedClientOptions = options; + } + } + + ClientOptions getClientOptions() { + std::lock_guard lock(clientOptionsMutex); + return cachedClientOptions.clone(); + } + void setOnlineStatus(bool status) { thread->actor().invoke(&OnlineFileSourceThread::setOnlineStatus, status); } void setMaximumConcurrentRequests(const mapbox::base::Value& value) { @@ -398,7 +423,9 @@ public: private: mutable std::mutex resourceOptionsMutex; + mutable std::mutex clientOptionsMutex; ResourceOptions cachedResourceOptions; + ClientOptions cachedClientOptions; mutable std::mutex maximumConcurrentRequestsMutex; uint32_t cachedMaximumConcurrentRequests = util::DEFAULT_MAXIMUM_CONCURRENT_REQUESTS; @@ -586,7 +613,8 @@ void OnlineFileRequest::onCancel(std::function callback_) { cancelCallback = std::move(callback_); } -OnlineFileSource::OnlineFileSource(const ResourceOptions& options) : impl(std::make_unique(options)) {} +OnlineFileSource::OnlineFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : impl(std::make_unique(resourceOptions, clientOptions)) {} OnlineFileSource::~OnlineFileSource() = default; @@ -685,4 +713,12 @@ ResourceOptions OnlineFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void OnlineFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions OnlineFileSource::getClientOptions() { + return impl->getClientOptions(); +} + } // namespace mbgl diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index ec3d6e670..c266c4b08 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -121,11 +121,12 @@ void glfwError(int error, const char *description) { mbgl::Log::Error(mbgl::Event::OpenGL, "GLFW error (%i): %s", error, description); } -GLFWView::GLFWView(bool fullscreen_, bool benchmark_, const mbgl::ResourceOptions &options) +GLFWView::GLFWView(bool fullscreen_, bool benchmark_, const mbgl::ResourceOptions &resourceOptions, const mbgl::ClientOptions &clientOptions) : fullscreen(fullscreen_), benchmark(benchmark_), snapshotterObserver(std::make_unique()), - mapResourceOptions(options.clone()) { + mapResourceOptions(resourceOptions.clone()), + mapClientOptions(clientOptions.clone()) { glfwSetErrorCallback(glfwError); std::srand(static_cast(std::time(nullptr))); @@ -726,7 +727,7 @@ void GLFWView::popAnnotation() { void GLFWView::makeSnapshot(bool withOverlay) { if (!snapshotter || snapshotter->getStyleURL() != map->getStyle().getURL()) { snapshotter = std::make_unique( - map->getMapOptions().size(), map->getMapOptions().pixelRatio(), mapResourceOptions, *snapshotterObserver); + map->getMapOptions().size(), map->getMapOptions().pixelRatio(), mapResourceOptions, mapClientOptions, *snapshotterObserver); snapshotter->setStyleURL(map->getStyle().getURL()); } diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp index 918f5fb51..3eed3aeec 100644 --- a/platform/glfw/glfw_view.hpp +++ b/platform/glfw/glfw_view.hpp @@ -25,7 +25,7 @@ class RendererBackend; class GLFWView : public mbgl::MapObserver { public: - GLFWView(bool fullscreen, bool benchmark, const mbgl::ResourceOptions &options); + GLFWView(bool fullscreen, bool benchmark, const mbgl::ResourceOptions &resourceOptions, const mbgl::ClientOptions &clientOptions); ~GLFWView() override; float getPixelRatio() const; @@ -152,6 +152,7 @@ private: std::unique_ptr snapshotter; std::unique_ptr snapshotterObserver; mbgl::ResourceOptions mapResourceOptions; + mbgl::ClientOptions mapClientOptions; #if defined(MBGL_RENDER_BACKEND_OPENGL) && !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) bool puckFollowsCameraCenter = false; diff --git a/platform/glfw/main.cpp b/platform/glfw/main.cpp index f926bb667..e311e5981 100644 --- a/platform/glfw/main.cpp +++ b/platform/glfw/main.cpp @@ -102,13 +102,14 @@ int main(int argc, char *argv[]) { auto mapTilerConfiguration = mbgl::TileServerOptions::MapTilerConfiguration(); mbgl::ResourceOptions resourceOptions; resourceOptions.withCachePath(cacheDB).withApiKey(apikey).withTileServerOptions(mapTilerConfiguration); + mbgl::ClientOptions clientOptions; auto orderedStyles = mapTilerConfiguration.defaultStyles(); - GLFWView backend(fullscreen, benchmark, resourceOptions); + GLFWView backend(fullscreen, benchmark, resourceOptions, clientOptions); view = &backend; std::shared_ptr onlineFileSource = - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions, clientOptions); if (!settings.online) { if (onlineFileSource) { onlineFileSource->setProperty("online-status", false); @@ -122,7 +123,7 @@ int main(int argc, char *argv[]) { GLFWRendererFrontend rendererFrontend { std::make_unique(view->getRendererBackend(), view->getPixelRatio()), *view }; mbgl::Map map(rendererFrontend, *view, - mbgl::MapOptions().withSize(view->getSize()).withPixelRatio(view->getPixelRatio()), resourceOptions); + mbgl::MapOptions().withSize(view->getSize()).withPixelRatio(view->getPixelRatio()), resourceOptions, clientOptions); backend.setMap(&map); @@ -166,7 +167,7 @@ int main(int argc, char *argv[]) { // Resource loader controls top-level request processing and can resume / pause all managed sources simultaneously. std::shared_ptr resourceLoader = - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions, clientOptions); view->setPauseResumeCallback([resourceLoader]() { static bool isPaused = false; @@ -181,7 +182,7 @@ int main(int argc, char *argv[]) { // Database file source. auto databaseFileSource = std::static_pointer_cast(std::shared_ptr( - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions))); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions, clientOptions))); view->setResetCacheCallback([databaseFileSource]() { databaseFileSource->resetDatabase([](const std::exception_ptr& ex) { if (ex) { diff --git a/platform/ios/platform/darwin/src/MGLMapSnapshotter.mm b/platform/ios/platform/darwin/src/MGLMapSnapshotter.mm index 9eda43e07..3d11cbc17 100644 --- a/platform/ios/platform/darwin/src/MGLMapSnapshotter.mm +++ b/platform/ios/platform/darwin/src/MGLMapSnapshotter.mm @@ -7,6 +7,7 @@ #import #import #import +#import #import #import "MGLOfflineStorage_Private.h" @@ -718,6 +719,8 @@ NSArray *MGLAttributionInfosFromAttributions(mbgl::MapSnap .withTileServerOptions(*tileServerOptions) .withCachePath(MGLOfflineStorage.sharedOfflineStorage.databasePath.UTF8String) .withAssetPath(NSBundle.mainBundle.resourceURL.path.UTF8String); + mbgl::ClientOptions clientOptions; + auto apiKey = [[MGLSettings sharedSettings] apiKey]; if (apiKey) { resourceOptions.withApiKey([apiKey UTF8String]); @@ -727,7 +730,7 @@ NSArray *MGLAttributionInfosFromAttributions(mbgl::MapSnap auto localFontFamilyName = config.localFontFamilyName ? std::string(config.localFontFamilyName.UTF8String) : nullptr; _delegateHost = std::make_unique(self); _mbglMapSnapshotter = std::make_unique( - size, pixelRatio, resourceOptions, *_delegateHost, localFontFamilyName); + size, pixelRatio, resourceOptions, clientOptions, *_delegateHost, localFontFamilyName); _mbglMapSnapshotter->setStyleURL(std::string(options.styleURL.absoluteString.UTF8String)); diff --git a/platform/ios/platform/darwin/src/MGLOfflineStorage.mm b/platform/ios/platform/darwin/src/MGLOfflineStorage.mm index db677fed2..77477a8b6 100644 --- a/platform/ios/platform/darwin/src/MGLOfflineStorage.mm +++ b/platform/ios/platform/darwin/src/MGLOfflineStorage.mm @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -159,14 +160,14 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio if (self = [super init]) { mbgl::TileServerOptions* tileServerOptions = [[MGLSettings sharedSettings] tileServerOptionsInternal]; - mbgl::ResourceOptions options; - options.withCachePath(self.databasePath.UTF8String) - .withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String) - .withTileServerOptions(*tileServerOptions); - - _mbglFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, options); - _mbglOnlineFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, options); - _mbglDatabaseFileSource = std::static_pointer_cast(std::shared_ptr(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, options))); + mbgl::ResourceOptions resourceOptions; + resourceOptions.withCachePath(self.databasePath.UTF8String) + .withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String) + .withTileServerOptions(*tileServerOptions); + mbgl::ClientOptions clientOptions; + _mbglFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions, clientOptions); + _mbglOnlineFileSource = mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions, clientOptions); + _mbglDatabaseFileSource = std::static_pointer_cast(std::shared_ptr(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Database, resourceOptions, clientOptions))); // Observe for changes to the tile server options (and find out the current one). [[MGLSettings sharedSettings] addObserver:self diff --git a/platform/ios/platform/ios/src/MGLMapView.mm b/platform/ios/platform/ios/src/MGLMapView.mm index 507456c59..039b97016 100644 --- a/platform/ios/platform/ios/src/MGLMapView.mm +++ b/platform/ios/platform/ios/src/MGLMapView.mm @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -499,14 +500,15 @@ public: resourceOptions.withCachePath(MGLOfflineStorage.sharedOfflineStorage.databasePath.UTF8String) .withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String) .withTileServerOptions(*tileServerOptions); - + mbgl::ClientOptions clientOptions; + auto apiKey = [[MGLSettings sharedSettings] apiKey]; if (apiKey) { resourceOptions.withApiKey([apiKey UTF8String]); } NSAssert(!_mbglMap, @"_mbglMap should be NULL"); - _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions); + _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions, clientOptions); // start paused if launch into the background if (background) { diff --git a/platform/ios/platform/macos/src/MGLMapView.mm b/platform/ios/platform/macos/src/MGLMapView.mm index 473637594..0ff3a897a 100644 --- a/platform/ios/platform/macos/src/MGLMapView.mm +++ b/platform/ios/platform/macos/src/MGLMapView.mm @@ -34,6 +34,7 @@ #import #import #import +#import #import #import #import @@ -298,13 +299,14 @@ public: resourceOptions.withTileServerOptions(*tileServerOptions) .withCachePath(MGLOfflineStorage.sharedOfflineStorage.databasePath.UTF8String) .withAssetPath([NSBundle mainBundle].resourceURL.path.UTF8String); - + mbgl::ClientOptions clientOptions; + auto apiKey = [[MGLSettings sharedSettings] apiKey]; if (apiKey) { resourceOptions.withApiKey([apiKey UTF8String]); } - _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions); + _mbglMap = std::make_unique(*_rendererFrontend, *_mbglView, mapOptions, resourceOptions, clientOptions); // Notify map object when network reachability status changes. _reachability = [MGLReachability reachabilityForInternetConnection]; diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp index 0c9f22381..601cda81b 100644 --- a/platform/node/src/node_map.cpp +++ b/platform/node/src/node_map.cpp @@ -194,7 +194,7 @@ void NodeMap::New(const Nan::FunctionCallbackInfo& info) { info.This()->SetInternalField(1, options); mbgl::FileSourceManager::get()->registerFileSourceFactory( - mbgl::FileSourceType::ResourceLoader, [](const mbgl::ResourceOptions& resourceOptions) { + mbgl::FileSourceType::ResourceLoader, [](const mbgl::ResourceOptions& resourceOptions, const mbgl::ClientOptions& clientOptions) { return std::make_unique( reinterpret_cast(resourceOptions.platformContext())); }); @@ -644,7 +644,8 @@ void NodeMap::cancel() { .withPixelRatio(pixelRatio) .withMapMode(mbgl::MapMode::Static) .withCrossSourceCollisions(crossSourceCollisions), - mbgl::ResourceOptions().withPlatformContext(reinterpret_cast(this))); + mbgl::ResourceOptions().withPlatformContext(reinterpret_cast(this)), + mbgl::ClientOptions()); // FIXME: Reload the style after recreating the map. We need to find // a better way of canceling an ongoing rendering on the core level @@ -1422,7 +1423,8 @@ NodeMap::NodeMap(v8::Local options) .withPixelRatio(pixelRatio) .withMapMode(mbgl::MapMode::Static) .withCrossSourceCollisions(crossSourceCollisions), - mbgl::ResourceOptions().withPlatformContext(reinterpret_cast(this)))) + mbgl::ResourceOptions().withPlatformContext(reinterpret_cast(this)), + mbgl::ClientOptions())) , async(new uv_async_t) { async->data = this; uv_async_init(uv_default_loop(), async, [](uv_async_t* h) { @@ -1477,4 +1479,12 @@ mbgl::ResourceOptions NodeFileSource::getResourceOptions() { return this->_resourceOptions.clone(); } +void NodeFileSource::setClientOptions(mbgl::ClientOptions options) { + this->_clientOptions = std::move(options); +} + +mbgl::ClientOptions NodeFileSource::getClientOptions() { + return this->_clientOptions.clone(); +} + } // namespace node_mbgl diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp index 5872296a4..ab84a66c5 100644 --- a/platform/node/src/node_map.hpp +++ b/platform/node/src/node_map.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -103,8 +104,11 @@ struct NodeFileSource : public mbgl::FileSource { bool canRequest(const mbgl::Resource&) const override; void setResourceOptions(mbgl::ResourceOptions) override; mbgl::ResourceOptions getResourceOptions() override; + void setClientOptions(mbgl::ClientOptions) override; + mbgl::ClientOptions getClientOptions() override; NodeMap* nodeMap; mbgl::ResourceOptions _resourceOptions; + mbgl::ClientOptions _clientOptions; }; } // namespace node_mbgl diff --git a/platform/qt/app/main.cpp b/platform/qt/app/main.cpp index 0ca5cd705..134ccddba 100644 --- a/platform/qt/app/main.cpp +++ b/platform/qt/app/main.cpp @@ -10,6 +10,9 @@ int main(int argc, char **argv) settings.setCacheDatabasePath("/tmp/mbgl-cache.db"); settings.setCacheDatabaseMaximumSize(20 * 1024 * 1024); + settings.setClientName("TestApp"); + settings.setClientVersion("1.0"); + MapWindow window(settings); window.resize(800, 600); diff --git a/platform/qt/include/QMapLibreGL/settings.hpp b/platform/qt/include/QMapLibreGL/settings.hpp index 5091cbbfa..d814dfc8b 100644 --- a/platform/qt/include/QMapLibreGL/settings.hpp +++ b/platform/qt/include/QMapLibreGL/settings.hpp @@ -82,6 +82,12 @@ public: QString localFontFamily() const; void setLocalFontFamily(const QString &); + QString clientName() const; + void setClientName(const QString &); + + QString clientVersion() const; + void setClientVersion(const QString &); + std::function resourceTransform() const; void setResourceTransform(const std::function &); @@ -102,6 +108,8 @@ private: QString m_assetPath; QString m_apiKey; QString m_localFontFamily; + QString m_clientName; + QString m_clientVersion; std::function m_resourceTransform; mbgl::TileServerOptions *m_tileServerOptionsInternal{}; diff --git a/platform/qt/src/map.cpp b/platform/qt/src/map.cpp index 6be15823b..3a266856f 100644 --- a/platform/qt/src/map.cpp +++ b/platform/qt/src/map.cpp @@ -129,6 +129,12 @@ mbgl::ResourceOptions resourceOptionsFromSettings(const QMapLibreGL::Settings &s .withMaximumCacheSize(settings.cacheDatabaseMaximumSize())); } +mbgl::ClientOptions clientOptionsFromSettings(const QMapLibreGL::Settings &settings) { + return std::move(mbgl::ClientOptions() + .withName(settings.clientName().toStdString()) + .withVersion(settings.clientVersion().toStdString())); +} + mbgl::optional asAnnotation(const QMapLibreGL::Annotation & annotation) { auto asGeometry = [](const QMapLibreGL::ShapeAnnotationGeometry &geometry) { @@ -1380,11 +1386,14 @@ MapPrivate::MapPrivate(Map *q, const Settings &settings, const QSize &size, qrea defaultStyles.append(QPair( QString::fromStdString(style.getUrl()), QString::fromStdString(style.getName()))); } + + auto clientOptions = clientOptionsFromSettings(settings); // Setup the Map object. mapObj = std::make_unique(*this, *m_mapObserver, mapOptionsFromSettings(settings, size, m_pixelRatio), - resourceOptions); + resourceOptions, + clientOptionsFromSettings(settings)); if (settings.resourceTransform()) { m_resourceTransform = std::make_unique>( @@ -1401,7 +1410,7 @@ MapPrivate::MapPrivate(Map *q, const Settings &settings, const QSize &size, qrea actorRef.invoke(&mbgl::ResourceTransform::TransformCallback::operator(), kind, url, std::move(onFinished)); }}; std::shared_ptr fs = - mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions); + mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::Network, resourceOptions, clientOptions); fs->setResourceTransform(std::move(transform)); } diff --git a/platform/qt/src/mbgl/http_file_source.cpp b/platform/qt/src/mbgl/http_file_source.cpp index a2a13c5e1..1819aa8bc 100644 --- a/platform/qt/src/mbgl/http_file_source.cpp +++ b/platform/qt/src/mbgl/http_file_source.cpp @@ -11,9 +11,10 @@ namespace mbgl { -HTTPFileSource::Impl::Impl(const ResourceOptions& options) +HTTPFileSource::Impl::Impl(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) : m_manager(new QNetworkAccessManager(this)), - m_resourceOptions(options.clone()) + m_resourceOptions(resourceOptions.clone()), + m_clientOptions(clientOptions.clone()) { QNetworkProxyFactory::setUseSystemConfiguration(true); } @@ -110,8 +111,18 @@ ResourceOptions HTTPFileSource::Impl::getResourceOptions() return m_resourceOptions.clone(); } -HTTPFileSource::HTTPFileSource(const ResourceOptions& options) - : impl(std::make_unique(options)) { +void HTTPFileSource::Impl::setClientOptions(ClientOptions options) +{ + m_clientOptions = options; +} + +ClientOptions HTTPFileSource::Impl::getClientOptions() +{ + return m_clientOptions.clone(); +} + +HTTPFileSource::HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) + : impl(std::make_unique(resourceOptions, clientOptions)) { } HTTPFileSource::~HTTPFileSource() = default; @@ -129,4 +140,13 @@ ResourceOptions HTTPFileSource::getResourceOptions() { return impl->getResourceOptions(); } +void HTTPFileSource::setClientOptions(ClientOptions options) { + impl->setClientOptions(options.clone()); +} + +ClientOptions HTTPFileSource::getClientOptions() { + return impl->getClientOptions(); +} + + } // namespace mbgl diff --git a/platform/qt/src/mbgl/http_file_source.hpp b/platform/qt/src/mbgl/http_file_source.hpp index f3dc64a25..156c7e7f1 100644 --- a/platform/qt/src/mbgl/http_file_source.hpp +++ b/platform/qt/src/mbgl/http_file_source.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -22,7 +23,7 @@ class HTTPFileSource::Impl : public QObject Q_OBJECT public: - Impl(const ResourceOptions& options); + Impl(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); virtual ~Impl() = default; void request(HTTPRequest *); @@ -31,6 +32,9 @@ public: void setResourceOptions(ResourceOptions options); ResourceOptions getResourceOptions(); + void setClientOptions(ClientOptions options); + ClientOptions getClientOptions(); + public slots: void onReplyFinished(); @@ -38,6 +42,7 @@ private: QMap, QVector>> m_pending; QNetworkAccessManager *m_manager; ResourceOptions m_resourceOptions; + ClientOptions m_clientOptions; }; } // namespace mbgl diff --git a/platform/qt/src/mbgl/http_request.cpp b/platform/qt/src/mbgl/http_request.cpp index a7d152ea4..a9a8b1158 100644 --- a/platform/qt/src/mbgl/http_request.cpp +++ b/platform/qt/src/mbgl/http_request.cpp @@ -39,7 +39,18 @@ QNetworkRequest HTTPRequest::networkRequest() const QNetworkRequest req = QNetworkRequest(requestUrl()); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); - static const QByteArray agent = QString("MapLibreGL/%1 (Qt %2)").arg(version::revision).arg(QT_VERSION_STR).toLatin1(); + static const QByteArray agent = !m_context->getClientOptions().name().empty() + ? QString("%1/%2 (%3) MapLibreGL/%4 (Qt %5)") + .arg(QString::fromStdString(m_context->getClientOptions().name())) + .arg(QString::fromStdString(m_context->getClientOptions().version())) + .arg(QSysInfo::prettyProductName()) + .arg(version::revision) + .arg(QT_VERSION_STR) + .toLatin1() + : QString("MapLibreGL/%1 (Qt %2)") + .arg(version::revision) + .arg(QT_VERSION_STR) + .toLatin1(); req.setRawHeader("User-Agent", agent); if (m_resource.priorEtag) { diff --git a/platform/qt/src/settings.cpp b/platform/qt/src/settings.cpp index abb5b0b6f..fecd4797c 100644 --- a/platform/qt/src/settings.cpp +++ b/platform/qt/src/settings.cpp @@ -348,6 +348,38 @@ void Settings::setLocalFontFamily(const QString &family) m_localFontFamily = family; } +/*! + Returns the client name. Returns an empty string if no client name is set. +*/ +QString Settings::clientName() const +{ + return m_clientName; +} + +/*! + Sets the client name. +*/ +void Settings::setClientName(const QString &name) +{ + m_clientName = name; +} + +/*! + Returns the client version. Returns an empty string if no client version is set. +*/ +QString Settings::clientVersion() const +{ + return m_clientVersion; +} + +/*! + Sets the client version. +*/ +void Settings::setClientVersion(const QString &version) +{ + m_clientVersion = version; +} + /*! Returns resource transformation callback used to transform requested URLs. */ diff --git a/render-test/file_source.cpp b/render-test/file_source.cpp index f01cb264c..98b2fa2d6 100644 --- a/render-test/file_source.cpp +++ b/render-test/file_source.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -15,11 +16,12 @@ std::atomic_size_t transferredSize{0}; std::atomic_bool active{false}; std::atomic_bool offline{true}; -ProxyFileSource::ProxyFileSource(std::shared_ptr defaultResourceLoader_, const ResourceOptions& options) - : defaultResourceLoader(std::move(defaultResourceLoader_)) { +ProxyFileSource::ProxyFileSource(std::shared_ptr defaultResourceLoader_, const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : defaultResourceLoader(std::move(defaultResourceLoader_)), + resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) { assert(defaultResourceLoader); if (offline) { - std::shared_ptr dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, options); + std::shared_ptr dbfs = FileSourceManager::get()->getFileSource(FileSourceType::Database, resourceOptions_, clientOptions_); dbfs->setProperty(READ_ONLY_MODE_KEY, true); } } @@ -83,6 +85,14 @@ ResourceOptions ProxyFileSource::getResourceOptions() { return resourceOptions.clone(); } +void ProxyFileSource::setClientOptions(ClientOptions options) { + clientOptions = options; +} + +ClientOptions ProxyFileSource::getClientOptions() { + return clientOptions.clone(); +} + // static void ProxyFileSource::setOffline(bool status) { diff --git a/render-test/file_source.hpp b/render-test/file_source.hpp index 404ac9f27..b03b70142 100644 --- a/render-test/file_source.hpp +++ b/render-test/file_source.hpp @@ -4,11 +4,12 @@ namespace mbgl { +class ClientOptions; class ResourceOptions; class ProxyFileSource : public FileSource { public: - ProxyFileSource(std::shared_ptr, const ResourceOptions&); + ProxyFileSource(std::shared_ptr, const ResourceOptions&, const ClientOptions&); ~ProxyFileSource(); std::unique_ptr request(const Resource&, Callback) override; @@ -45,9 +46,14 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: std::shared_ptr defaultResourceLoader; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; } // namespace mbgl diff --git a/render-test/runner.cpp b/render-test/runner.cpp index 41c2bd530..9563eb31c 100644 --- a/render-test/runner.cpp +++ b/render-test/runner.cpp @@ -101,10 +101,10 @@ void TestRunner::registerProxyFileSource() { auto resourceLoaderFactory = fileSourceManager->unRegisterFileSourceFactory(mbgl::FileSourceType::ResourceLoader); - auto factory = [defaultFactory = std::move(resourceLoaderFactory)](const mbgl::ResourceOptions& options) { + auto factory = [defaultFactory = std::move(resourceLoaderFactory)](const mbgl::ResourceOptions& resourceOptions, const mbgl::ClientOptions& clientOptions) { assert(defaultFactory); - std::shared_ptr fileSource = defaultFactory(options); - return std::make_unique(std::move(fileSource), options); + std::shared_ptr fileSource = defaultFactory(resourceOptions, clientOptions); + return std::make_unique(std::move(fileSource), resourceOptions, clientOptions); }; fileSourceManager->registerFileSourceFactory(mbgl::FileSourceType::ResourceLoader, std::move(factory)); @@ -677,10 +677,10 @@ uint32_t getImageTileOffset(const std::set& dims, uint32_t dim, float } // namespace -TestRunner::Impl::Impl(const TestMetadata& metadata, const mbgl::ResourceOptions& resourceOptions) +TestRunner::Impl::Impl(const TestMetadata& metadata, const mbgl::ResourceOptions& resourceOptions, const mbgl::ClientOptions& clientOptions) : observer(std::make_unique()), frontend(metadata.size, metadata.pixelRatio, swapBehavior(metadata.mapMode)), - fileSource(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions)), + fileSource(mbgl::FileSourceManager::get()->getFileSource(mbgl::FileSourceType::ResourceLoader, resourceOptions, clientOptions)), map(frontend, *observer.get(), mbgl::MapOptions() @@ -688,7 +688,8 @@ TestRunner::Impl::Impl(const TestMetadata& metadata, const mbgl::ResourceOptions .withSize(metadata.size) .withPixelRatio(metadata.pixelRatio) .withCrossSourceCollisions(metadata.crossSourceCollisions), - resourceOptions) {} + resourceOptions, + clientOptions) {} TestRunner::Impl::~Impl() {} @@ -738,7 +739,8 @@ void TestRunner::run(TestMetadata& metadata) { if (maps.find(key) == maps.end()) { maps[key] = std::make_unique( metadata, - mbgl::ResourceOptions().withCachePath(manifest.getCachePath()).withApiKey(manifest.getApiKey())); + mbgl::ResourceOptions().withCachePath(manifest.getCachePath()).withApiKey(manifest.getApiKey()), + mbgl::ClientOptions()); } ctx.runnerImpl = maps[key].get(); diff --git a/render-test/runner.hpp b/render-test/runner.hpp index 4f0db4f2f..b2cb8d57f 100644 --- a/render-test/runner.hpp +++ b/render-test/runner.hpp @@ -57,7 +57,7 @@ private: void registerProxyFileSource(); struct Impl { - Impl(const TestMetadata&, const mbgl::ResourceOptions&); + Impl(const TestMetadata&, const mbgl::ResourceOptions&, const mbgl::ClientOptions&); ~Impl(); std::unique_ptr observer; diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 464166ca6..4091fbafc 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -29,12 +29,13 @@ using namespace style; Map::Map(RendererFrontend& frontend, MapObserver& observer, const MapOptions& mapOptions, - const ResourceOptions& resourceOptions) + const ResourceOptions& resourceOptions, + const ClientOptions& clientOptions) : impl(std::make_unique( frontend, observer, FileSourceManager::get() - ? std::shared_ptr(FileSourceManager::get()->getFileSource(ResourceLoader, resourceOptions)) + ? std::shared_ptr(FileSourceManager::get()->getFileSource(ResourceLoader, resourceOptions, clientOptions)) : nullptr, mapOptions)) {} diff --git a/src/mbgl/storage/asset_file_source.hpp b/src/mbgl/storage/asset_file_source.hpp index 66dc6fbaa..6d9ee3bb5 100644 --- a/src/mbgl/storage/asset_file_source.hpp +++ b/src/mbgl/storage/asset_file_source.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace mbgl { @@ -11,7 +12,7 @@ template class Thread; class AssetFileSource : public FileSource { public: - AssetFileSource(const ResourceOptions& options); + AssetFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~AssetFileSource() override; std::unique_ptr request(const Resource&, Callback) override; @@ -22,6 +23,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: class Impl; std::unique_ptr> impl; diff --git a/src/mbgl/storage/file_source_manager.cpp b/src/mbgl/storage/file_source_manager.cpp index 72e94c5c7..5e8018088 100644 --- a/src/mbgl/storage/file_source_manager.cpp +++ b/src/mbgl/storage/file_source_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -30,7 +31,7 @@ FileSourceManager::FileSourceManager() : impl(std::make_unique()) {} FileSourceManager::~FileSourceManager() = default; -PassRefPtr FileSourceManager::getFileSource(FileSourceType type, const ResourceOptions& options) noexcept { +PassRefPtr FileSourceManager::getFileSource(FileSourceType type, const ResourceOptions& resourceOptions, const ClientOptions& clientOptions) noexcept { std::lock_guard lock(impl->mutex); // Remove released file sources. @@ -38,10 +39,10 @@ PassRefPtr FileSourceManager::getFileSource(FileSourceType type, con it = it->fileSource.expired() ? impl->fileSources.erase(it) : ++it; } - const auto context = reinterpret_cast(options.platformContext()); - std::string baseURL = options.tileServerOptions().baseURL(); + const auto context = reinterpret_cast(resourceOptions.platformContext()); + std::string baseURL = resourceOptions.tileServerOptions().baseURL(); std::string id = - baseURL + '|' + options.apiKey() + '|' + options.cachePath() + '|' + util::toString(context); + baseURL + '|' + resourceOptions.apiKey() + '|' + resourceOptions.cachePath() + '|' + util::toString(context); std::shared_ptr fileSource; auto fileSourceIt = std::find_if(impl->fileSources.begin(), impl->fileSources.end(), [type, &id](const auto& info) { @@ -55,7 +56,7 @@ PassRefPtr FileSourceManager::getFileSource(FileSourceType type, con auto it = impl->fileSourceFactories.find(type); if (it != impl->fileSourceFactories.end()) { assert(it->second); - fileSource = it->second(options); + fileSource = it->second(resourceOptions, clientOptions); impl->fileSources.emplace_back(type, std::move(id), fileSource); } } diff --git a/src/mbgl/storage/http_file_source.hpp b/src/mbgl/storage/http_file_source.hpp index c4188621f..7a1233958 100644 --- a/src/mbgl/storage/http_file_source.hpp +++ b/src/mbgl/storage/http_file_source.hpp @@ -2,15 +2,15 @@ #include #include -#include namespace mbgl { +class ClientOptions; class ResourceOptions; class HTTPFileSource : public FileSource { public: - HTTPFileSource(const ResourceOptions& options); + HTTPFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~HTTPFileSource() override; std::unique_ptr request(const Resource&, Callback) override; @@ -21,6 +21,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + class Impl; private: diff --git a/src/mbgl/storage/local_file_source.hpp b/src/mbgl/storage/local_file_source.hpp index 0ce0b89c1..3595db649 100644 --- a/src/mbgl/storage/local_file_source.hpp +++ b/src/mbgl/storage/local_file_source.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace mbgl { @@ -11,7 +12,7 @@ template class Thread; class LocalFileSource : public FileSource { public: - LocalFileSource(const ResourceOptions& options); + LocalFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~LocalFileSource() override; std::unique_ptr request(const Resource&, Callback) override; @@ -22,6 +23,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: class Impl; std::unique_ptr> impl; diff --git a/src/mbgl/storage/main_resource_loader.hpp b/src/mbgl/storage/main_resource_loader.hpp index aeaba51f7..6b6ddc542 100644 --- a/src/mbgl/storage/main_resource_loader.hpp +++ b/src/mbgl/storage/main_resource_loader.hpp @@ -1,16 +1,16 @@ #pragma once #include -#include namespace mbgl { +class ClientOptions; class ResourceTransform; class ResourceOptions; class MainResourceLoader final : public FileSource { public: - explicit MainResourceLoader(const ResourceOptions& options); + explicit MainResourceLoader(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~MainResourceLoader() override; bool supportsCacheOnlyRequests() const override; @@ -22,6 +22,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: class Impl; const std::unique_ptr impl; diff --git a/src/mbgl/storage/mbtiles_file_source.hpp b/src/mbgl/storage/mbtiles_file_source.hpp index 76afd14c1..a31f9002e 100644 --- a/src/mbgl/storage/mbtiles_file_source.hpp +++ b/src/mbgl/storage/mbtiles_file_source.hpp @@ -1,8 +1,9 @@ #pragma once #include -#include #include +#include +#include namespace mbgl { @@ -10,7 +11,7 @@ namespace mbgl { // can only load resource URLS that are absolute paths to local files class MBTilesFileSource : public FileSource { public: - MBTilesFileSource(const ResourceOptions& options); + MBTilesFileSource(const ResourceOptions& resourceOptions, const ClientOptions& clientOptions); ~MBTilesFileSource() override; std::unique_ptr request(const Resource &, Callback) override; @@ -19,6 +20,9 @@ public: void setResourceOptions(ResourceOptions) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions) override; + ClientOptions getClientOptions() override; + private: class Impl; std::unique_ptr > thread; //impl diff --git a/src/mbgl/util/client_options.cpp b/src/mbgl/util/client_options.cpp new file mode 100644 index 000000000..c5651278d --- /dev/null +++ b/src/mbgl/util/client_options.cpp @@ -0,0 +1,41 @@ +#include + +namespace mbgl { + +class ClientOptions::Impl { +public: + std::string name; + std::string version; +}; + +// These requires the complete type of Impl. +ClientOptions::ClientOptions() : impl_(std::make_unique()) {} +ClientOptions::~ClientOptions() = default; +ClientOptions::ClientOptions(ClientOptions&&) noexcept = default; +ClientOptions::ClientOptions(const ClientOptions& other) : impl_(std::make_unique(*other.impl_)) {} +ClientOptions& ClientOptions::operator=(const ClientOptions& other) {impl_ = std::make_unique(*other.impl_); return *this; } +ClientOptions& ClientOptions::operator=(ClientOptions&& options) {swap(impl_, options.impl_); return *this; } + +ClientOptions ClientOptions::clone() const { + return ClientOptions(*this); +} + +ClientOptions& ClientOptions::withName(std::string name) { + impl_->name = std::move(name); + return *this; +} + +const std::string& ClientOptions::name() const { + return impl_->name; +} + +ClientOptions& ClientOptions::withVersion(std::string version) { + impl_->version = std::move(version); + return *this; +} + +const std::string& ClientOptions::version() const { + return impl_->version; +} + +} // namespace mbgl diff --git a/test/api/recycle_map.cpp b/test/api/recycle_map.cpp index 1182a009d..bfccaff75 100644 --- a/test/api/recycle_map.cpp +++ b/test/api/recycle_map.cpp @@ -24,7 +24,7 @@ TEST(API, RecycleMapUpdateImages) { HeadlessFrontend frontend { 1 }; auto map = std::make_unique(frontend, MapObserver::nullObserver(), - std::make_shared(ResourceOptions::Default()), + std::make_shared(ResourceOptions::Default(), ClientOptions()), MapOptions().withMapMode(MapMode::Static).withSize(frontend.getSize())); EXPECT_TRUE(map); diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index 673a46756..c91cde74e 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -49,7 +50,7 @@ public: MapAdapter map; MapTest(float pixelRatio = 1, MapMode mode = MapMode::Static) - : fileSource(std::make_shared(ResourceOptions::Default())) + : fileSource(std::make_shared(ResourceOptions::Default(), ClientOptions())) , frontend(pixelRatio) , map(frontend, observer, fileSource, MapOptions().withMapMode(mode).withSize(frontend.getSize()).withPixelRatio(pixelRatio)) {} @@ -65,7 +66,7 @@ public: float pixelRatio = 1, MapMode mode = MapMode::Static, typename std::enable_if::value>::type* = nullptr) - : fileSource(std::make_shared(ResourceOptions().withCachePath(cachePath).withAssetPath(assetPath))), + : fileSource(std::make_shared(ResourceOptions().withCachePath(cachePath).withAssetPath(assetPath), ClientOptions())), frontend(pixelRatio), map(frontend, observer, @@ -73,10 +74,11 @@ public: MapOptions().withMapMode(mode).withSize(frontend.getSize()).withPixelRatio(pixelRatio)) {} template - MapTest(const ResourceOptions& options, + MapTest(const ResourceOptions& resourceOptions, + const ClientOptions& clientOptions = ClientOptions(), float pixelRatio = 1, MapMode mode = MapMode::Static) - : fileSource(std::make_shared(options)), + : fileSource(std::make_shared(resourceOptions, clientOptions)), frontend(pixelRatio), map(frontend, observer, diff --git a/test/map/map_snapshotter.test.cpp b/test/map/map_snapshotter.test.cpp index a23d2bbc6..0ea31c5bb 100644 --- a/test/map/map_snapshotter.test.cpp +++ b/test/map/map_snapshotter.test.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -113,7 +114,7 @@ TEST(MapSnapshotter, TEST_REQUIRES_SERVER(cancel)) { TEST(MapSnapshotter, TEST_REQUIRES_SERVER(runtimeStyling)) { util::RunLoop runLoop; SnapshotterObserver observer; - MapSnapshotter snapshotter(Size{256, 128}, 1.0f, ResourceOptions(), observer); + MapSnapshotter snapshotter(Size{256, 128}, 1.0f, ResourceOptions(), ClientOptions(), observer); snapshotter.setStyleURL("http://127.0.0.1:3000/online/style.json"); observer.didFinishLoadingStyleCallback = [&snapshotter, &runLoop] { diff --git a/test/src/mbgl/test/fake_file_source.hpp b/test/src/mbgl/test/fake_file_source.hpp index d29500398..276ebb895 100644 --- a/test/src/mbgl/test/fake_file_source.hpp +++ b/test/src/mbgl/test/fake_file_source.hpp @@ -2,9 +2,10 @@ #include #include +#include #include #include -#include +#include #include #include @@ -42,8 +43,9 @@ public: } }; - FakeFileSource(const ResourceOptions& options): resourceOptions(options.clone()) {} - FakeFileSource(): FakeFileSource(ResourceOptions::Default()) {} + FakeFileSource(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) {} + FakeFileSource() : FakeFileSource(ResourceOptions::Default(), ClientOptions()) {} std::unique_ptr request(const Resource& resource, Callback callback) override { return std::make_unique(resource, callback, requests); @@ -76,14 +78,23 @@ public: return resourceOptions.clone(); } + void setClientOptions(ClientOptions options) override { + clientOptions = options; + } + ClientOptions getClientOptions() override { + return clientOptions.clone(); + } + private: ResourceOptions resourceOptions; + ClientOptions clientOptions; }; class FakeOnlineFileSource : public FakeFileSource { public: - FakeOnlineFileSource(): FakeOnlineFileSource(ResourceOptions::Default()) {} - FakeOnlineFileSource(const ResourceOptions& options): FakeFileSource(options) {} + FakeOnlineFileSource() : FakeOnlineFileSource(ResourceOptions::Default(), ClientOptions()) {} + FakeOnlineFileSource(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_) + : FakeFileSource(resourceOptions_, clientOptions_) {} std::unique_ptr request(const Resource& resource, Callback callback) override { return FakeFileSource::request(resource, callback); @@ -97,7 +108,7 @@ public: return onlineFs->getProperty(property); } - std::unique_ptr onlineFs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr onlineFs = std::make_unique(ResourceOptions::Default(), ClientOptions()); }; } // namespace mbgl diff --git a/test/src/mbgl/test/stub_file_source.cpp b/test/src/mbgl/test/stub_file_source.cpp index ca8e4d598..0c6557ef3 100644 --- a/test/src/mbgl/test/stub_file_source.cpp +++ b/test/src/mbgl/test/stub_file_source.cpp @@ -1,6 +1,7 @@ +#include #include #include -#include +#include namespace mbgl { @@ -20,10 +21,10 @@ public: }; StubFileSource::StubFileSource(ResponseType type_): - StubFileSource::StubFileSource(ResourceOptions().withTileServerOptions(TileServerOptions::MapTilerConfiguration()), type_) {} + StubFileSource::StubFileSource(ResourceOptions().withTileServerOptions(TileServerOptions::MapTilerConfiguration()), ClientOptions(), type_) {} -StubFileSource::StubFileSource(const ResourceOptions& options, ResponseType type_) - : type(type_), resourceOptions(options.clone()) { +StubFileSource::StubFileSource(const ResourceOptions& resourceOptions_, const ClientOptions& clientOptions_, ResponseType type_) + : type(type_), resourceOptions(resourceOptions_.clone()), clientOptions(clientOptions_.clone()) { if (type == ResponseType::Synchronous) { return; } @@ -122,4 +123,12 @@ ResourceOptions StubFileSource::getResourceOptions() { return resourceOptions.clone(); } +void StubFileSource::setClientOptions(ClientOptions options) { + clientOptions = options; +} + +ClientOptions StubFileSource::getClientOptions() { + return clientOptions.clone(); +} + } // namespace mbgl diff --git a/test/src/mbgl/test/stub_file_source.hpp b/test/src/mbgl/test/stub_file_source.hpp index c8b410f70..5851f8984 100644 --- a/test/src/mbgl/test/stub_file_source.hpp +++ b/test/src/mbgl/test/stub_file_source.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -18,7 +19,7 @@ public: Synchronous }; - StubFileSource(const ResourceOptions&, ResponseType = ResponseType::Asynchronous); + StubFileSource(const ResourceOptions&, const ClientOptions&, ResponseType = ResponseType::Asynchronous); StubFileSource(ResponseType = ResponseType::Asynchronous); ~StubFileSource() override; @@ -47,6 +48,9 @@ public: void setResourceOptions(ResourceOptions options) override; ResourceOptions getResourceOptions() override; + void setClientOptions(ClientOptions options) override; + ClientOptions getClientOptions() override; + private: friend class StubOnlineFileSource; @@ -59,6 +63,7 @@ private: std::map properties; ResourceOptions resourceOptions; + ClientOptions clientOptions; }; } // namespace mbgl diff --git a/test/storage/asset_file_source.test.cpp b/test/storage/asset_file_source.test.cpp index db481625c..bb25a3acd 100644 --- a/test/storage/asset_file_source.test.cpp +++ b/test/storage/asset_file_source.test.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -16,7 +17,7 @@ using namespace mbgl; TEST(AssetFileSource, Load) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); // iOS seems to run out of file descriptors... #if TARGET_OS_IPHONE @@ -72,7 +73,7 @@ TEST(AssetFileSource, Load) { } TEST(AssetFileSource, AcceptsURL) { - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); EXPECT_TRUE(fs.canRequest(Resource::style("asset://empty"))); EXPECT_TRUE(fs.canRequest(Resource::style("asset:///test"))); EXPECT_FALSE(fs.canRequest(Resource::style("assds://foo"))); @@ -84,7 +85,7 @@ TEST(AssetFileSource, AcceptsURL) { TEST(AssetFileSource, EmptyFile) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "asset://empty" }, [&](Response res) { req.reset(); @@ -100,7 +101,7 @@ TEST(AssetFileSource, EmptyFile) { TEST(AssetFileSource, NonEmptyFile) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "asset://nonempty" }, [&](Response res) { req.reset(); @@ -116,7 +117,7 @@ TEST(AssetFileSource, NonEmptyFile) { TEST(AssetFileSource, NonExistentFile) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "asset://does_not_exist" }, [&](Response res) { req.reset(); @@ -133,7 +134,7 @@ TEST(AssetFileSource, NonExistentFile) { TEST(AssetFileSource, InvalidURL) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "test://wrong-scheme" }, [&](Response res) { req.reset(); @@ -150,7 +151,7 @@ TEST(AssetFileSource, InvalidURL) { TEST(AssetFileSource, ReadDirectory) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "asset://directory" }, [&](Response res) { req.reset(); @@ -167,7 +168,7 @@ TEST(AssetFileSource, ReadDirectory) { TEST(AssetFileSource, URLEncoding) { util::RunLoop loop; - AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets")); + AssetFileSource fs(ResourceOptions::Default().withAssetPath("test/fixtures/storage/assets"), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "asset://%6eonempty" }, [&](Response res) { req.reset(); diff --git a/test/storage/http_file_source.test.cpp b/test/storage/http_file_source.test.cpp index 1560a3b33..7e9ba966d 100644 --- a/test/storage/http_file_source.test.cpp +++ b/test/storage/http_file_source.test.cpp @@ -11,7 +11,7 @@ using namespace mbgl; TEST(HTTPFileSource, TEST_REQUIRES_SERVER(Cancel)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test" }, [&](Response) { ADD_FAILURE() << "Callback should not be called"; @@ -22,7 +22,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(Cancel)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP200)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test" }, [&](Response res) { EXPECT_EQ(nullptr, res.error); @@ -40,7 +40,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP200)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP404)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/doesnotexist" }, [&](Response res) { ASSERT_NE(nullptr, res.error); @@ -59,7 +59,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP404)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTPTile404)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Tile, "http://127.0.0.1:3000/doesnotexist" }, [&](Response res) { EXPECT_TRUE(res.noContent); @@ -77,7 +77,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTPTile404)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP200EmptyData)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/empty-data" }, [&](Response res) { EXPECT_FALSE(res.noContent); @@ -95,7 +95,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP200EmptyData)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP204)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/no-content" }, [&](Response res) { EXPECT_TRUE(res.noContent); @@ -113,7 +113,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP204)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP500)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/permanent-error" }, [&](Response res) { ASSERT_NE(nullptr, res.error); @@ -132,7 +132,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(HTTP500)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(ExpiresParsing)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test?modified=1420794326&expires=1420797926&etag=foo" }, [&](Response res) { @@ -151,7 +151,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(ExpiresParsing)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(CacheControlParsing)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); auto req = fs.request({ Resource::Unknown, "http://127.0.0.1:3000/test?cachecontrol=max-age=120" }, [&](Response res) { EXPECT_EQ(nullptr, res.error); @@ -169,7 +169,7 @@ TEST(HTTPFileSource, TEST_REQUIRES_SERVER(CacheControlParsing)) { TEST(HTTPFileSource, TEST_REQUIRES_SERVER(Load)) { util::RunLoop loop; - HTTPFileSource fs(ResourceOptions::Default()); + HTTPFileSource fs(ResourceOptions::Default(), ClientOptions()); const int concurrency = 50; const int max = 10000; diff --git a/test/storage/local_file_source.test.cpp b/test/storage/local_file_source.test.cpp index 656745507..60655a469 100644 --- a/test/storage/local_file_source.test.cpp +++ b/test/storage/local_file_source.test.cpp @@ -35,7 +35,7 @@ std::string toAbsoluteURL(const std::string& fileName) { using namespace mbgl; TEST(LocalFileSource, AcceptsURL) { - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); EXPECT_TRUE(fs.canRequest(Resource::style("file://empty"))); EXPECT_TRUE(fs.canRequest(Resource::style("file:///test"))); EXPECT_FALSE(fs.canRequest(Resource::style("flie://foo"))); @@ -47,7 +47,7 @@ TEST(LocalFileSource, AcceptsURL) { TEST(LocalFileSource, EmptyFile) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, toAbsoluteURL("empty") }, [&](Response res) { req.reset(); @@ -63,7 +63,7 @@ TEST(LocalFileSource, EmptyFile) { TEST(LocalFileSource, NonEmptyFile) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, toAbsoluteURL("nonempty") }, [&](Response res) { req.reset(); @@ -79,7 +79,7 @@ TEST(LocalFileSource, NonEmptyFile) { TEST(LocalFileSource, NonExistentFile) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, toAbsoluteURL("does_not_exist") }, [&](Response res) { req.reset(); @@ -96,7 +96,7 @@ TEST(LocalFileSource, NonExistentFile) { TEST(LocalFileSource, InvalidURL) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, "test://wrong-scheme" }, [&](Response res) { req.reset(); @@ -113,7 +113,7 @@ TEST(LocalFileSource, InvalidURL) { TEST(LocalFileSource, ReadDirectory) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, toAbsoluteURL("directory") }, [&](Response res) { req.reset(); @@ -130,7 +130,7 @@ TEST(LocalFileSource, ReadDirectory) { TEST(LocalFileSource, URLEncoding) { util::RunLoop loop; - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = fs.request({ Resource::Unknown, toAbsoluteURL("%6eonempty") }, [&](Response res) { req.reset(); @@ -147,7 +147,7 @@ TEST(LocalFileSource, URLLimit) { util::RunLoop loop; size_t length = PATH_MAX - toAbsoluteURL("").size(); - LocalFileSource fs(ResourceOptions::Default()); + LocalFileSource fs(ResourceOptions::Default(), ClientOptions()); char* filename = new char[length]; memset(filename, 'x', length); diff --git a/test/storage/main_resource_loader.test.cpp b/test/storage/main_resource_loader.test.cpp index affa5c818..88012b58a 100644 --- a/test/storage/main_resource_loader.test.cpp +++ b/test/storage/main_resource_loader.test.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -15,7 +16,7 @@ using namespace mbgl; TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheResponse)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource resource{Resource::Unknown, "http://127.0.0.1:3000/cache"}; Response response; @@ -55,7 +56,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheResponse)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(VolatileStoragePolicy)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource{Resource::Unknown, "http://127.0.0.1:3000/cache"}; resource.storagePolicy = Resource::StoragePolicy::Volatile; @@ -82,7 +83,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(VolatileStoragePolicy)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateSame)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource revalidateSame{Resource::Unknown, "http://127.0.0.1:3000/revalidate-same"}; std::unique_ptr req1; @@ -144,7 +145,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateSame)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateModified)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource revalidateModified{Resource::Unknown, "http://127.0.0.1:3000/revalidate-modified"}; std::unique_ptr req1; @@ -206,7 +207,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateModified)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateEtag)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource revalidateEtag{Resource::Unknown, "http://127.0.0.1:3000/revalidate-etag"}; std::unique_ptr req1; @@ -256,7 +257,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CacheRevalidateEtag)) { // occurs. TEST(MainResourceLoader, TEST_REQUIRES_SERVER(HTTPIssue1369)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource resource{Resource::Unknown, "http://127.0.0.1:3000/test"}; @@ -279,7 +280,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(HTTPIssue1369)) { TEST(MainResourceLoader, OptionalNonExpired) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource optionalResource{ Resource::Unknown, "http://127.0.0.1:3000/test", {}, Resource::LoadingMethod::CacheOnly}; @@ -292,7 +293,7 @@ TEST(MainResourceLoader, OptionalNonExpired) { std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(optionalResource, response, [&] { req = fs.request(optionalResource, [&](Response res) { req.reset(); @@ -313,7 +314,7 @@ TEST(MainResourceLoader, OptionalNonExpired) { TEST(MainResourceLoader, OptionalExpired) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource optionalResource{ Resource::Unknown, "http://127.0.0.1:3000/test", {}, Resource::LoadingMethod::CacheOnly}; @@ -324,7 +325,7 @@ TEST(MainResourceLoader, OptionalExpired) { response.data = std::make_shared("Cached value"); response.expires = util::now() - 1h; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); std::unique_ptr req; dbfs->forward(optionalResource, response, [&] { req = fs.request(optionalResource, [&](Response res) { @@ -346,7 +347,7 @@ TEST(MainResourceLoader, OptionalExpired) { TEST(MainResourceLoader, OptionalNotFound) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource optionalResource{ Resource::Unknown, "http://127.0.0.1:3000/test", {}, Resource::LoadingMethod::CacheOnly}; @@ -373,7 +374,7 @@ TEST(MainResourceLoader, OptionalNotFound) { // Test that a network only request doesn't attempt to load data from the cache. TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagNotModified)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" }; resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; @@ -387,7 +388,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagNotModified)) { response.expires = util::now() + 1h; std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -410,7 +411,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagNotModified)) { // Test that a network only request doesn't attempt to load data from the cache. TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagModified)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" }; resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; @@ -424,7 +425,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagModified)) { response.expires = util::now() + 1h; std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -447,7 +448,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshEtagModified)) { // Test that a network only request doesn't attempt to load data from the cache. TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheFull)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" }; resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; @@ -460,7 +461,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheFull)) { response.expires = util::now() + 1h; std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -484,7 +485,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheFull)) { // from cache like a regular request TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedNotModified)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-modified" }; resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; @@ -498,7 +499,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedNotModified) response.expires = util::now() + 1h; std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -522,7 +523,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedNotModified) // from cache like a regular request TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedModified)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-modified" }; resource.loadingMethod = Resource::LoadingMethod::NetworkOnly; @@ -536,7 +537,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedModified)) { response.expires = util::now() + 1h; std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -557,9 +558,9 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoCacheRefreshModifiedModified)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) { util::RunLoop loop; - MainResourceLoader resourceLoader(ResourceOptions{}); + MainResourceLoader resourceLoader(ResourceOptions{}, ClientOptions{}); std::shared_ptr onlinefs = - FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{}, ClientOptions{}); // Translates the URL "localhost://test to http://127.0.0.1:3000/test Actor transform( @@ -613,9 +614,9 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(SetResourceTransform)) { TEST(MainResourceLoader, SetResourceCachePath) { util::RunLoop loop; - MainResourceLoader resourceLoader(ResourceOptions{}); + MainResourceLoader resourceLoader(ResourceOptions{}, ClientOptions{}); std::shared_ptr fs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); auto dbfs = std::static_pointer_cast(fs); dbfs->setDatabasePath("./new_offline.db", [&loop] { loop.stop(); }); loop.run(); @@ -624,7 +625,7 @@ TEST(MainResourceLoader, SetResourceCachePath) { // Test that a stale cache file that has must-revalidate set will trigger a response. TEST(MainResourceLoader, TEST_REQUIRES_SERVER(RespondToStaleMustRevalidate)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Resource resource { Resource::Unknown, "http://127.0.0.1:3000/revalidate-same" }; resource.loadingMethod = Resource::LoadingMethod::CacheOnly; @@ -640,7 +641,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(RespondToStaleMustRevalidate)) { response.etag.emplace("snowfall"); std::unique_ptr req; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { req.reset(); @@ -704,7 +705,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(RespondToStaleMustRevalidate)) { // Test that requests for expired resources have lower priority than requests for new resources TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CachedResourceLowPriority)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); Response response; std::size_t online_response_counter = 0; @@ -713,9 +714,9 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CachedResourceLowPriority)) { response.expires = util::now() - 1h; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); std::shared_ptr onlineFs = - FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Network, ResourceOptions{}, ClientOptions{}); // Put existing values into the cache. Resource resource1{Resource::Unknown, "http://127.0.0.1:3000/load/3", {}, Resource::LoadingMethod::All}; @@ -791,7 +792,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(CachedResourceLowPriority)) { TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoDoubleDispatch)) { util::RunLoop loop; - MainResourceLoader fs(ResourceOptions{}); + MainResourceLoader fs(ResourceOptions{}, ClientOptions{}); const Resource resource{Resource::Unknown, "http://127.0.0.1:3000/revalidate-same"}; Response response; @@ -801,7 +802,7 @@ TEST(MainResourceLoader, TEST_REQUIRES_SERVER(NoDoubleDispatch)) { std::unique_ptr req; unsigned responseCount = 0u; std::shared_ptr dbfs = - FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}); + FileSourceManager::get()->getFileSource(FileSourceType::Database, ResourceOptions{}, ClientOptions{}); dbfs->forward(resource, response, [&] { req = fs.request(resource, [&](Response res) { EXPECT_EQ(nullptr, res.error); @@ -831,7 +832,8 @@ TEST(MainResourceLoader, ResourceOptions) { TileServerOptions() .withBaseURL("originalBaseURL") .withUriSchemeAlias("originalAlias") - ) + ), + ClientOptions() ); fs.setResourceOptions(ResourceOptions() diff --git a/test/storage/mbtiles_file_source.test.cpp b/test/storage/mbtiles_file_source.test.cpp index f511e2ba2..c32468447 100644 --- a/test/storage/mbtiles_file_source.test.cpp +++ b/test/storage/mbtiles_file_source.test.cpp @@ -36,7 +36,7 @@ std::string toAbsoluteURL(const std::string &fileName) { using namespace mbgl; TEST(MBTilesFileSource, AcceptsURL) { - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); EXPECT_TRUE(mbtiles.canRequest(Resource::style("mbtiles:///test"))); EXPECT_FALSE(mbtiles.canRequest(Resource::style("mbtile://test"))); EXPECT_FALSE(mbtiles.canRequest(Resource::style("mbtiles:"))); @@ -47,7 +47,7 @@ TEST(MBTilesFileSource, AcceptsURL) { TEST(MBTilesFileSource, AbsolutePath) { util::RunLoop loop; - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = mbtiles.request( {Resource::Unknown, "mbtiles://not_absolute"}, [&](Response res) { @@ -66,7 +66,7 @@ TEST(MBTilesFileSource, AbsolutePath) { TEST(MBTilesFileSource, NonExistentFile) { util::RunLoop loop; - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = mbtiles.request( {Resource::Unknown, toAbsoluteURL("does_not_exist")}, [&](Response res) { @@ -85,7 +85,7 @@ TEST(MBTilesFileSource, NonExistentFile) { TEST(MBTilesFileSource, TileJSON) { util::RunLoop loop; - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = mbtiles.request( {Resource::Unknown, toAbsoluteURL("geography-class-png.mbtiles")}, [&](Response res) { @@ -105,7 +105,7 @@ TEST(MBTilesFileSource, TileJSON) { TEST(MBTilesFileSource, Tile) { util::RunLoop loop; - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = mbtiles.request( Resource::tile(toAbsoluteURL("geography-class-png.mbtiles?file={z}/{x}/{y}.png"), 1.0, 0, 0, 0, Tileset::Scheme::XYZ), @@ -124,7 +124,7 @@ TEST(MBTilesFileSource, Tile) { TEST(MBTilesFileSource, NonExistentTile) { util::RunLoop loop; - MBTilesFileSource mbtiles(ResourceOptions::Default()); + MBTilesFileSource mbtiles(ResourceOptions::Default(), ClientOptions()); std::unique_ptr req = mbtiles.request( Resource::tile(toAbsoluteURL("geography-class-png.mbtiles?file={z}/{x}/{y}.png"), 1.0, 0, 0, 4, Tileset::Scheme::XYZ), diff --git a/test/storage/online_file_source.test.cpp b/test/storage/online_file_source.test.cpp index 042dc6eba..f3662b978 100644 --- a/test/storage/online_file_source.test.cpp +++ b/test/storage/online_file_source.test.cpp @@ -15,7 +15,7 @@ using namespace mbgl; TEST(OnlineFileSource, Cancel) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); fs->request({Resource::Unknown, "http://127.0.0.1:3000/test"}, [&](Response) { ADD_FAILURE() << "Callback should not be called"; }); @@ -25,7 +25,7 @@ TEST(OnlineFileSource, Cancel) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(CancelMultiple)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const Resource resource { Resource::Unknown, "http://127.0.0.1:3000/test" }; @@ -49,7 +49,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(CancelMultiple)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(TemporaryError)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const auto start = Clock::now(); int counter = 0; @@ -89,7 +89,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(TemporaryError)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(ConnectionError)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const auto start = Clock::now(); int counter = 0; @@ -120,7 +120,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(ConnectionError)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(Timeout)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); int counter = 0; @@ -147,7 +147,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(Timeout)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RetryDelayOnExpiredTile)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); int counter = 0; @@ -167,7 +167,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RetryDelayOnExpiredTile)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RetryOnClockSkew)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); int counter = 0; @@ -196,7 +196,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RetryOnClockSkew)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RespectPriorExpires)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); // Very long expiration time, should never arrive. Resource resource1{ Resource::Unknown, "http://127.0.0.1:3000/test" }; @@ -220,7 +220,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RespectPriorExpires)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RespectMinimumUpdateInterval)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); auto start = util::now(); Resource resource{Resource::Unknown, "http://127.0.0.1:3000/test"}; @@ -238,7 +238,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RespectMinimumUpdateInterval)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(Load)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const int concurrency = 50; const int max = 10000; @@ -282,7 +282,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(Load)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChange)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const Resource resource { Resource::Unknown, "http://127.0.0.1:3000/delayed" }; @@ -312,7 +312,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChange)) { // reachability issues. TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChangePreempt)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); fs->pause(); const auto start = Clock::now(); @@ -355,7 +355,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusChangePreempt)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusOnlineOffline)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); const Resource resource { Resource::Unknown, "http://127.0.0.1:3000/test" }; @@ -383,7 +383,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(NetworkStatusOnlineOffline)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitStandard)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); auto req = fs->request({Resource::Unknown, "http://127.0.0.1:3000/rate-limit?std=true"}, [&](Response res) { ASSERT_NE(nullptr, res.error); @@ -398,7 +398,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitStandard)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitMBX)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); auto req = fs->request({Resource::Unknown, "http://127.0.0.1:3000/rate-limit?mbx=true"}, [&](Response res) { ASSERT_NE(nullptr, res.error); @@ -413,7 +413,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitMBX)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitDefault)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); auto req = fs->request({Resource::Unknown, "http://127.0.0.1:3000/rate-limit"}, [&](Response res) { ASSERT_NE(nullptr, res.error); @@ -427,7 +427,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RateLimitDefault)) { TEST(OnlineFileSource, GetBaseURLAndApiKeyWhilePaused) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); fs->pause(); @@ -443,7 +443,7 @@ TEST(OnlineFileSource, GetBaseURLAndApiKeyWhilePaused) { TEST(OnlineFileSource, ChangeAPIBaseURL){ util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); EXPECT_EQ(ResourceOptions::Default().tileServerOptions().baseURL(), *fs->getProperty(API_BASE_URL_KEY).getString()); const std::string customURL = "test.domain"; fs->setProperty(API_BASE_URL_KEY, customURL); @@ -455,7 +455,7 @@ TEST(OnlineFileSource, ChangeAPIBaseURL){ TEST(OnlineFileSource, ChangeTileServerOptions){ util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); TileServerOptions tileServerOptsChanged; tileServerOptsChanged.withApiKeyParameterName("apiKeyChanged") @@ -501,7 +501,7 @@ TEST(OnlineFileSource, ChangeTileServerOptions){ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(LowHighPriorityRequests)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); std::size_t response_counter = 0; const std::size_t NUM_REQUESTS = 3; @@ -543,7 +543,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(LowHighPriorityRequests)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(LowHighPriorityRequestsMany)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); int response_counter = 0; int correct_low = 0; int correct_regular = 0; @@ -598,7 +598,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(LowHighPriorityRequestsMany)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(MaximumConcurrentRequests)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); ASSERT_EQ(*fs->getProperty(MAX_CONCURRENT_REQUESTS_KEY).getUint(), 20u); @@ -608,7 +608,7 @@ TEST(OnlineFileSource, TEST_REQUIRES_SERVER(MaximumConcurrentRequests)) { TEST(OnlineFileSource, TEST_REQUIRES_SERVER(RequestSameUrlMultipleTimes)) { util::RunLoop loop; - std::unique_ptr fs = std::make_unique(ResourceOptions::Default()); + std::unique_ptr fs = std::make_unique(ResourceOptions::Default(), ClientOptions()); int count = 0; std::vector> requests; diff --git a/test/tile/vector_tile.test.cpp b/test/tile/vector_tile.test.cpp index 7809e32e2..cb12c5853 100644 --- a/test/tile/vector_tile.test.cpp +++ b/test/tile/vector_tile.test.cpp @@ -23,7 +23,7 @@ using namespace mbgl; class VectorTileTest { public: - std::shared_ptr fileSource = std::make_shared(ResourceOptions::Default()); + std::shared_ptr fileSource = std::make_shared(ResourceOptions::Default(), ClientOptions()); TransformState transformState; util::RunLoop loop; style::Style style{fileSource, 1};