diff options
author | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-18 14:46:29 +0100 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-18 14:46:29 +0100 |
commit | 868428cc634f0e2c6d5ace84555675cb80363d3f (patch) | |
tree | 98d321520f31107067ca45e5b5806d92551b2f3d /src/tools | |
parent | 0d303db8c2e79c772cd216bfc07b42637c37e1bd (diff) | |
parent | 93184f7959bd18ba6f77e8d8b312f0e3be95d70c (diff) | |
download | qt-creator-868428cc634f0e2c6d5ace84555675cb80363d3f.tar.gz |
Merge remote-tracking branch 'origin/3.1'
Conflicts:
qbs/imports/QtcTool.qbs
src/plugins/git/giteditor.cpp
src/plugins/qmldesigner/qmldesignerplugin.cpp
Change-Id: Icafd32f713effb1479480a0d1f61a01e429fbec0
Diffstat (limited to 'src/tools')
29 files changed, 1406 insertions, 182 deletions
diff --git a/src/tools/3rdparty/3rdparty.pro b/src/tools/3rdparty/3rdparty.pro index 9b9062f2d9..c0c053bf4c 100644 --- a/src/tools/3rdparty/3rdparty.pro +++ b/src/tools/3rdparty/3rdparty.pro @@ -1,5 +1,7 @@ TEMPLATE = subdirs mac { - SUBDIRS += iossim + SUBDIRS += \ + iossim \ + iossim_1_8_2 } diff --git a/src/tools/3rdparty/iossim/dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h b/src/tools/3rdparty/iossim/dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h new file mode 100644 index 0000000000..70cc4ac436 --- /dev/null +++ b/src/tools/3rdparty/iossim/dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h @@ -0,0 +1,290 @@ +// +// Generated by class-dump 3.5 (64 bit). +// +// class-dump is Copyright (C) 1997-1998, 2000-2001, 2004-2013 by Steve Nygard. +// + +#pragma mark Blocks + +typedef void (^CDUnknownBlockType)(void); // return type and parameters are unknown + +#pragma mark - + +// +// File: $(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTiPhoneSimulatorRemoteClient.framework/Versions/A/DVTiPhoneSimulatorRemoteClient +// +// Arch: x86_64 +// Current version: 12.0.0 +// Compatibility version: 1.0.0 +// Source version: 5037.3.0.0.0 +// Minimum Mac OS X version: 10.8.0 +// SDK version: 10.9.0 +// +// Objective-C Garbage Collection: Unsupported +// +// Run path: @loader_path/../../../../PrivateFrameworks/ +// = $(DEVELOPER_DIR)/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks +// + + +@class DTiPhoneSimulatorApplicationSpecifier; +@class DTiPhoneSimulatorSession; +@class DTiPhoneSimulatorSessionConfig; +@class DTiPhoneSimulatorSystemRoot; +@class DVTiPhoneSimulatorMessenger; + +@protocol DTiPhoneSimulatorSessionDelegate + +- (void) session: (DTiPhoneSimulatorSession *) session didEndWithError: (NSError *) error; +- (void) session: (DTiPhoneSimulatorSession *) session didStart: (BOOL) started withError: (NSError *) error; + +@end + +@protocol OS_dispatch_source +@end +@protocol OS_dispatch_queue +@end +@class DVTDispatchLock; +@class DVTConfinementServiceConnection; +@class DVTTask; + + +@interface DVTiPhoneSimulatorMessenger : NSObject +{ + DTiPhoneSimulatorSession *_session; + CDUnknownBlockType _readyMessageHandler; + CDUnknownBlockType _runningMessageHandler; + CDUnknownBlockType _appDidLaunchMessageHandler; + CDUnknownBlockType _appDidQuitMessageHandler; + CDUnknownBlockType _appPIDExitedMessageHandler; + CDUnknownBlockType _toolDidLaunchMessageHandler; +} + ++ (id)messengerForSession:(id)arg1 withConnection:(id)arg2; ++ (id)messengerForSession:(id)arg1; +@property(copy, nonatomic) CDUnknownBlockType toolDidLaunchMessageHandler; // @synthesize toolDidLaunchMessageHandler=_toolDidLaunchMessageHandler; +@property(copy, nonatomic) CDUnknownBlockType appPIDExitedMessageHandler; // @synthesize appPIDExitedMessageHandler=_appPIDExitedMessageHandler; +@property(copy, nonatomic) CDUnknownBlockType appDidQuitMessageHandler; // @synthesize appDidQuitMessageHandler=_appDidQuitMessageHandler; +@property(copy, nonatomic) CDUnknownBlockType appDidLaunchMessageHandler; // @synthesize appDidLaunchMessageHandler=_appDidLaunchMessageHandler; +@property(copy, nonatomic) CDUnknownBlockType runningMessageHandler; // @synthesize runningMessageHandler=_runningMessageHandler; +@property(copy, nonatomic) CDUnknownBlockType readyMessageHandler; // @synthesize readyMessageHandler=_readyMessageHandler; +@property(readonly) DTiPhoneSimulatorSession *session; // @synthesize session=_session; +- (void)doUbiquityFetchEvent; +- (void)doFetchEventForPID:(int)arg1; +- (void)backgroundAllApps:(int)arg1; +- (void)startSimulatorToolSessionWithParameters:(id)arg1; +- (void)stopSimulatingLocation; +- (void)startSimulatingLocationWithLatitude:(id)arg1 longitute:(id)arg2; +- (void)endSimulatorSessionWithPID:(int)arg1; +- (void)startSimulatorSessionWithRequestInfo:(id)arg1; +- (void)clearAllMessageHandlers; +- (void)waitPID:(int)arg1 withAppPIDExitedMessagedHandler:(CDUnknownBlockType)arg2; +- (void)disconnectFromService; +- (BOOL)connectToServiceWithSessionOnLaunch:(BOOL)arg1 simulatorPID:(int *)arg2 error:(id *)arg3; +- (id)initWithSession:(id)arg1; + +@end + +@interface DVTiPhoneSimulatorLocalMessenger : DVTiPhoneSimulatorMessenger +{ + BOOL _appTerminationMessageSent; + NSObject<OS_dispatch_source> *_pidDispatchSource; + DVTTask *_simTask; +} + +- (void)doUbiquityFetchEvent; +- (void)doFetchEventForPID:(int)arg1; +- (void)backgroundAllApps:(int)arg1; +- (void)_handleSimulatorToolDidLaunchMessage:(id)arg1; +- (void)setToolDidLaunchMessageHandler:(CDUnknownBlockType)arg1; +- (void)waitPID:(int)arg1 withAppPIDExitedMessagedHandler:(CDUnknownBlockType)arg2; +- (void)_handleSimulatorAppDidQuitMessage:(id)arg1; +- (void)setAppDidQuitMessageHandler:(CDUnknownBlockType)arg1; +- (void)_handleSimulatorAppDidLaunchMessage:(id)arg1; +- (void)setAppDidLaunchMessageHandler:(CDUnknownBlockType)arg1; +- (void)_handleSimulatorRunningMessage:(id)arg1; +- (void)setRunningMessageHandler:(CDUnknownBlockType)arg1; +- (void)_handleSimulatorReadyMessage:(id)arg1; +- (void)setReadyMessageHandler:(CDUnknownBlockType)arg1; +- (void)startSimulatorToolSessionWithParameters:(id)arg1; +- (void)stopSimulatingLocation; +- (void)startSimulatingLocationWithLatitude:(id)arg1 longitute:(id)arg2; +- (void)endSimulatorSessionWithPID:(int)arg1; +- (void)startSimulatorSessionWithRequestInfo:(id)arg1; +- (void)clearAllMessageHandlers; +- (void)disconnectFromService; +- (BOOL)connectToServiceWithSessionOnLaunch:(BOOL)arg1 simulatorPID:(int *)arg2 error:(id *)arg3; +- (void)_enableObserver:(BOOL)arg1 forName:(id)arg2 selector:(SEL)arg3; + +@end + +@interface DVTiPhoneSimulatorRemoteMessenger : DVTiPhoneSimulatorMessenger +{ + unsigned long long _commandTag; + NSObject<OS_dispatch_queue> *_responseQueue; + DVTDispatchLock *_awaitingLock; + NSMutableDictionary *_awaitingSemaphores; + NSMutableDictionary *_awaitingResponses; + NSMutableSet *_waitingAppPIDs; + DVTConfinementServiceConnection *_connection; +} + +@property(readonly) DVTConfinementServiceConnection *connection; // @synthesize connection=_connection; +- (void)handleNotificationResponse:(id)arg1; +- (void)waitPID:(int)arg1 withAppPIDExitedMessagedHandler:(CDUnknownBlockType)arg2; +- (void)startSimulatorToolSessionWithParameters:(id)arg1; +- (void)stopSimulatingLocation; +- (void)startSimulatingLocationWithLatitude:(id)arg1 longitute:(id)arg2; +- (void)endSimulatorSessionWithPID:(int)arg1; +- (void)startSimulatorSessionWithRequestInfo:(id)arg1; +- (void)disconnectFromService; +- (BOOL)connectToServiceWithSessionOnLaunch:(BOOL)arg1 simulatorPID:(int *)arg2 error:(id *)arg3; +- (BOOL)sendTaggedRequest:(id)arg1 awaitingResponse:(id *)arg2 error:(id *)arg3; +- (id)nextCommandTag; +- (id)awaitResponseWithTag:(id)arg1 error:(id *)arg2; +- (void)enqueueResponse:(id)arg1 withTag:(id)arg2 error:(id)arg3; +- (BOOL)sendRequest:(id)arg1 withTag:(id)arg2 error:(id *)arg3; +- (id)initWithSession:(id)arg1 connection:(id)arg2; + +@end + +@interface DTiPhoneSimulatorSession : NSObject +{ + int _simulatedApplicationPID; + int _simulatorPID; + NSString *_uuid; + id <DTiPhoneSimulatorSessionDelegate> _delegate; + NSString *_simulatedAppPath; + long long _sessionLifecycleProgress; + NSTimer *_timeoutTimer; + DTiPhoneSimulatorSessionConfig *_sessionConfig; + DVTiPhoneSimulatorMessenger *_messenger; +} + +@property(retain) DVTiPhoneSimulatorMessenger *messenger; // @synthesize messenger=_messenger; +@property(copy, nonatomic) DTiPhoneSimulatorSessionConfig *sessionConfig; // @synthesize sessionConfig=_sessionConfig; +@property(retain, nonatomic) NSTimer *timeoutTimer; // @synthesize timeoutTimer=_timeoutTimer; +@property(nonatomic) long long sessionLifecycleProgress; // @synthesize sessionLifecycleProgress=_sessionLifecycleProgress; +@property int simulatorPID; // @synthesize simulatorPID=_simulatorPID; +@property(copy) NSString *simulatedAppPath; // @synthesize simulatedAppPath=_simulatedAppPath; +@property int simulatedApplicationPID; // @synthesize simulatedApplicationPID=_simulatedApplicationPID; +@property(retain, nonatomic) id <DTiPhoneSimulatorSessionDelegate> delegate; // @synthesize delegate=_delegate; +@property(copy, nonatomic) NSString *uuid; // @synthesize uuid=_uuid; +- (void)doUbiquityFetchEvent; +- (void)doFetchEventForPID:(int)arg1; +- (void)backgroundAllApps:(int)arg1; +- (id)_invalidConfigError; +- (void)_endSimulatorSession; +- (void)_callDelegateResponseFromSessionEndedInfo:(id)arg1; +- (void)_callDelegateResponseFromSessionStartedInfo:(id)arg1; +- (id)_sessionStartRequestInfoFromConfig:(id)arg1 withError:(id *)arg2; +- (BOOL)_startToolSessionInSimulatorWithError:(id *)arg1; +- (BOOL)_startApplicationSessionInSimulatorWithError:(id *)arg1; +- (BOOL)_startBasicSessionInSimulatorWithError:(id *)arg1; +- (BOOL)_startSessionInSimulatorWithError:(id *)arg1; +- (BOOL)_handleSessionEndedInSimulator:(id)arg1 notification:(id)arg2; +- (void)_handleSessionStartedWithSim:(id)arg1; +- (void)_handleSessionStartedInSimulator:(id)arg1; +- (void)_handleSimulatorReadyMessage:(id)arg1; +- (void)_timeoutElapsed:(id)arg1; +- (BOOL)attachedToTargetWithConfig:(id)arg1 error:(id *)arg2; +- (void)stopLocationSimulation; +- (void)simulateLocationWithLatitude:(id)arg1 longitude:(id)arg2; +- (void)requestEndWithTimeout:(double)arg1; +- (BOOL)requestStartWithConfig:(id)arg1 timeout:(double)arg2 error:(id *)arg3; +- (BOOL)_setUpSimulatorMessengerWithConfig:(id)arg1 error:(id *)arg2; +- (id)description; +- (void)dealloc; +- (id)init; + +@end + +@interface DTiPhoneSimulatorSessionConfig : NSObject <NSCopying> +{ + BOOL _launchForBackgroundFetch; + BOOL _simulatedApplicationShouldWaitForDebugger; + NSString *_localizedClientName; + DTiPhoneSimulatorSystemRoot *_simulatedSystemRoot; + NSString *_simulatedDeviceInfoName; + NSNumber *_simulatedDeviceFamily; + NSString *_simulatedArchitecture; + NSNumber *_simulatedDisplayHeight; + NSNumber *_simulatedDisplayScale; + DTiPhoneSimulatorApplicationSpecifier *_applicationToSimulateOnStart; + NSNumber *_pid; + NSArray *_simulatedApplicationLaunchArgs; + NSDictionary *_simulatedApplicationLaunchEnvironment; + NSString *_simulatedApplicationStdOutPath; + NSString *_simulatedApplicationStdErrPath; + NSFileHandle *_stdinFileHandle; + NSFileHandle *_stdoutFileHandle; + NSFileHandle *_stderrFileHandle; + id _confinementService; +} + ++ (id)displayNameForDeviceFamily:(id)arg1; +@property(retain) id confinementService; // @synthesize confinementService=_confinementService; +@property(retain) NSFileHandle *stderrFileHandle; // @synthesize stderrFileHandle=_stderrFileHandle; +@property(retain) NSFileHandle *stdoutFileHandle; // @synthesize stdoutFileHandle=_stdoutFileHandle; +@property(retain) NSFileHandle *stdinFileHandle; // @synthesize stdinFileHandle=_stdinFileHandle; +@property(copy) NSString *simulatedApplicationStdErrPath; // @synthesize simulatedApplicationStdErrPath=_simulatedApplicationStdErrPath; +@property(copy) NSString *simulatedApplicationStdOutPath; // @synthesize simulatedApplicationStdOutPath=_simulatedApplicationStdOutPath; +@property BOOL simulatedApplicationShouldWaitForDebugger; // @synthesize simulatedApplicationShouldWaitForDebugger=_simulatedApplicationShouldWaitForDebugger; +@property(copy) NSDictionary *simulatedApplicationLaunchEnvironment; // @synthesize simulatedApplicationLaunchEnvironment=_simulatedApplicationLaunchEnvironment; +@property(copy) NSArray *simulatedApplicationLaunchArgs; // @synthesize simulatedApplicationLaunchArgs=_simulatedApplicationLaunchArgs; +@property(copy) NSNumber *pid; // @synthesize pid=_pid; +@property(copy) DTiPhoneSimulatorApplicationSpecifier *applicationToSimulateOnStart; // @synthesize applicationToSimulateOnStart=_applicationToSimulateOnStart; +@property(copy) NSNumber *simulatedDisplayScale; // @synthesize simulatedDisplayScale=_simulatedDisplayScale; +@property(copy) NSNumber *simulatedDisplayHeight; // @synthesize simulatedDisplayHeight=_simulatedDisplayHeight; +@property(copy) NSString *simulatedArchitecture; // @synthesize simulatedArchitecture=_simulatedArchitecture; +@property(copy) NSNumber *simulatedDeviceFamily; // @synthesize simulatedDeviceFamily=_simulatedDeviceFamily; +@property(retain) NSString *simulatedDeviceInfoName; // @synthesize simulatedDeviceInfoName=_simulatedDeviceInfoName; +@property(copy) DTiPhoneSimulatorSystemRoot *simulatedSystemRoot; // @synthesize simulatedSystemRoot=_simulatedSystemRoot; +@property(copy) NSString *localizedClientName; // @synthesize localizedClientName=_localizedClientName; +@property BOOL launchForBackgroundFetch; // @synthesize launchForBackgroundFetch=_launchForBackgroundFetch; +- (id)description; +- (id)copyWithZone:(struct _NSZone *)arg1; +- (id)init; + +@end + +@interface DTiPhoneSimulatorSystemRoot : NSObject <NSCopying> +{ + NSString *sdkRootPath; + NSString *sdkVersion; + NSString *sdkDisplayName; +} + ++ (id)rootWithSDKVersion:(id)arg1; ++ (id)rootWithSDKPath:(id)arg1; ++ (id)defaultRoot; ++ (id)knownRoots; ++ (void)initialize; +@property(copy) NSString *sdkDisplayName; // @synthesize sdkDisplayName; +@property(copy) NSString *sdkVersion; // @synthesize sdkVersion; +@property(copy) NSString *sdkRootPath; // @synthesize sdkRootPath; +- (id)description; +- (long long)compare:(id)arg1; +- (id)copyWithZone:(struct _NSZone *)arg1; +- (BOOL)isEqual:(id)arg1; +- (id)initWithSDKPath:(id)arg1; + +@end + +@interface DTiPhoneSimulatorApplicationSpecifier : NSObject <NSCopying> +{ + NSString *appPath; + NSString *bundleID; + NSString *toolPath; +} + ++ (id)specifierWithToolPath:(id)arg1; ++ (id)specifierWithApplicationBundleIdentifier:(id)arg1; ++ (id)specifierWithApplicationPath:(id)arg1; +@property(copy, nonatomic) NSString *toolPath; // @synthesize toolPath; +@property(copy, nonatomic) NSString *bundleID; // @synthesize bundleID; +@property(copy, nonatomic) NSString *appPath; // @synthesize appPath; +- (id)description; +- (id)copyWithZone:(struct _NSZone *)arg1; + +@end
\ No newline at end of file diff --git a/src/tools/3rdparty/iossim/iossim.pro b/src/tools/3rdparty/iossim/iossim.pro index 9e30307406..557362e4c3 100644 --- a/src/tools/3rdparty/iossim/iossim.pro +++ b/src/tools/3rdparty/iossim/iossim.pro @@ -26,10 +26,10 @@ iPhoneSimulatorRemoteClientDirectLinking { -F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks \ -F/Applications/Xcode.app/Contents/OtherFrameworks LIBS += \ - -framework iPhoneSimulatorRemoteClient + -framework DTViPhoneSimulatorRemoteClient QMAKE_RPATHDIR += /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks \ - /Applications/Xcode.app/Contents/OtherFrameworks - /System/Library/PrivateFrameworks \ + /Applications/Xcode.app/Contents/OtherFrameworks \ + /System/Library/PrivateFrameworks } TEMPLATE = app @@ -49,7 +49,7 @@ HEADERS += \ nsprintf.h \ nsstringexpandpath.h \ version.h \ - iphonesimulatorremoteclient/iphonesimulatorremoteclient.h + dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h OTHER_FILES = IOSSIM_LICENSE \ Info.plist diff --git a/src/tools/3rdparty/iossim/iossim.qbs b/src/tools/3rdparty/iossim/iossim.qbs index ba3133b493..1300b107d5 100644 --- a/src/tools/3rdparty/iossim/iossim.qbs +++ b/src/tools/3rdparty/iossim/iossim.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool @@ -18,7 +18,7 @@ QtcTool { "nsprintf.h", "nsstringexpandpath.h", "version.h", - "iphonesimulatorremoteclient/iphonesimulatorremoteclient.h" + "dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h" ] cpp.linkerFlags: base.concat(["-sectcreate", "__TEXT", "__info_plist", path + "/Info.plist", "-fobjc-link-runtime"]) diff --git a/src/tools/3rdparty/iossim/iphonesimulator.h b/src/tools/3rdparty/iossim/iphonesimulator.h index 0770c50ee3..3049f318d2 100644 --- a/src/tools/3rdparty/iossim/iphonesimulator.h +++ b/src/tools/3rdparty/iossim/iphonesimulator.h @@ -6,7 +6,7 @@ */ #import <Foundation/Foundation.h> -#import "iphonesimulatorremoteclient/iphonesimulatorremoteclient.h" +#import <dvtiphonesimulatorremoteclient/dvtiphonesimulatorremoteclient.h> #import "version.h" @interface iPhoneSimulator : NSObject <DTiPhoneSimulatorSessionDelegate> { @@ -14,8 +14,7 @@ DTiPhoneSimulatorSystemRoot *sdkRoot; NSFileHandle *stdoutFileHandle; NSFileHandle *stderrFileHandle; - DTiPhoneSimulatorSession *session; - NSTimer *pidCheckingTimer; + DTiPhoneSimulatorSession *mySession; BOOL startOnly; BOOL exitOnStartup; BOOL shouldWaitDebugger; @@ -34,8 +33,7 @@ - (void)createStdioFIFO:(NSFileHandle **)fileHandle ofType:(NSString *)type atPath:(NSString **)path; - (void)removeStdioFIFO:(NSFileHandle *)fileHandle atPath:(NSString *)path; - (void)stop; -- (void)checkPid:(NSTimer *)timer; - (void)doExit:(int)errorCode; -- (void)changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice; +- (NSString*)changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice; @end diff --git a/src/tools/3rdparty/iossim/iphonesimulator.mm b/src/tools/3rdparty/iossim/iphonesimulator.mm index b06b54276d..e8ca358454 100644 --- a/src/tools/3rdparty/iossim/iphonesimulator.mm +++ b/src/tools/3rdparty/iossim/iphonesimulator.mm @@ -10,8 +10,8 @@ #import "nsprintf.h" #import <sys/types.h> #import <sys/stat.h> -#import <objc/runtime.h> -#import <AppKit/NSRunningApplication.h> +#import <Foundation/NSTask.h> +@class DTiPhoneSimulatorSystemRoot; NSString *simulatorPrefrencesName = @"com.apple.iphonesimulator"; NSString *deviceProperty = @"SimulateDevice"; @@ -21,6 +21,18 @@ NSString *deviceIphone = @"iPhone"; NSString *deviceIpad = @"iPad"; NSString *deviceIpadRetina = @"iPad (Retina)"; +// The path within the developer dir of the private Simulator frameworks. +NSString* const kSimulatorFrameworkRelativePath = @"Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/DVTiPhoneSimulatorRemoteClient.framework"; +NSString* const kDVTFoundationRelativePath = @"../SharedFrameworks/DVTFoundation.framework"; +NSString* const kDevToolsFoundationRelativePath = @"../OtherFrameworks/DevToolsFoundation.framework"; +//NSString* const kSimulatorRelativePath = @"Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app"; + +static const char *gDevDir = 0; + +@interface DVTPlatform : NSObject ++ (BOOL)loadAllPlatformsReturningError:(id*)arg1; +@end + /** * A simple iPhoneSimulatorRemoteClient framework. */ @@ -28,14 +40,12 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; - (id)init { self = [super init]; - session = nil; - pidCheckingTimer = nil; + mySession = nil; return self; } - (void)dealloc { - [session release]; - [pidCheckingTimer release]; + [mySession release]; [super dealloc]; } @@ -47,8 +57,88 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; exit(errorCode); } +// Helper to find a class by name and die if it isn't found. +-(Class) FindClassByName:(NSString*) nameOfClass { + Class theClass = NSClassFromString(nameOfClass); + if (!theClass) { + nsfprintf(stderr,@"Failed to find class %@ at runtime.", nameOfClass); + [self doExit:EXIT_FAILURE]; + } + return theClass; +} + +// Loads the Simulator framework from the given developer dir. +-(void) LoadSimulatorFramework:(NSString*) developerDir { + // The Simulator framework depends on some of the other Xcode private + // frameworks; manually load them first so everything can be linked up. + NSString* dvtFoundationPath = [developerDir stringByAppendingPathComponent:kDVTFoundationRelativePath]; + + NSBundle* dvtFoundationBundle = + [NSBundle bundleWithPath:dvtFoundationPath]; + if (![dvtFoundationBundle load]){ + nsprintf(@"Unable to dvtFoundationBundle. Error: "); + [self doExit:EXIT_FAILURE]; + return ; + } + NSString* devToolsFoundationPath = [developerDir stringByAppendingPathComponent:kDevToolsFoundationRelativePath]; + NSBundle* devToolsFoundationBundle = + [NSBundle bundleWithPath:devToolsFoundationPath]; + if (![devToolsFoundationBundle load]){ + nsprintf(@"Unable to devToolsFoundationPath. Error: "); + return ; + } + // Prime DVTPlatform. + NSError* error; + Class DVTPlatformClass = [self FindClassByName:@"DVTPlatform"]; + if (![DVTPlatformClass loadAllPlatformsReturningError:&error]) { + nsprintf(@"Unable to loadAllPlatformsReturningError. Error: %@",[error localizedDescription]); + return ; + } + NSString* simBundlePath = [developerDir stringByAppendingPathComponent:kSimulatorFrameworkRelativePath]; + NSBundle* simBundle = [NSBundle bundleWithPath:simBundlePath]; + if (![simBundle load]){ + nsprintf(@"Unable to load simulator framework. Error: %@",[error localizedDescription]); + return ; + } + return ; +} + + +// Finds the developer dir via xcode-select or the DEVELOPER_DIR environment +// variable. +NSString* FindDeveloperDir() { + if (gDevDir) + return [NSString stringWithCString:gDevDir encoding:NSUTF8StringEncoding]; + // Check the env first. + NSDictionary* env = [[NSProcessInfo processInfo] environment]; + NSString* developerDir = [env objectForKey:@"DEVELOPER_DIR"]; + if ([developerDir length] > 0) + return developerDir; + + // Go look for it via xcode-select. + NSTask* xcodeSelectTask = [[[NSTask alloc] init] autorelease]; + [xcodeSelectTask setLaunchPath:@"/usr/bin/xcode-select"]; + [xcodeSelectTask setArguments:[NSArray arrayWithObject:@"-print-path"]]; + + NSPipe* outputPipe = [NSPipe pipe]; + [xcodeSelectTask setStandardOutput:outputPipe]; + NSFileHandle* outputFile = [outputPipe fileHandleForReading]; + + [xcodeSelectTask launch]; + NSData* outputData = [outputFile readDataToEndOfFile]; + [xcodeSelectTask terminate]; + + NSString* output = + [[[NSString alloc] initWithData:outputData + encoding:NSUTF8StringEncoding] autorelease]; + output = [output stringByTrimmingCharactersInSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if ([output length] == 0) + output = nil; + return output; +} - (void) printUsage { - fprintf(stdout, "<msg>Usage: iossim <command> <options> [--args ...]\n"); + fprintf(stdout, "<msg>Usage: ios-sim <command> <options> [--args ...]\n"); fprintf(stdout, "\n"); fprintf(stdout, "Commands:\n"); fprintf(stdout, " showsdks List the available iOS SDK versions\n"); @@ -80,61 +170,60 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; - (int) showSDKs { - NSUInteger i; - id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); - return EXIT_FAILURE; - } - NSArray *roots = [tClass knownRoots]; + Class systemRootClass = [self FindClassByName:@"DTiPhoneSimulatorSystemRoot"]; + + NSArray *roots = [systemRootClass knownRoots]; nsprintf(@"<device_info>"); - for (i = 0; i < [roots count]; ++i) { + for (NSUInteger i = 0; i < [roots count]; ++i) { DTiPhoneSimulatorSystemRoot *root = [roots objectAtIndex:i]; - nsprintf(@"<item><key>sdk%d_name</key><value>%@</value></item>", i, [root sdkDisplayName]); - nsprintf(@"<item><key>sdk%d_version</key><value>%@</value></item>", i, [root sdkVersion]); - nsprintf(@"<item><key>sdk%d_sysroot</key><value>%@</value></item>", i, [root sdkRootPath]); + nsprintf(@"<item><key>sdk%d_name</key><value>%@</value></item>", i, [root sdkDisplayName]); + nsprintf(@"<item><key>sdk%d_version</key><value>%@</value></item>", i, [root sdkVersion]); + nsprintf(@"<item><key>sdk%d_sysroot</key><value>%@</value></item>", i, [root sdkRootPath]); } nsprintf(@"</device_info>"); + return EXIT_SUCCESS; } -- (void)session:(DTiPhoneSimulatorSession *)mySession didEndWithError:(NSError *)error { +- (void)session:(DTiPhoneSimulatorSession *)session didEndWithError:(NSError *)error { if (verbose) { nsprintf(@"<msg>Session did end with error %@</msg>", error); } if (stderrFileHandle != nil) { - NSString *stderrPath = [[mySession sessionConfig] simulatedApplicationStdErrPath]; + NSString *stderrPath = [[session sessionConfig] simulatedApplicationStdErrPath]; [self removeStdioFIFO:stderrFileHandle atPath:stderrPath]; } if (stdoutFileHandle != nil) { - NSString *stdoutPath = [[mySession sessionConfig] simulatedApplicationStdOutPath]; + NSString *stdoutPath = [[session sessionConfig] simulatedApplicationStdOutPath]; [self removeStdioFIFO:stdoutFileHandle atPath:stdoutPath]; } - if (error != nil) + if (error != nil) { [self doExit:EXIT_FAILURE]; - else - [self doExit:EXIT_SUCCESS]; + } + + [self doExit:EXIT_SUCCESS]; } -- (void)session:(DTiPhoneSimulatorSession *)mySession didStart:(BOOL)started withError:(NSError *)error { - if (startOnly && mySession) { - [NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript" - arguments:[NSArray arrayWithObjects:@"-e", @"tell application \"iPhone Simulator\" to activate", nil]]; - nsprintf(@"<msg>Simulator started (no session)</msg>"); - [self doExit:EXIT_SUCCESS]; - return; +- (void)session:(DTiPhoneSimulatorSession *)session didStart:(BOOL)started withError:(NSError *)error { + if (startOnly && session) { + [NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript" + arguments:[NSArray arrayWithObjects:@"-e", @"tell application \"iPhone Simulator\" to activate", nil]]; + nsprintf(@"<msg>Simulator started (no session)</msg>"); + [self doExit:EXIT_SUCCESS]; + return; } if (started) { [NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript" arguments:[NSArray arrayWithObjects:@"-e", @"tell application \"iPhone Simulator\" to activate", nil]]; + int pid = [session simulatedApplicationPID]; if (shouldStartDebugger) { - char*args[4] = { NULL, NULL, (char*)[[[mySession simulatedApplicationPID] description] UTF8String], NULL }; + char*args[4] = { NULL, NULL, (char*)[[@(pid) description] UTF8String], NULL }; if (useGDB) { args[0] = strdup("gdb"); args[1] = strdup("program"); @@ -156,35 +245,23 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; if (verbose) { nsprintf(@"<msg>Session started</msg>"); } - nsprintf(@"<inferior_pid>%@</inferior_pid>", [session simulatedApplicationPID]); + nsprintf(@"<inferior_pid>%d</inferior_pid>", pid); fflush(stdout); if (exitOnStartup) { - [self doExit:EXIT_SUCCESS]; - return; + [self doExit:EXIT_SUCCESS]; + return; } - pidCheckingTimer = [[NSTimer scheduledTimerWithTimeInterval:5.0 target:self - selector:@selector(checkPid:) userInfo:nil repeats: TRUE] retain]; } else { - nsprintf(@"<msg>Session could not be started: %@</msg>", error); - [self doExit:EXIT_FAILURE]; + nsprintf(@"<msg>Session could not be started: %@</msg>", error); + [self doExit:EXIT_FAILURE]; } } - (void)stop { - if (session) - [session requestEndWithTimeout: 0.1]; + if (mySession) + [mySession requestEndWithTimeout: 0.1]; } -- (void)checkPid:(NSTimer *)timer { - (void)timer; - if (session && [[session simulatedApplicationPID]intValue] > 0) { - if (kill((pid_t)[[session simulatedApplicationPID]intValue], 0) == -1) { - nsprintf(@"<msg>app stopped</msg>"); - [self doExit:EXIT_SUCCESS]; - return; - } - } -} - (void)stdioDataIsAvailable:(NSNotification *)notification { [[notification object] readInBackgroundAndNotify]; NSData *data = [[notification userInfo] valueForKey:NSFileHandleNotificationDataItem]; @@ -201,14 +278,13 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; } else { nsprintf(@"<app_output>%@</app_output>", str); // handle stderr differently? } - fflush(stdout); } - (void)createStdioFIFO:(NSFileHandle **)fileHandle ofType:(NSString *)type atPath:(NSString **)path { *path = [NSString stringWithFormat:@"%@/ios-sim-%@-pipe-%d", NSTemporaryDirectory(), type, (int)time(NULL)]; if (mkfifo([*path UTF8String], S_IRUSR | S_IWUSR) == -1) { - nsprintf(@"<msg>Unable to create %@ named pipe `%@'</msg>", type, *path); + nsprintf(@"<msg>Unable to create %@ named pipe `%@</msg>'", type, *path); [self doExit:EXIT_FAILURE]; } else { if (verbose) { @@ -246,33 +322,27 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; args:(NSArray *)args { DTiPhoneSimulatorApplicationSpecifier *appSpec; DTiPhoneSimulatorSessionConfig *config; - NSError *error = 0; - id tClass; + DTiPhoneSimulatorSession *session; + NSError *error; NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; if (!startOnly && ![fileManager fileExistsAtPath:path]) { - nsprintf(@"<msg>Application path %@ doesn't exist!</msg>", path); - return EXIT_FAILURE; + nsprintf(@"<msg>Application path %@ doesn't exist!</msg>", path); + return EXIT_FAILURE; } /* Create the app specifier */ - tClass = objc_getClass("DTiPhoneSimulatorApplicationSpecifier"); - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorApplicationSpecifier class is nil.</msg>"); - return EXIT_FAILURE; - } - appSpec = startOnly ? nil : [tClass specifierWithApplicationPath:path]; + appSpec = startOnly ? nil : [[self FindClassByName:@"DTiPhoneSimulatorApplicationSpecifier"] specifierWithApplicationPath:path]; if (verbose) { - nsprintf(@"<msg>App Spec: %@</msg>", appSpec); - nsprintf(@"SDK Root: %@", sdkRoot); + nsprintf(@"<msg>App Spec: %@</msg>", appSpec); + nsprintf(@"<msg>SDK Root: %@</msg>", sdkRoot); for (id key in environment) { nsprintf(@"<msg>Env: %@ = %@</msg>", key, [environment objectForKey:key]); } } - NSString *sdkVersion = [sdkRoot sdkVersion]; NSString *appSupportDir = [NSString stringWithFormat:@"%@/Library/Application Support/iPhone Simulator/%@", NSHomeDirectory(), sdkVersion]; @@ -288,12 +358,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; environment = mutableEnv; /* Set up the session configuration */ - tClass = objc_getClass("DTiPhoneSimulatorSessionConfig"); - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorApplicationSpecifier class is nil.</msg>"); - return EXIT_FAILURE; - } - config = [[[tClass alloc] init] autorelease]; + config = [[[[self FindClassByName:@"DTiPhoneSimulatorSessionConfig"] alloc] init] autorelease]; [config setApplicationToSimulateOnStart:appSpec]; [config setSimulatedSystemRoot:sdkRoot]; [config setSimulatedApplicationShouldWaitForDebugger:shouldWaitDebugger]; @@ -333,16 +398,13 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; [config setSimulatedDeviceFamily:[NSNumber numberWithInt:1]]; } } - - [self changeDeviceType:family retina:retinaDevice isTallDevice:tallDevice]; + + NSString* devicePropertyValue = [self changeDeviceType:family retina:retinaDevice isTallDevice:tallDevice]; + [config setSimulatedDeviceInfoName:devicePropertyValue]; /* Start the session */ - tClass = objc_getClass("DTiPhoneSimulatorSession"); - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorSession class is nil.</msg>"); - return EXIT_FAILURE; - } - session = [[tClass alloc] init]; + session = [[[[self FindClassByName:@"DTiPhoneSimulatorSession"] alloc] init] autorelease]; + mySession = session; [session setDelegate:self]; if (uuid != nil){ [session setUuid:uuid]; @@ -356,7 +418,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; return EXIT_SUCCESS; } -- (void) changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice { +- (NSString*) changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice { NSString *devicePropertyValue; if (retina) { if (verbose) { @@ -381,6 +443,8 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; } CFPreferencesSetAppValue((CFStringRef)deviceProperty, (CFPropertyListRef)devicePropertyValue, (CFStringRef)simulatorPrefrencesName); CFPreferencesAppSynchronize((CFStringRef)simulatorPrefrencesName); + + return devicePropertyValue; } @@ -398,17 +462,29 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; exitOnStartup = NO; alreadyPrintedData = NO; startOnly = strcmp(argv[1], "start") == 0; + nsprintf(@"<query_result>"); + for (int i = 0; i < argc; ++i) { + if (strcmp(argv[i], "--developer-path") == 0) { + ++i; + if (i < argc) + gDevDir = argv[i]; + } + } + NSString* developerDir = FindDeveloperDir(); + if (!developerDir) { + nsprintf(@"Unable to find developer directory."); + exit(EXIT_FAILURE); + } if (strcmp(argv[1], "showsdks") == 0) { - [self doExit:[self showSDKs]]; - return; + [self LoadSimulatorFramework:developerDir]; + exit([self showSDKs]); } else if (strcmp(argv[1], "launch") == 0 || startOnly) { if (strcmp(argv[1], "launch") == 0 && argc < 3) { nsprintf(@"<msg>Missing application path argument</msg>"); [self printUsage]; - [self doExit:EXIT_FAILURE]; - return; + exit(EXIT_FAILURE); } NSString *appPath = nil; @@ -425,6 +501,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; NSString *uuid = nil; NSString *stdoutPath = nil; NSString *stderrPath = nil; + NSString *xctest = nil; NSTimeInterval timeout = 30; NSMutableDictionary *environment = [NSMutableDictionary dictionary]; @@ -452,20 +529,15 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; } else if (strcmp(argv[i], "--timeout") == 0) { if (i + 1 < argc) { timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue]; - NSLog(@"<msg>Timeout: %f second(s)</msg>", timeout); + NSLog(@"Timeout: %f second(s)", timeout); } } else if (strcmp(argv[i], "--sdk") == 0) { i++; + [self LoadSimulatorFramework:developerDir]; NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding]; - id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); - NSArray *roots; - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); - [self doExit:EXIT_FAILURE]; - return; - } - roots = [tClass knownRoots]; + Class systemRootClass = [self FindClassByName:@"DTiPhoneSimulatorSystemRoot"]; + NSArray *roots = [systemRootClass knownRoots]; for (DTiPhoneSimulatorSystemRoot *root in roots) { NSString *v = [root sdkVersion]; if ([v isEqualToString:ver]) { @@ -491,7 +563,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; } else if (strcmp(argv[i], "--env") == 0) { i++; NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath]; - environment = [NSDictionary dictionaryWithContentsOfFile:envFilePath]; + [environment setValuesForKeysWithDictionary:[NSDictionary dictionaryWithContentsOfFile:envFilePath]]; if (!environment) { fprintf(stdout, "<msg>Could not read environment from file: %s</msg>\n", argv[i]); [self printUsage]; @@ -502,9 +574,13 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath]; NSLog(@"stdoutPath: %@", stdoutPath); } else if (strcmp(argv[i], "--stderr") == 0) { - i++; - stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath]; - NSLog(@"stderrPath: %@", stderrPath); + i++; + stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath]; + NSLog(@"stderrPath: %@", stderrPath); + } else if (strcmp(argv[i], "--xctest") == 0) { + i++; + xctest = [[NSString stringWithUTF8String:argv[i]] expandPath]; + NSLog(@"xctest: %@", xctest); } else if (strcmp(argv[i], "--retina") == 0) { retinaDevice = YES; } else if (strcmp(argv[i], "--tall") == 0) { @@ -513,7 +589,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; i++; break; } else { - printf("<msg>unrecognized argument:%s</msg>\n", argv[i]); + fprintf(stdout, "<msg>unrecognized argument:%s</msg>\n", argv[i]); [self printUsage]; [self doExit:EXIT_FAILURE]; return; @@ -525,13 +601,19 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; } if (sdkRoot == nil) { - id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); - if (tClass == nil) { - nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); - [self doExit:EXIT_FAILURE]; - return; - } - sdkRoot = [tClass defaultRoot]; + [self LoadSimulatorFramework:developerDir]; + Class systemRootClass = [self FindClassByName:@"DTiPhoneSimulatorSystemRoot"]; + sdkRoot = [systemRootClass defaultRoot]; + } + if (xctest) { + NSString *appName = [appPath lastPathComponent]; + NSString *executableName = [appName stringByDeletingPathExtension]; + NSString *injectionPath = @"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection"; + [environment setValuesForKeysWithDictionary:@{ + @"DYLD_INSERT_LIBRARIES" : injectionPath, + @"XCInjectBundle" : xctest, + @"XCInjectBundleInto" : [appPath stringByAppendingFormat:@"/%@", executableName], + }]; } /* Don't exit, adds to runloop */ @@ -556,7 +638,7 @@ NSString *deviceIpadRetina = @"iPad (Retina)"; printf("%s\n", IOS_SIM_VERSION); [self doExit:EXIT_SUCCESS]; } else { - fprintf(stdout, "<msg>Unknown command</msg>\n"); + fprintf(stderr, "Unknown command\n"); [self printUsage]; [self doExit:EXIT_FAILURE]; } diff --git a/src/tools/3rdparty/iossim/main.mm b/src/tools/3rdparty/iossim/main.mm index 29b67c5c33..b8f778be27 100644 --- a/src/tools/3rdparty/iossim/main.mm +++ b/src/tools/3rdparty/iossim/main.mm @@ -5,69 +5,24 @@ * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. */ /* derived from https://github.com/phonegap/ios-sim */ + #import <AppKit/AppKit.h> -#import "iphonesimulator.h" -#include <QLibrary> -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) -#include <QApplication> -#else -#include <QGuiApplication> -#endif -#include <QString> -#include <QStringList> -/* to do: - * - try to stop inferior when killed (or communicate with creator to allow killing the inferior) - * - remove unneeded functionality and streamline a bit - */ +#import "iphonesimulator.h" /* * Runs the iPhoneSimulator backed by a main runloop. */ int main (int argc, char *argv[]) { -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) - QApplication a(argc, argv); -#else - QGuiApplication a(argc, argv); -#endif - - - //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - QString xcodePath = QLatin1String("/Applications/Xcode.app/Contents/Developer/"); - for (int i = 0; i + 1 < argc; ++i) { - if (strcmp(argv[i], "--developer-path") == 0) - xcodePath = QCoreApplication::arguments().at(i+1); - } - if (!xcodePath.endsWith(QLatin1Char('/'))) - xcodePath.append(QLatin1Char('/')); - - /* manual loading of the private deps */ - QStringList deps = QStringList() - << QLatin1String("/System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols") - << QLatin1String("/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication") - << (xcodePath + QLatin1String("../OtherFrameworks/DevToolsFoundation.framework/DevToolsFoundation")); - foreach (const QString &libPath, deps) { - QLibrary *lib = new QLibrary(libPath); - //lib->setLoadHints(QLibrary::ExportExternalSymbolsHint); - if (!lib->load()) - printf("<msg>error loading %s</msg>", libPath.toUtf8().constData()); - } - QLibrary *libIPhoneSimulatorRemoteClient = new QLibrary(xcodePath - + QLatin1String("Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework/iPhoneSimulatorRemoteClient")); - //libIPhoneSimulatorRemoteClient->setLoadHints(QLibrary::ResolveAllSymbolsHint|QLibrary::ExportExternalSymbolsHint); - if (!libIPhoneSimulatorRemoteClient->load()) - printf("<msg>error loading iPhoneSimulatorRemoteClient</msg>"); - + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; iPhoneSimulator *sim = [[iPhoneSimulator alloc] init]; - + /* Execute command line handler */ [sim runWithArgc: argc argv: argv]; /* Run the loop to handle added input sources, if any */ + [[NSRunLoop mainRunLoop] run]; - int res = a.exec(); - exit(res); - // [pool release]; + [pool release]; return 0; } diff --git a/src/tools/3rdparty/iossim/nsprintf.mm b/src/tools/3rdparty/iossim/nsprintf.mm index b7413f593c..95c12c785f 100644 --- a/src/tools/3rdparty/iossim/nsprintf.mm +++ b/src/tools/3rdparty/iossim/nsprintf.mm @@ -24,7 +24,7 @@ int nsfprintf (FILE *stream, NSString *format, ...) { va_start(ap, format); { retval = nsvfprintf(stream, format, ap); - } + } va_end(ap); return retval; @@ -37,7 +37,7 @@ int nsprintf (NSString *format, ...) { va_start(ap, format); { retval = nsvfprintf(stdout, format, ap); - } + } va_end(ap); return retval; diff --git a/src/tools/3rdparty/iossim/nsstringexpandpath.mm b/src/tools/3rdparty/iossim/nsstringexpandpath.mm index 53f43e3c12..b36481b504 100644 --- a/src/tools/3rdparty/iossim/nsstringexpandpath.mm +++ b/src/tools/3rdparty/iossim/nsstringexpandpath.mm @@ -1,5 +1,5 @@ /* - * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + * See the LICENSE file for the license on the source code in this file. */ #import "nsstringexpandpath.h" diff --git a/src/tools/3rdparty/iossim/version.h b/src/tools/3rdparty/iossim/version.h index 9f8c0dfc91..d22dd94b8e 100644 --- a/src/tools/3rdparty/iossim/version.h +++ b/src/tools/3rdparty/iossim/version.h @@ -1 +1 @@ -#define IOS_SIM_VERSION "1.8.2m" +#define IOS_SIM_VERSION "1.9.0" diff --git a/src/tools/3rdparty/iossim_1_8_2/IOSSIM_LICENSE b/src/tools/3rdparty/iossim_1_8_2/IOSSIM_LICENSE new file mode 100644 index 0000000000..162622f1db --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/IOSSIM_LICENSE @@ -0,0 +1,31 @@ +Author: Landon Fuller <landonf@plausiblelabs.com> +Copyright (c) 2008-2011 Plausible Labs Cooperative, Inc. +All rights reserved. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Modifications made by the following entities are licensed as above: +- Jeff Haynie, Appcelerator, Inc. +- https://github.com/hborders +- http://pivotallabs.com/users/scoward/blog +- Eloy Duran, Fingertips <eloy@fngtps.com> +- Fawzi Mohamed, digia <fawzi.mohamed@digia.com> diff --git a/src/tools/3rdparty/iossim_1_8_2/Info.plist b/src/tools/3rdparty/iossim_1_8_2/Info.plist new file mode 100644 index 0000000000..bc69bf3873 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/Info.plist @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>CFBundlePackageType</key> + <string>APPL</string> + <key>CFBundleSignature</key> + <string>@TYPEINFO@</string> + <key>CFBundleExecutable</key> + <string>@EXECUTABLE@</string> + <key>CFBundleIdentifier</key> + <string>org.qt-project.qt-creator.iosTool</string> + <key>LSUIElement</key> + <string>1</string> +</dict> +</plist> diff --git a/src/tools/3rdparty/iossim_1_8_2/iossim.qbs b/src/tools/3rdparty/iossim_1_8_2/iossim.qbs new file mode 100644 index 0000000000..1b96084e17 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/iossim.qbs @@ -0,0 +1,30 @@ +import qbs 1.0 +import QtcTool + + +QtcTool { + name: "iossim" + condition: qbs.targetOS.contains("osx") + + Depends { name: "Qt"; submodules: ["widgets"] } + Depends { name: "app_version_header" } + + files: [ + "main.mm", + "nsprintf.mm", + "nsstringexpandpath.mm", + "iphonesimulator.mm", + "iphonesimulator.h", + "nsprintf.h", + "nsstringexpandpath.h", + "version.h", + "iphonesimulatorremoteclient/iphonesimulatorremoteclient.h" + ] + cpp.linkerFlags: base.concat(["-sectcreate", "__TEXT", "__info_plist", path + "/Info.plist", + "-fobjc-link-runtime"]) + cpp.frameworks: base.concat(["Foundation", "CoreServices", "ApplicationServices", "IOKit", + "AppKit"]) + cpp.frameworkPaths: base.concat("/System/Library/PrivateFrameworks") + + toolInstallDir: project.ide_libexec_path + "/ios" +} diff --git a/src/tools/3rdparty/iossim_1_8_2/iossim_1_8_2.pro b/src/tools/3rdparty/iossim_1_8_2/iossim_1_8_2.pro new file mode 100644 index 0000000000..9e30307406 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/iossim_1_8_2.pro @@ -0,0 +1,55 @@ +CONFIG += console + +QT += core +QT += gui + +CONFIG -= app_bundle + +include(../../../../qtcreator.pri) + +# Prevent from popping up in the dock when launched. +# We embed the Info.plist file, so the application doesn't need to +# be a bundle. +QMAKE_LFLAGS += -sectcreate __TEXT __info_plist \"$$PWD/Info.plist\" \ + -fobjc-link-runtime + +LIBS += \ + -framework Foundation \ + -framework CoreServices \ + -framework ApplicationServices \ + -framework CoreFoundation \ + -F/System/Library/PrivateFrameworks \ + -framework IOKit -framework AppKit + +iPhoneSimulatorRemoteClientDirectLinking { + LIBS += \ + -F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks \ + -F/Applications/Xcode.app/Contents/OtherFrameworks + LIBS += \ + -framework iPhoneSimulatorRemoteClient + QMAKE_RPATHDIR += /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks \ + /Applications/Xcode.app/Contents/OtherFrameworks + /System/Library/PrivateFrameworks \ +} + +TEMPLATE = app + +# put into a subdir, so we can deploy a separate qt.conf for it +DESTDIR = $$IDE_LIBEXEC_PATH/ios +include(../../../rpath.pri) + +OBJECTIVE_SOURCES += \ + main.mm \ + nsprintf.mm \ + nsstringexpandPath.mm \ + iphonesimulator.mm + +HEADERS += \ + iphonesimulator.h \ + nsprintf.h \ + nsstringexpandpath.h \ + version.h \ + iphonesimulatorremoteclient/iphonesimulatorremoteclient.h + +OTHER_FILES = IOSSIM_LICENSE \ + Info.plist diff --git a/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.h b/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.h new file mode 100644 index 0000000000..0770c50ee3 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.h @@ -0,0 +1,41 @@ +/* Author: Landon Fuller <landonf@plausiblelabs.com> + * Copyright (c) 2008-2011 Plausible Labs Cooperative, Inc. + * All rights reserved. + * + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ + +#import <Foundation/Foundation.h> +#import "iphonesimulatorremoteclient/iphonesimulatorremoteclient.h" +#import "version.h" + +@interface iPhoneSimulator : NSObject <DTiPhoneSimulatorSessionDelegate> { +@private + DTiPhoneSimulatorSystemRoot *sdkRoot; + NSFileHandle *stdoutFileHandle; + NSFileHandle *stderrFileHandle; + DTiPhoneSimulatorSession *session; + NSTimer *pidCheckingTimer; + BOOL startOnly; + BOOL exitOnStartup; + BOOL shouldWaitDebugger; + BOOL shouldStartDebugger; + BOOL useGDB; + BOOL verbose; + BOOL alreadyPrintedData; + BOOL retinaDevice; + BOOL tallDevice; +} + +- (id)init; +- (void)dealloc; +- (void)runWithArgc:(int)argc argv:(char **)argv; + +- (void)createStdioFIFO:(NSFileHandle **)fileHandle ofType:(NSString *)type atPath:(NSString **)path; +- (void)removeStdioFIFO:(NSFileHandle *)fileHandle atPath:(NSString *)path; +- (void)stop; +- (void)checkPid:(NSTimer *)timer; +- (void)doExit:(int)errorCode; +- (void)changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice; + +@end diff --git a/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.mm b/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.mm new file mode 100644 index 0000000000..b06b54276d --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/iphonesimulator.mm @@ -0,0 +1,566 @@ +/* Author: Landon Fuller <landonf@plausiblelabs.com> + * Copyright (c) 2008-2011 Plausible Labs Cooperative, Inc. + * All rights reserved. + * + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ + +#import "iphonesimulator.h" +#import "nsstringexpandpath.h" +#import "nsprintf.h" +#import <sys/types.h> +#import <sys/stat.h> +#import <objc/runtime.h> +#import <AppKit/NSRunningApplication.h> + +NSString *simulatorPrefrencesName = @"com.apple.iphonesimulator"; +NSString *deviceProperty = @"SimulateDevice"; +NSString *deviceIphoneRetina3_5Inch = @"iPhone Retina (3.5-inch)"; +NSString *deviceIphoneRetina4_0Inch = @"iPhone Retina (4-inch)"; +NSString *deviceIphone = @"iPhone"; +NSString *deviceIpad = @"iPad"; +NSString *deviceIpadRetina = @"iPad (Retina)"; + +/** + * A simple iPhoneSimulatorRemoteClient framework. + */ +@implementation iPhoneSimulator + +- (id)init { + self = [super init]; + session = nil; + pidCheckingTimer = nil; + return self; +} + +- (void)dealloc { + [session release]; + [pidCheckingTimer release]; + [super dealloc]; +} + +- (void)doExit:(int)errorCode { + nsprintf(@"<exit code=\"%d\"/>", errorCode); + nsprintf(@"</query_result>"); + fflush(stdout); + fflush(stderr); + exit(errorCode); +} + +- (void) printUsage { + fprintf(stdout, "<msg>Usage: iossim <command> <options> [--args ...]\n"); + fprintf(stdout, "\n"); + fprintf(stdout, "Commands:\n"); + fprintf(stdout, " showsdks List the available iOS SDK versions\n"); + fprintf(stdout, " launch <application path> Launch the application at the specified path on the iOS Simulator\n"); + fprintf(stdout, " start Launch iOS Simulator without an app\n"); + fprintf(stdout, "\n"); + fprintf(stdout, "Options:\n"); + fprintf(stdout, " --version Print the version of ios-sim\n"); + fprintf(stdout, " --developer-path <developerDir> path to the developer directory (in Xcode)"); + fprintf(stdout, " --help Show this help text\n"); + fprintf(stdout, " --verbose Set the output level to verbose\n"); + fprintf(stdout, " --exit Exit after startup\n"); + fprintf(stdout, " --wait-for-debugger Wait for debugger to attach\n"); + fprintf(stdout, " --debug Attach LLDB to the application on startup\n"); + fprintf(stdout, " --use-gdb Use GDB instead of LLDB. (Requires --debug)\n"); + fprintf(stdout, " --sdk <sdkversion> The iOS SDK version to run the application on (defaults to the latest)\n"); + fprintf(stdout, " --family <device family> The device type that should be simulated (defaults to `iphone')\n"); + fprintf(stdout, " --retina Start a retina device\n"); + fprintf(stdout, " --tall In combination with --retina flag, start the tall version of the retina device (e.g. iPhone 5 (4-inch))\n"); + fprintf(stdout, " --uuid <uuid> A UUID identifying the session (is that correct?)\n"); + fprintf(stdout, " --env <environment file path> A plist file containing environment key-value pairs that should be set\n"); + fprintf(stdout, " --setenv NAME=VALUE Set an environment variable\n"); + fprintf(stdout, " --stdout <stdout file path> The path where stdout of the simulator will be redirected to (defaults to stdout of ios-sim)\n"); + fprintf(stdout, " --stderr <stderr file path> The path where stderr of the simulator will be redirected to (defaults to stderr of ios-sim)\n"); + fprintf(stdout, " --timeout <seconds> The timeout time to wait for a response from the Simulator. Default value: 30 seconds\n"); + fprintf(stdout, " --args <...> All following arguments will be passed on to the application</msg>\n"); + fflush(stdout); +} + + +- (int) showSDKs { + NSUInteger i; + id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); + return EXIT_FAILURE; + } + NSArray *roots = [tClass knownRoots]; + + nsprintf(@"<device_info>"); + for (i = 0; i < [roots count]; ++i) { + DTiPhoneSimulatorSystemRoot *root = [roots objectAtIndex:i]; + nsprintf(@"<item><key>sdk%d_name</key><value>%@</value></item>", i, [root sdkDisplayName]); + nsprintf(@"<item><key>sdk%d_version</key><value>%@</value></item>", i, [root sdkVersion]); + nsprintf(@"<item><key>sdk%d_sysroot</key><value>%@</value></item>", i, [root sdkRootPath]); + } + nsprintf(@"</device_info>"); + return EXIT_SUCCESS; +} + + +- (void)session:(DTiPhoneSimulatorSession *)mySession didEndWithError:(NSError *)error { + if (verbose) { + nsprintf(@"<msg>Session did end with error %@</msg>", error); + } + + if (stderrFileHandle != nil) { + NSString *stderrPath = [[mySession sessionConfig] simulatedApplicationStdErrPath]; + [self removeStdioFIFO:stderrFileHandle atPath:stderrPath]; + } + + if (stdoutFileHandle != nil) { + NSString *stdoutPath = [[mySession sessionConfig] simulatedApplicationStdOutPath]; + [self removeStdioFIFO:stdoutFileHandle atPath:stdoutPath]; + } + + if (error != nil) + [self doExit:EXIT_FAILURE]; + else + [self doExit:EXIT_SUCCESS]; +} + + +- (void)session:(DTiPhoneSimulatorSession *)mySession didStart:(BOOL)started withError:(NSError *)error { + if (startOnly && mySession) { + [NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript" + arguments:[NSArray arrayWithObjects:@"-e", @"tell application \"iPhone Simulator\" to activate", nil]]; + nsprintf(@"<msg>Simulator started (no session)</msg>"); + [self doExit:EXIT_SUCCESS]; + return; + } + if (started) { + [NSTask launchedTaskWithLaunchPath:@"/usr/bin/osascript" + arguments:[NSArray arrayWithObjects:@"-e", @"tell application \"iPhone Simulator\" to activate", nil]]; + if (shouldStartDebugger) { + char*args[4] = { NULL, NULL, (char*)[[[mySession simulatedApplicationPID] description] UTF8String], NULL }; + if (useGDB) { + args[0] = strdup("gdb"); + args[1] = strdup("program"); + } else { + args[0] = strdup("lldb"); + args[1] = strdup("--attach-pid"); + } + // The parent process must live on to process the stdout/stderr fifos, + // so start the debugger as a child process. + pid_t child_pid = fork(); + if (child_pid == 0) { + execvp(args[0], args); + } else if (child_pid < 0) { + nsprintf(@"<msg>Could not start debugger process: %@</msg>", errno); + [self doExit:EXIT_FAILURE]; + return; + } + } + if (verbose) { + nsprintf(@"<msg>Session started</msg>"); + } + nsprintf(@"<inferior_pid>%@</inferior_pid>", [session simulatedApplicationPID]); + fflush(stdout); + if (exitOnStartup) { + [self doExit:EXIT_SUCCESS]; + return; + } + pidCheckingTimer = [[NSTimer scheduledTimerWithTimeInterval:5.0 target:self + selector:@selector(checkPid:) userInfo:nil repeats: TRUE] retain]; + } else { + nsprintf(@"<msg>Session could not be started: %@</msg>", error); + [self doExit:EXIT_FAILURE]; + } +} + +- (void)stop { + if (session) + [session requestEndWithTimeout: 0.1]; +} + +- (void)checkPid:(NSTimer *)timer { + (void)timer; + if (session && [[session simulatedApplicationPID]intValue] > 0) { + if (kill((pid_t)[[session simulatedApplicationPID]intValue], 0) == -1) { + nsprintf(@"<msg>app stopped</msg>"); + [self doExit:EXIT_SUCCESS]; + return; + } + } +} +- (void)stdioDataIsAvailable:(NSNotification *)notification { + [[notification object] readInBackgroundAndNotify]; + NSData *data = [[notification userInfo] valueForKey:NSFileHandleNotificationDataItem]; + NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; /* dangerous if partially encoded data is at the boundary */ + if (!alreadyPrintedData) { + if ([str length] == 0) { + return; + } else { + alreadyPrintedData = YES; + } + } + if ([notification object] == stdoutFileHandle) { + printf("<app_output>%s</app_output>\n", [str UTF8String]); + } else { + nsprintf(@"<app_output>%@</app_output>", str); // handle stderr differently? + } + fflush(stdout); +} + + +- (void)createStdioFIFO:(NSFileHandle **)fileHandle ofType:(NSString *)type atPath:(NSString **)path { + *path = [NSString stringWithFormat:@"%@/ios-sim-%@-pipe-%d", NSTemporaryDirectory(), type, (int)time(NULL)]; + if (mkfifo([*path UTF8String], S_IRUSR | S_IWUSR) == -1) { + nsprintf(@"<msg>Unable to create %@ named pipe `%@'</msg>", type, *path); + [self doExit:EXIT_FAILURE]; + } else { + if (verbose) { + nsprintf(@"<msg>Creating named pipe at `%@'</msg>", *path); + } + int fd = open([*path UTF8String], O_RDONLY | O_NDELAY); + *fileHandle = [[[NSFileHandle alloc] initWithFileDescriptor:fd] retain]; + [*fileHandle readInBackgroundAndNotify]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(stdioDataIsAvailable:) + name:NSFileHandleReadCompletionNotification + object:*fileHandle]; + } +} + + +- (void)removeStdioFIFO:(NSFileHandle *)fileHandle atPath:(NSString *)path { + if (verbose) { + nsprintf(@"<msg>Removing named pipe at `%@'</msg>", path); + } + [fileHandle closeFile]; + [fileHandle release]; + if (![[NSFileManager defaultManager] removeItemAtPath:path error:NULL]) { + nsprintf(@"<msg>Unable to remove named pipe `%@'</msg>", path); + } +} + + +- (int)launchApp:(NSString *)path withFamily:(NSString *)family + uuid:(NSString *)uuid + environment:(NSDictionary *)environment + stdoutPath:(NSString *)stdoutPath + stderrPath:(NSString *)stderrPath + timeout:(NSTimeInterval)timeout + args:(NSArray *)args { + DTiPhoneSimulatorApplicationSpecifier *appSpec; + DTiPhoneSimulatorSessionConfig *config; + NSError *error = 0; + id tClass; + + NSFileManager *fileManager = [[[NSFileManager alloc] init] autorelease]; + if (!startOnly && ![fileManager fileExistsAtPath:path]) { + nsprintf(@"<msg>Application path %@ doesn't exist!</msg>", path); + return EXIT_FAILURE; + } + + /* Create the app specifier */ + tClass = objc_getClass("DTiPhoneSimulatorApplicationSpecifier"); + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorApplicationSpecifier class is nil.</msg>"); + return EXIT_FAILURE; + } + appSpec = startOnly ? nil : [tClass specifierWithApplicationPath:path]; + + if (verbose) { + nsprintf(@"<msg>App Spec: %@</msg>", appSpec); + nsprintf(@"SDK Root: %@", sdkRoot); + + for (id key in environment) { + nsprintf(@"<msg>Env: %@ = %@</msg>", key, [environment objectForKey:key]); + } + } + + + NSString *sdkVersion = [sdkRoot sdkVersion]; + NSString *appSupportDir = [NSString stringWithFormat:@"%@/Library/Application Support/iPhone Simulator/%@", + NSHomeDirectory(), sdkVersion]; + NSMutableDictionary *mutableEnv = [NSMutableDictionary dictionaryWithDictionary:environment]; + [mutableEnv setObject:appSupportDir forKey:@"CFFIXED_USER_HOME"]; + [mutableEnv setObject:appSupportDir forKey:@"IPHONE_SHARED_RESOURCES_DIRECTORY"]; + [mutableEnv setObject:appSupportDir forKey:@"HOME"]; + [mutableEnv setObject:[sdkRoot sdkRootPath] forKey:@"IPHONE_SIMULATOR_ROOT"]; + [mutableEnv setObject:[sdkRoot sdkRootPath] forKey:@"DYLD_ROOT_PATH"]; + [mutableEnv setObject:[sdkRoot sdkRootPath] forKey:@"DYLD_FRAMEWORK_PATH"]; + [mutableEnv setObject:[sdkRoot sdkRootPath] forKey:@"DYLD_LIBRARY_PATH"]; + [mutableEnv setObject:@"YES" forKey:@"NSUnbufferedIO"]; + environment = mutableEnv; + + /* Set up the session configuration */ + tClass = objc_getClass("DTiPhoneSimulatorSessionConfig"); + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorApplicationSpecifier class is nil.</msg>"); + return EXIT_FAILURE; + } + config = [[[tClass alloc] init] autorelease]; + [config setApplicationToSimulateOnStart:appSpec]; + [config setSimulatedSystemRoot:sdkRoot]; + [config setSimulatedApplicationShouldWaitForDebugger:shouldWaitDebugger]; + + [config setSimulatedApplicationLaunchArgs:args]; + [config setSimulatedApplicationLaunchEnvironment:environment]; + + if (stderrPath) { + stderrFileHandle = nil; + } else if (!exitOnStartup) { + [self createStdioFIFO:&stderrFileHandle ofType:@"stderr" atPath:&stderrPath]; + } + [config setSimulatedApplicationStdErrPath:stderrPath]; + + if (stdoutPath) { + stdoutFileHandle = nil; + } else if (!exitOnStartup) { + [self createStdioFIFO:&stdoutFileHandle ofType:@"stdout" atPath:&stdoutPath]; + } + [config setSimulatedApplicationStdOutPath:stdoutPath]; + + [config setLocalizedClientName: @"iossim"]; + + // this was introduced in 3.2 of SDK + if ([config respondsToSelector:@selector(setSimulatedDeviceFamily:)]) { + if (family == nil) { + family = @"iphone"; + } + + if (verbose) { + nsprintf(@"using device family %@",family); + } + + if ([family isEqualToString:@"ipad"]) { +[config setSimulatedDeviceFamily:[NSNumber numberWithInt:2]]; + } else{ + [config setSimulatedDeviceFamily:[NSNumber numberWithInt:1]]; + } + } + + [self changeDeviceType:family retina:retinaDevice isTallDevice:tallDevice]; + + /* Start the session */ + tClass = objc_getClass("DTiPhoneSimulatorSession"); + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorSession class is nil.</msg>"); + return EXIT_FAILURE; + } + session = [[tClass alloc] init]; + [session setDelegate:self]; + if (uuid != nil){ + [session setUuid:uuid]; + } + + if (![session requestStartWithConfig:config timeout:timeout error:&error]) { + nsprintf(@"<msg>Could not start simulator session: %@</msg>", error); + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} + +- (void) changeDeviceType:(NSString *)family retina:(BOOL)retina isTallDevice:(BOOL)isTallDevice { + NSString *devicePropertyValue; + if (retina) { + if (verbose) { + nsprintf(@"<msg>using retina</msg>"); + } + if ([family isEqualToString:@"ipad"]) { + devicePropertyValue = deviceIpadRetina; + } + else { + if (isTallDevice) { + devicePropertyValue = deviceIphoneRetina4_0Inch; + } else { + devicePropertyValue = deviceIphoneRetina3_5Inch; + } + } + } else { + if ([family isEqualToString:@"ipad"]) { + devicePropertyValue = deviceIpad; + } else { + devicePropertyValue = deviceIphone; + } + } + CFPreferencesSetAppValue((CFStringRef)deviceProperty, (CFPropertyListRef)devicePropertyValue, (CFStringRef)simulatorPrefrencesName); + CFPreferencesAppSynchronize((CFStringRef)simulatorPrefrencesName); +} + + +/** + * Execute 'main' + */ +- (void)runWithArgc:(int)argc argv:(char **)argv { + if (argc < 2) { + [self printUsage]; + exit(EXIT_FAILURE); + } + + retinaDevice = NO; + tallDevice = NO; + exitOnStartup = NO; + alreadyPrintedData = NO; + startOnly = strcmp(argv[1], "start") == 0; + nsprintf(@"<query_result>"); + + if (strcmp(argv[1], "showsdks") == 0) { + [self doExit:[self showSDKs]]; + return; + } else if (strcmp(argv[1], "launch") == 0 || startOnly) { + if (strcmp(argv[1], "launch") == 0 && argc < 3) { + nsprintf(@"<msg>Missing application path argument</msg>"); + [self printUsage]; + [self doExit:EXIT_FAILURE]; + return; + } + + NSString *appPath = nil; + int argOffset; + if (startOnly) { + argOffset = 2; + } + else { + argOffset = 3; + appPath = [[NSString stringWithUTF8String:argv[2]] expandPath]; + } + + NSString *family = nil; + NSString *uuid = nil; + NSString *stdoutPath = nil; + NSString *stderrPath = nil; + NSTimeInterval timeout = 30; + NSMutableDictionary *environment = [NSMutableDictionary dictionary]; + + int i = argOffset; + for (; i < argc; i++) { + if (strcmp(argv[i], "--version") == 0) { + printf("%s\n", IOS_SIM_VERSION); + exit(EXIT_SUCCESS); + } else if (strcmp(argv[i], "--help") == 0) { + [self printUsage]; + exit(EXIT_SUCCESS); + } else if (strcmp(argv[i], "--verbose") == 0) { + verbose = YES; + } else if (strcmp(argv[i], "--exit") == 0) { + exitOnStartup = YES; + } else if (strcmp(argv[i], "--wait-for-debugger") == 0) { + shouldWaitDebugger = YES; + } else if (strcmp(argv[i], "--debug") == 0) { + shouldWaitDebugger = YES; + shouldStartDebugger = YES; + } else if (strcmp(argv[i], "--use-gdb") == 0) { + useGDB = YES; + } else if (strcmp(argv[i], "--developer-path") == 0) { + ++i; + } else if (strcmp(argv[i], "--timeout") == 0) { + if (i + 1 < argc) { + timeout = [[NSString stringWithUTF8String:argv[++i]] doubleValue]; + NSLog(@"<msg>Timeout: %f second(s)</msg>", timeout); + } + } + else if (strcmp(argv[i], "--sdk") == 0) { + i++; + NSString* ver = [NSString stringWithCString:argv[i] encoding:NSUTF8StringEncoding]; + id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); + NSArray *roots; + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); + [self doExit:EXIT_FAILURE]; + return; + } + roots = [tClass knownRoots]; + for (DTiPhoneSimulatorSystemRoot *root in roots) { + NSString *v = [root sdkVersion]; + if ([v isEqualToString:ver]) { + sdkRoot = root; + break; + } + } + if (sdkRoot == nil) { + fprintf(stdout,"<msg>Unknown or unsupported SDK version: %s</msg>\n",argv[i]); + [self showSDKs]; + exit(EXIT_FAILURE); + } + } else if (strcmp(argv[i], "--family") == 0) { + i++; + family = [NSString stringWithUTF8String:argv[i]]; + } else if (strcmp(argv[i], "--uuid") == 0) { + i++; + uuid = [NSString stringWithUTF8String:argv[i]]; + } else if (strcmp(argv[i], "--setenv") == 0) { + i++; + NSArray *parts = [[NSString stringWithUTF8String:argv[i]] componentsSeparatedByString:@"="]; + [environment setObject:[parts objectAtIndex:1] forKey:[parts objectAtIndex:0]]; + } else if (strcmp(argv[i], "--env") == 0) { + i++; + NSString *envFilePath = [[NSString stringWithUTF8String:argv[i]] expandPath]; + environment = [NSDictionary dictionaryWithContentsOfFile:envFilePath]; + if (!environment) { + fprintf(stdout, "<msg>Could not read environment from file: %s</msg>\n", argv[i]); + [self printUsage]; + exit(EXIT_FAILURE); + } + } else if (strcmp(argv[i], "--stdout") == 0) { + i++; + stdoutPath = [[NSString stringWithUTF8String:argv[i]] expandPath]; + NSLog(@"stdoutPath: %@", stdoutPath); + } else if (strcmp(argv[i], "--stderr") == 0) { + i++; + stderrPath = [[NSString stringWithUTF8String:argv[i]] expandPath]; + NSLog(@"stderrPath: %@", stderrPath); + } else if (strcmp(argv[i], "--retina") == 0) { + retinaDevice = YES; + } else if (strcmp(argv[i], "--tall") == 0) { + tallDevice = YES; + } else if (strcmp(argv[i], "--args") == 0) { + i++; + break; + } else { + printf("<msg>unrecognized argument:%s</msg>\n", argv[i]); + [self printUsage]; + [self doExit:EXIT_FAILURE]; + return; + } + } + NSMutableArray *args = [NSMutableArray arrayWithCapacity:MAX(argc - i,0)]; + for (; i < argc; i++) { + [args addObject:[NSString stringWithUTF8String:argv[i]]]; + } + + if (sdkRoot == nil) { + id tClass = objc_getClass("DTiPhoneSimulatorSystemRoot"); + if (tClass == nil) { + nsprintf(@"<msg>DTiPhoneSimulatorSystemRoot class is nil.</msg>"); + [self doExit:EXIT_FAILURE]; + return; + } + sdkRoot = [tClass defaultRoot]; + } + + /* Don't exit, adds to runloop */ + int res = [self launchApp:appPath + withFamily:family + uuid:uuid + environment:environment + stdoutPath:stdoutPath + stderrPath:stderrPath + timeout:timeout + args:args]; + nsprintf(@"<app_started status=\"%@\" />", ((res == 0) ? @"SUCCESS" : @"FAILURE")); + fflush(stdout); + fflush(stderr); + if (res != 0) + [self doExit:EXIT_FAILURE]; + } else { + if (argc == 2 && strcmp(argv[1], "--help") == 0) { + [self printUsage]; + [self doExit:EXIT_SUCCESS]; + } else if (argc == 2 && strcmp(argv[1], "--version") == 0) { + printf("%s\n", IOS_SIM_VERSION); + [self doExit:EXIT_SUCCESS]; + } else { + fprintf(stdout, "<msg>Unknown command</msg>\n"); + [self printUsage]; + [self doExit:EXIT_FAILURE]; + } + } +} + +@end diff --git a/src/tools/3rdparty/iossim/iphonesimulatorremoteclient/iphonesimulatorremoteclient.h b/src/tools/3rdparty/iossim_1_8_2/iphonesimulatorremoteclient/iphonesimulatorremoteclient.h index abf69c8067..abf69c8067 100644 --- a/src/tools/3rdparty/iossim/iphonesimulatorremoteclient/iphonesimulatorremoteclient.h +++ b/src/tools/3rdparty/iossim_1_8_2/iphonesimulatorremoteclient/iphonesimulatorremoteclient.h diff --git a/src/tools/3rdparty/iossim_1_8_2/main.mm b/src/tools/3rdparty/iossim_1_8_2/main.mm new file mode 100644 index 0000000000..fb83dc3e19 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/main.mm @@ -0,0 +1,77 @@ +/* Author: Landon Fuller <landonf@plausiblelabs.com> + * Copyright (c) 2008-2011 Plausible Labs Cooperative, Inc. + * All rights reserved. + * + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ +/* derived from https://github.com/phonegap/ios-sim */ +#import <AppKit/AppKit.h> +#import "iphonesimulator.h" +#include <QLibrary> +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) +#include <QApplication> +#else +#include <QGuiApplication> +#endif +#include <QString> +#include <QStringList> + +/* to do: + * - try to stop inferior when killed (or communicate with creator to allow killing the inferior) + * - remove unneeded functionality and streamline a bit + */ + +/* + * Runs the iPhoneSimulator backed by a main runloop. + */ +int main (int argc, char *argv[]) { + int qtargc = 1; + char *qtarg = 0; + if (argc) + qtarg = argv[0]; +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) + QApplication a(qtargc, &qtarg); +#else + QGuiApplication a(qtargc, &qtarg); +#endif + + + //NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + QString xcodePath = QLatin1String("/Applications/Xcode.app/Contents/Developer/"); + for (int i = 0; i + 1 < argc; ++i) { + if (strcmp(argv[i], "--developer-path") == 0) + xcodePath = QString::fromLocal8Bit(argv[i + 1]); + } + if (!xcodePath.endsWith(QLatin1Char('/'))) + xcodePath.append(QLatin1Char('/')); + + /* manual loading of the private deps */ + QStringList deps = QStringList() + << QLatin1String("/System/Library/PrivateFrameworks/DebugSymbols.framework/Versions/A/DebugSymbols") + << QLatin1String("/System/Library/PrivateFrameworks/CoreSymbolication.framework/CoreSymbolication") + << (xcodePath + QLatin1String("../OtherFrameworks/DevToolsFoundation.framework/DevToolsFoundation")); + foreach (const QString &libPath, deps) { + QLibrary *lib = new QLibrary(libPath); + //lib->setLoadHints(QLibrary::ExportExternalSymbolsHint); + if (!lib->load()) + printf("<msg>error loading %s</msg>", libPath.toUtf8().constData()); + } + QLibrary *libIPhoneSimulatorRemoteClient = new QLibrary(xcodePath + + QLatin1String("Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework/iPhoneSimulatorRemoteClient")); + //libIPhoneSimulatorRemoteClient->setLoadHints(QLibrary::ResolveAllSymbolsHint|QLibrary::ExportExternalSymbolsHint); + if (!libIPhoneSimulatorRemoteClient->load()) + printf("<msg>error loading iPhoneSimulatorRemoteClient</msg>"); + + iPhoneSimulator *sim = [[iPhoneSimulator alloc] init]; + + /* Execute command line handler */ + [sim runWithArgc: argc argv: argv]; + + /* Run the loop to handle added input sources, if any */ + + int res = a.exec(); + exit(res); + // [pool release]; + return 0; +} diff --git a/src/tools/3rdparty/iossim_1_8_2/nsprintf.h b/src/tools/3rdparty/iossim_1_8_2/nsprintf.h new file mode 100644 index 0000000000..cee7c00d28 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/nsprintf.h @@ -0,0 +1,6 @@ +/* + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ +int nsvfprintf (FILE *stream, NSString *format, va_list args); +int nsfprintf (FILE *stream, NSString *format, ...); +int nsprintf (NSString *format, ...); diff --git a/src/tools/3rdparty/iossim_1_8_2/nsprintf.mm b/src/tools/3rdparty/iossim_1_8_2/nsprintf.mm new file mode 100644 index 0000000000..b7413f593c --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/nsprintf.mm @@ -0,0 +1,44 @@ +/* + * NSLog() clone, but writes to arbitrary output stream + * + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ + +#import <Foundation/Foundation.h> +#import <stdio.h> + +int nsvfprintf (FILE *stream, NSString *format, va_list args) { + int retval; + + NSString *str = (NSString *) CFStringCreateWithFormatAndArguments(NULL, NULL, (CFStringRef) format, args); + retval = fprintf(stream, "%s\n", [str UTF8String]); + [str release]; + + return retval; +} + +int nsfprintf (FILE *stream, NSString *format, ...) { + va_list ap; + int retval; + + va_start(ap, format); + { + retval = nsvfprintf(stream, format, ap); + } + va_end(ap); + + return retval; +} + +int nsprintf (NSString *format, ...) { + va_list ap; + int retval; + + va_start(ap, format); + { + retval = nsvfprintf(stdout, format, ap); + } + va_end(ap); + + return retval; +} diff --git a/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.h b/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.h new file mode 100644 index 0000000000..3eed139c0e --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.h @@ -0,0 +1,11 @@ +/* + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ + +#import <Foundation/Foundation.h> + +@interface NSString (ExpandPath) + +- (NSString *)expandPath; + +@end diff --git a/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.mm b/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.mm new file mode 100644 index 0000000000..53f43e3c12 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/nsstringexpandpath.mm @@ -0,0 +1,18 @@ +/* + * See the IOSSIM_LICENSE file in this directory for the license on the source code in this file. + */ + +#import "nsstringexpandpath.h" + +@implementation NSString (ExpandPath) + +- (NSString *)expandPath { + if ([self isAbsolutePath]) { + return [self stringByStandardizingPath]; + } else { + NSString *cwd = [[NSFileManager defaultManager] currentDirectoryPath]; + return [[cwd stringByAppendingPathComponent:self] stringByStandardizingPath]; + } +} + +@end diff --git a/src/tools/3rdparty/iossim_1_8_2/version.h b/src/tools/3rdparty/iossim_1_8_2/version.h new file mode 100644 index 0000000000..9f8c0dfc91 --- /dev/null +++ b/src/tools/3rdparty/iossim_1_8_2/version.h @@ -0,0 +1 @@ +#define IOS_SIM_VERSION "1.8.2m" diff --git a/src/tools/iostool/iostool.qbs b/src/tools/iostool/iostool.qbs index abb95f0975..e2a40ad446 100644 --- a/src/tools/iostool/iostool.qbs +++ b/src/tools/iostool/iostool.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool QtcTool { diff --git a/src/tools/qtcdebugger/qtcdebugger.qbs b/src/tools/qtcdebugger/qtcdebugger.qbs index 1895eb917f..7358d74eb3 100644 --- a/src/tools/qtcdebugger/qtcdebugger.qbs +++ b/src/tools/qtcdebugger/qtcdebugger.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool QtcTool { diff --git a/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs b/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs index 2bd9b70d38..9d0bd4524b 100644 --- a/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs +++ b/src/tools/qtcreatorcrashhandler/qtcreatorcrashhandler.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool QtcTool { diff --git a/src/tools/qtpromaker/qtpromaker.qbs b/src/tools/qtpromaker/qtpromaker.qbs index b23fb9f0ae..63d01368bc 100644 --- a/src/tools/qtpromaker/qtpromaker.qbs +++ b/src/tools/qtpromaker/qtpromaker.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool QtcTool { diff --git a/src/tools/sdktool/getoperation.cpp b/src/tools/sdktool/getoperation.cpp index 1899cefa1c..2beb77f9e5 100644 --- a/src/tools/sdktool/getoperation.cpp +++ b/src/tools/sdktool/getoperation.cpp @@ -69,9 +69,10 @@ int GetOperation::execute() const foreach (const QString &key, m_keys) { const QVariant result = get(map, key); - if (result.isValid()) - return 2; - std::cout << qPrintable(result.toString()) << std::endl; + if (!result.isValid()) + std::cout << "<invalid>" << std::endl; + else + std::cout << qPrintable(result.toString()) << std::endl; } return 0; diff --git a/src/tools/sdktool/sdktool.qbs b/src/tools/sdktool/sdktool.qbs index a917b6fe4a..72d6188052 100644 --- a/src/tools/sdktool/sdktool.qbs +++ b/src/tools/sdktool/sdktool.qbs @@ -1,4 +1,4 @@ -import qbs.base 1.0 +import qbs 1.0 import QtcTool QtcTool { |