Skip to content

Commit

Permalink
Add ClientOptions to be able to pass around client name and version (#…
Browse files Browse the repository at this point in the history
…365)

* ClientOptions and Qt user agent

* Update CHANGELOG.md

Co-authored-by: Oliver Wipfli <[email protected]>

Co-authored-by: Oliver Wipfli <[email protected]>
  • Loading branch information
ntadej and wipfli authored Aug 13, 2022
1 parent c2d9147 commit 1341f33
Show file tree
Hide file tree
Showing 71 changed files with 830 additions and 249 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions bin/offline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <mbgl/storage/database_file_source.hpp>
#include <mbgl/storage/file_source_manager.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/util/client_options.hpp>
#include <mbgl/util/tile_server_options.hpp>

#include <args.hxx>
Expand Down Expand Up @@ -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<OfflineRegion> region;

if (inputDb && mergePath) {
DatabaseFileSource inputSource(ResourceOptions().withCachePath(*inputDb));
DatabaseFileSource inputSource(ResourceOptions().withCachePath(*inputDb), ClientOptions());

int retCode = 0;
std::cout << "Start Merge" << std::endl;
Expand Down
4 changes: 3 additions & 1 deletion include/mbgl/map/map.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <mbgl/util/geometry.hpp>
#include <mbgl/map/projection_mode.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/util/client_options.hpp>

#include <cstdint>
#include <string>
Expand All @@ -35,7 +36,8 @@ class Map : private util::noncopyable {
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
Expand Down
7 changes: 5 additions & 2 deletions include/mbgl/storage/database_file_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
#include <mbgl/storage/offline.hpp>
#include <mbgl/util/expected.hpp>
#include <mbgl/util/optional.hpp>
#include <mbgl/storage/resource_options.hpp>

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
Expand Down Expand Up @@ -236,6 +236,9 @@ class DatabaseFileSource : public FileSource {
void setResourceOptions(ResourceOptions) override;
ResourceOptions getResourceOptions() override;

void setClientOptions(ClientOptions) override;
ClientOptions getClientOptions() override;

private:
class Impl;
const std::unique_ptr<Impl> impl;
Expand Down
6 changes: 6 additions & 0 deletions include/mbgl/storage/file_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <mbgl/storage/resource_transform.hpp>
#include <mbgl/storage/response.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/util/client_options.hpp>

#include <mapbox/compatibility/value.hpp>

Expand Down Expand Up @@ -92,6 +93,11 @@ class FileSource {
// 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;
};
Expand Down
5 changes: 3 additions & 2 deletions include/mbgl/storage/file_source_manager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

namespace mbgl {

class ClientOptions;
class ResourceOptions;

/**
Expand All @@ -18,7 +19,7 @@ class ResourceOptions;
*/
class FileSourceManager {
public:
using FileSourceFactory = std::function<std::unique_ptr<FileSource>(const ResourceOptions&)>;
using FileSourceFactory = std::function<std::unique_ptr<FileSource>(const ResourceOptions&, const ClientOptions&)>;

/**
* @brief A singleton getter.
Expand All @@ -30,7 +31,7 @@ class FileSourceManager {
// 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<FileSource> getFileSource(FileSourceType, const ResourceOptions&) noexcept;
PassRefPtr<FileSource> 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.
Expand Down
7 changes: 5 additions & 2 deletions include/mbgl/storage/online_file_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,19 @@

#include <mbgl/storage/file_source.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/util/client_options.hpp>
#include <mbgl/util/optional.hpp>

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
Expand Down
62 changes: 62 additions & 0 deletions include/mbgl/util/client_options.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#pragma once

#include <memory>
#include <string>

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> impl_;
};

} // namespace mbgl
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ namespace mbgl {

class AssetManagerFileSource::Impl {
public:
Impl(ActorRef<Impl>, AAssetManager* assetManager_, const ResourceOptions options) :
resourceOptions(options.clone()),
Impl(ActorRef<Impl>, AAssetManager* assetManager_, const ResourceOptions resourceOptions_, const ClientOptions clientOptions_) :
resourceOptions(resourceOptions_.clone()),
clientOptions(clientOptions_.clone()),
assetManager(assetManager_) {}

void request(const std::string& url, ActorRef<FileSourceRequest> req) {
Expand Down Expand Up @@ -46,20 +47,31 @@ class AssetManagerFileSource::Impl {
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<android::AssetManager>& assetManager_,
const ResourceOptions options)
const ResourceOptions resourceOptions,
const ClientOptions clientOptions)
: assetManager(jni::NewGlobal(env, assetManager_)),
impl(std::make_unique<util::Thread<Impl>>(
util::makeThreadPrioritySetter(platform::EXPERIMENTAL_THREAD_PRIORITY_FILE),
"AssetManagerFileSource",
AAssetManager_fromJava(&env, jni::Unwrap(assetManager.get())),
options.clone())) {}
resourceOptions.clone(),
clientOptions.clone())) {}

AssetManagerFileSource::~AssetManagerFileSource() = default;

Expand All @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <mbgl/storage/file_source.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/util/client_options.hpp>

#include "asset_manager.hpp"

Expand All @@ -15,7 +16,7 @@ template <typename T> class Thread;

class AssetManagerFileSource : public FileSource {
public:
AssetManagerFileSource(jni::JNIEnv&, const jni::Object<android::AssetManager>&, const ResourceOptions);
AssetManagerFileSource(jni::JNIEnv&, const jni::Object<android::AssetManager>&, const ResourceOptions, const ClientOptions);
~AssetManagerFileSource() override;

std::unique_ptr<AsyncRequest> request(const Resource&, Callback) override;
Expand All @@ -24,6 +25,9 @@ class AssetManagerFileSource : public FileSource {
void setResourceOptions(ResourceOptions options) override;
ResourceOptions getResourceOptions() override;

void setClientOptions(ClientOptions options) override;
ClientOptions getClientOptions() override;

private:
class Impl;

Expand Down
22 changes: 17 additions & 5 deletions platform/android/MapboxGLAndroidSDK/src/cpp/file_source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <mbgl/storage/file_source_manager.hpp>
#include <mbgl/storage/resource_options.hpp>
#include <mbgl/storage/resource_transform.hpp>
#include <mbgl/util/client_options.hpp>
#include <mbgl/util/logging.hpp>

#include <mbgl/storage/sqlite3.hpp>
Expand All @@ -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<mbgl::FileSource> assetFileSource;
if (android::Mapbox::hasInstance(*env)) {
auto assetManager = android::Mapbox::getAssetManager(*env);
assetFileSource = std::make_unique<AssetManagerFileSource>(*env, assetManager, opts.clone());
assetFileSource = std::make_unique<AssetManagerFileSource>(*env, assetManager, resourceOptions.clone(), clientOptions.clone());
}
return assetFileSource;
});
Expand All @@ -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<mbgl::DatabaseFileSource>(std::shared_ptr<mbgl::FileSource>(
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() {
Expand Down Expand Up @@ -199,6 +200,17 @@ mbgl::ResourceOptions FileSource::getSharedResourceOptions(jni::JNIEnv& env,
return {};
}

mbgl::ClientOptions FileSource::getSharedClientOptions(jni::JNIEnv& env,
const jni::Object<FileSource>& 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,
Expand Down
3 changes: 3 additions & 0 deletions platform/android/MapboxGLAndroidSDK/src/cpp/file_source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,15 @@ class FileSource {

static mbgl::ResourceOptions getSharedResourceOptions(jni::JNIEnv&, const jni::Object<FileSource>&);

static mbgl::ClientOptions getSharedClientOptions(jni::JNIEnv&, const jni::Object<FileSource>&);

static void registerNative(jni::JNIEnv&);

private:
const std::string DATABASE_FILE = "/mbgl-offline.db";
optional<int> activationCounter;
mbgl::ResourceOptions resourceOptions;
mbgl::ClientOptions clientOptions;
std::unique_ptr<Actor<ResourceTransform::TransformCallback>> resourceTransform;
std::function<void()> pathChangeCallback;
std::shared_ptr<mbgl::DatabaseFileSource> databaseSource;
Expand Down
Loading

0 comments on commit 1341f33

Please sign in to comment.