1 | #pragma once |
2 | |
3 | #include <mbgl/storage/response.hpp> |
4 | #include <mbgl/util/optional.hpp> |
5 | #include <mbgl/util/font_stack.hpp> |
6 | #include <mbgl/util/tileset.hpp> |
7 | #include <mbgl/util/util.hpp> |
8 | #include <mbgl/util/traits.hpp> |
9 | |
10 | #include <string> |
11 | |
12 | namespace mbgl { |
13 | |
14 | class Resource { |
15 | public: |
16 | enum Kind : uint8_t { |
17 | Unknown = 0, |
18 | Style, |
19 | Source, |
20 | Tile, |
21 | Glyphs, |
22 | SpriteImage, |
23 | SpriteJSON, |
24 | Image |
25 | }; |
26 | |
27 | struct TileData { |
28 | std::string urlTemplate; |
29 | uint8_t pixelRatio; |
30 | int32_t x; |
31 | int32_t y; |
32 | int8_t z; |
33 | }; |
34 | |
35 | enum class LoadingMethod : uint8_t { |
36 | None = 0b00, |
37 | Cache = 0b01, |
38 | Network = 0b10, |
39 | |
40 | CacheOnly = Cache, |
41 | NetworkOnly = Network, |
42 | All = Cache | Network, |
43 | }; |
44 | |
45 | Resource(Kind kind_, |
46 | std::string url_, |
47 | optional<TileData> tileData_ = {}, |
48 | LoadingMethod loadingMethod_ = LoadingMethod::All) |
49 | : kind(kind_), |
50 | loadingMethod(loadingMethod_), |
51 | url(std::move(url_)), |
52 | tileData(std::move(tileData_)) { |
53 | } |
54 | |
55 | bool hasLoadingMethod(LoadingMethod method); |
56 | |
57 | static Resource style(const std::string& url); |
58 | static Resource source(const std::string& url); |
59 | static Resource tile(const std::string& urlTemplate, |
60 | float pixelRatio, |
61 | int32_t x, |
62 | int32_t y, |
63 | int8_t z, |
64 | Tileset::Scheme scheme, |
65 | LoadingMethod = LoadingMethod::All); |
66 | static Resource glyphs(const std::string& urlTemplate, |
67 | const FontStack& fontStack, |
68 | const std::pair<uint16_t, uint16_t>& glyphRange); |
69 | static Resource spriteImage(const std::string& base, float pixelRatio); |
70 | static Resource spriteJSON(const std::string& base, float pixelRatio); |
71 | static Resource image(const std::string& url); |
72 | |
73 | Kind kind; |
74 | LoadingMethod loadingMethod; |
75 | std::string url; |
76 | |
77 | // Includes auxiliary data if this is a tile request. |
78 | optional<TileData> tileData; |
79 | |
80 | optional<Timestamp> priorModified = {}; |
81 | optional<Timestamp> priorExpires = {}; |
82 | optional<std::string> priorEtag = {}; |
83 | std::shared_ptr<const std::string> priorData; |
84 | }; |
85 | |
86 | |
87 | MBGL_CONSTEXPR Resource::LoadingMethod operator|(Resource::LoadingMethod a, Resource::LoadingMethod b) { |
88 | return Resource::LoadingMethod(mbgl::underlying_type(t: a) | mbgl::underlying_type(t: b)); |
89 | } |
90 | |
91 | MBGL_CONSTEXPR Resource::LoadingMethod& operator|=(Resource::LoadingMethod& a, Resource::LoadingMethod b) { |
92 | return (a = a | b); |
93 | } |
94 | |
95 | MBGL_CONSTEXPR Resource::LoadingMethod operator&(Resource::LoadingMethod a, Resource::LoadingMethod b) { |
96 | return Resource::LoadingMethod(mbgl::underlying_type(t: a) & mbgl::underlying_type(t: b)); |
97 | } |
98 | |
99 | inline bool Resource::hasLoadingMethod(Resource::LoadingMethod method) { |
100 | return (loadingMethod & method) != Resource::LoadingMethod::None; |
101 | } |
102 | |
103 | } // namespace mbgl |
104 | |