Hand-apply e30fd8d; resurrect JSON server code.
authorCarl Hetherington <cth@carlh.net>
Tue, 24 Mar 2015 23:57:22 +0000 (23:57 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 24 Mar 2015 23:57:22 +0000 (23:57 +0000)
21 files changed:
ChangeLog
TO_PORT
src/lib/analyse_audio_job.cc
src/lib/analyse_audio_job.h
src/lib/examine_content_job.cc
src/lib/examine_content_job.h
src/lib/job.cc
src/lib/job.h
src/lib/scp_dcp_job.cc
src/lib/scp_dcp_job.h
src/lib/send_kdm_email_job.cc
src/lib/send_kdm_email_job.h
src/lib/send_problem_report_job.cc
src/lib/send_problem_report_job.h
src/lib/transcode_job.cc
src/lib/transcode_job.h
src/lib/util.cc
src/lib/util.h
src/lib/wscript
src/tools/dcpomatic_cli.cc
test/job_test.cc

index b063002..9fb6dff 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2015-03-24  Carl Hetherington  <cth@carlh.net>
 
+       * Hand-apply e30fd8d; resurrect JSON server code.
+
        * Hand-apply 7ba9dcdbfe8f0d94ad9887843995c152c45dfe9e from master;
        allow "deletion" of the audio part of a FFmpeg file from the
        timeline; delete unmaps the audio (#316).
diff --git a/TO_PORT b/TO_PORT
index 8e85ad7..daab0e8 100644 (file)
--- a/TO_PORT
+++ b/TO_PORT
@@ -1,4 +1,3 @@
-e30fd8d
 31eafa8a121b8d341d198e4fe426ee843cc70167
 3e3d3e46a74af7b3e6431033c7c80bd058c02cf6
 ec3e6abf817b84d589f0782b01f5059dd3bf0953
index 74c0125..079fe88 100644 (file)
@@ -49,6 +49,12 @@ AnalyseAudioJob::name () const
        return _("Analyse audio");
 }
 
+string
+AnalyseAudioJob::json_name () const
+{
+       return N_("analyse_audio");
+}
+
 void
 AnalyseAudioJob::run ()
 {
index bde9d0d..6f64dd2 100644 (file)
@@ -41,6 +41,7 @@ public:
        AnalyseAudioJob (boost::shared_ptr<const Film>, boost::shared_ptr<AudioContent>);
 
        std::string name () const;
+       std::string json_name () const;
        void run ();
 
 private:
index 2b8f118..b5441e3 100644 (file)
@@ -46,6 +46,12 @@ ExamineContentJob::name () const
        return _("Examine content");
 }
 
+string
+ExamineContentJob::json_name () const
+{
+       return N_("examine_content");
+}
+
 void
 ExamineContentJob::run ()
 {
index 016a563..b97e782 100644 (file)
@@ -30,6 +30,7 @@ public:
        ~ExamineContentJob ();
 
        std::string name () const;
+       std::string json_name () const;
        void run ();
 
 private:
index 547b484..eadafbf 100644 (file)
@@ -340,6 +340,29 @@ Job::status () const
        return s.str ();
 }
 
+string
+Job::json_status () const
+{
+       boost::mutex::scoped_lock lm (_state_mutex);
+
+       switch (_state) {
+       case NEW:
+               return N_("new");
+       case RUNNING:
+               return N_("running");
+       case PAUSED:
+               return N_("paused");
+       case FINISHED_OK:
+               return N_("finished_ok");
+       case FINISHED_ERROR:
+               return N_("finished_error");
+       case FINISHED_CANCELLED:
+               return N_("finished_cancelled");
+       }
+
+       return "";
+}
+
 /** @return An estimate of the remaining time for this sub-job, in seconds */
 int
 Job::remaining_time () const
index f6120f1..7c67078 100644 (file)
@@ -43,6 +43,7 @@ public:
 
        /** @return user-readable name of this job */
        virtual std::string name () const = 0;
+       virtual std::string json_name () const = 0;
        /** Run this job in the current thread. */
        virtual void run () = 0;
        
@@ -64,6 +65,7 @@ public:
 
        int elapsed_time () const;
        virtual std::string status () const;
+       std::string json_status () const;
        std::string sub_name () const {
                return _sub_name;
        }
index 67a1fb8..5aade63 100644 (file)
@@ -111,6 +111,12 @@ SCPDCPJob::name () const
        return _("Copy DCP to TMS");
 }
 
+string
+SCPDCPJob::json_name () const
+{
+       return N_("scp_dcp");
+}
+
 void
 SCPDCPJob::run ()
 {
index bdc83af..e3960d7 100644 (file)
@@ -29,6 +29,7 @@ public:
        SCPDCPJob (boost::shared_ptr<const Film>);
 
        std::string name () const;
+       std::string json_name () const;
        void run ();
        std::string status () const;
 
index 541307f..de03222 100644 (file)
@@ -52,6 +52,12 @@ SendKDMEmailJob::name () const
        return String::compose (_("Email KDMs for %1"), _film->name());
 }
 
+string
+SendKDMEmailJob::json_name () const
+{
+       return N_("send_kdm_email");
+}
+
 void
 SendKDMEmailJob::run ()
 {
index 8d9f9b0..5226bb7 100644 (file)
@@ -36,6 +36,7 @@ public:
                );
 
        std::string name () const;
+       std::string json_name () const;
        void run ();
 
 private:
index b2eb4e2..b0e37c5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2015 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
@@ -49,6 +49,12 @@ SendProblemReportJob::name () const
        return String::compose (_("Email problem report for %1"), _film->name());
 }
 
+string
+SendProblemReportJob::json_name () const
+{
+       return N_("send_problem_report");
+}
+
 void
 SendProblemReportJob::run ()
 {
index c40011d..8c4d9db 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2014-2015 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
@@ -31,6 +31,7 @@ public:
                );
 
        std::string name () const;
