Implemented wxExecute (minimal flags support).
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@25839 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
1904aa72f0
commit
fadb227e01
@ -32,12 +32,106 @@ extern "C" {
|
||||
#ifndef __DARWIN__
|
||||
#define wxEXECUTE_WIN_MESSAGE 10000
|
||||
|
||||
long wxExecute(const wxString& command, int flags, wxProcess *handler)
|
||||
{
|
||||
// TODO
|
||||
wxFAIL_MSG( _T("wxExecute() not yet implemented") );
|
||||
return 0;
|
||||
#include "wx/mac/private.h"
|
||||
|
||||
/*
|
||||
Below FinderLaunch function comes from:
|
||||
http://developer.apple.com/technotes/tn/tn1002.html#fndrask
|
||||
*/
|
||||
/* FinderLaunch converts a list of nTargets FSSpec records
|
||||
pointed to by the targetList parameter and converts the
|
||||
list to an Apple Event. It then sends that event to the
|
||||
Finder. The array of FSSpec records pointed to by the
|
||||
targetList parameter may contain references to files,
|
||||
folders, or applications. The net effect of this command
|
||||
is equivalent to the user selecting an icon in one of the
|
||||
Finder's windows and then choosing the open command from
|
||||
the Finder's file menu. */
|
||||
static OSErr FinderLaunch(long nTargets, FSSpec *targetList) {
|
||||
OSErr err;
|
||||
AppleEvent theAEvent, theReply;
|
||||
AEAddressDesc fndrAddress;
|
||||
AEDescList targetListDesc;
|
||||
OSType fndrCreator;
|
||||
Boolean wasChanged;
|
||||
AliasHandle targetAlias;
|
||||
long index;
|
||||
|
||||
/* set up locals */
|
||||
AECreateDesc(typeNull, NULL, 0, &theAEvent);
|
||||
AECreateDesc(typeNull, NULL, 0, &fndrAddress);
|
||||
AECreateDesc(typeNull, NULL, 0, &theReply);
|
||||
AECreateDesc(typeNull, NULL, 0, &targetListDesc);
|
||||
targetAlias = NULL;
|
||||
fndrCreator = 'MACS';
|
||||
|
||||
/* verify parameters */
|
||||
if ((nTargets == 0) || (targetList == NULL)) {
|
||||
err = paramErr;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* create an open documents event targeting the
|
||||
finder */
|
||||
err = AECreateDesc(typeApplSignature, (Ptr) &fndrCreator,
|
||||
sizeof(fndrCreator), &fndrAddress);
|
||||
if (err != noErr) goto bail;
|
||||
err = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
|
||||
&fndrAddress, kAutoGenerateReturnID,
|
||||
kAnyTransactionID, &theAEvent);
|
||||
if (err != noErr) goto bail;
|
||||
|
||||
/* create the list of files to open */
|
||||
err = AECreateList(NULL, 0, false, &targetListDesc);
|
||||
if (err != noErr) goto bail;
|
||||
for ( index=0; index < nTargets; index++) {
|
||||
if (targetAlias == NULL)
|
||||
err = NewAlias(NULL, (targetList + index),
|
||||
&targetAlias);
|
||||
else err = UpdateAlias(NULL, (targetList + index),
|
||||
targetAlias, &wasChanged);
|
||||
if (err != noErr) goto bail;
|
||||
HLock((Handle) targetAlias);
|
||||
err = AEPutPtr(&targetListDesc, (index + 1),
|
||||
typeAlias, *targetAlias,
|
||||
GetHandleSize((Handle) targetAlias));
|
||||
HUnlock((Handle) targetAlias);
|
||||
if (err != noErr) goto bail;
|
||||
}
|
||||
|
||||
/* add the file list to the Apple Event */
|
||||
err = AEPutParamDesc(&theAEvent, keyDirectObject,
|
||||
&targetListDesc);
|
||||
if (err != noErr) goto bail;
|
||||
|
||||
/* send the event to the Finder */
|
||||
err = AESend(&theAEvent, &theReply, kAENoReply,
|
||||
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
|
||||
|
||||
/* clean up and leave */
|
||||
bail:
|
||||
if (targetAlias != NULL) DisposeHandle((Handle) targetAlias);
|
||||
AEDisposeDesc(&targetListDesc);
|
||||
AEDisposeDesc(&theAEvent);
|
||||
AEDisposeDesc(&fndrAddress);
|
||||
AEDisposeDesc(&theReply);
|
||||
return err;
|
||||
}
|
||||
|
||||
long wxExecute(const wxString& command, int flags, wxProcess *WXUNUSED(handler))
|
||||
{
|
||||
wxASSERT_MSG( flags == wxEXEC_ASYNC,
|
||||
wxT("wxExecute: Only wxEXEC_ASYNC is supported") );
|
||||
|
||||
FSSpec fsSpec;
|
||||
wxMacFilename2FSSpec(command, &fsSpec);
|
||||
|
||||
// 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 ( FinderLaunch(1 /*one file*/, &fsSpec) == noErr ) ? -1 : 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __DARWIN__
|
||||
|
@ -32,12 +32,106 @@ extern "C" {
|
||||
#ifndef __DARWIN__
|
||||
#define wxEXECUTE_WIN_MESSAGE 10000
|
||||
|
||||
long wxExecute(const wxString& command, int flags, wxProcess *handler)
|
||||
{
|
||||
// TODO
|
||||
wxFAIL_MSG( _T("wxExecute() not yet implemented") );
|
||||
return 0;
|
||||
#include "wx/mac/private.h"
|
||||
|
||||
/*
|
||||
Below FinderLaunch function comes from:
|
||||
http://developer.apple.com/technotes/tn/tn1002.html#fndrask
|
||||
*/
|
||||
/* FinderLaunch converts a list of nTargets FSSpec records
|
||||
pointed to by the targetList parameter and converts the
|
||||
list to an Apple Event. It then sends that event to the
|
||||
Finder. The array of FSSpec records pointed to by the
|
||||
targetList parameter may contain references to files,
|
||||
folders, or applications. The net effect of this command
|
||||
is equivalent to the user selecting an icon in one of the
|
||||
Finder's windows and then choosing the open command from
|
||||
the Finder's file menu. */
|
||||
static OSErr FinderLaunch(long nTargets, FSSpec *targetList) {
|
||||
OSErr err;
|
||||
AppleEvent theAEvent, theReply;
|
||||
AEAddressDesc fndrAddress;
|
||||
AEDescList targetListDesc;
|
||||
OSType fndrCreator;
|
||||
Boolean wasChanged;
|
||||
AliasHandle targetAlias;
|
||||
long index;
|
||||
|
||||
/* set up locals */
|
||||
AECreateDesc(typeNull, NULL, 0, &theAEvent);
|
||||
AECreateDesc(typeNull, NULL, 0, &fndrAddress);
|
||||
AECreateDesc(typeNull, NULL, 0, &theReply);
|
||||
AECreateDesc(typeNull, NULL, 0, &targetListDesc);
|
||||
targetAlias = NULL;
|
||||
fndrCreator = 'MACS';
|
||||
|
||||
/* verify parameters */
|
||||
if ((nTargets == 0) || (targetList == NULL)) {
|
||||
err = paramErr;
|
||||
goto bail;
|
||||
}
|
||||
|
||||
/* create an open documents event targeting the
|
||||
finder */
|
||||
err = AECreateDesc(typeApplSignature, (Ptr) &fndrCreator,
|
||||
sizeof(fndrCreator), &fndrAddress);
|
||||
if (err != noErr) goto bail;
|
||||
err = AECreateAppleEvent(kCoreEventClass, kAEOpenDocuments,
|
||||
&fndrAddress, kAutoGenerateReturnID,
|
||||
kAnyTransactionID, &theAEvent);
|
||||
if (err != noErr) goto bail;
|
||||
|
||||
/* create the list of files to open */
|
||||
err = AECreateList(NULL, 0, false, &targetListDesc);
|
||||
if (err != noErr) goto bail;
|
||||
for ( index=0; index < nTargets; index++) {
|
||||
if (targetAlias == NULL)
|
||||
err = NewAlias(NULL, (targetList + index),
|
||||
&targetAlias);
|
||||
else err = UpdateAlias(NULL, (targetList + index),
|
||||
targetAlias, &wasChanged);
|
||||
if (err != noErr) goto bail;
|
||||
HLock((Handle) targetAlias);
|
||||
err = AEPutPtr(&targetListDesc, (index + 1),
|
||||
typeAlias, *targetAlias,
|
||||
GetHandleSize((Handle) targetAlias));
|
||||
HUnlock((Handle) targetAlias);
|
||||
if (err != noErr) goto bail;
|
||||
}
|
||||
|
||||
/* add the file list to the Apple Event */
|
||||
err = AEPutParamDesc(&theAEvent, keyDirectObject,
|
||||
&targetListDesc);
|
||||
if (err != noErr) goto bail;
|
||||
|
||||
/* send the event to the Finder */
|
||||
err = AESend(&theAEvent, &theReply, kAENoReply,
|
||||
kAENormalPriority, kAEDefaultTimeout, NULL, NULL);
|
||||
|
||||
/* clean up and leave */
|
||||
bail:
|
||||
if (targetAlias != NULL) DisposeHandle((Handle) targetAlias);
|
||||
AEDisposeDesc(&targetListDesc);
|
||||
AEDisposeDesc(&theAEvent);
|
||||
AEDisposeDesc(&fndrAddress);
|
||||
AEDisposeDesc(&theReply);
|
||||
return err;
|
||||
}
|
||||
|
||||
long wxExecute(const wxString& command, int flags, wxProcess *WXUNUSED(handler))
|
||||
{
|
||||
wxASSERT_MSG( flags == wxEXEC_ASYNC,
|
||||
wxT("wxExecute: Only wxEXEC_ASYNC is supported") );
|
||||
|
||||
FSSpec fsSpec;
|
||||
wxMacFilename2FSSpec(command, &fsSpec);
|
||||
|
||||
// 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 ( FinderLaunch(1 /*one file*/, &fsSpec) == noErr ) ? -1 : 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __DARWIN__
|
||||
|
Loading…
Reference in New Issue
Block a user