X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftags%2Fstable%2Fsrc%2Fgtkmm%2Fipc.cpp;h=4d1db5678f3cef23d4d6a22a8b169327c43311c9;hb=47fce282611fbba1044921d22ca887f9b53ad91a;hp=630063c3b7f08acad5f00b1553e466e179184879;hpb=7c6d5426922cb3cda793f688dcd4d534b02765c8;p=synfig.git diff --git a/synfig-studio/tags/stable/src/gtkmm/ipc.cpp b/synfig-studio/tags/stable/src/gtkmm/ipc.cpp index 630063c..4d1db56 100644 --- a/synfig-studio/tags/stable/src/gtkmm/ipc.cpp +++ b/synfig-studio/tags/stable/src/gtkmm/ipc.cpp @@ -1,20 +1,22 @@ -/* === S I N F G =========================================================== */ +/* === S Y N F I G ========================================================= */ /*! \file ipc.cpp ** \brief Template File ** -** $Id: ipc.cpp,v 1.6 2005/01/16 19:55:57 darco Exp $ +** $Id$ ** ** \legal -** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** -** This software and associated documentation -** are CONFIDENTIAL and PROPRIETARY property of -** the above-mentioned copyright holder. +** This package 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. ** -** You may not copy, print, publish, or in any -** other way distribute this software without -** a prior written agreement with -** the copyright holder. +** This package 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. ** \endlegal */ /* ========================================================================= */ @@ -38,7 +40,11 @@ #include #endif -#include +#ifdef HAVE_SYS_ERRNO_H +#include +#endif + +#include #include "app.h" #ifdef HAVE_UNISTD_H @@ -57,17 +63,19 @@ #include "toolbox.h" #include -#include -#include +#include +#include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ using namespace std; using namespace etl; -using namespace sinfg; +using namespace synfig; using namespace studio; /* === M A C R O S ========================================================= */ @@ -76,8 +84,8 @@ using namespace studio; #ifdef _WIN32 #define WIN32_PIPE_PATH "\\\\.\\pipe\\SynfigStudio.Cmd" -static sinfg::Mutex cmd_mutex; -static std::list cmd_queue; +static synfig::Mutex cmd_mutex; +static std::list cmd_queue; static Glib::Dispatcher* cmd_dispatcher; static void pipe_listen_thread() @@ -97,10 +105,10 @@ pipe_listen_thread() ); if(pipe_handle==INVALID_HANDLE_VALUE) { - sinfg::error("IPC(): Call to CreateNamedPipe failed. Ignore next error. GetLastError=%d",GetLastError()); + synfig::error("IPC(): Call to CreateNamedPipe failed. Ignore next error. GetLastError=%d",GetLastError()); return; } - + bool connected; connected=ConnectNamedPipe(pipe_handle,NULL)?true:(GetLastError()==ERROR_PIPE_CONNECTED); DWORD read_bytes; @@ -111,7 +119,7 @@ pipe_listen_thread() if(connected) do { String data; - char c; + char c; do { success= ReadFile( @@ -124,11 +132,11 @@ pipe_listen_thread() if(success && read_bytes==1 && c!='\n') data+=c; }while(c!='\n'); - sinfg::Mutex::Lock lock(cmd_mutex); + synfig::Mutex::Lock lock(cmd_mutex); cmd_queue.push_back(data); cmd_dispatcher->emit(); } while(success && read_bytes); - + CloseHandle(pipe_handle); } } @@ -136,7 +144,7 @@ pipe_listen_thread() static void empty_cmd_queue() { - sinfg::Mutex::Lock lock(cmd_mutex); + synfig::Mutex::Lock lock(cmd_mutex); while(!cmd_queue.empty()) { IPC::process_command(cmd_queue.front()); @@ -156,34 +164,35 @@ IPC::IPC() cmd_dispatcher=new Glib::Dispatcher; cmd_dispatcher->connect(sigc::ptr_fun(empty_cmd_queue)); - + Glib::Thread::create( sigc::ptr_fun(pipe_listen_thread), false ); - + #else - + remove(fifo_path().c_str()); fd=-1; - + if(mkfifo(fifo_path().c_str(), S_IRWXU)!=0) { - sinfg::error("IPC(): mkfifo failed for "+fifo_path()); + synfig::error("IPC(): mkfifo failed for "+fifo_path()); } - + { fd=open(fifo_path().c_str(),O_RDWR); if(fd<0) { - sinfg::error("IPC(): Failed to open fifo \"%s\". (errno=%d)",fifo_path().c_str(),errno); + synfig::error("IPC(): Failed to open fifo \"%s\". (errno=?)",fifo_path().c_str()); + //synfig::error("IPC(): Failed to open fifo \"%s\". (errno=%d)",fifo_path().c_str(),::errno); } else { file=SmartFILE(fdopen(fd,"r")); - + Glib::signal_io().connect( sigc::mem_fun(this,&IPC::fifo_activity), fd, @@ -200,12 +209,12 @@ IPC::~IPC() // fclose(file.get()); remove(fifo_path().c_str()); - + //if(fd>=0) // close(fd); } -sinfg::String +synfig::String IPC::fifo_path() { #ifdef _WIN32 @@ -218,19 +227,16 @@ IPC::fifo_path() bool IPC::fifo_activity(Glib::IOCondition cond) { - sinfg::info(__FILE__":%d: fifo activity",__LINE__); - if(cond&(Glib::IO_ERR|Glib::IO_HUP|Glib::IO_NVAL)) { if(cond&(Glib::IO_ERR)) - sinfg::error("IPC::fifo_activity(): IO_ERR"); + synfig::error("IPC::fifo_activity(): IO_ERR"); if(cond&(Glib::IO_HUP)) - sinfg::error("IPC::fifo_activity(): IO_HUP"); + synfig::error("IPC::fifo_activity(): IO_HUP"); if(cond&(Glib::IO_NVAL)) - sinfg::error("IPC::fifo_activity(): IO_NVAL"); + synfig::error("IPC::fifo_activity(): IO_NVAL"); return false; } - sinfg::info(__FILE__":%d: fifo activity",__LINE__); String command; { @@ -242,23 +248,30 @@ IPC::fifo_activity(Glib::IOCondition cond) command+=tmp; } while(tmp!='\n'); } - + + synfig::info("%s:%d: fifo activity: '%s'", __FILE__, __LINE__, command.c_str()); process_command(command); return true; } bool -IPC::process_command(const sinfg::String& command_line) +IPC::process_command(const synfig::String& command_line) { if(command_line.empty()) return false; - - char cmd=command_line[0]; - + + char cmd = command_line[0]; + String args(command_line.begin()+1,command_line.end()); - while(!args.empty() && args[0]==' ') args.erase(args.begin()); - while(!args.empty() && args[args.size()-1]=='\n' || args[args.size()-1]==' ') args.erase(args.end()-1); - + + // erase leading spaces + while (!args.empty() && args[0] == ' ') + args.erase(args.begin()); + + // erase trailing newlines and spaces + while (!args.empty() && (args[args.size()-1] == '\n' || args[args.size()-1] == ' ')) + args.erase(args.end()-1); + switch(toupper(cmd)) { case 'F': // Focus/Foreground @@ -277,14 +290,14 @@ IPC::process_command(const sinfg::String& command_line) App::quit(); break; default: - sinfg::warning("Received unknown command '%c' with arg '%s'",cmd,args.c_str()); + synfig::warning("Received unknown command '%c' with arg '%s'",cmd,args.c_str()); break; } - + return true; } -sinfg::SmartFILE +synfig::SmartFILE IPC::make_connection() { SmartFILE ret; @@ -297,28 +310,34 @@ IPC::make_connection() NULL, // security attributes OPEN_EXISTING, // creation disposition FILE_ATTRIBUTE_NORMAL, // flags and attributes - NULL // template file + NULL // template file ); if(pipe_handle==INVALID_HANDLE_VALUE) { - sinfg::warning("IPC::make_connection(): Unable to connect to previous instance. GetLastError=%d",GetLastError()); + DWORD error = GetLastError(); +#ifndef _DEBUG + if( error != ERROR_FILE_NOT_FOUND ) +#endif + synfig::warning("IPC::make_connection(): Unable to connect to previous instance. GetLastError=%d",error); } int fd=_open_osfhandle(reinterpret_cast(pipe_handle),_O_APPEND|O_WRONLY); #else struct stat file_stat; if(stat(fifo_path().c_str(),&file_stat)!=0) return ret; - + if(!S_ISFIFO(file_stat.st_mode)) return ret; - + int fd=open(fifo_path().c_str(),O_WRONLY|O_NONBLOCK); #endif - + if(fd>=0) ret=SmartFILE(fdopen(fd,"w")); - sinfg::info("uplink fd=%d",fd); +#ifdef _DEBUG + // synfig::info("uplink fd=%d",fd); +#endif return ret; }