+       std::string json_name () const;
        void run ();
 
 private:
index fe2ad67..1a2202a 100644 (file)
@@ -54,6 +54,12 @@ TranscodeJob::name () const
        return String::compose (_("Transcode %1"), _film->name());
 }
 
+string
+TranscodeJob::json_name () const
+{
+       return N_("transcode");
+}
+
 void
 TranscodeJob::run ()
 {
index 97a7d49..e0145d7 100644 (file)
@@ -35,6 +35,7 @@ public:
        TranscodeJob (boost::shared_ptr<const Film> f);
        
        std::string name () const;
+       std::string json_name () const;
        void run ();
        std::string status () const;
 
index 6bb16c4..2b5eb69 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2015 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
@@ -70,6 +70,7 @@ using std::endl;
 using std::vector;
 using std::min;
 using std::max;
+using std::map;
 using std::list;
 using std::multimap;
 using std::istream;
@@ -576,3 +577,49 @@ subtitle_period (AVSubtitle const & sub)
 
        return period;
 }
+
+map<string, string>
+split_get_request (string url)
+{
+       enum {
+               AWAITING_QUESTION_MARK,
+               KEY,
+               VALUE
+       } state = AWAITING_QUESTION_MARK;
+       
+       map<string, string> r;
+       string k;
+       string v;
+       for (size_t i = 0; i < url.length(); ++i) {
+               switch (state) {
+               case AWAITING_QUESTION_MARK:
+                       if (url[i] == '?') {
+                               state = KEY;
+                       }
+                       break;
+               case KEY:
+                       if (url[i] == '=') {
+                               v.clear ();
+                               state = VALUE;
+                       } else {
+                               k += url[i];
+                       }
+                       break;
+               case VALUE:
+                       if (url[i] == '&') {
+                               r.insert (make_pair (k, v));
+                               k.clear ();
+                               state = KEY;
+                       } else {
+                               v += url[i];
+                       }
+                       break;
+               }
+       }
+
+       if (state == VALUE) {
+               r.insert (make_pair (k, v));
+       }
+
+       return r;
+}
index bfb39fc..97e1193 100644 (file)
@@ -76,6 +76,7 @@ extern void* wrapped_av_malloc (size_t);
 extern ContentTimePeriod subtitle_period (AVSubtitle const &);
 extern void set_backtrace_file (boost::filesystem::path);
 extern int64_t video_frames_to_audio_frames (VideoFrame v, float audio_sample_rate, float frames_per_second);
+extern std::map<std::string, std::string> split_get_request (std::string url);
 
 #endif
 
index 322f877..217c0c8 100644 (file)
@@ -58,6 +58,7 @@ sources = """
           job.cc
           job_manager.cc
           kdm.cc
+          json_server.cc
           log.cc
           magick_image_proxy.cc
           md5_digester.cc
index 2a2db98..e187e57 100644 (file)
@@ -33,6 +33,7 @@
 #include "lib/log.h"
 #include "lib/ui_signaller.h"
 #include "lib/server_finder.h"
+#include "lib/json_server.h"
 
 using std::string;
 using std::cerr;
@@ -41,6 +42,7 @@ using std::vector;
 using std::pair;
 using std::list;
 using boost::shared_ptr;
+using boost::optional;
 
 static void
 help (string n)
@@ -51,6 +53,7 @@ help (string n)
             << "  -f, --flags        show flags passed to C++ compiler on build\n"
             << "  -n, --no-progress  do not print progress to stdout\n"
             << "  -r, --no-remote    do not use any remote servers\n"
+            << "  -j, --json <port>  run a JSON server on the specified port\n"
             << "  -k, --keep-going   keep running even when the job is complete\n"
             << "\n"
             << "<FILM> is the film directory.\n";
@@ -62,6 +65,7 @@ main (int argc, char* argv[])
        string film_dir;
        bool progress = true;
        bool no_remote = false;
+       optional<int> json_port;
        bool keep_going = false;
 
        int option_index = 0;
@@ -72,11 +76,12 @@ main (int argc, char* argv[])
                        { "flags", no_argument, 0, 'f'},
                        { "no-progress", no_argument, 0, 'n'},
                        { "no-remote", no_argument, 0, 'r'},
+                       { "json", required_argument, 0, 'j'},
                        { "keep-going", no_argument, 0, 'k' },
                        { 0, 0, 0, 0 }
                };
 
-               int c = getopt_long (argc, argv, "vhfnrk", long_options, &option_index);
+               int c = getopt_long (argc, argv, "vhfnrj:k", long_options, &option_index);
 
                if (c == -1) {
                        break;
@@ -98,6 +103,9 @@ main (int argc, char* argv[])
                case 'r':
                        no_remote = true;
                        break;
+               case 'j':
+                       json_port = atoi (optarg);
+                       break;
                case 'k':
                        keep_going = true;
                        break;
@@ -113,11 +121,15 @@ main (int argc, char* argv[])
                        
        dcpomatic_setup ();
        ui_signaller = new UISignaller ();
-
+       
        if (no_remote) {
                ServerFinder::instance()->disable ();
        }
 
+       if (json_port) {
+               new JSONServer (json_port.get ());
+       }
+
        cout << "DCP-o-matic " << dcpomatic_version << " git " << dcpomatic_git_commit;
        char buf[256];
        if (gethostname (buf, 256) == 0) {
index 97a23b9..c1b66d4 100644 (file)
@@ -58,6 +58,10 @@ public:
        string name () const {
                return "";
        }
+
+       string json_name () const {
+               return "";
+       }
 };
 
 BOOST_AUTO_TEST_CASE (job_manager_test)