Improve exception handling in dcpomatic_server.
authorCarl Hetherington <cth@carlh.net>
Mon, 30 Dec 2013 22:49:08 +0000 (22:49 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 30 Dec 2013 22:49:08 +0000 (22:49 +0000)
run/dcpomatic_server [new file with mode: 0755]
run/dcpomatic_server_gui [deleted file]
src/tools/dcpomatic_server.cc

diff --git a/run/dcpomatic_server b/run/dcpomatic_server
new file mode 100755 (executable)
index 0000000..5856221
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+export LD_LIBRARY_PATH=build/src/lib:$LD_LIBRARY_PATH
+if [ "$1" == "--debug" ]; then
+    gdb --args build/src/tools/dcpomatic_server
+elif [ "$1" == "--valgrind" ]; then
+    valgrind --tool="memcheck" build/src/tools/dcpomatic_server
+else
+    build/src/tools/dcpomatic_server
+fi
diff --git a/run/dcpomatic_server_gui b/run/dcpomatic_server_gui
deleted file mode 100755 (executable)
index b7b122e..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-export LD_LIBRARY_PATH=build/src/lib:$LD_LIBRARY_PATH
-if [ "$1" == "--debug" ]; then
-    gdb --args build/src/tools/dcpomatic_server_gui
-elif [ "$1" == "--valgrind" ]; then
-    valgrind --tool="memcheck" build/src/tools/dcpomatic_server_gui
-else
-    build/src/tools/dcpomatic_server_gui
-fi
index 8c6a294619bed2230357fc4124bb6f317093025f..a82478dfdbd47fc3a9e27985bff669eddd8c678f 100644 (file)
@@ -27,6 +27,7 @@
 
 using std::cout;
 using std::string;
+using std::exception;
 using boost::shared_ptr;
 using boost::thread;
 using boost::bind;
@@ -133,7 +134,7 @@ private:
        }
 };
 
-class App : public wxApp
+class App : public wxApp, public ExceptionStore
 {
 public:
        App ()
@@ -154,6 +155,10 @@ private:
 
                _icon = new TaskBarIcon;
                _thread = new thread (bind (&App::main_thread, this));
+
+               Bind (wxEVT_TIMER, boost::bind (&App::check, this));
+               _timer.reset (new wxTimer (this));
+               _timer->Start (1000);
                
                return true;
        }
@@ -165,13 +170,29 @@ private:
        }
 
        void main_thread ()
-       {
+       try {
                Server server (memory_log, false);
                server.run (Config::instance()->num_local_encoding_threads ());
+       } catch (...) {
+               store_current ();
+       }
+
+       void check ()
+       {
+               try {
+                       rethrow ();
+               } catch (exception& e) {
+                       error_dialog (0, std_to_wx (e.what ()));
+                       wxTheApp->ExitMainLoop ();
+               } catch (...) {
+                       error_dialog (0, _("An unknown error has occurred with the DCP-o-matic server."));
+                       wxTheApp->ExitMainLoop ();
+               }
        }
 
        boost::thread* _thread;
        TaskBarIcon* _icon;
+       shared_ptr<wxTimer> _timer;
 };
 
 IMPLEMENT_APP (App)