summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeith Bade <leith@mapbox.com>2014-12-18 12:39:36 +1100
committerLeith Bade <leith@mapbox.com>2014-12-18 12:39:36 +1100
commit40f859e482e5282d0fbf257a9feaa9d70953a4fd (patch)
tree0fb920677d0ba92cedc64a4df9e1da045e891e75
parent6f56e88ee599160b336cce222384979a2b517343 (diff)
parenta8dec01230a00f9e701fc6403110c4f5017ba905 (diff)
downloadqtlocation-mapboxgl-40f859e482e5282d0fbf257a9feaa9d70953a4fd.tar.gz
Merge branch 'master' of github.com:mapbox/mapbox-gl-native into android-mason
Conflicts: gyp/mbgl-ios.gypi gyp/mbgl-osx.gypi platform/default/asset_request_libuv.cpp src/mbgl/storage/caching_http_file_source.cpp src/mbgl/storage/file_request.cpp src/mbgl/storage/file_request.hpp src/mbgl/storage/file_request_baton.hpp
-rw-r--r--README.md4
-rw-r--r--gyp/mbgl-ios.gypi4
-rw-r--r--gyp/mbgl-linux.gypi3
-rw-r--r--gyp/mbgl-osx.gypi4
-rw-r--r--gyp/styles.gypi14
-rw-r--r--include/mbgl/platform/platform.hpp2
-rw-r--r--include/mbgl/storage/asset_request.hpp27
m---------ios/mapbox-gl-cocoa0
-rw-r--r--linux/main.cpp4
-rw-r--r--linux/mapboxgl-app.gyp1
-rw-r--r--macosx/main.mm4
-rw-r--r--platform/darwin/application_root.mm18
-rw-r--r--platform/default/application_root.cpp15
-rw-r--r--platform/default/asset_request_libuv.cpp (renamed from src/mbgl/storage/file_request_baton.cpp)98
-rw-r--r--src/mbgl/storage/caching_http_file_source.cpp10
-rw-r--r--src/mbgl/storage/file_request.cpp37
-rw-r--r--src/mbgl/storage/file_request.hpp27
-rw-r--r--src/mbgl/storage/file_request_baton.hpp36
18 files changed, 174 insertions, 134 deletions
diff --git a/README.md b/README.md
index c686d594cb..c80e731ae5 100644
--- a/README.md
+++ b/README.md
@@ -169,9 +169,9 @@ The demo applications use Mapbox vector tiles, which **require a Mapbox account
For iOS and OS X use of the demo apps in Xcode, setup the access token by editing the scheme for the application target, then adding an environment variable with the name `MAPBOX_ACCESS_TOKEN`.
-![edit scheme](https://cloud.githubusercontent.com/assets/98601/3647749/30f74f26-1102-11e4-84af-f1be853b4e38.png)
+![edit scheme](https://cloud.githubusercontent.com/assets/98601/5460702/c4610262-8519-11e4-873a-8597821da468.png)
-![setting access token in Xcode scheme](https://cloud.githubusercontent.com/assets/52399/3543326/9e7cfbb8-0860-11e4-8def-3684a9028b61.png)
+![setting access token in Xcode scheme](https://cloud.githubusercontent.com/assets/162976/5349358/0a086f00-7f8c-11e4-8433-bdbaccda2b58.png)
For Linux, set the environment variable `MAPBOX_ACCESS_TOKEN` to your token.
diff --git a/gyp/mbgl-ios.gypi b/gyp/mbgl-ios.gypi
index e3d7fbbc7a..bd96486d69 100644
--- a/gyp/mbgl-ios.gypi
+++ b/gyp/mbgl-ios.gypi
@@ -39,11 +39,13 @@
'../platform/darwin/log_nslog.mm',
'../platform/darwin/string_nsstring.mm',
'../platform/darwin/http_request_baton_cocoa.mm',
+ '../platform/darwin/application_root.mm',
'../platform/darwin/image.mm',
- '../platform/default/asset_request_baton_noop.cpp',
+ '../platform/default/asset_request_libuv.cpp',
],
'include_dirs': [
'../include',
+ '../src',
],
'xcode_settings': {
'OTHER_CPLUSPLUSFLAGS': [ '<@(uv_cflags)' ],
diff --git a/gyp/mbgl-linux.gypi b/gyp/mbgl-linux.gypi
index c39d165a30..9501950d9b 100644
--- a/gyp/mbgl-linux.gypi
+++ b/gyp/mbgl-linux.gypi
@@ -34,7 +34,9 @@
'../platform/default/shader_cache_tmp.cpp',
'../platform/default/log_stderr.cpp',
'../platform/default/string_stdlib.cpp',
+ '../platform/default/asset_request_libuv.cpp',
'../platform/default/http_request_baton_curl.cpp',
+ '../platform/default/application_root.cpp',
'../platform/default/image.cpp',
'../platform/default/image_reader.cpp',
'../platform/default/png_reader.cpp',
@@ -43,6 +45,7 @@
],
'include_dirs': [
'../include',
+ '../src',
],
'link_settings': {
'libraries': [
diff --git a/gyp/mbgl-osx.gypi b/gyp/mbgl-osx.gypi
index 193341abc5..0cc29f6e73 100644
--- a/gyp/mbgl-osx.gypi
+++ b/gyp/mbgl-osx.gypi
@@ -14,11 +14,13 @@
'../platform/darwin/log_nslog.mm',
'../platform/darwin/string_nsstring.mm',
'../platform/darwin/http_request_baton_cocoa.mm',
+ '../platform/darwin/application_root.mm',
'../platform/darwin/image.mm',
- '../platform/default/asset_request_baton_noop.cpp',
+ '../platform/default/asset_request_libuv.cpp',
],
'include_dirs': [
'../include',
+ '../src',
],
'xcode_settings': {
'OTHER_CPLUSPLUSFLAGS': [ '<@(uv_cflags)' ],
diff --git a/gyp/styles.gypi b/gyp/styles.gypi
index 02cdea6e04..e1cd344fe1 100644
--- a/gyp/styles.gypi
+++ b/gyp/styles.gypi
@@ -18,9 +18,17 @@
'type': 'none',
'hard_dependency': 1,
'dependencies': [ 'touch_styles' ], # required for xcode http://openradar.appspot.com/7232149
- 'direct_dependent_settings': {
- 'mac_bundle_resources': [ '../styles/styles' ],
- }
+ 'conditions': [
+ ['OS == "mac"', {
+ 'direct_dependent_settings': {
+ 'mac_bundle_resources': [ '../styles/styles' ],
+ }
+ }, {
+ 'direct_dependent_settings': {
+ 'copies': [{ 'files': [ '../styles/styles' ], 'destination': '<(PRODUCT_DIR)' }],
+ }
+ }]
+ ],
}
]
}
diff --git a/include/mbgl/platform/platform.hpp b/include/mbgl/platform/platform.hpp
index 9edcc23ccd..02c612c833 100644
--- a/include/mbgl/platform/platform.hpp
+++ b/include/mbgl/platform/platform.hpp
@@ -23,6 +23,8 @@ std::string defaultCacheDatabase();
// Returns the path to the default shader cache on this system.
std::string defaultShaderCache();
+std::string applicationRoot();
+
// Shows an alpha image with the specified dimensions in a named window.
void show_debug_image(std::string name, const char *data, size_t width, size_t height);
diff --git a/include/mbgl/storage/asset_request.hpp b/include/mbgl/storage/asset_request.hpp
new file mode 100644
index 0000000000..3114d41ad2
--- /dev/null
+++ b/include/mbgl/storage/asset_request.hpp
@@ -0,0 +1,27 @@
+#ifndef MBGL_STORAGE_ASSET_REQUEST
+#define MBGL_STORAGE_ASSET_REQUEST
+
+#include <mbgl/storage/base_request.hpp>
+
+namespace mbgl {
+
+typedef struct uv_loop_s uv_loop_t;
+
+struct AssetRequestBaton;
+
+class AssetRequest : public BaseRequest {
+public:
+ AssetRequest(const std::string &path, uv_loop_t *loop);
+ ~AssetRequest();
+
+ void cancel();
+
+private:
+ AssetRequestBaton *ptr = nullptr;
+
+ friend struct AssetRequestBaton;
+};
+
+}
+
+#endif
diff --git a/ios/mapbox-gl-cocoa b/ios/mapbox-gl-cocoa
-Subproject 1533d3288f5678d13bc550b43fb7dbb6ecdfa29
+Subproject 27442b6816ff7df9054f0898968471283ca773c
diff --git a/linux/main.cpp b/linux/main.cpp
index 42a98d0198..e2965a8ea7 100644
--- a/linux/main.cpp
+++ b/linux/main.cpp
@@ -49,7 +49,7 @@ int main(int argc, char *argv[]) {
// handle fullscreen_flag
break;
case 's':
- style = std::string("file://") + std::string(optarg);
+ style = std::string("asset://") + std::string(optarg);
default:
break;
}
@@ -83,7 +83,7 @@ int main(int argc, char *argv[]) {
// Load style
if (style.empty())
- style = std::string("file://") + uv::cwd() + std::string("/../../styles/styles/bright-v6.json");
+ style = std::string("asset://") + std::string("styles/bright-v6.json");
map.setStyleURL(style);
diff --git a/linux/mapboxgl-app.gyp b/linux/mapboxgl-app.gyp
index fbeabd74ea..4127b5c278 100644
--- a/linux/mapboxgl-app.gyp
+++ b/linux/mapboxgl-app.gyp
@@ -48,6 +48,7 @@
'dependencies': [
'../mapboxgl.gyp:mbgl-standalone',
'../mapboxgl.gyp:mbgl-linux',
+ '../mapboxgl.gyp:bundle_styles',
'../mapboxgl.gyp:copy_certificate_bundle',
],
'copies': [{
diff --git a/macosx/main.mm b/macosx/main.mm
index 228b05f0b4..39ddde10d0 100644
--- a/macosx/main.mm
+++ b/macosx/main.mm
@@ -102,9 +102,7 @@ int main() {
if (accessToken) fileSource.setAccessToken([accessToken cStringUsingEncoding:[NSString defaultCStringEncoding]]);
// Load style
- const std::string path([[[NSBundle mainBundle] pathForResource:@"bright-v6" ofType:@"json" inDirectory:@"styles/"] UTF8String]);
-
- map.setStyleURL(std::string("file://") + path);
+ map.setStyleURL("asset://styles/bright-v6.json");
int ret = view.run();
diff --git a/platform/darwin/application_root.mm b/platform/darwin/application_root.mm
new file mode 100644
index 0000000000..19b872c54d
--- /dev/null
+++ b/platform/darwin/application_root.mm
@@ -0,0 +1,18 @@
+#import <Foundation/Foundation.h>
+
+#include <mbgl/platform/platform.hpp>
+
+namespace mbgl {
+namespace platform {
+
+// Returns the path to the default shader cache on this system.
+std::string applicationRoot() {
+ static const std::string root = []() -> std::string {
+ NSString *path = [[[NSBundle mainBundle] resourceURL] path];
+ return {[path cStringUsingEncoding : NSUTF8StringEncoding],
+ [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding]};
+ }();
+ return root;
+}
+}
+}
diff --git a/platform/default/application_root.cpp b/platform/default/application_root.cpp
new file mode 100644
index 0000000000..f25a44d46b
--- /dev/null
+++ b/platform/default/application_root.cpp
@@ -0,0 +1,15 @@
+#include <mbgl/platform/platform.hpp>
+
+#include <mbgl/util/uv.hpp>
+
+namespace mbgl {
+namespace platform {
+
+// Returns the path the application root.
+std::string applicationRoot() {
+ static const std::string root = uv::cwd();
+ return root;
+}
+
+}
+}
diff --git a/src/mbgl/storage/file_request_baton.cpp b/platform/default/asset_request_libuv.cpp
index 6da10552b2..0e0b7280a7 100644
--- a/src/mbgl/storage/file_request_baton.cpp
+++ b/platform/default/asset_request_libuv.cpp
@@ -1,22 +1,45 @@
-#include <mbgl/storage/file_request_baton.hpp>
-#include <mbgl/storage/file_request.hpp>
+#include <mbgl/storage/asset_request.hpp>
#include <mbgl/storage/response.hpp>
+#include <mbgl/platform/platform.hpp>
#include <mbgl/util/std.hpp>
+#include <uv.h>
+
#include <limits>
namespace mbgl {
-FileRequestBaton::FileRequestBaton(FileRequest *request_, const std::string &path, uv_loop_t *loop)
+struct AssetRequestBaton {
+ AssetRequestBaton(AssetRequest *request_, const std::string &path, uv_loop_t *loop);
+ ~AssetRequestBaton();
+
+ void cancel();
+ static void fileOpened(uv_fs_t *req);
+ static void fileStated(uv_fs_t *req);
+ static void fileRead(uv_fs_t *req);
+ static void fileClosed(uv_fs_t *req);
+ static void notifyError(uv_fs_t *req);
+ static void cleanup(uv_fs_t *req);
+
+ const std::thread::id threadId;
+ AssetRequest *request = nullptr;
+ uv_fs_t req;
+ uv_file fd = -1;
+ bool canceled = false;
+ std::string body;
+ uv_buf_t buffer;
+};
+
+AssetRequestBaton::AssetRequestBaton(AssetRequest *request_, const std::string &path, uv_loop_t *loop)
: threadId(std::this_thread::get_id()), request(request_) {
req.data = this;
uv_fs_open(loop, &req, path.c_str(), O_RDONLY, S_IRUSR, fileOpened);
}
-FileRequestBaton::~FileRequestBaton() {
+AssetRequestBaton::~AssetRequestBaton() {
}
-void FileRequestBaton::cancel() {
+void AssetRequestBaton::cancel() {
canceled = true;
// uv_cancel fails frequently when the request has already been started.
@@ -25,8 +48,8 @@ void FileRequestBaton::cancel() {
uv_cancel((uv_req_t *)&req);
}
-void FileRequestBaton::notifyError(uv_fs_t *req) {
- FileRequestBaton *ptr = reinterpret_cast<FileRequestBaton *>(req->data);
+void AssetRequestBaton::notifyError(uv_fs_t *req) {
+ AssetRequestBaton *ptr = reinterpret_cast<AssetRequestBaton *>(req->data);
assert(std::this_thread::get_id() == ptr->threadId);
if (ptr->request && req->result < 0 && !ptr->canceled && req->result != UV_ECANCELED) {
@@ -41,8 +64,8 @@ void FileRequestBaton::notifyError(uv_fs_t *req) {
}
}
-void FileRequestBaton::fileOpened(uv_fs_t *req) {
- FileRequestBaton *ptr = reinterpret_cast<FileRequestBaton *>(req->data);
+void AssetRequestBaton::fileOpened(uv_fs_t *req) {
+ AssetRequestBaton *ptr = reinterpret_cast<AssetRequestBaton *>(req->data);
assert(std::this_thread::get_id() == ptr->threadId);
if (req->result < 0) {
@@ -56,7 +79,7 @@ void FileRequestBaton::fileOpened(uv_fs_t *req) {
uv_fs_req_cleanup(req);
if (ptr->canceled || !ptr->request) {
- // Either the FileRequest object has been destructed, or the
+ // Either the AssetRequest object has been destructed, or the
// request was canceled.
uv_fs_close(req->loop, req, fd, fileClosed);
} else {
@@ -66,8 +89,8 @@ void FileRequestBaton::fileOpened(uv_fs_t *req) {
}
}
-void FileRequestBaton::fileStated(uv_fs_t *req) {
- FileRequestBaton *ptr = reinterpret_cast<FileRequestBaton *>(req->data);
+void AssetRequestBaton::fileStated(uv_fs_t *req) {
+ AssetRequestBaton *ptr = reinterpret_cast<AssetRequestBaton *>(req->data);
assert(std::this_thread::get_id() == ptr->threadId);
if (req->result != 0 || ptr->canceled || !ptr->request) {
@@ -113,8 +136,8 @@ void FileRequestBaton::fileStated(uv_fs_t *req) {
}
}
-void FileRequestBaton::fileRead(uv_fs_t *req) {
- FileRequestBaton *ptr = reinterpret_cast<FileRequestBaton *>(req->data);
+void AssetRequestBaton::fileRead(uv_fs_t *req) {
+ AssetRequestBaton *ptr = reinterpret_cast<AssetRequestBaton *>(req->data);
assert(std::this_thread::get_id() == ptr->threadId);
if (req->result < 0 || ptr->canceled || !ptr->request) {
@@ -135,8 +158,8 @@ void FileRequestBaton::fileRead(uv_fs_t *req) {
uv_fs_close(req->loop, req, ptr->fd, fileClosed);
}
-void FileRequestBaton::fileClosed(uv_fs_t *req) {
- assert(std::this_thread::get_id() == reinterpret_cast<FileRequestBaton *>(req->data)->threadId);
+void AssetRequestBaton::fileClosed(uv_fs_t *req) {
+ assert(std::this_thread::get_id() == (reinterpret_cast<AssetRequestBaton *>(req->data))->threadId);
if (req->result < 0) {
// Closing the file failed. But there isn't anything we can do.
@@ -145,8 +168,8 @@ void FileRequestBaton::fileClosed(uv_fs_t *req) {
cleanup(req);
}
-void FileRequestBaton::cleanup(uv_fs_t *req) {
- FileRequestBaton *ptr = reinterpret_cast<FileRequestBaton *>(req->data);
+void AssetRequestBaton::cleanup(uv_fs_t *req) {
+ AssetRequestBaton *ptr = reinterpret_cast<AssetRequestBaton *>(req->data);
assert(std::this_thread::get_id() == ptr->threadId);
if (ptr->request) {
@@ -158,4 +181,43 @@ void FileRequestBaton::cleanup(uv_fs_t *req) {
ptr = nullptr;
}
+
+AssetRequest::AssetRequest(const std::string &path_, uv_loop_t *loop)
+ : BaseRequest(path_) {
+ if (!path.empty() && path[0] == '/') {
+ // This is an absolute path. We don't allow this. Note that this is not a way to absolutely
+ // prevent access to resources outside the application bundle; e.g. there could be symlinks
+ // in the application bundle that link to outside. We don't care about these.
+ response = util::make_unique<Response>();
+ response->code = 403;
+ response->message = "Path is outside the application bundle";
+ notify();
+ } else {
+ // Note: The AssetRequestBaton object is deleted in AssetRequestBaton::cleanup().
+ ptr = new AssetRequestBaton(this, platform::applicationRoot() + "/" + path, loop);
+ }
+}
+
+void AssetRequest::cancel() {
+ assert(std::this_thread::get_id() == threadId);
+
+ if (ptr) {
+ ptr->cancel();
+
+ // When deleting a AssetRequest object with a uv_fs_* call is in progress, we are making sure
+ // that the callback doesn't accidentally reference this object again.
+ ptr->request = nullptr;
+ ptr = nullptr;
+ }
+
+ notify();
+}
+
+AssetRequest::~AssetRequest() {
+ assert(std::this_thread::get_id() == threadId);
+ cancel();
+
+ // Note: The AssetRequestBaton object is deleted in AssetRequestBaton::cleanup().
+}
+
}
diff --git a/src/mbgl/storage/caching_http_file_source.cpp b/src/mbgl/storage/caching_http_file_source.cpp
index 4f32df3111..634a56f9c4 100644
--- a/src/mbgl/storage/caching_http_file_source.cpp
+++ b/src/mbgl/storage/caching_http_file_source.cpp
@@ -1,5 +1,5 @@
#include <mbgl/storage/caching_http_file_source.hpp>
-#include <mbgl/storage/file_request.hpp>
+#include <mbgl/storage/asset_request.hpp>
#include <mbgl/storage/http_request.hpp>
#include <mbgl/storage/sqlite_store.hpp>
#include <mbgl/storage/asset_request.hpp>
@@ -18,6 +18,8 @@ CachingHTTPFileSource::~CachingHTTPFileSource() {
}
void CachingHTTPFileSource::setLoop(uv_loop_t* loop_) {
+ assert(!loop);
+
threadId = std::this_thread::get_id();
store = !path.empty() ? util::ptr<SQLiteStore>(new SQLiteStore(loop_, path)) : nullptr;
loop = loop_;
@@ -52,6 +54,8 @@ void CachingHTTPFileSource::clearLoop() {
}
store.reset();
+
+ loop = nullptr;
}
void CachingHTTPFileSource::setBase(std::string value) {
@@ -96,9 +100,7 @@ std::unique_ptr<Request> CachingHTTPFileSource::request(ResourceType type, const
}
if (!req) {
- if (url.substr(0, 7) == "file://") {
- req = std::make_shared<FileRequest>(url.substr(7), loop);
- } else if (url.substr(0, 8) == "asset://") {
+ if (url.substr(0, 8) == "asset://") {
req = std::make_shared<AssetRequest>(url.substr(8), loop);
} else {
req = std::make_shared<HTTPRequest>(type, url, loop, store);
diff --git a/src/mbgl/storage/file_request.cpp b/src/mbgl/storage/file_request.cpp
deleted file mode 100644
index 6cb882101d..0000000000
--- a/src/mbgl/storage/file_request.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <mbgl/storage/file_request.hpp>
-#include <mbgl/storage/file_request_baton.hpp>
-#include <mbgl/storage/response.hpp>
-
-#include <uv.h>
-
-#include <cassert>
-
-#include <unistd.h>
-
-namespace mbgl {
-
-FileRequest::FileRequest(const std::string &path_, uv_loop_t *loop)
- : BaseRequest(path_), ptr(new FileRequestBaton(this, path, loop)) {
-}
-
-void FileRequest::cancel() {
- assert(std::this_thread::get_id() == threadId);
-
- if (ptr) {
- ptr->cancel();
-
- // When deleting a FileRequest object with a uv_fs_* call is in progress, we are making sure
- // that the callback doesn't accidentally reference this object again.
- ptr->request = nullptr;
- ptr = nullptr;
- }
-
- notify();
-}
-
-FileRequest::~FileRequest() {
- assert(std::this_thread::get_id() == threadId);
- cancel();
-}
-
-}
diff --git a/src/mbgl/storage/file_request.hpp b/src/mbgl/storage/file_request.hpp
deleted file mode 100644
index 3de2d5b60d..0000000000
--- a/src/mbgl/storage/file_request.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef MBGL_STORAGE_FILE_REQUEST
-#define MBGL_STORAGE_FILE_REQUEST
-
-#include <mbgl/storage/base_request.hpp>
-
-namespace mbgl {
-
-typedef struct uv_loop_s uv_loop_t;
-
-struct FileRequestBaton;
-
-class FileRequest : public BaseRequest {
-public:
- FileRequest(const std::string &path, uv_loop_t *loop);
- ~FileRequest();
-
- void cancel();
-
-private:
- FileRequestBaton *ptr = nullptr;
-
- friend struct FileRequestBaton;
-};
-
-}
-
-#endif
diff --git a/src/mbgl/storage/file_request_baton.hpp b/src/mbgl/storage/file_request_baton.hpp
deleted file mode 100644
index ef9c170fe7..0000000000
--- a/src/mbgl/storage/file_request_baton.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef MBGL_STORAGE_FILE_REQUEST_BATON
-#define MBGL_STORAGE_FILE_REQUEST_BATON
-
-#include <mbgl/storage/file_request.hpp>
-#include <thread>
-
-#include <uv.h>
-
-namespace mbgl {
-
-struct FileRequestBaton {
- FileRequestBaton(FileRequest *request_, const std::string &path, uv_loop_t *loop);
- ~FileRequestBaton();
-
- void cancel();
- static void fileOpened(uv_fs_t *req);
- static void fileStated(uv_fs_t *req);
- static void fileRead(uv_fs_t *req);
- static void fileClosed(uv_fs_t *req);
- static void notifyError(uv_fs_t *req);
- static void cleanup(uv_fs_t *req);
-
- const std::thread::id threadId;
- FileRequest *request = nullptr;
- uv_fs_t req;
- uv_file fd = -1;
- bool canceled = false;
- std::string body;
- uv_buf_t buffer;
-};
-
-
-}
-
-
-#endif