Use SystemExec for post-export hook
authorColin Fletcher <colin.m.fletcher@googlemail.com>
Thu, 10 Oct 2013 18:54:22 +0000 (19:54 +0100)
committerColin Fletcher <colin.m.fletcher@googlemail.com>
Thu, 10 Oct 2013 18:54:22 +0000 (19:54 +0100)
Use the new command-line parsing constructor for SystemExec to construct
the args array for the post-export hook from the entered command string,
with some simple substitutions for filename, directory, &c.

gtk2_ardour/export_format_dialog.cc
libs/ardour/ardour/export_handler.h
libs/ardour/export_handler.cc

index a05a6e549a046994ca7c4ed222714c2cf95735ee..0e2da53cfddcc65e048ca5ff06447cf90c171d3a 100644 (file)
@@ -52,7 +52,7 @@ ExportFormatDialog::ExportFormatDialog (FormatPtr format, bool new_dialog) :
   silence_end_clock ("silence_end", true, "", true, false, true),
 
   upload_checkbox(_("Upload to Soundcloud")),
-  command_label(_("Command to run post-export (%1=full path & filename, %2=directory, %3=basename):")),
+  command_label(_("Command to run post-export\n(%f=full path & filename, %d=directory, %b=basename, %u=username, %p=password):")),
 
   format_table (3, 4),
   compatibility_label (_("Compatibility"), Gtk::ALIGN_LEFT),
index 7f667d2dee1ac37aa19851150881ff0a62b0352e..e2c0a7b2b7548488440a7e640cba10df7ec6c13c 100644 (file)
@@ -95,6 +95,8 @@ class ExportHandler : public ExportElementFactory, public sigc::trackable
        friend boost::shared_ptr<ExportHandler> Session::get_export_handler();
        ExportHandler (Session & session);
 
+       void command_output(std::string output, size_t size);
+
   public:
        ~ExportHandler ();
 
index 042edaf788bf8599a2f9f32c8705aa92fec96b92..f2fb895b91238e342d01c76c9b0255e73f95ec0b 100644 (file)
@@ -34,6 +34,7 @@
 #include "ardour/soundcloud_upload.h"
 #include "pbd/openuri.h"
 #include "pbd/basename.h"
+#include "pbd/system_exec.h"
 
 #include "i18n.h"
 
@@ -277,6 +278,13 @@ ExportHandler::process_normalize ()
        return 0;
 }
 
+void
+ExportHandler::command_output(std::string output, size_t size)
+{
+       std::cerr << "command: " << size << ", " << output << std::endl;
+       info << output << endmsg;
+}
+
 void
 ExportHandler::finish_timespan ()
 {
@@ -294,13 +302,40 @@ ExportHandler::finish_timespan ()
                }
 
                if (!fmt->command().empty()) {
-                       std::string command = string_compose(fmt->command(),
-                                       filepath,
-                                       Glib::path_get_dirname(filepath),
-                                       PBD::basename_nosuffix(filepath)
-                                       );
-                       std::cerr << "running command: " << command << "..." << std::endl;
-                       system(command.c_str());
+
+#if 0                  // would be nicer with C++11 initialiser...
+                       std::map<char, std::string> subs {
+                               { 'f', filepath },
+                               { 'd', Glib::path_get_dirname(filepath) },
+                               { 'b', PBD::basename_nosuffix(filepath) },
+                               { 'u', upload_username },
+                               { 'p', upload_password}
+                       };
+#endif
+
+                       PBD::ScopedConnection command_connection;
+                       std::map<char, std::string> subs;
+                       subs.insert (std::pair<char, std::string> ('f', filepath));
+                       subs.insert (std::pair<char, std::string> ('d', Glib::path_get_dirname(filepath)));
+                       subs.insert (std::pair<char, std::string> ('b', PBD::basename_nosuffix(filepath)));
+                       subs.insert (std::pair<char, std::string> ('u', upload_username));
+                       subs.insert (std::pair<char, std::string> ('p', upload_password));
+
+
+                       std::cerr << "running command: " << fmt->command() << "..." << std::endl;
+                       SystemExec *se = new SystemExec(fmt->command(), subs);
+                       se->ReadStdout.connect_same_thread(command_connection, boost::bind(&ExportHandler::command_output, this, _1, _2));
+                       if (se->start (2) == 0) {
+                               // successfully started
+                               std::cerr << "started!" << std::endl;
+                               while (se->is_running ()) {
+                                       // wait for system exec to terminate
+                                       // std::cerr << "waiting..." << std::endl;
+                                       usleep (1000);
+                               }
+                       }
+                       std::cerr << "done! deleting..." << std::endl;
+                       delete (se);
                }
 
                if (fmt->upload()) {