summaryrefslogtreecommitdiff
path: root/libs/glibmm2/glibmm/spawn.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/glibmm2/glibmm/spawn.cc')
-rw-r--r--libs/glibmm2/glibmm/spawn.cc311
1 files changed, 311 insertions, 0 deletions
diff --git a/libs/glibmm2/glibmm/spawn.cc b/libs/glibmm2/glibmm/spawn.cc
new file mode 100644
index 0000000000..cbc204cd70
--- /dev/null
+++ b/libs/glibmm2/glibmm/spawn.cc
@@ -0,0 +1,311 @@
+// Generated by gtkmmproc -- DO NOT MODIFY!
+
+#include <glibmm/spawn.h>
+#include <glibmm/private/spawn_p.h>
+
+// -*- c++ -*-
+/* $Id$ */
+
+/* Copyright (C) 2002 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <glib/gspawn.h>
+#include <glibmm/exceptionhandler.h>
+#include <glibmm/utility.h>
+
+
+namespace
+{
+
+extern "C"
+{
+
+/* Helper callback to invoke the actual sigc++ slot.
+ * We don't need to worry about (un)referencing, since the
+ * child process gets its own copy of the parent's memory anyway.
+ */
+void child_setup_callback(void* user_data)
+{
+ try
+ {
+ (*reinterpret_cast<sigc::slot<void>*>(user_data))();
+ }
+ catch(...)
+ {
+ Glib::exception_handlers_invoke();
+ }
+}
+
+void copy_output_buf(std::string* dest, const char* buf)
+{
+ if(dest)
+ {
+ if(buf)
+ *dest = buf;
+ else
+ dest->erase();
+ }
+}
+
+} //extern "C"
+
+} //anonymous namespace
+
+
+namespace Glib
+{
+
+/**** process spawning functions *******************************************/
+
+void spawn_async_with_pipes(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ const Glib::ArrayHandle<std::string>& envp,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ Pid* child_pid,
+ int* standard_input,
+ int* standard_output,
+ int* standard_error)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+ GError* error = 0;
+
+ g_spawn_async_with_pipes(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()),
+ const_cast<char**>(envp.data()),
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ child_pid,
+ standard_input, standard_output, standard_error,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+}
+
+void spawn_async_with_pipes(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ Pid* child_pid,
+ int* standard_input,
+ int* standard_output,
+ int* standard_error)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+ GError* error = 0;
+
+ g_spawn_async_with_pipes(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()), 0,
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ child_pid,
+ standard_input, standard_output, standard_error,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+}
+
+void spawn_async(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ const Glib::ArrayHandle<std::string>& envp,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ Pid* child_pid)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+ GError* error = 0;
+
+ g_spawn_async(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()),
+ const_cast<char**>(envp.data()),
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ child_pid,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+}
+
+void spawn_async(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ Pid* child_pid)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+ GError* error = 0;
+
+ g_spawn_async(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()), 0,
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ child_pid,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+}
+
+void spawn_sync(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ const Glib::ArrayHandle<std::string>& envp,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ std::string* standard_output,
+ std::string* standard_error,
+ int* exit_status)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+
+ Glib::ScopedPtr<char> buf_standard_output;
+ Glib::ScopedPtr<char> buf_standard_error;
+ GError* error = 0;
+
+ g_spawn_sync(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()),
+ const_cast<char**>(envp.data()),
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ (standard_output) ? buf_standard_output.addr() : 0,
+ (standard_error) ? buf_standard_error.addr() : 0,
+ exit_status,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+
+ copy_output_buf(standard_output, buf_standard_output.get());
+ copy_output_buf(standard_error, buf_standard_error.get());
+}
+
+void spawn_sync(const std::string& working_directory,
+ const Glib::ArrayHandle<std::string>& argv,
+ SpawnFlags flags,
+ const sigc::slot<void>& child_setup,
+ std::string* standard_output,
+ std::string* standard_error,
+ int* exit_status)
+{
+ const bool setup_slot = !child_setup.empty();
+ sigc::slot<void> child_setup_ = child_setup;
+
+ Glib::ScopedPtr<char> buf_standard_output;
+ Glib::ScopedPtr<char> buf_standard_error;
+ GError* error = 0;
+
+ g_spawn_sync(
+ working_directory.c_str(),
+ const_cast<char**>(argv.data()), 0,
+ static_cast<GSpawnFlags>(unsigned(flags)),
+ (setup_slot) ? &child_setup_callback : 0,
+ (setup_slot) ? &child_setup_ : 0,
+ (standard_output) ? buf_standard_output.addr() : 0,
+ (standard_error) ? buf_standard_error.addr() : 0,
+ exit_status,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+
+ copy_output_buf(standard_output, buf_standard_output.get());
+ copy_output_buf(standard_error, buf_standard_error.get());
+}
+
+void spawn_command_line_async(const std::string& command_line)
+{
+ GError* error = 0;
+ g_spawn_command_line_async(command_line.c_str(), &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+}
+
+void spawn_command_line_sync(const std::string& command_line,
+ std::string* standard_output,
+ std::string* standard_error,
+ int* exit_status)
+{
+ Glib::ScopedPtr<char> buf_standard_output;
+ Glib::ScopedPtr<char> buf_standard_error;
+ GError* error = 0;
+
+ g_spawn_command_line_sync(
+ command_line.c_str(),
+ (standard_output) ? buf_standard_output.addr() : 0,
+ (standard_error) ? buf_standard_error.addr() : 0,
+ exit_status,
+ &error);
+
+ if(error)
+ Glib::Error::throw_exception(error);
+
+ copy_output_buf(standard_output, buf_standard_output.get());
+ copy_output_buf(standard_error, buf_standard_error.get());
+}
+
+void spawn_close_pid(Pid pid)
+{
+ g_spawn_close_pid(pid);
+}
+
+} // namespace Glib
+
+
+namespace
+{
+} // anonymous namespace
+
+
+Glib::SpawnError::SpawnError(Glib::SpawnError::Code error_code, const Glib::ustring& error_message)
+:
+ Glib::Error (G_SPAWN_ERROR, error_code, error_message)
+{}
+
+Glib::SpawnError::SpawnError(GError* gobject)
+:
+ Glib::Error (gobject)
+{}
+
+Glib::SpawnError::Code Glib::SpawnError::code() const
+{
+ return static_cast<Code>(Glib::Error::code());
+}
+
+void Glib::SpawnError::throw_func(GError* gobject)
+{
+ throw Glib::SpawnError(gobject);
+}
+
+