X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c8023fed763ccd02964dc5b5201371b7d3cfda55..e11898f903183f897a2b2a50a4447ea73ba7273f:/src/mac/carbon/utilsexc.cpp diff --git a/src/mac/carbon/utilsexc.cpp b/src/mac/carbon/utilsexc.cpp index 1d9082a085..6d7c4e5600 100644 --- a/src/mac/carbon/utilsexc.cpp +++ b/src/mac/carbon/utilsexc.cpp @@ -10,7 +10,7 @@ ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation +//#pragma implementation #endif #include "wx/log.h" @@ -19,7 +19,9 @@ #include "wx/unix/execute.h" #include #include +extern "C" { #include +} #include #endif @@ -28,26 +30,41 @@ #include #ifndef __DARWIN__ -#define wxEXECUTE_WIN_MESSAGE 10000 -long wxExecute(const wxString& command, int flags, wxProcess *handler) +#include "wx/mac/private.h" +#include "LaunchServices.h" + +long wxExecute(const wxString& command, int flags, wxProcess *WXUNUSED(handler)) { - // TODO - wxFAIL_MSG( _T("wxExecute() not yet implemented") ); - return 0; + wxASSERT_MSG( flags == wxEXEC_ASYNC, + wxT("wxExecute: Only wxEXEC_ASYNC is supported") ); + + FSRef fsRef ; + OSErr err = noErr ; + err = wxMacPathToFSRef( command , &fsRef ) ; + if ( noErr == err ) + { + err = LSOpenFSRef( &fsRef , NULL ) ; + } + + // 0 means execution failed. Returning non-zero is a PID, but not + // on Mac where PIDs are 64 bits and won't fit in a long, so we + // return a dummy value for now. + return ( err == noErr ) ? -1 : 0; } + #endif #ifdef __DARWIN__ void wxMAC_MachPortEndProcessDetect(CFMachPortRef port, void *data) { wxEndProcessData *proc_data = (wxEndProcessData*)data; - wxLogDebug("Wow.. this actually worked!"); + wxLogDebug(wxT("Wow.. this actually worked!")); int status = 0; int rc = waitpid(abs(proc_data->pid), &status, WNOHANG); if(!rc) { - wxLogDebug("Mach port was invalidated, but process hasn't terminated!"); + wxLogDebug(wxT("Mach port was invalidated, but process hasn't terminated!")); return; } if((rc != -1) && WIFEXITED(status)) @@ -67,14 +84,14 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid) taskOfOurProcess = mach_task_self(); if(taskOfOurProcess == MACH_PORT_NULL) { - wxLogDebug("No mach_task_self()"); + wxLogDebug(wxT("No mach_task_self()")); return -1; } - wxLogDebug("pid=%d",pid); + wxLogDebug(wxT("pid=%d"),pid); kernResult = task_for_pid(taskOfOurProcess,pid, &machPortForProcess); if(kernResult != KERN_SUCCESS) { - wxLogDebug("no task_for_pid()"); + wxLogDebug(wxT("no task_for_pid()")); // try seeing if it is already dead or something // FIXME: a better method would be to call the callback function // from idle time until the process terminates. Of course, how @@ -95,7 +112,7 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid) CFMachPortForProcess = CFMachPortCreateWithPort(NULL, machPortForProcess, NULL, &termcb_contextinfo, &ShouldFreePort); if(!CFMachPortForProcess) { - wxLogDebug("No CFMachPortForProcess"); + wxLogDebug(wxT("No CFMachPortForProcess")); mach_port_deallocate(taskOfOurProcess, machPortForProcess); return -1; } @@ -104,7 +121,7 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid) kernResult = mach_port_deallocate(taskOfOurProcess, machPortForProcess); if(kernResult!=KERN_SUCCESS) { - wxLogDebug("Couldn't deallocate mach port"); + wxLogDebug(wxT("Couldn't deallocate mach port")); return -1; } } @@ -113,7 +130,7 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid) runloopsource = CFMachPortCreateRunLoopSource(NULL,CFMachPortForProcess, (CFIndex)0); if(!runloopsource) { - wxLogDebug("Couldn't create runloopsource"); + wxLogDebug(wxT("Couldn't create runloopsource")); return -1; } @@ -121,7 +138,7 @@ int wxAddProcessCallbackForPid(wxEndProcessData *proc_data, int pid) CFRunLoopAddSource(CFRunLoopGetCurrent(),runloopsource,kCFRunLoopDefaultMode); CFRelease(runloopsource); - wxLogDebug("Successfully added notification to the runloop"); + wxLogDebug(wxT("Successfully added notification to the runloop")); return 0; } #endif