X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fipc.cpp;h=4d1db5678f3cef23d4d6a22a8b169327c43311c9;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=d6e14aa15a434f49b85aaed8bd4af191a9c985f0;hpb=5b563cca093fe09eb397bbbf336412d9fa6fb4bd;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/ipc.cpp b/synfig-studio/trunk/src/gtkmm/ipc.cpp index d6e14aa..4d1db56 100644 --- a/synfig-studio/trunk/src/gtkmm/ipc.cpp +++ b/synfig-studio/trunk/src/gtkmm/ipc.cpp @@ -2,10 +2,11 @@ /*! \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-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -66,6 +67,8 @@ #include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -105,7 +108,7 @@ pipe_listen_thread() 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; @@ -116,7 +119,7 @@ pipe_listen_thread() if(connected) do { String data; - char c; + char c; do { success= ReadFile( @@ -133,7 +136,7 @@ pipe_listen_thread() cmd_queue.push_back(data); cmd_dispatcher->emit(); } while(success && read_bytes); - + CloseHandle(pipe_handle); } } @@ -161,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) { synfig::error("IPC(): mkfifo failed for "+fifo_path()); } - + { fd=open(fifo_path().c_str(),O_RDWR); if(fd<0) { - synfig::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, @@ -205,7 +209,7 @@ IPC::~IPC() // fclose(file.get()); remove(fifo_path().c_str()); - + //if(fd>=0) // close(fd); } @@ -223,8 +227,6 @@ IPC::fifo_path() bool IPC::fifo_activity(Glib::IOCondition cond) { - synfig::info(__FILE__":%d: fifo activity",__LINE__); - if(cond&(Glib::IO_ERR|Glib::IO_HUP|Glib::IO_NVAL)) { if(cond&(Glib::IO_ERR)) @@ -235,7 +237,6 @@ IPC::fifo_activity(Glib::IOCondition cond) synfig::error("IPC::fifo_activity(): IO_NVAL"); return false; } - synfig::info(__FILE__":%d: fifo activity",__LINE__); String command; { @@ -247,7 +248,8 @@ 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; } @@ -257,13 +259,19 @@ 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 @@ -285,7 +293,7 @@ IPC::process_command(const synfig::String& command_line) synfig::warning("Received unknown command '%c' with arg '%s'",cmd,args.c_str()); break; } - + return true; } @@ -302,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) { - synfig::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")); - synfig::info("uplink fd=%d",fd); +#ifdef _DEBUG + // synfig::info("uplink fd=%d",fd); +#endif return ret; }