From 161933bd1352c24f9c822b746a2c059ba902bc3a Mon Sep 17 00:00:00 2001 From: fractalwrench Date: Mon, 19 Mar 2018 15:24:20 +0000 Subject: [PATCH] retain previously added breadcrumbs whenever a new breadcrumb is added --- ndk/src/main/jni/bugsnag_ndk_report.c | 59 +++++++++++++------------- ndk/src/main/jni/deps/bugsnag/report.c | 2 - 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/ndk/src/main/jni/bugsnag_ndk_report.c b/ndk/src/main/jni/bugsnag_ndk_report.c index 0ab9956..2036f37 100644 --- a/ndk/src/main/jni/bugsnag_ndk_report.c +++ b/ndk/src/main/jni/bugsnag_ndk_report.c @@ -774,9 +774,6 @@ time_t bsg_get_time_from_string(const char* time_details) { * Gets the breadcrumbs from the client class and pre-populates the bugsnag error */ void bsg_populate_breadcrumbs(JNIEnv *env, bsg_event *event) { - // Clear out existing breadcrumbs - bugsnag_event_clear_breadcrumbs(event); - jclass interface_class = (*env)->FindClass(env, "com/bugsnag/android/NativeInterface"); jmethodID get_breadcrumbs_method = (*env)->GetStaticMethodID(env, interface_class, "getBreadcrumbs", "()[Ljava/lang/Object;"); @@ -791,47 +788,49 @@ void bsg_populate_breadcrumbs(JNIEnv *env, bsg_event *event) { // loop over all the items in the map and add them int size = (*env)->GetArrayLength(env, breadcrumbs_value); - for (int i = 0; i < size; i++) { - jobject breadcrumb = (*env)->GetObjectArrayElement(env, breadcrumbs_value, i); + int i = size - 1; // pick last breadcrumb + + if (i < 0) { + return; + } - const char * timestamp = bsg_get_meta_data_string(env, (*env)->GetObjectField(env, breadcrumb, timestamp_field)); - const char * name = bsg_get_meta_data_string(env, (*env)->GetObjectField(env, breadcrumb, name_field)); - jobject breadcrumb_type = (*env)->GetObjectField(env, breadcrumb, type_field); - jobject meta_data_value = (*env)->GetObjectField(env, breadcrumb, meta_data_field); + jobject breadcrumb = (*env)->GetObjectArrayElement(env, breadcrumbs_value, i); - bsg_breadcrumb *crumb = - bugsnag_breadcrumb_init((char *)name, bsg_get_breadcrumb_type(env, breadcrumb_type)); - crumb->timestamp = bsg_get_time_from_string(timestamp); + const char * timestamp = bsg_get_meta_data_string(env, (*env)->GetObjectField(env, breadcrumb, timestamp_field)); + const char * name = bsg_get_meta_data_string(env, (*env)->GetObjectField(env, breadcrumb, name_field)); + jobject breadcrumb_type = (*env)->GetObjectField(env, breadcrumb, type_field); + jobject meta_data_value = (*env)->GetObjectField(env, breadcrumb, meta_data_field); - int meta_size = bsg_get_map_size(env, meta_data_value); + bsg_breadcrumb *crumb = + bugsnag_breadcrumb_init((char *)name, bsg_get_breadcrumb_type(env, breadcrumb_type)); + crumb->timestamp = bsg_get_time_from_string(timestamp); - if (meta_size > 0) { - jarray key_array_value = bsg_get_map_key_array(env, meta_data_value); + int meta_size = bsg_get_map_size(env, meta_data_value); - int j; - for (j = 0; j < meta_size; j++) { - jstring key_str = (*env)->GetObjectArrayElement(env, key_array_value, j); - const char* key = (*env)->GetStringUTFChars(env, key_str, JNI_FALSE); + if (meta_size > 0) { + jarray key_array_value = bsg_get_map_key_array(env, meta_data_value); - jstring value_str = bsg_get_item_from_map(env, meta_data_value, key_str); + for (int j = 0; j < meta_size; j++) { + jstring key_str = (*env)->GetObjectArrayElement(env, key_array_value, j); + const char* key = (*env)->GetStringUTFChars(env, key_str, JNI_FALSE); - if (value_str != NULL) { - const char* value = (*env)->GetStringUTFChars(env, value_str, JNI_FALSE); - bugsnag_object_set_string(json_value_get_object(crumb->metadata), key, value); - } + jstring value_str = bsg_get_item_from_map(env, meta_data_value, key_str); - (*env)->DeleteLocalRef(env, key_str); - (*env)->DeleteLocalRef(env, value_str); + if (value_str != NULL) { + const char* value = (*env)->GetStringUTFChars(env, value_str, JNI_FALSE); + bugsnag_object_set_string(json_value_get_object(crumb->metadata), key, value); } - (*env)->DeleteLocalRef(env, key_array_value); + (*env)->DeleteLocalRef(env, key_str); + (*env)->DeleteLocalRef(env, value_str); } - bugsnag_event_add_breadcrumb(event, crumb); - - (*env)->DeleteLocalRef(env, breadcrumb); + (*env)->DeleteLocalRef(env, key_array_value); } + bugsnag_event_add_breadcrumb(event, crumb); + + (*env)->DeleteLocalRef(env, breadcrumb); (*env)->DeleteLocalRef(env, breadcrumbs_value); (*env)->DeleteLocalRef(env, interface_class); diff --git a/ndk/src/main/jni/deps/bugsnag/report.c b/ndk/src/main/jni/deps/bugsnag/report.c index ec2b8b6..7512c36 100644 --- a/ndk/src/main/jni/deps/bugsnag/report.c +++ b/ndk/src/main/jni/deps/bugsnag/report.c @@ -101,8 +101,6 @@ void bugsnag_event_add_breadcrumb(bsg_event *event, bsg_breadcrumb *crumb) { json_value_free(old_crumb->metadata); free(old_crumb); for (int i = 0; i < length - 1; i++) { - bsg_breadcrumb *crumb1 = event->breadcrumbs[i]; - bsg_breadcrumb *crumb2 = event->breadcrumbs[i + 1]; event->breadcrumbs[i] = event->breadcrumbs[i + 1]; } event->breadcrumbs[length - 1] = crumb;