X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/dcb68102796280b3e54979ae95738089914ce842..7198c3368055d88249a338eb33b21f051f674806:/src/cocoa/utilsexc.mm diff --git a/src/cocoa/utilsexc.mm b/src/cocoa/utilsexc.mm index 7d01c682fc..7df71bf321 100644 --- a/src/cocoa/utilsexc.mm +++ b/src/cocoa/utilsexc.mm @@ -1,39 +1,59 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: utilsexec.mm +// Name: src/cocoa/utilsexec.mm // Purpose: Execution-related utilities for wxCocoa // Author: Ryan Norton // Modified by: // 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. ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #include "wx/utils.h" #endif -#include "wx/utils.h" +#include "wx/unix/execute.h" + +#if 0 + +#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 +// +// RN: This is a prelimenary implementation - simple +// launching and process redirection works, +// but with the piping tests in the exec sample +// SIGPIPE is triggered... +// + class wxPipeInputStream : public wxInputStream { public: - wxPipeInputStream(NSPipe* thePipe) : + wxPipeInputStream(NSPipe* thePipe) : m_thePipe(thePipe), m_theHandle([m_thePipe fileHandleForReading]) { } ~wxPipeInputStream() - { + { [m_thePipe release]; } @@ -44,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]; } @@ -68,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 @@ -86,90 +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 = wxEXEC_ASYNC, - wxProcess *handle = NULL) +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* theSeperatedArguments = + + NSMutableArray* theSeparatedArguments = [NSMutableArray arrayWithCapacity:10]; - + for (unsigned i = 0; i < [theQuoteArguments count]; ++i) { - [theSeperatedArguments addObjectsFromArray: + [theSeparatedArguments addObjectsFromArray: [[theQuoteArguments objectAtIndex:i] componentsSeparatedByString:@" "] ]; - + if(++i < [theQuoteArguments count]) - [theSeperatedArguments addObject:[theQuoteArguments objectAtIndex:i]]; + [theSeparatedArguments addObject:[theQuoteArguments objectAtIndex:i]]; } - - [theTask setLaunchPath:[theSeperatedArguments objectAtIndex:0]]; - [theTask setArguments:theSeperatedArguments]; + + [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]; - } -} \ No newline at end of file + } +} +#endif //0