gnome: implement dbus error interface

DBus errors usually indicate that dring has crashed or been killed.
This handler shows a warning dialog and gives dring 2.5s to restart.
If a DBus connection is not re-established, an error dialog is show and
the client quits.

This implementation prevents the client from suddenly crashing when
dring is killed due to the exception thrown by the LRC
implementation of the interface.

Patch adds updated translation template.

Issue: #79655
Change-Id: Ie7679a11ca357d68d8b87a3925abe4598d36f02c
diff --git a/src/native/dbuserrorhandler.h b/src/native/dbuserrorhandler.h
new file mode 100644
index 0000000..b0267ce
--- /dev/null
+++ b/src/native/dbuserrorhandler.h
@@ -0,0 +1,40 @@
+/*
+ *  Copyright (C) 2015 Savoir-faire Linux Inc.
+ *  Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA.
+ */
+
+#pragma once
+
+#include <gtk/gtk.h>
+#include <interfaces/dbuserrorhandleri.h>
+#include <atomic>
+
+namespace Interfaces {
+
+class DBusErrorHandler : public DBusErrorHandlerI {
+public:
+    void connectionError(const QString& error) override;
+    void invalidInterfaceError(const QString& error) override;
+
+    void finishedHandlingError();
+private:
+    /* keeps track if we're in the process of handling an error already, so that we don't keep
+     * displaying error dialogs; we use an atomic in case the errors come from multiple threads */
+    std::atomic_bool handlingError{false};
+};
+
+} // namespace Interfaces