diff options
-rw-r--r-- | core/dive.h | 2 | ||||
-rw-r--r-- | core/errorhelper.c | 38 | ||||
-rw-r--r-- | desktop-widgets/mainwindow.cpp | 6 | ||||
-rw-r--r-- | mobile-widgets/qmlmanager.cpp | 5 |
4 files changed, 17 insertions, 34 deletions
diff --git a/core/dive.h b/core/dive.h index c155abbfd..3793cc359 100644 --- a/core/dive.h +++ b/core/dive.h @@ -719,7 +719,7 @@ extern "C" { extern int report_error(const char *fmt, ...); extern const char *get_error_string(void); -extern void set_error_cb(void(*cb)(void)); +extern void set_error_cb(void(*cb)(char *)); // Callback takes ownership of passed string extern struct dive *find_dive_including(timestamp_t when); extern bool dive_within_time_range(struct dive *dive, timestamp_t when, timestamp_t offset); diff --git a/core/errorhelper.c b/core/errorhelper.c index 0f544efb6..5390c4c20 100644 --- a/core/errorhelper.c +++ b/core/errorhelper.c @@ -8,43 +8,23 @@ #define VA_BUF(b, fmt) do { va_list args; va_start(args, fmt); put_vformat(b, fmt, args); va_end(args); } while (0) -static struct membuffer error_string_buffer = { 0 }; -static void (*error_cb)(void) = NULL; -/* - * Note that the act of "getting" the error string - * buffer doesn't de-allocate the buffer, but it does - * set the buffer length to zero, so that any future - * error reports will overwrite the string rather than - * append to it. - */ -const char *get_error_string(void) -{ - const char *str; - - if (!error_string_buffer.len) - return ""; - str = mb_cstring(&error_string_buffer); - error_string_buffer.len = 0; - return str; -} +static void (*error_cb)(char *) = NULL; int report_error(const char *fmt, ...) { - struct membuffer *buf = &error_string_buffer; + struct membuffer buf = { 0 }; - /* Previous unprinted errors? Add a newline in between */ - if (buf->len) - put_bytes(buf, "\n", 1); - VA_BUF(buf, fmt); - mb_cstring(buf); + /* if there is no error callback registered, don't produce errors */ + if (!error_cb) + return -1; - /* if an error callback is registered, call it */ - if (error_cb) - error_cb(); + VA_BUF(&buf, fmt); + mb_cstring(&buf); + error_cb(detach_buffer(&buf)); return -1; } -void set_error_cb(void(*cb)(void)) { +void set_error_cb(void(*cb)(char *)) { error_cb = cb; } diff --git a/desktop-widgets/mainwindow.cpp b/desktop-widgets/mainwindow.cpp index 3c70f73f4..ac6289f34 100644 --- a/desktop-widgets/mainwindow.cpp +++ b/desktop-widgets/mainwindow.cpp @@ -89,9 +89,11 @@ extern "C" int updateProgress(const char *text) MainWindow *MainWindow::m_Instance = NULL; -extern "C" void showErrorFromC() +extern "C" void showErrorFromC(char *buf) { - emit MainWindow::instance()->showError(get_error_string()); + QString error(buf); + free(buf); + emit MainWindow::instance()->showError(error); } MainWindow::MainWindow() : QMainWindow(), diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index e24bf8e01..18db13621 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -36,11 +36,12 @@ QMLManager *QMLManager::m_instance = NULL; #define NOCLOUD_LOCALSTORAGE format_string("%s/cloudstorage/localrepo[master]", system_default_directory()) -extern "C" void showErrorFromC() +extern "C" void showErrorFromC(char *buf) { + QString error(buf); + free(buf); // By using invokeMethod with Qt:AutoConnection, the error string is safely // transported across thread boundaries, if not called from the UI thread. - QString error(get_error_string()); QMetaObject::invokeMethod(QMLManager::instance(), "registerError", Qt::AutoConnection, Q_ARG(QString, error)); } |