X-Git-Url: https://git.saurik.com/uikittools.git/blobdiff_plain/3ffcdfdb8076bb82532bb122b0752b0f5dc21078..ef0e2d50c9d7b51e53ce6fd4bae768742526ca3e:/uicache.mm diff --git a/uicache.mm b/uicache.mm index aac264d..e5235f2 100644 --- a/uicache.mm +++ b/uicache.mm @@ -46,8 +46,6 @@ #include -#include - #include "csstore.hpp" @interface NSMutableArray (Cydia) @@ -60,6 +58,10 @@ [self addObject:info]; } +- (NSArray *) allInfoDictionaries { + return self; +} + @end @interface NSMutableDictionary (Cydia) @@ -73,11 +75,35 @@ [self setObject:info forKey:bundle]; } +- (NSArray *) allInfoDictionaries { + return [self allValues]; +} + +@end + +@interface LSApplicationWorkspace : NSObject ++ (id) defaultWorkspace; +- (BOOL) registerApplication:(id)application; +- (BOOL) unregisterApplication:(id)application; +- (BOOL) invalidateIconCache:(id)bundle; +- (BOOL) registerApplicationDictionary:(id)application; +- (BOOL) installApplication:(id)application withOptions:(id)options; +- (BOOL) _LSPrivateRebuildApplicationDatabasesForSystemApps:(BOOL)system internal:(BOOL)internal user:(BOOL)user; @end int main(int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + Class $LSApplicationWorkspace(objc_getClass("LSApplicationWorkspace")); + LSApplicationWorkspace *workspace($LSApplicationWorkspace == nil ? nil : [$LSApplicationWorkspace defaultWorkspace]); + + if (kCFCoreFoundationVersionNumber > 1000) // this API is on iOS 7 but invaliding the icon cache is harder there + if ([workspace respondsToSelector:@selector(_LSPrivateRebuildApplicationDatabasesForSystemApps:internal:user:)]) { + if (![workspace _LSPrivateRebuildApplicationDatabasesForSystemApps:YES internal:YES user:NO]) + fprintf(stderr, "failed to rebuild application databases"); + return 0; + } + bool respring(false); NSString *home(NSHomeDirectory()); @@ -92,9 +118,6 @@ int main(int argc, const char *argv[]) { system("killall lsd"); - Class $LSApplicationWorkspace(objc_getClass("LSApplicationWorkspace")); - LSApplicationWorkspace *workspace($LSApplicationWorkspace == nil ? nil : [$LSApplicationWorkspace defaultWorkspace]); - if ([workspace respondsToSelector:@selector(invalidateIconCache:)]) while (![workspace invalidateIconCache:nil]) sleep(1); @@ -116,6 +139,11 @@ int main(int argc, const char *argv[]) { NSArray *cached([cache objectForKey:@"InfoPlistCachedKeys"]); + NSMutableSet *removed([NSMutableSet set]); + for (NSDictionary *info in [before allInfoDictionaries]) + if (NSString *path = [info objectForKey:@"Path"]) + [removed addObject:path]; + if (NSArray *apps = [manager contentsOfDirectoryAtPath:@"/Applications" error:&error]) { for (NSString *app in apps) if ([app hasSuffix:@".app"]) { @@ -125,6 +153,7 @@ int main(int argc, const char *argv[]) { if (NSMutableDictionary *info = [NSMutableDictionary dictionaryWithContentsOfFile:plist]) { if (NSString *identifier = [info objectForKey:@"CFBundleIdentifier"]) { [bundles setObject:path forKey:identifier]; + [removed removeObject:path]; if (cached != nil) { NSMutableDictionary *merged([before objectForKey:identifier]); @@ -166,8 +195,14 @@ int main(int argc, const char *argv[]) { for (NSString *identifier in bundles) { NSString *path([bundles objectForKey:identifier]); - [workspace registerApplication:[NSURL fileURLWithPath:path]]; + if (kCFCoreFoundationVersionNumber >= 800) + [workspace registerApplicationDictionary:[after objectForKey:identifier]]; + else + [workspace registerApplication:[NSURL fileURLWithPath:path]]; } + + for (NSString *path in removed) + [workspace unregisterApplication:[NSURL fileURLWithPath:path]]; } } else fprintf(stderr, "cannot open cache file. incorrect user?\n"); cached: