summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2008-09-13 22:07:08 +0000
committerJay Freeman (saurik) <saurik@saurik.com>2008-09-13 22:07:08 +0000
commit1094bdcb9288d51f5dae9194d2f5adcfa3273040 (patch)
tree6f431f33849fc905eeffafabc90e9423009fc21c
parent2285d9e2b051bc3f429c870f9f4604034318f4eb (diff)
Adding initial version of uiinstall for BigBoss.
-rw-r--r--uiinstall.mm77
1 files changed, 77 insertions, 0 deletions
diff --git a/uiinstall.mm b/uiinstall.mm
new file mode 100644
index 0000000..1473ca5
--- /dev/null
+++ b/uiinstall.mm
@@ -0,0 +1,77 @@
+@interface NSMutableArray (Cydia)
+- (void) addInfoDictionary:(NSDictionary *)info;
+@end
+
+@implementation NSMutableArray (Cydia)
+
+- (void) addInfoDictionary:(NSDictionary *)info {
+ [self addObject:info];
+}
+
+@end
+
+@interface NSMutableDictionary (Cydia)
+- (void) addInfoDictionary:(NSDictionary *)info;
+@end
+
+@implementation NSMutableDictionary (Cydia)
+
+- (void) addInfoDictionary:(NSDictionary *)info {
+ NSString *bundle = [info objectForKey:@"CFBundleIdentifier"];
+ [self setObject:info forKey:bundle];
+}
+
+@end
+
+#define Cache_ "/User/Library/Caches/com.apple.mobile.installation.plist"
+
+int main() {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ if (NSMutableDictionary *cache = [[NSMutableDictionary alloc] initWithContentsOfFile:@ Cache_]) {
+ [cache autorelease];
+
+ NSFileManager *manager = [NSFileManager defaultManager];
+ NSError *error = nil;
+
+ id system = [cache objectForKey:@"System"];
+ if (system == nil)
+ goto error;
+
+ struct stat info;
+ if (stat(Cache_, &info) == -1)
+ goto error;
+
+ [system removeAllObjects];
+
+ if (NSArray *apps = [manager contentsOfDirectoryAtPath:@"/Applications" error:&error]) {
+ for (NSString *app in apps)
+ if ([app hasSuffix:@".app"]) {
+ NSString *path = [@"/Applications" stringByAppendingPathComponent:app];
+ NSString *plist = [path stringByAppendingPathComponent:@"Info.plist"];
+ if (NSMutableDictionary *info = [[NSMutableDictionary alloc] initWithContentsOfFile:plist]) {
+ [info autorelease];
+ [info setObject:path forKey:@"Path"];
+ [info setObject:@"System" forKey:@"ApplicationType"];
+ [system addInfoDictionary:info];
+ }
+ }
+ } else goto error;
+
+ [cache writeToFile:@Cache_ atomically:YES];
+
+ if (chown(Cache_, info.st_uid, info.st_gid) == -1)
+ goto error;
+ if (chmod(Cache_, info.st_mode) == -1)
+ goto error;
+
+ if (false) error:
+ fprintf(stderr, "%s\n", error == nil ? strerror(errno) : [[error localizedDescription] UTF8String]);
+ }
+
+ notify_post("com.apple.mobile.application_installed");
+
+ [pool release];
+
+ return 0;
+}