]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Commit most of the new layout I'd been working on.
[winterboard.git] / Library.mm
index adc30f9453658ae4c162dadeb62ba0b4c5cac84d..bc8084b84066d80b43751f05097d36b7a44aa3d5 100644 (file)
@@ -370,12 +370,10 @@ static NSString *$getTheme$(NSArray *files, NSArray *themes = Themes_) {
 }
 // }}}
 // $pathForFile$inBundle$() {{{
-static void $pathForFile$inBundle$(NSMutableArray *names, NSString *file, NSBundle *bundle) {
-    NSString *identifier = [bundle bundleIdentifier];
-
+static void $pathForFile$inBundle$(NSMutableArray *names, NSString *file, NSString *identifier, NSURL *url) {
     if (identifier != nil)
         [names addObject:[NSString stringWithFormat:@"Bundles/%@/%@", identifier, file]];
-    if (NSString *folder = [[bundle bundlePath] lastPathComponent]) {
+    if (NSString *folder = [url lastPathComponent]) {
         [names addObject:[NSString stringWithFormat:@"Folders/%@/%@", folder, file]];
         NSString *base([folder stringByDeletingPathExtension]);
         if ([base hasSuffix:@"~iphone"])
@@ -392,13 +390,13 @@ static void $pathForFile$inBundle$(NSMutableArray *names, NSString *file, NSBund
 
     if (identifier == nil);
     else if ([identifier isEqualToString:@"com.apple.uikit.Artwork"])
-        $pathForFile$inBundle$(names, file, [WBBundle bundleWithIdentifier:@"com.apple.UIKit"]);
+        $pathForFile$inBundle$(names, file, @"com.apple.UIKit", nil);
     else if ([identifier isEqualToString:@"com.apple.uikit.LegacyArtwork"])
-        $pathForFile$inBundle$(names, file, [WBBundle bundleWithIdentifier:@"com.apple.UIKit"]);
+        $pathForFile$inBundle$(names, file, @"com.apple.UIKit", nil);
     else if ([identifier isEqualToString:@"com.apple.UIKit"])
         [names addObject:[NSString stringWithFormat:@"UIImages/%@", file]];
     else if ([identifier isEqualToString:@"com.apple.chatkit"])
-        $pathForFile$inBundle$(names, file, [WBBundle bundleWithIdentifier:@"com.apple.MobileSMS"]);
+        $pathForFile$inBundle$(names, file, @"com.apple.MobileSMS", nil);
     else if ([identifier isEqualToString:@"com.apple.calculator"])
         [names addObject:[NSString stringWithFormat:@"Files/Applications/Calculator.app/%@", file]];
     else if ([identifier isEqualToString:@"com.apple.Maps"] && [file isEqualToString:@"Icon-57@2x.png"])
@@ -409,14 +407,25 @@ static void $pathForFile$inBundle$(NSMutableArray *names, NSString *file, NSBund
         remapResourceName(@"SBWeatherCelsius.png", @"Icons/Weather")
 }
 
-static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool use) {
+static NSString *$pathForFile$inBundle$(NSString *file, NSString *identifier, NSURL *url, bool use) {
     NSMutableArray *names = [NSMutableArray arrayWithCapacity:8];
-    $pathForFile$inBundle$(names, file, bundle);
+    $pathForFile$inBundle$(names, file, identifier, url);
     [names addObject:[NSString stringWithFormat:@"Fallback/%@", file]];
     if (NSString *path = $getTheme$($useScale$(names, use)))
         return path;
     return nil;
 }
+
+// XXX: this cannot be merged due to WBBundle
+static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool use) {
+    return $pathForFile$inBundle$(file, [bundle bundleIdentifier], [bundle bundleURL], use);
+}
+
+static NSString *$pathForFile$inBundle$(NSString *file, CFBundleRef bundle, bool use) {
+    NSString *identifier((NSString *) CFBundleGetIdentifier(bundle));
+    NSURL *url([(NSURL *) CFBundleCopyBundleURL(bundle) autorelease]);
+    return $pathForFile$inBundle$(file, identifier, url, use);
+}
 // }}}
 
 static NSString *$pathForIcon$(SBApplication *self, NSString *suffix = @"") {
@@ -424,7 +433,12 @@ static NSString *$pathForIcon$(SBApplication *self, NSString *suffix = @"") {
     NSString *path = [self path];
     NSString *folder = [path lastPathComponent];
     NSString *dname = [self displayName];
-    NSString *didentifier = [self displayIdentifier];
+
+    NSString *didentifier;
+    if ([self respondsToSelector:@selector(displayIdentifier)])
+        didentifier = [self displayIdentifier];
+    else
+        didentifier = nil;
 
     if (Debug_)
         NSLog(@"WB:Debug: [SBApplication(%@:%@:%@:%@) pathForIcon]", identifier, folder, dname, didentifier);
@@ -441,7 +455,7 @@ static NSString *$pathForIcon$(SBApplication *self, NSString *suffix = @"") {
         if (NSString *name = Name) \
             [names addObject:[NSString stringWithFormat:@"Icons%@/%@.png", suffix, name]];
 
-    if (![didentifier isEqualToString:identifier])
+    if (didentifier != nil && ![didentifier isEqualToString:identifier])
         testForIcon(didentifier);
 
     testForIcon(identifier);
@@ -726,16 +740,19 @@ MSHook(UIImage *, _UIApplicationImageWithName, NSString *name) {
             NSLog(@"WB:Error: [%s forwardInvocation:(%s)]", class_getName([self class]), sel_getName(sel)); \
     }
 
-// %hook -[NSBundle pathForResource:ofType:] {{{
-MSInstanceMessageHook2(NSString *, NSBundle, pathForResource,ofType, NSString *, resource, NSString *, type) {
-    NSString *file = type == nil ? resource : [NSString stringWithFormat:@"%@.%@", resource, type];
-    if ([file isEqualToString:@"Info.plist"])
-        return MSOldCall(resource, type);
+// %hook CFBundleCopyResourceURL {{{
+MSHook(CFURLRef, CFBundleCopyResourceURL, CFBundleRef bundle, CFStringRef resourceName, CFStringRef resourceType, CFStringRef subDirName) {
+    NSString *file((NSString *) resourceName);
+    if (resourceType != NULL)
+        file = [NSString stringWithFormat:@"%@.%@", file, resourceType];
+    if (subDirName != NULL)
+        file = [NSString stringWithFormat:@"%@/%@", subDirName, resourceType];
+
     if (Debug_)
-        NSLog(@"WB:Debug: [NSBundle(%@) pathForResource:\"%@\"]", [self bundleIdentifier], file);
-    if (NSString *path = $pathForFile$inBundle$(file, self, false))
-        return path;
-    return MSOldCall(resource, type);
+        NSLog(@"WB:Debug: CFBundleCopyResourceURL(<%@>, \"%@\", \"%@\", \"%@\")", CFBundleGetIdentifier(bundle), resourceName, resourceType, subDirName);
+    if (NSString *path = $pathForFile$inBundle$(file, bundle, false))
+        return (CFURLRef) [[NSURL alloc] initFileURLWithPath:path];
+    return _CFBundleCopyResourceURL(bundle, resourceName, resourceType, subDirName);
 }
 // }}}
 
@@ -2219,33 +2236,48 @@ static void ChangeWallpaper(
 
 }
 
-MSHook(NSArray *, CPBitmapCreateImagesFromPath, NSString *path, NSDictionary **names, void *arg2, void *arg3) {
+MSHook(NSArray *, CPBitmapCreateImagesFromPath, NSString *path, CFTypeRef *names, void *arg2, void *arg3) {
     NSArray *images(_CPBitmapCreateImagesFromPath(path, names, arg2, arg3));
-    if (images != NULL && *names != nil && CFGetTypeID((CFTypeRef) *names) == CFDictionaryGetTypeID()) {
-        if (NSBundle *bundle = [NSBundle wb$bundleWithFile:path]) {
-            NSMutableArray *copy([images mutableCopy]);
-            [images release];
-            images = copy;
-
-            NSString *file([path stringByResolvingSymlinksInPath]);
-            NSString *prefix([[bundle bundlePath] stringByResolvingSymlinksInPath]);
-            if ([file hasPrefix:prefix]) {
-                NSUInteger length([prefix length]);
-                if (length != [file length]) {
-                    NSEnumerator *enumerator([*names keyEnumerator]);
-                    while (NSString *name = [enumerator nextObject]) {
-                        NSString *png([name stringByAppendingString:@".png"]);
-                        if (NSString *themed = $pathForFile$inBundle$(png, bundle, true)) {
-                            NSUInteger index([[*names objectForKey:name] intValue]);
-                            UIImage *image($getImage$(themed));
-                            CGImageRef cg([image CGImage]);
-                            [copy replaceObjectAtIndex:index withObject:(id)cg];
-                        }
-                    }
-                }
-            }
+    if (images == nil)
+        return nil;
+    if (*names == nil)
+        return images;
+
+    NSBundle *bundle([NSBundle wb$bundleWithFile:path]);
+    if (bundle == nil)
+        return images;
+
+    NSString *file([path stringByResolvingSymlinksInPath]);
+    NSString *prefix([[bundle bundlePath] stringByResolvingSymlinksInPath]);
+    // XXX: why do I care about this?
+    if (![file hasPrefix:prefix])
+        return images;
+
+    NSMutableArray *copy([images mutableCopy]);
+    [images release];
+    images = copy;
+
+    NSDictionary *indexes;
+    NSEnumerator *enumerator;
+
+    if (CFGetTypeID((CFTypeRef) *names) == CFDictionaryGetTypeID()) {
+        indexes = (NSDictionary *) *names;
+        enumerator = [indexes keyEnumerator];
+    } else {
+        indexes = nil;
+        enumerator = [(NSArray *) *names objectEnumerator];
+    }
+
+    for (NSUInteger index(0); NSString *name = [enumerator nextObject]; ++index)
+        if (NSString *themed = $pathForFile$inBundle$([name stringByAppendingString:@".png"], bundle, true)) {
+            if (indexes != nil)
+                index = [[indexes objectForKey:name] intValue];
+            UIImage *image($getImage$(themed));
+            CGImageRef cg([image CGImage]);
+            [copy replaceObjectAtIndex:index withObject:(id)cg];
         }
-    } return images;
+
+    return images;
 }
 
 MSHook(void, BKSDisplayServicesSetSystemAppExitedImagePath, NSString *path) {
@@ -2403,7 +2435,7 @@ static void SBInitialize() {
     no = true;
 
     if (strstr(path, "/icon") != NULL)
-        MSHookProcess(-1, "");
+        *reinterpret_cast<void *volatile *>(NULL) = NULL;
 
     if (fd == -1 && errno == EFAULT)
         NSLog(@"open(%p, %#x, %#o) = %d\n", path, oflag, mode, fd);
@@ -2431,7 +2463,9 @@ MSInitialize {
 
     // Load Settings.plist {{{
     if (NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"/User/Library/Preferences/com.saurik.WinterBoard.plist"]]) {
-        if (NSNumber *value = [settings objectForKey:@"SummerBoard"])
+        if (kCFCoreFoundationVersionNumber >= 1000)
+            SummerBoard_ = false;
+        else if (NSNumber *value = [settings objectForKey:@"SummerBoard"])
             SummerBoard_ = [value boolValue];
         else
             SummerBoard_ = true;
@@ -2487,7 +2521,7 @@ MSInitialize {
 
     // AppSupport {{{
     if (MSImageRef image = MSGetImageByName("/System/Library/PrivateFrameworks/AppSupport.framework/AppSupport")) {
-        NSArray *(*CPBitmapCreateImagesFromPath)(NSString *, NSDictionary **, void *, void *);
+        NSArray *(*CPBitmapCreateImagesFromPath)(NSString *, CFTypeRef *, void *, void *);
         msset(CPBitmapCreateImagesFromPath, image, "_CPBitmapCreateImagesFromPath");
         MSHookFunction(CPBitmapCreateImagesFromPath, MSHake(CPBitmapCreateImagesFromPath));
     }
@@ -2510,6 +2544,11 @@ MSInitialize {
         MSHookFunction(BKSDisplayServicesSetSystemAppExitedImagePath, MSHake(BKSDisplayServicesSetSystemAppExitedImagePath));
     }
     // }}}
+    // Foundation {{{
+    if (true) {
+        MSHookFunction(CFBundleCopyResourceURL, MSHake(CFBundleCopyResourceURL));
+    }
+    // }}}
     // GraphicsServices {{{
     if (true) {
         MSHookFunction(&GSFontCreateWithName, &$GSFontCreateWithName, &_GSFontCreateWithName);