1 #pragma once
2 
3 #include <mbgl/util/noncopyable.hpp>
4 #include <mbgl/storage/resource.hpp>
5 #include <mbgl/tile/tile.hpp>
6 
7 namespace mbgl {
8 
9 class FileSource;
10 class AsyncRequest;
11 class Response;
12 class Tileset;
13 class TileParameters;
14 
15 template <typename T>
16 class TileLoader : private util::noncopyable {
17 public:
18     TileLoader(T&,
19                const OverscaledTileID&,
20                const TileParameters&,
21                const Tileset&);
22     ~TileLoader();
23 
setNecessity(TileNecessity newNecessity)24     void setNecessity(TileNecessity newNecessity) {
25         if (newNecessity != necessity) {
26             necessity = newNecessity;
27             if (necessity == TileNecessity::Required) {
28                 makeRequired();
29             } else {
30                 makeOptional();
31             }
32         }
33     }
34 
35 private:
36     // called when the tile is one of the ideal tiles that we want to show definitely. the tile source
37     // should try to make every effort (e.g. fetch from internet, or revalidate existing resources).
38     void makeRequired();
39 
40     // called when the zoom level no longer corresponds to the displayed one, but
41     // we're still interested in retaining the tile, e.g. for backfill.
42     // subclassed TileSources should cancel actions they are taking to provide
43     // an up-to-date version or load new data
44     void makeOptional();
45 
46     void loadFromCache();
47     void loadedData(const Response&);
48     void loadFromNetwork();
49 
50     T& tile;
51     TileNecessity necessity;
52     Resource resource;
53     FileSource& fileSource;
54     std::unique_ptr<AsyncRequest> request;
55 };
56 
57 } // namespace mbgl
58