summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2013-02-06 09:41:58 +0000
committerJay Freeman (saurik) <saurik@saurik.com>2013-02-06 10:53:29 +0000
commit3ffcdfdb8076bb82532bb122b0752b0f5dc21078 (patch)
tree85b08aa49020e46631c5eda87086698676abea4e
parent22d64ef459e18eaf0271f213978680d198318a55 (diff)
If possible, only merge cached Info.plist keys.
-rw-r--r--uicache.mm28
1 files changed, 24 insertions, 4 deletions
diff --git a/uicache.mm b/uicache.mm
index 1b62d0e..aac264d 100644
--- a/uicache.mm
+++ b/uicache.mm
@@ -105,13 +105,16 @@ int main(int argc, const char *argv[]) {
NSMutableDictionary *bundles([NSMutableDictionary dictionaryWithCapacity:16]);
- id system = [cache objectForKey:@"System"];
- if (system == nil) { error:
+ id after = [cache objectForKey:@"System"];
+ if (after == nil) { error:
fprintf(stderr, "%s\n", error == nil ? strerror(errno) : [[error localizedDescription] UTF8String]);
goto cached;
}
- [system removeAllObjects];
+ id before([[after copy] autorelease]);
+ [after removeAllObjects];
+
+ NSArray *cached([cache objectForKey:@"InfoPlistCachedKeys"]);
if (NSArray *apps = [manager contentsOfDirectoryAtPath:@"/Applications" error:&error]) {
for (NSString *app in apps)
@@ -122,9 +125,26 @@ int main(int argc, const char *argv[]) {
if (NSMutableDictionary *info = [NSMutableDictionary dictionaryWithContentsOfFile:plist]) {
if (NSString *identifier = [info objectForKey:@"CFBundleIdentifier"]) {
[bundles setObject:path forKey:identifier];
+
+ if (cached != nil) {
+ NSMutableDictionary *merged([before objectForKey:identifier]);
+ if (merged == nil)
+ merged = [NSMutableDictionary dictionary];
+ else
+ merged = [[merged mutableCopy] autorelease];
+
+ for (NSString *key in cached)
+ if (NSObject *value = [info objectForKey:key])
+ [merged setObject:value forKey:key];
+ else
+ [merged removeObjectForKey:key];
+
+ info = merged;
+ }
+
[info setObject:path forKey:@"Path"];
[info setObject:@"System" forKey:@"ApplicationType"];
- [system addInfoDictionary:info];
+ [after addInfoDictionary:info];
} else
fprintf(stderr, "%s missing CFBundleIdentifier", [app UTF8String]);
}