- (void) removeProgressHUD:(UIProgressHUD *)hud;
- (CYViewController *) pageForPackage:(NSString *)name;
- (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item;
+- (void) reloadDataWithInvocation:(NSInvocation *)invocation;
@end
static id<CydiaDelegate> CydiaApp;
- (NSArray *) packages;
- (NSArray *) sources;
- (Source *) sourceWithKey:(NSString *)key;
-- (void) reloadData;
+- (void) reloadDataWithInvocation:(NSInvocation *)invocation;
- (void) configure;
- (bool) prepare;
return [self popErrorWithTitle:title] || !success;
}
-- (void) reloadData { CYPoolStart() {
+- (void) reloadDataWithInvocation:(NSInvocation *)invocation { CYPoolStart() {
@synchronized (self) {
++era_;
if (chk != -1)
close(chk);
+ if (invocation != nil)
+ [invocation invoke];
+
NSString *title(UCLocalize("DATABASE"));
_trace();
database_ = database;
buttons_ = [[NSMutableArray alloc] initWithCapacity:4];
name_ = [[NSString alloc] initWithString:name];
+ [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/package/#!/%@", UI_, name_]]];
} return self;
}
- (void) reloadData {
- [super reloadData];
-
if (package_ != nil)
[package_ autorelease];
package_ = [database_ packageWithName:name_];
action:@selector(customButtonClicked)
];
- [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/package/#!/%@", UI_, name_]]];
+ [super reloadData];
}
- (bool) isLoading {
if (package_ == nil)
return 0;
- return 1;
+ if ([package_ installed] == nil)
+ return 1;
+ else
+ return 2;
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (package_ == nil)
return 0;
- return 2;
+ // both sections contain just one item right now.
+ return 1;
}
- (NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
- return UCLocalize("CHANGE_PACKAGE_SETTINGS");
+ return nil;
}
- (NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
- return UCLocalize("SHOW_ALL_CHANGES_EX");
+ if (section == 0)
+ return UCLocalize("SHOW_ALL_CHANGES_EX");
+ else
+ return UCLocalize("IGNORE_UPGRADES_EX");
}
- (void) onSubscribed:(id)control {
[delegate_ updateData];
}
+- (void) _updateIgnored {
+ const char *package([name_ UTF8String]);
+ bool on([ignoredSwitch_ isOn]);
+
+ pid_t pid(ExecFork());
+ if (pid == 0) {
+ FILE *dpkg(popen("dpkg --set-selections", "w"));
+ fwrite(package, strlen(package), 1, dpkg);
+
+ if (on)
+ fwrite(" hold\n", 6, 1, dpkg);
+ else
+ fwrite(" install\n", 9, 1, dpkg);
+
+ pclose(dpkg);
+
+ exit(0);
+ _assert(false);
+ }
+
+ _forever {
+ int status;
+ int result(waitpid(pid, &status, 0));
+
+ if (result != -1) {
+ _assert(result == pid);
+ break;
+ }
+ }
+}
+
- (void) onIgnored:(id)control {
- // TODO: set Held state - possibly call out to dpkg, etc.
+ NSInvocation *invocation([NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(_updateIgnored)]]);
+ [invocation setTarget:self];
+ [invocation setSelector:@selector(_updateIgnored)];
+
+ [delegate_ reloadDataWithInvocation:invocation];
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (package_ == nil)
return nil;
- switch ([indexPath row]) {
+ switch ([indexPath section]) {
case 0: return subscribedCell_;
case 1: return ignoredCell_;
ignoredSwitch_ = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 50, 20)];
[ignoredSwitch_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
[ignoredSwitch_ addTarget:self action:@selector(onIgnored:) forEvents:UIControlEventValueChanged];
- // Disable this switch, since it only reflects (not modifies) the ignored state.
- [ignoredSwitch_ setUserInteractionEnabled:NO];
subscribedCell_ = [[UITableViewCell alloc] init];
[subscribedCell_ setText:UCLocalize("SHOW_ALL_CHANGES")];
[ignoredCell_ setText:UCLocalize("IGNORE_UPGRADES")];
[ignoredCell_ setAccessoryView:ignoredSwitch_];
[ignoredCell_ setSelectionStyle:UITableViewCellSelectionStyleNone];
- // FIXME: Ignored state is not saved.
- [ignoredCell_ setUserInteractionEnabled:NO];
}
- (void) viewDidLoad {
if (package_ != nil)
[package_ autorelease];
package_ = [database_ packageWithName:name_];
+
if (package_ != nil) {
- [package_ retain];
+ package_ = [package_ retain];
[subscribedSwitch_ setOn:([package_ subscribed] ? 1 : 0) animated:NO];
[ignoredSwitch_ setOn:([package_ ignored] ? 1 : 0) animated:NO];
- }
+ } // XXX: what now, G?
[table_ reloadData];
}
[NSThread detachNewThreadSelector:@selector(_refreshIfPossible) toTarget:self withObject:nil];
}
-- (void) _reloadData {
+- (void) _reloadDataWithInvocation:(NSInvocation *)invocation {
UIProgressHUD *hud(loaded_ ? [self addProgressHUD] : nil);
[hud setText:UCLocalize("RELOADING_DATA")];
- [database_ yieldToSelector:@selector(reloadData) withObject:nil];
+ [database_ yieldToSelector:@selector(reloadDataWithInvocation:) withObject:invocation];
if (hud != nil)
[self removeProgressHUD:hud];
];
}
-- (void) reloadData {
+- (void) reloadDataWithInvocation:(NSInvocation *)invocation {
@synchronized (self) {
- [self _reloadData];
+ [self _reloadDataWithInvocation:invocation];
}
}
+- (void) reloadData {
+ [self reloadDataWithInvocation:nil];
+}
+
- (void) resolve {
pkgProblemResolver *resolver = [database_ resolver];
- (void) complete {
@synchronized (self) {
- [self _reloadData];
+ [self _reloadDataWithInvocation:nil];
}
}
Finishes_ = [NSArray arrayWithObjects:@"return", @"reopen", @"restart", @"reload", @"reboot", nil];
- if (substrate && access("/Library/MobileSubstrate/DynamicLibraries/SimulatedKeyEvents.dylib", F_OK) == 0)
- dlopen("/Library/MobileSubstrate/DynamicLibraries/SimulatedKeyEvents.dylib", RTLD_LAZY | RTLD_GLOBAL);
- if (substrate && access("/Applications/WinterBoard.app/WinterBoard.dylib", F_OK) == 0)
- dlopen("/Applications/WinterBoard.app/WinterBoard.dylib", RTLD_LAZY | RTLD_GLOBAL);
+#define MobileSubstrate_(name) \
+ if (substrate && access("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", F_OK) == 0) \
+ dlopen("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", RTLD_LAZY | RTLD_GLOBAL);
+
+ MobileSubstrate_(Activator)
+ MobileSubstrate_(libstatusbar)
+ MobileSubstrate_(SimulatedKeyEvents)
+ MobileSubstrate_(WinterBoard)
+
/*if (substrate && access("/Library/MobileSubstrate/MobileSubstrate.dylib", F_OK) == 0)
dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib", RTLD_LAZY | RTLD_GLOBAL);*/