[android] fix source ownership
This commit is contained in:
committed by
Ivo van Dongen
parent
3a4a27c95f
commit
822b83ae4e
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user