From 3e350787363e94d810de26054e3bd4eddacac7d0 Mon Sep 17 00:00:00 2001 From: gouldtj Date: Wed, 27 Jun 2007 06:20:11 +0000 Subject: [PATCH] r15377@tres: ted | 2007-05-08 22:03:14 -0700 It seems to work... I'm not entirely sure I understand why. Needs more testing, but I'm optimistic. --- src/extension/implementation/script.cpp | 65 +++++++++++++++---------- src/extension/implementation/script.h | 2 +- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/extension/implementation/script.cpp b/src/extension/implementation/script.cpp index fc0ce05bb..8e813237b 100644 --- a/src/extension/implementation/script.cpp +++ b/src/extension/implementation/script.cpp @@ -224,7 +224,7 @@ public: }; }; -int execute (const Glib::ustring &in_command, +int execute (const std::list &in_command, const std::list &in_params, const Glib::ustring &filein, file_listener &fileout); @@ -373,8 +373,9 @@ Script::check_existance(const Glib::ustring &command) Glib::build_filename(localPath, command); if (Inkscape::IO::file_test(candidatePath .c_str(), - G_FILE_TEST_EXISTS)) + G_FILE_TEST_EXISTS)) { return true; + } } @@ -413,26 +414,23 @@ Script::load(Inkscape::Extension::Extension *module) /* This should probably check to find the executable... */ Inkscape::XML::Node *child_repr = sp_repr_children(module->get_repr()); - Glib::ustring command_text; while (child_repr != NULL) { if (!strcmp(child_repr->name(), "script")) { child_repr = sp_repr_children(child_repr); while (child_repr != NULL) { if (!strcmp(child_repr->name(), "command")) { - command_text = solve_reldir(child_repr); - const gchar *interpretstr = child_repr->attribute("interpreter"); if (interpretstr != NULL) { Glib::ustring interpString = resolveInterpreterExecutable(interpretstr); - interpString .append(" \""); - interpString .append(command_text); - interpString .append("\""); - command_text = interpString; + command.insert(command.end(), interpretstr); } + + command.insert(command.end(), solve_reldir(child_repr)); } - if (!strcmp(child_repr->name(), "helper_extension")) + if (!strcmp(child_repr->name(), "helper_extension")) { helper_extension = sp_repr_children(child_repr)->content(); + } child_repr = sp_repr_next(child_repr); } @@ -441,9 +439,8 @@ Script::load(Inkscape::Extension::Extension *module) child_repr = sp_repr_next(child_repr); } - g_return_val_if_fail(command_text.size() > 0, FALSE); + //g_return_val_if_fail(command.length() > 0, FALSE); - command = command_text; return true; } @@ -459,7 +456,7 @@ Script::load(Inkscape::Extension::Extension *module) void Script::unload(Inkscape::Extension::Extension *module) { - command = ""; + command.clear(); helper_extension = ""; } @@ -779,7 +776,6 @@ void Script::effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *doc) { std::list params; - Glib::ustring local_command(command); if (module->no_doc) { // this is a no-doc extension, e.g. a Help menu command; @@ -788,7 +784,7 @@ Script::effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *do Glib::ustring empty; file_listener outfile; - execute(local_command, params, empty, outfile); + execute(command, params, empty, outfile); return; } @@ -857,7 +853,7 @@ Script::effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *do } file_listener fileout; - int data_read = execute(local_command, params, tempfilename_in, fileout); + int data_read = execute(command, params, tempfilename_in, fileout); fileout.toFile(tempfilename_out); SPDocument * mydoc = NULL; @@ -992,7 +988,7 @@ checkStderr (const Glib::ustring &data, are closed, and we return to what we were doing. */ int -execute (const Glib::ustring &in_command, +execute (const std::list &in_command, const std::list &in_params, const Glib::ustring &filein, file_listener &fileout) @@ -1000,10 +996,13 @@ execute (const Glib::ustring &in_command, g_return_val_if_fail(in_command.size() > 0, 0); // printf("Executing: %s\n", in_command); - std::vector argv; - argv.push_back(in_command); + for (std::list::const_iterator i = in_command.begin(); + i != in_command.end(); i++) { + argv.push_back(*i); + } + if (!(filein.empty())) { argv.push_back(filein); } @@ -1013,18 +1012,29 @@ execute (const Glib::ustring &in_command, argv.push_back(*i); } +/* + for (std::vector::const_iterator i = argv.begin(); + i != argv.end(); i++) { + std::cout << *i << std::endl; + } +*/ Glib::Pid pid; int stdout_pipe, stderr_pipe; - Glib::spawn_async_with_pipes(Glib::get_tmp_dir(), // working directory - argv, // arg v - Glib::SPAWN_DO_NOT_REAP_CHILD, - sigc::slot(), - &pid, // Pid - NULL, // STDIN - &stdout_pipe, // STDOUT - &stderr_pipe); // STDERR + try { + Glib::spawn_async_with_pipes(Glib::get_tmp_dir(), // working directory + argv, // arg v + Glib::SPAWN_SEARCH_PATH /*| Glib::SPAWN_DO_NOT_REAP_CHILD*/, + sigc::slot(), + &pid, // Pid + NULL, // STDIN + &stdout_pipe, // STDOUT + &stderr_pipe); // STDERR + } catch (Glib::SpawnError e) { + printf("Can't Spawn!!! %d\n", e.code()); + return 0; + } Glib::RefPtr main_loop = Glib::MainLoop::create(false); @@ -1046,6 +1056,7 @@ execute (const Glib::ustring &in_command, return 0; } + // std::cout << "Finishing Execution." << std::endl; return stdout_data.length(); } diff --git a/src/extension/implementation/script.h b/src/extension/implementation/script.h index b7871d9f8..0e9708926 100644 --- a/src/extension/implementation/script.h +++ b/src/extension/implementation/script.h @@ -105,7 +105,7 @@ private: * The command that has been dirived from * the configuration file with appropriate directories */ - Glib::ustring command; + std::list command; /** * This is the extension that will be used -- 2.30.2