diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-12-31 15:44:51 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-12-31 15:44:51 +0000 |
| commit | ad49361b303d1ceff7048fa0e89ba609ca9ce376 (patch) | |
| tree | be6413325604b0d403add54a8de6ea861ec90772 /src/tools | |
| parent | b2a9271256e09fcfedff3beea5fc73c04e7c0e14 (diff) | |
| parent | 5625ba9542e38504e87799dd655be5071161fb1f (diff) | |
Merge 1.0
Diffstat (limited to 'src/tools')
| -rw-r--r-- | src/tools/dcpomatic.cc | 18 | ||||
| -rw-r--r-- | src/tools/dcpomatic_create.cc | 128 | ||||
| -rw-r--r-- | src/tools/dcpomatic_server.cc | 25 | ||||
| -rw-r--r-- | src/tools/wscript | 2 |
4 files changed, 169 insertions, 4 deletions
diff --git a/src/tools/dcpomatic.cc b/src/tools/dcpomatic.cc index 66f795ddf..891c4623c 100644 --- a/src/tools/dcpomatic.cc +++ b/src/tools/dcpomatic.cc @@ -54,6 +54,7 @@ #include "lib/cinema.h" #include "lib/kdm.h" #include "lib/send_kdm_email_job.h" +#include "lib/server_finder.h" using std::cout; using std::string; @@ -632,8 +633,12 @@ class App : public wxApp f->Show (); ui_signaller = new wxUISignaller (this); - this->Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); + Bind (wxEVT_IDLE, boost::bind (&App::idle, this)); + Bind (wxEVT_TIMER, boost::bind (&App::check, this)); + _timer.reset (new wxTimer (this)); + _timer->Start (1000); + return true; } catch (exception& e) @@ -670,6 +675,17 @@ class App : public wxApp { ui_signaller->ui_idle (); } + + void check () + { + try { + ServerFinder::instance()->rethrow (); + } catch (exception& e) { + error_dialog (0, std_to_wx (e.what ())); + } + } + + shared_ptr<wxTimer> _timer; }; IMPLEMENT_APP (App) diff --git a/src/tools/dcpomatic_create.cc b/src/tools/dcpomatic_create.cc new file mode 100644 index 000000000..8be468b30 --- /dev/null +++ b/src/tools/dcpomatic_create.cc @@ -0,0 +1,128 @@ +/* + Copyright (C) 2013 Carl Hetherington <cth@carlh.net> + + 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include <string> +#include <iostream> +#include <cstdlib> +#include <getopt.h> +#include <boost/filesystem.hpp> +#include "lib/version.h" +#include "lib/film.h" +#include "lib/util.h" +#include "lib/content_factory.h" +#include "lib/job_manager.h" +#include "lib/ui_signaller.h" +#include "lib/job.h" + +using std::string; +using std::cout; +using std::cerr; +using std::list; +using boost::shared_ptr; + +static void +help (string n) +{ + cerr << "Create a film directory (ready for making a DCP) from some content files.\n" + << "Syntax: " << n << " [OPTION] <CONTENT> [<CONTENT> ...]\n" + << " -v, --version show DCP-o-matic version\n" + << " -h, --help show this help\n" + << " -n, --name film name\n" + << " -o, --output output directory (required)\n"; +} + +int +main (int argc, char* argv[]) +{ + string name; + boost::filesystem::path output; + + int option_index = 0; + while (1) { + static struct option long_options[] = { + { "version", no_argument, 0, 'v'}, + { "help", no_argument, 0, 'h'}, + { "name", required_argument, 0, 'n'}, + { "output", required_argument, 0, 'o'}, + { 0, 0, 0, 0} + }; + + int c = getopt_long (argc, argv, "vhn:o:", long_options, &option_index); + if (c == -1) { + break; + } + + switch (c) { + case 'v': + cout << "dcpomatic version " << dcpomatic_version << " " << dcpomatic_git_commit << "\n"; + exit (EXIT_SUCCESS); + case 'h': + help (argv[0]); + exit (EXIT_SUCCESS); + case 'n': + name = optarg; + break; + case 'o': + output = optarg; + break; + } + } + + if (optind > argc) { + help (argv[0]); + exit (EXIT_FAILURE); + } + + if (output.empty ()) { + cerr << "Missing required option -o or --output.\n" + << "Use " << argv[0] << " --help for help.\n"; + exit (EXIT_FAILURE); + } + + dcpomatic_setup (); + ui_signaller = new UISignaller (); + + shared_ptr<Film> film (new Film (output)); + if (!name.empty ()) { + film->set_name (name); + } + + for (int i = optind; i < argc; ++i) { + film->examine_and_add_content (content_factory (film, argv[i])); + } + + JobManager* jm = JobManager::instance (); + while (jm->work_to_do ()) { + ui_signaller->ui_idle (); + } + + if (jm->errors ()) { + list<shared_ptr<Job> > jobs = jm->get (); + for (list<shared_ptr<Job> >::iterator i = jobs.begin(); i != jobs.end(); ++i) { + if ((*i)->finished_in_error ()) { + cerr << (*i)->error_summary () << "\n" + << (*i)->error_details () << "\n"; + } + } + exit (EXIT_FAILURE); + } + + film->write_metadata (); + return 0; +} diff --git a/src/tools/dcpomatic_server.cc b/src/tools/dcpomatic_server.cc index 8c6a29461..a82478dfd 100644 --- a/src/tools/dcpomatic_server.cc +++ b/src/tools/dcpomatic_server.cc @@ -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) diff --git a/src/tools/wscript b/src/tools/wscript index eafad44ec..0fd336676 100644 --- a/src/tools/wscript +++ b/src/tools/wscript @@ -9,7 +9,7 @@ def configure(conf): conf.env.append_value('LINKFLAGS', ['-mconsole']) def build(bld): - for t in ['dcpomatic_cli', 'dcpomatic_server_cli', 'server_test', 'dcpomatic_kdm']: + for t in ['dcpomatic_cli', 'dcpomatic_server_cli', 'server_test', 'dcpomatic_kdm', 'dcpomatic_create']: obj = bld(features = 'cxx cxxprogram') obj.uselib = 'BOOST_THREAD OPENJPEG DCP CXML AVFORMAT AVFILTER AVCODEC AVUTIL SWSCALE POSTPROC WXWIDGETS QUICKMAIL' obj.includes = ['..'] |
