]> git.lyx.org Git - features.git/commitdiff
Launch external Windows processes for e.g. display image conversion using CreateProce...
authorJoost Verburg <joostverburg@users.sourceforge.net>
Mon, 28 Jun 2010 17:45:04 +0000 (17:45 +0000)
committerJoost Verburg <joostverburg@users.sourceforge.net>
Mon, 28 Jun 2010 17:45:04 +0000 (17:45 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34721 a592a061-630c-0410-9148-cb99ea01b6c8

src/support/ForkedCalls.cpp
src/support/filetools.cpp

index fb9dd608f8903ba0245b47f71d6d7b39fb66742e..fd4fb62d1270f1780e735db1394a5ab2246b40e9 100644 (file)
@@ -300,6 +300,9 @@ int ForkedCall::generateChild()
        if (line.empty())
                return 1;
 
+#if !defined (_WIN32)
+       // POSIX
+
        // Split the input command up into an array of words stored
        // in a contiguous block of memory. The array contains pointers
        // to each word.
@@ -326,23 +329,11 @@ int ForkedCall::generateChild()
                        if (c == ' ')
                                *it = '\0';
                        else if (c == '\'' || c == '"') {
-#if defined (_WIN32)
-                               // How perverse!
-                               // spawnvp *requires* the quotes or it will
-                               // split the arg at the internal whitespace!
-                               // Make shure the quote is a DOS-style one.
-                               *it = '"';
-#else
                                *it = '\0';
-#endif
                                inside_quote = c;
                        }
                } else if (c == inside_quote) {
-#if defined (_WIN32)
-                       *it = '"';
-#else
                        *it = '\0';
-#endif
                        inside_quote = 0;
                }
        }
@@ -370,9 +361,6 @@ int ForkedCall::generateChild()
                lyxerr << "</command>" << endl;
        }
 
-#ifdef _WIN32
-       pid_t const cpid = spawnvp(_P_NOWAIT, argv[0], &*argv.begin());
-#else // POSIX
        pid_t const cpid = ::fork();
        if (cpid == 0) {
                // Child
@@ -383,6 +371,24 @@ int ForkedCall::generateChild()
                       << strerror(errno) << endl;
                _exit(1);
        }
+#else
+       // Windows
+
+       pid_t cpid = -1;
+
+       STARTUPINFO startup; 
+       PROCESS_INFORMATION process; 
+
+       memset(&startup, 0, sizeof(STARTUPINFO));
+       memset(&process, 0, sizeof(PROCESS_INFORMATION));
+    
+       startup.cb = sizeof(STARTUPINFO);
+
+       if (CreateProcess(0, (LPSTR)line.c_str(), 0, 0, FALSE,
+               CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+               CloseHandle(process.hThread);
+               cpid = (pid_t)process.hProcess;
+       }
 #endif
 
        if (cpid < 0) {
@@ -571,6 +577,7 @@ void handleCompletedProcesses()
                        } else {
                                actCall->setRetValue(exit_code);
                        }
+                       CloseHandle(hProcess);
                        remove_it = true;
                        break;
                }
@@ -578,6 +585,7 @@ void handleCompletedProcesses()
                        lyxerr << "WaitForSingleObject failed waiting for child\n"
                               << getChildErrorMessage() << endl;
                        actCall->setRetValue(1);
+                       CloseHandle(hProcess);
                        remove_it = true;
                        break;
                }
index 82854612a00f512c2840f70206fd72994676a400..94a9f78c953a6bcf1550ea81ff5e64167df3e25b 100644 (file)
@@ -39,6 +39,7 @@
 #include <boost/regex.hpp>
 
 #include <fcntl.h>
+#include <io.h>
 
 #include <cerrno>
 #include <cstdlib>
 #include <fstream>
 #include <sstream>
 
+#if defined (_WIN32)
+#include <windows.h>
+#endif
+
 using namespace std;
 
 #define USE_QPROCESS
@@ -766,7 +771,39 @@ cmd_ret const runCommand(string const & cmd)
        // pstream (process stream), with the
        // variants ipstream, opstream
 
-#if defined (HAVE_POPEN)
+#if defined (_WIN32)
+       int fno; 
+       STARTUPINFO startup; 
+       PROCESS_INFORMATION process; 
+       SECURITY_ATTRIBUTES security; 
+       HANDLE in, out;
+       FILE * inf = 0;
+    
+       security.nLength = sizeof(SECURITY_ATTRIBUTES); 
+       security.bInheritHandle = TRUE; 
+       security.lpSecurityDescriptor = NULL; 
+
+       if (CreatePipe(&in, &out, &security, 0)) { 
+               memset(&startup, 0, sizeof(STARTUPINFO));
+               memset(&process, 0, sizeof(PROCESS_INFORMATION));
+    
+               startup.cb = sizeof(STARTUPINFO);
+               startup.dwFlags = STARTF_USESTDHANDLES;
+  
+               startup.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+               startup.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+               startup.hStdOutput = out;
+
+               if (CreateProcess(0, (LPTSTR)cmd.c_str(), &security, &security,
+                       TRUE, CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+
+                       CloseHandle(process.hThread);
+                       fno = _open_osfhandle((long)in, _O_RDONLY);
+                       CloseHandle(out);
+                       inf = _fdopen(fno, "r");
+               }
+       }
+#elif defined (HAVE_POPEN)
        FILE * inf = ::popen(cmd.c_str(), os::popen_read_mode());
 #elif defined (HAVE__POPEN)
        FILE * inf = ::_popen(cmd.c_str(), os::popen_read_mode());
@@ -787,7 +824,11 @@ cmd_ret const runCommand(string const & cmd)
                c = fgetc(inf);
        }
 
-#if defined (HAVE_PCLOSE)
+#if defined (_WIN32)
+       WaitForSingleObject(process.hProcess, INFINITE);
+       CloseHandle(process.hProcess);
+       int const pret = fclose(inf);
+#elif defined (HAVE_PCLOSE)
        int const pret = pclose(inf);
 #elif defined (HAVE__PCLOSE)
        int const pret = _pclose(inf);