]> git.lyx.org Git - lyx.git/blobdiff - src/lyxserver.C
add missing writeNormal() methods to some insets
[lyx.git] / src / lyxserver.C
index 0d6662cd96371c358186f68fddffd025369e8ee5..fa0294c5dd921099b1b309161eead5611a935095 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <config.h>
 
-//#include <cstring>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
@@ -81,14 +80,24 @@ int mkfifo(char const * __path, mode_t __mode) {
 
 extern LyXAction lyxaction;
 
-// C wrapper
-extern "C" void C_LyXComm_callback(int fd, void *v);
+
+extern "C" {
+       
+       // C wrapper
+       static
+       void C_LyXComm_callback(int fd, void *v)
+       {
+               LyXComm::callback(fd, v);
+       }
+
+}
 
 
 // LyXComm class
- // Open pipes
-void LyXComm::openConnection() {
+
+// Open pipes
+void LyXComm::openConnection()
+{
        lyxerr[Debug::LYXSERVER] << "LyXComm: Opening connection" << endl;
        
        // If we are up, that's an error
@@ -101,193 +110,151 @@ void LyXComm::openConnection() {
  
        if (pipename.empty()) return;
 
-       // --- prepare input pipe ---------------------------------------
+       if ((infd = startPipe(pipename + ".in")) == -1)
+               return;
+
+       if ((outfd = startPipe(pipename + ".out")) == -1) {
+               endPipe(infd, pipename + ".in");
+               return;
+       }
+       if (fcntl(outfd, F_SETFL, O_NONBLOCK) < 0) {
+               lyxerr << "LyXComm: Could not set flags on pipe " << pipename << ".out"
+                      << '\n' << strerror(errno) << endl;
+               return;
+       }
+       // We made it!
+       ready = true;
+       lyxerr[Debug::LYXSERVER] << "LyXComm: Connection established" << endl;
+}
+
+       
+/// Close pipes
+void LyXComm::closeConnection()
+{
+               lyxerr[Debug::LYXSERVER] << "LyXComm: Closing connection" << endl;
+
+       if (pipename.empty()) {
+               return;
+       }
+
+       if (!ready) {
+               lyxerr << "LyXComm: Already disconnected" << endl;
+               return;
+       }
+       endPipe(infd, pipename + ".in");
+       endPipe(outfd, pipename + ".out");
+       ready = false;
+}
+
+int LyXComm::startPipe(string const & filename)
+{
+       int fd;
  
-       string tmp = pipename + ".in";
-       
 #ifdef __EMX__
-       HPIPE fd;
+       HPIPE os2fd;
        APIRET rc;
        int errnum;
        // Try create one instance of named pipe with the mode O_RDONLY|O_NONBLOCK.
        // The current emx implementation of access() won't work with pipes.
-       rc = DosCreateNPipe(tmp.c_str(), &fd, NP_ACCESS_INBOUND,
+       rc = DosCreateNPipe(filename.c_str(), &os2fd, NP_ACCESS_INBOUND,
                NP_NOWAIT|0x01, 0600, 0600, 0);
        if (rc == ERROR_PIPE_BUSY) {
-#else
-       if (::access(tmp.c_str(), F_OK) == 0) {
-#endif
-               lyxerr << "LyXComm: Pipe " << tmp << " already exists.\n"
+               lyxerr << "LyXComm: Pipe " << filename << " already exists.\n"
                       << "If no other LyX program is active, please delete"
                        " the pipe by hand and try again." << endl;
                pipename.erase();
-               return;
+               return -1;
        }
-#ifndef __EMX__
-       if (::mkfifo(tmp.c_str(), 0600) < 0) {
-               lyxerr << "LyXComm: Could not create pipe " << tmp << '\n'
-                      << strerror(errno) << endl;
-               return;
-       };
-       infd = ::open(tmp.c_str(), O_RDONLY|O_NONBLOCK);
-#else
        if (rc != NO_ERROR) {
                errnum = TranslateOS2Error(rc);
-               lyxerr <<"LyXComm: Could not create pipe " << tmp
+               lyxerr <<"LyXComm: Could not create pipe " << filename
                       << strerror(errnum) << endl;
-               return;
+               return -1;
        };
        // Listen to it.
-       rc = DosConnectNPipe(fd);
+       rc = DosConnectNPipe(os2fd);
        if (rc != NO_ERROR && rc != ERROR_PIPE_NOT_CONNECTED) {
                errnum = TranslateOS2Error(rc);
-               lyxerr <<"LyXComm: Could not create pipe " << tmp
+               lyxerr <<"LyXComm: Could not create pipe " << filename
                       << strerror(errnum) << endl;
-               return;
+               return -1;
        };
        // Imported handles can be used both with OS/2 APIs and emx
        // library functions. 
-       infd = _imphandle(fd);
-#endif
-       if (infd < 0) {
-               lyxerr << "LyXComm: Could not open pipe " << tmp << '\n'
-                      << strerror(errno) << endl;
-               return;
-       }
-       fl_add_io_callback(infd, FL_READ, C_LyXComm_callback, this);
-       // --- prepare output pipe ---------------------------------------
-       tmp = pipename + ".out";
-       
-#ifndef __EMX__       
-       if (::access(tmp.c_str(), F_OK) == 0) {
+       fd = _imphandle(os2fd);
 #else
-       rc = DosCreateNPipe(tmp.c_str(), &fd, NP_ACCESS_DUPLEX,
-               NP_NOWAIT|0x01, 0600, 0600, 0);
-
-       if (rc == ERROR_PIPE_BUSY) {
-#endif
-               lyxerr << "LyXComm: Pipe " << tmp << " already exists.\n"
+       if (::access(filename.c_str(), F_OK) == 0) {
+               lyxerr << "LyXComm: Pipe " << filename << " already exists.\n"
                       << "If no other LyX program is active, please delete"
                        " the pipe by hand and try again." << endl;
                pipename.erase();
-               return;
+               return -1;
        }
-#ifndef __EMX__
-       if (::mkfifo(tmp.c_str(), 0600) < 0) {
-               lyxerr << "LyXComm: Could not create pipe " << tmp << '\n'
+       if (::mkfifo(filename.c_str(), 0600) < 0) {
+               lyxerr << "LyXComm: Could not create pipe " << filename << '\n'
                       << strerror(errno) << endl;
-               return;
+               return -1;
        };
-       if (::access(tmp.c_str(), F_OK) != 0) {
-               lyxerr << "LyXComm: Pipe " << tmp
-                      << " does not exist" << endl;
-               return;
-       }
-       outfd = ::open(tmp.c_str(), O_RDWR);
-#else
-       if (rc != NO_ERROR) {
-               errnum = TranslateOS2Error(rc);
-               lyxerr << "LyXComm: Could not create pipe " << tmp << '\n'
-                      << strerror(errnum) << endl;
-               return;
-       }
-       rc = DosConnectNPipe(fd);
-       if (rc == ERROR_BAD_PIPE) {
-               lyxerr << "LyXComm: Pipe " << tmp
-                      << " does not exist" << endl;
-               return;
-       }
-       if (rc != NO_ERROR && rc != ERROR_PIPE_NOT_CONNECTED) {
-               errnum = TranslateOS2Error(rc);
-               lyxerr << "LyXComm: Could not create pipe " << tmp << '\n'
-                      << strerror(errnum) << endl;
-               return;
-       }
-       outfd = _imphandle(fd);
+       fd = ::open(filename.c_str(), O_RDONLY|O_NONBLOCK);
 #endif
-       if (outfd < 0) {
-               lyxerr << "LyXComm: Could not open pipe " << tmp << '\n'
+       if (fd < 0) {
+               lyxerr << "LyXComm: Could not open pipe " << filename << '\n'
                       << strerror(errno) << endl;
-               return;
+               lyx::unlink(filename);
+               return -1;
        }
-       if (fcntl(outfd, F_SETFL, O_NONBLOCK) < 0) {
-               lyxerr << "LyXComm: Could not set flags on pipe " << tmp
-                      << '\n' << strerror(errno) << endl;
-               return;
-       };
-       // We made it!
-       ready = true;
-       lyxerr[Debug::LYXSERVER] << "LyXComm: Connection established" << endl;
+       fl_add_io_callback(fd, FL_READ, C_LyXComm_callback, this);
+       return fd;
 }
-/// Close pipes
-void LyXComm::closeConnection() {
+
+
+void LyXComm::endPipe(int fd, string const & filename)
+{
+       if (fd < 0)
+               return;
+
 #ifdef __EMX__
        APIRET rc;
        int errnum;
-#endif
-               lyxerr[Debug::LYXSERVER] << "LyXComm: Closing connection" << endl;
-
-       if (pipename.empty()) {
-               return;
-       }
-
-       if (!ready) {
-               lyxerr << "LyXComm: Already disconnected" << endl;
+       rc = DosDisConnectNPipe(fd);
+       if (rc != NO_ERROR) {
+               errnum = TranslateOS2Error(rc);
+               lyxerr << "LyXComm: Could not disconnect pipe " << filename
+                      << '\n' << strerror(errnum) << endl;
                return;
        }
-       if (infd > -1) {
-               fl_remove_io_callback(infd, FL_READ, C_LyXComm_callback);
-               string tmp = pipename + ".in";
-#ifdef __EMX__         // Notify the operating system.
-               rc = DosDisConnectNPipe(infd);
-               if (rc != NO_ERROR) {
-                       errnum = TranslateOS2Error(rc);
-                       lyxerr << "LyXComm: Could not disconnect pipe " << tmp
-                              << '\n' << strerror(errnum) << endl;
-                       return;
-               }
-#endif
-               if (close(infd) < 0) {
-                       lyxerr << "LyXComm: Could not close pipe " << tmp
-                              << '\n' << strerror(errno) << endl;
-               }
-#ifndef __EMX__                // OS/2 named pipes will be automatically removed.
-               if (lyx::unlink(tmp) < 0){
-                       lyxerr << "LyXComm: Could not remove pipe " << tmp
-                              << '\n' << strerror(errno) << endl;
-               };
 #endif
+       if (::close(fd) < 0) {
+               lyxerr << "LyXComm: Could not close pipe " << filename
+                      << '\n' << strerror(errno) << endl;
        }
-       if (outfd > -1) {
-               string tmp = pipename + ".out";
-#ifdef __EMX__
-               rc = DosDisConnectNPipe(outfd);
-               if (rc != NO_ERROR) {
-                       errnum = TranslateOS2Error(rc);
-                       lyxerr << "LyXComm: Could not disconnect pipe " << tmp
-                              << '\n' << strerror(errnum) << endl;
-                       return;
-               }
-#endif
-               if (::close(outfd) < 0) {
-                       lyxerr << "LyXComm: Could not close pipe " << tmp
-                              << '\n' << strerror(errno) << endl;
-               }
+// OS/2 pipes are deleted automatically
 #ifndef __EMX__
-               if (lyx::unlink(tmp) < 0){
-                       lyxerr << "LyXComm: Could not remove pipe " << tmp
-                              << '\n' << strerror(errno) << endl;
-               };
+       if (lyx::unlink(filename) < 0){
+               lyxerr << "LyXComm: Could not remove pipe " << filename
+                      << '\n' << strerror(errno) << endl;
+       };
 #endif
-       }
-       ready = false;
 }
+
+
+void LyXComm::emergencyCleanup()
+{
+       endPipe(infd, pipename + ".in");
+       endPipe(outfd, pipename + ".out");
+}
+
+
 // Receives messages and sends then to client
 void LyXComm::callback(int fd, void *v)
 {
@@ -353,13 +320,9 @@ void LyXComm::callback(int fd, void *v)
        errno= 0;
 }
 
-extern "C" void C_LyXComm_callback(int fd, void *v)
-{
-       LyXComm::callback(fd, v);
-}
 
-void LyXComm::send(string const & msg) {
+void LyXComm::send(string const & msg)
+{
        if (msg.empty()) {
                lyxerr << "LyXComm: Request to send empty string. Ignoring."
                       << endl;