[android] fix source ownership

This commit is contained in:
Ivo van Dongen
2016-11-10 12:35:49 +01:00
committed by Ivo van Dongen
parent 3a4a27c95f
commit 822b83ae4e
4 changed files with 39 additions and 3 deletions

View File

@@ -0,0 +1,12 @@
package com.mapbox.mapboxsdk.style.sources;
/**
* Thrown when adding a source to a map twice
*/
public class CannotAddSourceException extends RuntimeException {
public CannotAddSourceException(String message) {
super(message);
}
}

View File

@@ -1142,9 +1142,13 @@ void nativeAddSource(JNIEnv *env, jni::jobject* obj, jni::jlong nativeMapViewPtr
assert(nativeSourcePtr != 0);
NativeMapView *nativeMapView = reinterpret_cast<NativeMapView *>(nativeMapViewPtr);
Source *source = reinterpret_cast<Source *>(nativeSourcePtr);
nativeMapView->getMap().addSource(source->releaseCoreSource());
Source *source = reinterpret_cast<Source *>(nativeSourcePtr);
try {
source->addToMap(nativeMapView->getMap());
} catch (const std::runtime_error& error) {
jni::ThrowNew(*env, jni::FindClass(*env, "com/mapbox/mapboxsdk/style/sources/CannotAddSourceException"), error.what());
}
}
void nativeRemoveSource(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jni::jstring* id) {

View File

@@ -35,6 +35,19 @@ namespace android {
return jni::Make<jni::String>(env, source.getID());
}
void Source::addToMap(mbgl::Map& _map) {
//Check to see if we own the source first
if (!ownedSource) {
throw std::runtime_error("Cannot add source twice");
}
//Add source to map
_map.addSource(releaseCoreSource());
//Save pointer to the map
this->map = &_map;
}
std::unique_ptr<mbgl::style::Source> Source::releaseCoreSource() {
assert(ownedSource != nullptr);
return std::move(ownedSource);

View File

@@ -32,16 +32,23 @@ public:
virtual ~Source();
void addToMap(mbgl::Map&);
virtual jni::jobject* createJavaPeer(jni::JNIEnv&) = 0;
jni::String getId(jni::JNIEnv&);
protected:
//Release the owned view and return it
std::unique_ptr<mbgl::style::Source> releaseCoreSource();
protected:
//Set on newly created sources until added to the map
std::unique_ptr<mbgl::style::Source> ownedSource;
//Raw pointer that is valid until the source is removed from the map
mbgl::style::Source& source;
//Map pointer is valid for newly created sources only after adding to the map
mbgl::Map* map;
};