Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / ipc.cpp
index 630063c..4d1db56 100644 (file)
@@ -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
 */
 /* ========================================================================= */
 #include <sys/stat.h>
 #endif
 
-#include <sinfg/main.h>
+#ifdef HAVE_SYS_ERRNO_H
+#include <sys/errno.h>
+#endif
+
+#include <synfig/main.h>
 #include "app.h"
 
 #ifdef HAVE_UNISTD_H
 
 #include "toolbox.h"
 #include <glibmm/dispatcher.h>
-#include <sinfg/mutex.h>
-#include <sinfg/string.h>
+#include <synfig/mutex.h>
+#include <synfig/string.h>
 #include <glibmm/thread.h>
 
+#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<sinfg::String> cmd_queue;
+static synfig::Mutex cmd_mutex;
+static std::list<synfig::String> 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<long int>(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;
 }