1 #pragma once
2 
3 #include <mbgl/storage/offline.hpp>
4 #include <mbgl/storage/resource.hpp>
5 
6 #include <list>
7 #include <unordered_set>
8 #include <memory>
9 #include <deque>
10 
11 namespace mbgl {
12 
13 class OfflineDatabase;
14 class FileSource;
15 class AsyncRequest;
16 class Response;
17 class Tileset;
18 
19 namespace style {
20 class Parser;
21 } // namespace style
22 
23 /**
24  * Coordinates the request and storage of all resources for an offline region.
25 
26  * @private
27  */
28 class OfflineDownload {
29 public:
30     OfflineDownload(int64_t id, OfflineRegionDefinition&&, OfflineDatabase& offline, FileSource& online);
31     ~OfflineDownload();
32 
33     void setObserver(std::unique_ptr<OfflineRegionObserver>);
34     void setState(OfflineRegionDownloadState);
35 
36     OfflineRegionStatus getStatus() const;
37 
38 private:
39     void activateDownload();
40     void continueDownload();
41     void deactivateDownload();
42 
43     /*
44      * Ensure that the resource is stored in the database, requesting it if necessary.
45      * While the request is in progress, it is recorded in `requests`. If the download
46      * is deactivated, all in progress requests are cancelled.
47      */
48     void ensureResource(const Resource&, std::function<void (Response)> = {});
49 
50     void onMapboxTileCountLimitExceeded();
51 
52     int64_t id;
53     OfflineRegionDefinition definition;
54     OfflineDatabase& offlineDatabase;
55     FileSource& onlineFileSource;
56     OfflineRegionStatus status;
57     std::unique_ptr<OfflineRegionObserver> observer;
58 
59     std::list<std::unique_ptr<AsyncRequest>> requests;
60     std::unordered_set<std::string> requiredSourceURLs;
61     std::deque<Resource> resourcesRemaining;
62     std::list<std::tuple<Resource, Response>> buffer;
63 
64     void queueResource(Resource);
65     void queueTiles(style::SourceType, uint16_t tileSize, const Tileset&);
66 };
67 
68 } // namespace mbgl
69