From 04ee9f372e9a9d91accf5ffedf6bafebfd9cdadd Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 4 Aug 2010 05:43:05 +0000 Subject: Sometimes, the capabilities aren't ready yet. --- control | 2 +- gssc.mm | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/control b/control index a91f06c..5f7c6b5 100644 --- a/control +++ b/control @@ -4,7 +4,7 @@ Section: Utilities Installed-Size: %S Maintainer: Jay Freeman (saurik) Architecture: iphoneos-arm -Version: 1.0.3201-1 +Version: 1.0.3227-1 Description: UIKit/GraphicsServices command line access Name: UIKit Tools Author: Jay Freeman (saurik) diff --git a/gssc.mm b/gssc.mm index 0c40ed5..4932174 100644 --- a/gssc.mm +++ b/gssc.mm @@ -6,6 +6,16 @@ static CFArrayRef (*$GSSystemCopyCapability)(CFStringRef); static CFArrayRef (*$GSSystemGetCapability)(CFStringRef); +void OnGSCapabilityChanged( + CFNotificationCenterRef center, + void *observer, + CFStringRef name, + const void *object, + CFDictionaryRef info +) { + CFRunLoopStop(CFRunLoopGetCurrent()); +} + int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; @@ -21,15 +31,34 @@ int main(int argc, char *argv[]) { $GSSystemCopyCapability = reinterpret_cast(dlsym(RTLD_DEFAULT, "GSSystemCopyCapability")); $GSSystemGetCapability = reinterpret_cast(dlsym(RTLD_DEFAULT, "GSSystemGetCapability")); + CFNotificationCenterAddObserver( + CFNotificationCenterGetDarwinNotifyCenter(), + NULL, + &OnGSCapabilityChanged, + CFSTR("GSCapabilitiesChanged"), + NULL, + NULL + ); + const NSArray *capability; - if ($GSSystemCopyCapability != NULL) { - capability = reinterpret_cast((*$GSSystemCopyCapability)(reinterpret_cast(name))); - capability = [capability autorelease]; - } else if ($GSSystemGetCapability != NULL) { - capability = reinterpret_cast((*$GSSystemGetCapability)(reinterpret_cast(name))); - } else - capability = nil; + for (;;) { + if ($GSSystemCopyCapability != NULL) { + capability = reinterpret_cast((*$GSSystemCopyCapability)(reinterpret_cast(name))); + if (capability != nil) + capability = [capability autorelease]; + } else if ($GSSystemGetCapability != NULL) { + capability = reinterpret_cast((*$GSSystemGetCapability)(reinterpret_cast(name))); + } else { + capability = nil; + break; + } + + if (capability != nil) + break; + + CFRunLoopRun(); + } NSLog(@"%@", capability); -- cgit v1.2.3