]> git.saurik.com Git - fiveicondock.git/blobdiff - prerm.mm
Fixed a fatal uninstallation flaw in Five Icon Dock.
[fiveicondock.git] / prerm.mm
diff --git a/prerm.mm b/prerm.mm
new file mode 100644 (file)
index 0000000..8c38b04
--- /dev/null
+++ b/prerm.mm
@@ -0,0 +1,85 @@
+#import <Foundation/Foundation.h>
+
+#include <sys/types.h>
+#include <pwd.h>
+#include <unistd.h>
+
+int main(int argc, const char *argv[]) {
+    if (argc < 2 || strcmp(argv[1], "remove") != 0)
+        return 0;
+
+    struct passwd *passwd = getpwnam("mobile");
+    if (passwd == NULL) {
+        perror("getpwnam");
+        return 0;
+    }
+
+    if (setregid(passwd->pw_gid, passwd->pw_gid) == -1) {
+        perror("setregid");
+        return 1;
+    }
+
+    if (setreuid(passwd->pw_uid, passwd->pw_uid) == -1) {
+        perror("setreuid");
+        return 1;
+    }
+
+    NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]);
+
+    NSString *path([NSString stringWithFormat:@"%@/Library/Preferences/com.apple.springboard.plist", NSHomeDirectory()]);
+
+    NSMutableDictionary *settings([[NSMutableDictionary alloc] initWithContentsOfFile:path]);
+    if (settings == nil)
+        return 0;
+
+    NSMutableDictionary *iconState([settings objectForKey:@"iconState"]);
+    if (iconState == nil)
+        return 0;
+
+    NSMutableDictionary *buttonBar([iconState objectForKey:@"buttonBar"]);
+    if (buttonBar == nil)
+        return 0;
+
+    NSMutableArray *buttonBarIconMatrix([buttonBar objectForKey:@"iconMatrix"]);
+    if (buttonBarIconMatrix == nil || [buttonBarIconMatrix count] == 0)
+        return 0;
+
+    NSMutableArray *buttonBarRow([buttonBarIconMatrix objectAtIndex:0]);
+    if (buttonBarRow == nil)
+        return 0;
+
+    NSMutableDictionary *fifth([buttonBarRow objectAtIndex:4]);
+
+    if (![fifth isEqual:[NSNumber numberWithInt:0]]) {
+        NSMutableArray *iconLists([iconState objectForKey:@"iconLists"]);
+        if (iconLists == nil)
+            iconLists = [NSMutableArray arrayWithCapacity:1];
+        else for (NSUInteger i(0), e([iconLists count]); i != e; ++i) {
+            NSMutableDictionary *iconList([iconLists objectAtIndex:i]);
+            NSMutableArray *iconMatrix([iconList objectForKey:@"iconMatrix"]);
+            if (iconMatrix == nil)
+                continue;
+
+            for (NSUInteger i(0), e([iconMatrix count]); i != e; ++i) {
+                NSMutableArray *row([iconMatrix objectAtIndex:i]);
+                NSUInteger spot([row indexOfObject:[NSNumber numberWithInteger:0]]);
+                if (spot != NSNotFound) {
+                    [row replaceObjectAtIndex:i withObject:fifth];
+                    goto save;
+                }
+            }
+        }
+
+        [iconLists addObject:[NSDictionary dictionaryWithObjectsAndKeys:
+            [NSArray arrayWithObjects:[NSArray arrayWithObject:fifth], nil], @"iconMatrix",
+        nil]];
+    }
+
+  save:
+    [buttonBarRow removeLastObject];
+    bool saved([settings writeToFile:path atomically:YES]);
+
+    [pool release];
+
+    return saved ? 0 : 1;
+}