summaryrefslogtreecommitdiff
path: root/platform/default
diff options
context:
space:
mode:
Diffstat (limited to 'platform/default')
-rw-r--r--platform/default/default_file_source.cpp58
-rw-r--r--platform/default/mbgl/storage/offline_database.cpp35
-rw-r--r--platform/default/mbgl/storage/offline_database.hpp16
3 files changed, 49 insertions, 60 deletions
diff --git a/platform/default/default_file_source.cpp b/platform/default/default_file_source.cpp
index 051e1b125c..93f10eea72 100644
--- a/platform/default/default_file_source.cpp
+++ b/platform/default/default_file_source.cpp
@@ -45,61 +45,44 @@ public:
onlineFileSource.setResourceTransform(std::move(transform));
}
- void listRegions(std::function<void (std::exception_ptr, optional<std::vector<OfflineRegion>>)> callback) {
- try {
- callback({}, offlineDatabase->listRegions());
- } catch (...) {
- callback(std::current_exception(), {});
- }
+ void listRegions(std::function<void (expected<OfflineRegions, std::exception_ptr>)> callback) {
+ callback(offlineDatabase->listRegions());
}
void createRegion(const OfflineRegionDefinition& definition,
const OfflineRegionMetadata& metadata,
- std::function<void (std::exception_ptr, optional<OfflineRegion>)> callback) {
- try {
- callback({}, offlineDatabase->createRegion(definition, metadata));
- } catch (...) {
- callback(std::current_exception(), {});
- }
+ std::function<void (expected<OfflineRegion, std::exception_ptr>)> callback) {
+ callback(offlineDatabase->createRegion(definition, metadata));
}
void updateMetadata(const int64_t regionID,
const OfflineRegionMetadata& metadata,
- std::function<void (std::exception_ptr, optional<OfflineRegionMetadata>)> callback) {
- try {
- callback({}, offlineDatabase->updateMetadata(regionID, metadata));
- } catch (...) {
- callback(std::current_exception(), {});
- }
+ std::function<void (expected<OfflineRegionMetadata, std::exception_ptr>)> callback) {
+ callback(offlineDatabase->updateMetadata(regionID, metadata));
}
- void getRegionStatus(int64_t regionID, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) {
+ void getRegionStatus(int64_t regionID, std::function<void (expected<OfflineRegionStatus, std::exception_ptr>)> callback) {
if (auto download = getDownload(regionID)) {
- callback({}, download->getStatus());
+ callback(download.value()->getStatus());
} else {
- callback(std::current_exception(), {});
+ callback(unexpected<std::exception_ptr>(download.error()));
}
}
void deleteRegion(OfflineRegion&& region, std::function<void (std::exception_ptr)> callback) {
- try {
- downloads.erase(region.getID());
- offlineDatabase->deleteRegion(std::move(region));
- callback({});
- } catch (...) {
- callback(std::current_exception());
- }
+ downloads.erase(region.getID());
+ callback(offlineDatabase->deleteRegion(std::move(region)));
}
void setRegionObserver(int64_t regionID, std::unique_ptr<OfflineRegionObserver> observer) {
if (auto download = getDownload(regionID)) {
- download->setObserver(std::move(observer));
+ download.value()->setObserver(std::move(observer));
}
}
void setRegionDownloadState(int64_t regionID, OfflineRegionDownloadState state) {
if (auto download = getDownload(regionID)) {
- download->setState(state);
+ download.value()->setState(state);
}
}
@@ -185,17 +168,16 @@ public:
}
private:
- OfflineDownload* getDownload(int64_t regionID) {
+ expected<OfflineDownload*, std::exception_ptr> getDownload(int64_t regionID) {
auto it = downloads.find(regionID);
if (it != downloads.end()) {
return it->second.get();
}
auto definition = offlineDatabase->getRegionDefinition(regionID);
if (!definition) {
- return nullptr;
+ return unexpected<std::exception_ptr>(definition.error());
}
-
- auto download = std::make_unique<OfflineDownload>(regionID, std::move(*definition),
+ auto download = std::make_unique<OfflineDownload>(regionID, std::move(definition.value()),
*offlineDatabase, onlineFileSource);
return downloads.emplace(regionID, std::move(download)).first->second.get();
}
@@ -266,19 +248,19 @@ std::unique_ptr<AsyncRequest> DefaultFileSource::request(const Resource& resourc
return std::move(req);
}
-void DefaultFileSource::listOfflineRegions(std::function<void (std::exception_ptr, optional<std::vector<OfflineRegion>>)> callback) {
+void DefaultFileSource::listOfflineRegions(std::function<void (expected<OfflineRegions, std::exception_ptr>)> callback) {
impl->actor().invoke(&Impl::listRegions, callback);
}
void DefaultFileSource::createOfflineRegion(const OfflineRegionDefinition& definition,
const OfflineRegionMetadata& metadata,
- std::function<void (std::exception_ptr, optional<OfflineRegion>)> callback) {
+ std::function<void (expected<OfflineRegion, std::exception_ptr>)> callback) {
impl->actor().invoke(&Impl::createRegion, definition, metadata, callback);
}
void DefaultFileSource::updateOfflineMetadata(const int64_t regionID,
const OfflineRegionMetadata& metadata,
- std::function<void (std::exception_ptr, optional<OfflineRegionMetadata>)> callback) {
+ std::function<void (expected<OfflineRegionMetadata, std::exception_ptr>)> callback) {
impl->actor().invoke(&Impl::updateMetadata, regionID, metadata, callback);
}
@@ -294,7 +276,7 @@ void DefaultFileSource::setOfflineRegionDownloadState(OfflineRegion& region, Off
impl->actor().invoke(&Impl::setRegionDownloadState, region.getID(), state);
}
-void DefaultFileSource::getOfflineRegionStatus(OfflineRegion& region, std::function<void (std::exception_ptr, optional<OfflineRegionStatus>)> callback) const {
+void DefaultFileSource::getOfflineRegionStatus(OfflineRegion& region, std::function<void (expected<OfflineRegionStatus, std::exception_ptr>)> callback) const {
impl->actor().invoke(&Impl::getRegionStatus, region.getID(), callback);
}
diff --git a/platform/default/mbgl/storage/offline_database.cpp b/platform/default/mbgl/storage/offline_database.cpp
index cfa7f52977..7516185f27 100644
--- a/platform/default/mbgl/storage/offline_database.cpp
+++ b/platform/default/mbgl/storage/offline_database.cpp
@@ -592,14 +592,15 @@ bool OfflineDatabase::putTile(const Resource::TileData& tile,
return true;
}
-std::vector<OfflineRegion> OfflineDatabase::listRegions() try {
+expected<OfflineRegions, std::exception_ptr> OfflineDatabase::listRegions() try {
mapbox::sqlite::Query query{ getStatement("SELECT id, definition, description FROM regions") };
- std::vector<OfflineRegion> result;
+ OfflineRegions result;
while (query.run()) {
const auto id = query.get<int64_t>(0);
const auto definition = query.get<std::string>(1);
const auto description = query.get<std::vector<uint8_t>>(2);
try {
+ // Construct, then move because this constructor is private.
OfflineRegion region(id, decodeOfflineRegionDefinition(definition), description);
result.emplace_back(std::move(region));
} catch (const std::exception& ex) {
@@ -608,14 +609,16 @@ std::vector<OfflineRegion> OfflineDatabase::listRegions() try {
Log::Error(Event::General, "%s", ex.what());
}
}
- return result;
+ // Explicit move to avoid triggering the copy constructor.
+ return { std::move(result) };
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "list regions");
- return {};
+ return unexpected<std::exception_ptr>(std::current_exception());
}
-optional<OfflineRegion> OfflineDatabase::createRegion(const OfflineRegionDefinition& definition,
- const OfflineRegionMetadata& metadata) try {
+expected<OfflineRegion, std::exception_ptr>
+OfflineDatabase::createRegion(const OfflineRegionDefinition& definition,
+ const OfflineRegionMetadata& metadata) try {
// clang-format off
mapbox::sqlite::Query query{ getStatement(
"INSERT INTO regions (definition, description) "
@@ -628,10 +631,11 @@ optional<OfflineRegion> OfflineDatabase::createRegion(const OfflineRegionDefinit
return OfflineRegion(query.lastInsertRowId(), definition, metadata);
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "create region");
- return nullopt;
+ return unexpected<std::exception_ptr>(std::current_exception());
}
-optional<OfflineRegionMetadata> OfflineDatabase::updateMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata) try {
+expected<OfflineRegionMetadata, std::exception_ptr>
+OfflineDatabase::updateMetadata(const int64_t regionID, const OfflineRegionMetadata& metadata) try {
// clang-format off
mapbox::sqlite::Query query{ getStatement(
"UPDATE regions SET description = ?1 "
@@ -644,10 +648,10 @@ optional<OfflineRegionMetadata> OfflineDatabase::updateMetadata(const int64_t re
return metadata;
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "update region metadata");
- return nullopt;
+ return unexpected<std::exception_ptr>(std::current_exception());
}
-void OfflineDatabase::deleteRegion(OfflineRegion&& region) try {
+std::exception_ptr OfflineDatabase::deleteRegion(OfflineRegion&& region) try {
{
mapbox::sqlite::Query query{ getStatement("DELETE FROM regions WHERE id = ?") };
query.bind(1, region.getID());
@@ -660,9 +664,10 @@ void OfflineDatabase::deleteRegion(OfflineRegion&& region) try {
// Ensure that the cached offlineTileCount value is recalculated.
offlineMapboxTileCount = {};
+ return nullptr;
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "delete region");
- return;
+ return std::current_exception();
}
optional<std::pair<Response, uint64_t>> OfflineDatabase::getRegionResource(int64_t regionID, const Resource& resource) try {
@@ -848,7 +853,7 @@ bool OfflineDatabase::markUsed(int64_t regionID, const Resource& resource) {
}
}
-optional<OfflineRegionDefinition> OfflineDatabase::getRegionDefinition(int64_t regionID) try {
+expected<OfflineRegionDefinition, std::exception_ptr> OfflineDatabase::getRegionDefinition(int64_t regionID) try {
mapbox::sqlite::Query query{ getStatement("SELECT definition FROM regions WHERE id = ?1") };
query.bind(1, regionID);
query.run();
@@ -856,10 +861,10 @@ optional<OfflineRegionDefinition> OfflineDatabase::getRegionDefinition(int64_t r
return decodeOfflineRegionDefinition(query.get<std::string>(0));
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "load region");
- return nullopt;
+ return unexpected<std::exception_ptr>(std::current_exception());
}
-optional<OfflineRegionStatus> OfflineDatabase::getRegionCompletedStatus(int64_t regionID) try {
+expected<OfflineRegionStatus, std::exception_ptr> OfflineDatabase::getRegionCompletedStatus(int64_t regionID) try {
OfflineRegionStatus result;
std::tie(result.completedResourceCount, result.completedResourceSize)
@@ -873,7 +878,7 @@ optional<OfflineRegionStatus> OfflineDatabase::getRegionCompletedStatus(int64_t
return result;
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "get region status");
- return nullopt;
+ return unexpected<std::exception_ptr>(std::current_exception());
}
std::pair<int64_t, int64_t> OfflineDatabase::getCompletedResourceCountAndSize(int64_t regionID) {
diff --git a/platform/default/mbgl/storage/offline_database.hpp b/platform/default/mbgl/storage/offline_database.hpp
index cdad11b79e..fbe6c707e1 100644
--- a/platform/default/mbgl/storage/offline_database.hpp
+++ b/platform/default/mbgl/storage/offline_database.hpp
@@ -7,6 +7,7 @@
#include <mbgl/util/optional.hpp>
#include <mbgl/util/constants.hpp>
#include <mbgl/util/mapbox.hpp>
+#include <mbgl/util/expected.hpp>
#include <unordered_map>
#include <memory>
@@ -47,14 +48,15 @@ public:
// Return value is (inserted, stored size)
std::pair<bool, uint64_t> put(const Resource&, const Response&);
- std::vector<OfflineRegion> listRegions();
+ expected<OfflineRegions, std::exception_ptr> listRegions();
- optional<OfflineRegion> createRegion(const OfflineRegionDefinition&,
- const OfflineRegionMetadata&);
+ expected<OfflineRegion, std::exception_ptr> createRegion(const OfflineRegionDefinition&,
+ const OfflineRegionMetadata&);
- optional<OfflineRegionMetadata> updateMetadata(const int64_t regionID, const OfflineRegionMetadata&);
+ expected<OfflineRegionMetadata, std::exception_ptr>
+ updateMetadata(const int64_t regionID, const OfflineRegionMetadata&);
- void deleteRegion(OfflineRegion&&);
+ std::exception_ptr deleteRegion(OfflineRegion&&);
// Return value is (response, stored size)
optional<std::pair<Response, uint64_t>> getRegionResource(int64_t regionID, const Resource&);
@@ -62,8 +64,8 @@ public:
uint64_t putRegionResource(int64_t regionID, const Resource&, const Response&);
void putRegionResources(int64_t regionID, const std::list<std::tuple<Resource, Response>>&, OfflineRegionStatus&);
- optional<OfflineRegionDefinition> getRegionDefinition(int64_t regionID);
- optional<OfflineRegionStatus> getRegionCompletedStatus(int64_t regionID);
+ expected<OfflineRegionDefinition, std::exception_ptr> getRegionDefinition(int64_t regionID);
+ expected<OfflineRegionStatus, std::exception_ptr> getRegionCompletedStatus(int64_t regionID);
void setOfflineMapboxTileCountLimit(uint64_t);
uint64_t getOfflineMapboxTileCountLimit();