X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3103e8a97e834e9793f0eb149aa82a99fd64ef9a..eea4d01c65f9b29baa1193db762b4c6b8144af24:/src/cocoa/utilsexc.mm?ds=sidebyside diff --git a/src/cocoa/utilsexc.mm b/src/cocoa/utilsexc.mm index 201db2a5a2..7df71bf321 100644 --- a/src/cocoa/utilsexc.mm +++ b/src/cocoa/utilsexc.mm @@ -6,30 +6,33 @@ // Created: 2004-10-05 // RCS-ID: $Id$ // Copyright: (c) Ryan Norton -// Licence: wxWindows licence +// Licence: wxWindows licence // Notes: This code may be useful on platforms other than Darwin. // On Darwin we share the CoreFoundation code with wxMac. ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" + #ifndef WX_PRECOMP + #include "wx/utils.h" #endif + #include "wx/unix/execute.h" -#include "wx/utils.h" #if 0 -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "wx/utils.h" +#ifndef WX_PRECOMP + #if wxUSE_STREAMS + #include "wx/stream.h" + #endif // wxUSE_STREAMS +#endif //WX_PRECOMP #include "wx/process.h" -#include "wx/stream.h" #include "wx/cocoa/string.h" +#include "wx/cocoa/objc/objc_uniquifying.h" + #import #import @@ -43,14 +46,14 @@ class wxPipeInputStream : public wxInputStream { public: - wxPipeInputStream(NSPipe* thePipe) : + wxPipeInputStream(NSPipe* thePipe) : m_thePipe(thePipe), m_theHandle([m_thePipe fileHandleForReading]) { } ~wxPipeInputStream() - { + { [m_thePipe release]; } @@ -61,23 +64,23 @@ protected: memcpy(buffer, [theData bytes], [theData length]); return [theData length]; } - - - NSPipe* m_thePipe; - NSFileHandle* m_theHandle; + + + NSPipe* m_thePipe; + NSFileHandle* m_theHandle; }; class wxPipeOutputStream : public wxOutputStream { public: - wxPipeOutputStream(NSPipe* thePipe) : + wxPipeOutputStream(NSPipe* thePipe) : m_thePipe(thePipe), m_theHandle([m_thePipe fileHandleForWriting]) { } ~wxPipeOutputStream() - { + { [m_thePipe release]; } @@ -85,14 +88,14 @@ protected: virtual size_t OnSysWrite(const void *buffer, size_t bufsize) { - NSData* theData = [NSData dataWithBytesNoCopy:(void*)buffer + NSData* theData = [NSData dataWithBytesNoCopy:(void*)buffer length:bufsize]; [m_theHandle writeData:theData]; return bufsize; } - - NSPipe* m_thePipe; - NSFileHandle* m_theHandle; + + NSPipe* m_thePipe; + NSFileHandle* m_theHandle; }; @interface wxTaskHandler : NSObject @@ -103,92 +106,94 @@ protected: -(id)init:(void*)handle processIdentifier:(long)pid; - (void)termHandler:(NSNotification *)aNotification; @end +WX_DECLARE_GET_OBJC_CLASS(wxTaskHandler,NSObject) @implementation wxTaskHandler : NSObject --(id)init:(void*)handle processIdentifier:(long)pid +-(id)init:(void*)handle processIdentifier:(long)pid { self = [super init]; - + m_handle = handle; m_pid = pid; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(termHandler:) - name:NSTaskDidTerminateNotification + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(termHandler:) + name:NSTaskDidTerminateNotification object:nil]; return self; } -- (void)termHandler:(NSNotification *)aNotification +- (void)termHandler:(NSNotification *)aNotification { NSTask* theTask = [aNotification object]; - + if ([theTask processIdentifier] == m_pid) { - ((wxProcess*)m_handle)->OnTerminate([theTask processIdentifier], + ((wxProcess*)m_handle)->OnTerminate([theTask processIdentifier], [theTask terminationStatus]); - + [self release]; } } @end +WX_IMPLEMENT_GET_OBJC_CLASS(wxTaskHandler,NSObject) -long wxExecute(const wxString& command, - int sync, - wxProcess *handle) +long wxExecute(const wxString& command, + int sync, + wxProcess *handle, + const wxExecuteEnv *env) { NSTask* theTask = [[NSTask alloc] init]; - + if (handle && handle->IsRedirected()) { NSPipe* theStdinPipe = [[NSPipe alloc] init]; NSPipe* theStderrPipe = [[NSPipe alloc] init]; NSPipe* theStdoutPipe = [[NSPipe alloc] init]; - + [theTask setStandardInput:theStdinPipe]; [theTask setStandardError:theStderrPipe]; [theTask setStandardOutput:theStdoutPipe]; - + handle->SetPipeStreams(new wxPipeInputStream(theStdoutPipe), new wxPipeOutputStream(theStdinPipe), new wxPipeInputStream(theStderrPipe) ); } - - NSArray* theQuoteArguments = + + NSArray* theQuoteArguments = [wxNSStringWithWxString(command) componentsSeparatedByString:@"\""]; - - NSMutableArray* theSeparatedArguments = + + NSMutableArray* theSeparatedArguments = [NSMutableArray arrayWithCapacity:10]; - + for (unsigned i = 0; i < [theQuoteArguments count]; ++i) { [theSeparatedArguments addObjectsFromArray: [[theQuoteArguments objectAtIndex:i] componentsSeparatedByString:@" "] ]; - + if(++i < [theQuoteArguments count]) [theSeparatedArguments addObject:[theQuoteArguments objectAtIndex:i]]; } - + [theTask setLaunchPath:[theSeparatedArguments objectAtIndex:0]]; [theTask setArguments:theSeparatedArguments]; [theTask launch]; - + if(sync & wxEXEC_ASYNC) { - [[wxTaskHandler alloc]init:handle + [[WX_GET_OBJC_CLASS(wxTaskHandler) alloc]init:handle processIdentifier:[theTask processIdentifier]]; - + return 0; } else { [theTask waitUntilExit]; - + return [theTask terminationStatus]; - } + } } #endif //0 -