#include <sys/sysctl.h>
#include <sys/param.h>
#include <sys/mount.h>
+#include <sys/reboot.h>
#include <fcntl.h>
#include <notify.h>
NSDictionary *package((NSDictionary *) value);
if (NSNumber *subscribed = [package objectForKey:@"IsSubscribed"])
- if ([subscribed boolValue])
+ if ([subscribed boolValue] && !metadata->subscribed_)
metadata->subscribed_ = true;
if (NSDate *date = [package objectForKey:@"FirstSeen"]) {
metadata->first_ = time;
}
- bool versioned(false);
+ NSDate *date([package objectForKey:@"LastSeen"]);
+ NSString *version([package objectForKey:@"LastVersion"]);
- if (NSDate *date = [package objectForKey:@"LastSeen"]) {
+ if (date != nil && version != nil) {
time_t time([date timeIntervalSince1970]);
- if (metadata->last_ < time || metadata->last_ == 0) {
- metadata->last_ = time;
- versioned = true;
- }
- } else if (metadata->last_ == 0) {
- metadata->last_ = metadata->first_;
- if (metadata->version_[0] == '\0')
- versioned = true;
- }
-
- if (versioned)
- if (NSString *version = [package objectForKey:@"LastVersion"])
+ if (metadata->last_ < time || metadata->last_ == 0)
if (CFStringGetCString((CFStringRef) version, buffer, sizeof(buffer), kCFStringEncodingUTF8)) {
size_t length(strlen(buffer));
uint16_t vhash(hashlittle(buffer, length));
strncpy(metadata->version_, latest, sizeof(metadata->version_));
metadata->vhash_ = vhash;
+
+ metadata->last_ = time;
}
+ }
}
// }}}
if (metadata->first_ == 0)
metadata->first_ = now_;
- if (metadata->last_ == 0)
- metadata->last_ = metadata->first_;
-
if (metadata->vhash_ != vhash || strncmp(metadata->version_, latest, sizeof(metadata->version_)) != 0) {
- if (metadata->version_[0] != '\0')
- metadata->last_ = now_;
strncpy(metadata->version_, latest, sizeof(metadata->version_));
metadata->vhash_ = vhash;
- }
+ metadata->last_ = now_;
+ } else if (metadata->last_ == 0)
+ metadata->last_ = metadata->first_;
_end
_profile(Package$initWithVersion$Section)
- (void) configure {
NSString *dpkg = [NSString stringWithFormat:@"dpkg --configure -a --status-fd %u", statusfd_];
+ _trace();
system([dpkg UTF8String]);
+ _trace();
}
- (bool) clean {
break;
case 2:
- system("launchctl stop com.apple.SpringBoard");
- break;
+ _trace();
+ goto reload;
case 3:
- system("launchctl unload "SpringBoard_"; launchctl load "SpringBoard_);
+ _trace();
+ goto reload;
+
+ reload:
+ system("/usr/bin/sbreload");
+ _trace();
break;
case 4:
- system("reboot");
+ _trace();
+ if (void (*SBReboot)(mach_port_t) = reinterpret_cast<void (*)(mach_port_t)>(dlsym(RTLD_DEFAULT, "SBReboot")))
+ SBReboot(SBSSpringBoardServerPort());
+ else
+ reboot2(RB_AUTOBOOT);
break;
}
}
case 4: [close_ setTitle:UCLocalize("REBOOT_DEVICE")]; break;
}
+ _trace();
system("su -c /usr/bin/uicache mobile");
+ _trace();
UpdateExternalStatus(Finish_ == 0 ? 2 : 0);
/* }}} */
-/* Add Source Controller {{{ */
-@interface AddSourceController : CYViewController {
- _transient Database *database_;
-}
-
-- (id) initWithDatabase:(Database *)database;
-
-@end
-
-@implementation AddSourceController
-
-- (id) initWithDatabase:(Database *)database {
- if ((self = [super init]) != nil) {
- database_ = database;
- } return self;
-}
-
-@end
-/* }}} */
/* Source Cell {{{ */
@interface SourceCell : CYTableViewCell <
ContentDelegate
@end
/* }}} */
/* Source Table {{{ */
-@interface SourceTable : CYViewController <
+@interface SourceController : CYViewController <
UITableViewDataSource,
UITableViewDelegate
> {
@end
-@implementation SourceTable
+@implementation SourceController
- (void) _releaseConnection:(NSURLConnection *)connection {
if (connection != nil) {
/* }}} */
/* Sections Controller {{{ */
-@interface SectionsController : CYViewController <
+@interface CYSectionsController : CYViewController <
UITableViewDataSource,
UITableViewDelegate
> {
@end
-@implementation SectionsController
+@implementation CYSectionsController
- (void) dealloc {
[list_ setDataSource:nil];
[super dealloc];
}
+- (void) setEditing:(BOOL)editing {
+ if ((editing_ = editing))
+ [list_ reloadData];
+ else
+ [delegate_ updateData];
+
+ [[self navigationItem] setTitle:editing_ ? UCLocalize("SECTION_VISIBILITY") : UCLocalize("SECTIONS")];
+ [[[self navigationItem] rightBarButtonItem] setTitle:[sections_ count] == 0 ? nil : editing_ ? UCLocalize("DONE") : UCLocalize("EDIT")];
+ [[[self navigationItem] rightBarButtonItem] setStyle:editing_ ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain];
+}
+
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[list_ deselectRowAtIndexPath:[list_ indexPathForSelectedRow] animated:animated];
}
+- (void) viewWillDisappear:(BOOL)animated {
+ [super viewWillDisappear:animated];
+ if (editing_) [self setEditing:NO];
+}
+
- (Section *) sectionAtIndexPath:(NSIndexPath *)indexPath {
Section *section = (editing_ ? [sections_ objectAtIndex:[indexPath row]] : ([indexPath row] == 0 ? nil : [filtered_ objectAtIndex:([indexPath row] - 1)]));
return section;
[self editButtonClicked];
}
-- (void) editButtonClicked {
- if ((editing_ = !editing_))
- [list_ reloadData];
- else
- [delegate_ updateData];
-
- [[self navigationItem] setTitle:editing_ ? UCLocalize("SECTION_VISIBILITY") : UCLocalize("SECTIONS")];
- [[[self navigationItem] rightBarButtonItem] setTitle:[sections_ count] == 0 ? nil : editing_ ? UCLocalize("DONE") : UCLocalize("EDIT")];
- [[[self navigationItem] rightBarButtonItem] setStyle:editing_ ? UIBarButtonItemStyleDone : UIBarButtonItemStylePlain];
+- (void)editButtonClicked {
+ [self setEditing:!editing_];
}
- (UIView *) accessoryView {
unsigned locked_;
unsigned activity_;
- SectionsController *sections_;
+ CYSectionsController *sections_;
ChangesController *changes_;
ManageController *manage_;
SearchController *search_;
- SourceTable *sources_;
+ SourceController *sources_;
InstalledController *installed_;
id queueDelegate_;
return [tabbar_ updating];
}
-- (UIView *) rotatingContentViewForWindow:(UIWindow *)window {
- return window_;
-}
-
- (void) _loaded {
if ([broken_ count] != 0) {
int count = [broken_ count];
- (void) _updateData {
[self _saveConfig];
- /* XXX: this is just stupid */
- if (tag_ != 1 && sections_ != nil)
- [sections_ reloadData];
- if (tag_ != 2 && changes_ != nil)
- [changes_ reloadData];
- if (tag_ != 4 && search_ != nil)
- [search_ reloadData];
+ NSMutableSet *tabs([[[NSMutableSet alloc] initWithCapacity:10] autorelease]);
+
+ [tabs addObject:[tabbar_ selectedViewController]];
+
+ if (sections_ != nil)
+ [tabs addObject:sections_];
+ if (changes_ != nil)
+ [tabs addObject:changes_];
+ if (manage_ != nil)
+ [tabs addObject:manage_];
+ if (search_ != nil)
+ [tabs addObject:search_];
+ if (sources_ != nil)
+ [tabs addObject:sources_];
+ if (installed_ != nil)
+ [tabs addObject:installed_];
- [(CYNavigationController *)[tabbar_ selectedViewController] reloadData];
+ for (CYNavigationController *tab in tabs)
+ [tab reloadData];
[queueDelegate_ queueStatusDidChange];
[[[self queueBadgeController] tabBarItem] setBadgeValue:(Queuing_ ? UCLocalize("Q_D") : nil)];
}
}
+ NSLog(@"changes:#%u", changes);
+
UITabBarItem *changesItem = [[[tabbar_ viewControllers] objectAtIndex:[self indexOfTabWithTag:kChangesTag]] tabBarItem];
if (changes != 0) {
+ _trace();
NSString *badge([[NSNumber numberWithInt:changes] stringValue]);
[changesItem setBadgeValue:badge];
[changesItem setAnimatedBadge:([essential_ count] > 0)];
-
- if ([self respondsToSelector:@selector(setApplicationBadge:)])
- [self setApplicationBadge:badge];
- else
- [self setApplicationBadgeString:badge];
+ [self setApplicationIconBadgeNumber:changes];
} else {
+ _trace();
[changesItem setBadgeValue:nil];
[changesItem setAnimatedBadge:NO];
-
- if ([self respondsToSelector:@selector(removeApplicationBadge)])
- [self removeApplicationBadge];
- else // XXX: maybe use setApplicationBadgeString also?
- [self setApplicationIconBadgeNumber:0];
+ [self setApplicationIconBadgeNumber:0];
}
[self _updateData];
_error->Discard();
}
-- (CGRect) popUpBounds {
- return [[tabbar_ view] bounds];
-}
-
- (bool) perform {
if (![database_ prepare])
return false;
return browser;
}
-- (SectionsController *) sectionsController {
+- (CYSectionsController *) sectionsController {
if (sections_ == nil)
- sections_ = [[SectionsController alloc] initWithDatabase:database_];
+ sections_ = [[CYSectionsController alloc] initWithDatabase:database_];
return sections_;
}
return search_;
}
-- (SourceTable *) sourcesController {
+- (SourceController *) sourcesController {
if (sources_ == nil)
- sources_ = [[SourceTable alloc] initWithDatabase:database_];
+ sources_ = [[SourceController alloc] initWithDatabase:database_];
return sources_;
}
}
- (void) system:(NSString *)command { _pooled
+ _trace();
system([command UTF8String]);
+ _trace();
}
- (void) applicationWillSuspend {
if (![path hasPrefix:@"/"])
path = [@"/" stringByAppendingString:path];
- if ([path isEqualToString:@"/add-source"])
- return [[[AddSourceController alloc] initWithDatabase:database_] autorelease];
- else if ([path isEqualToString:@"/storage"])
+ if ([path isEqualToString:@"/storage"])
return [self _pageForURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"storage" ofType:@"html"]] withClass:[CYBrowserController class]];
+ /*else if ([path isEqualToString:@"/add-source"])
+ return [[[AddSourceController alloc] initWithDatabase:database_] autorelease];*/
else if ([path isEqualToString:@"/sources"])
- return [[[SourceTable alloc] initWithDatabase:database_] autorelease];
+ return [[[SourceController alloc] initWithDatabase:database_] autorelease];
else if ([path isEqualToString:@"/packages"])
return [[[InstalledController alloc] initWithDatabase:database_] autorelease];
else if ([path hasPrefix:@"/url/"])
[tabbar_ setViewControllers:controllers];
}
+- (void)showFakeTabBarInView:(UIView *)view {
+ static UITabBar *fake = [[UITabBar alloc] initWithFrame:CGRectMake(0, 0, 0, 49.0f)];
+ if (view != nil) {
+ CGRect frame = [fake frame];
+ frame.origin.y = [view frame].size.height - frame.size.height;
+ frame.size.width = [view frame].size.width;
+ [fake setFrame:frame];
+ [fake setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
+ [view addSubview:fake];
+ } else {
+ [fake removeFromSuperview];
+ }
+}
+
- (void) applicationDidFinishLaunching:(id)unused {
_trace();
CydiaApp = self;
essential_ = [[NSMutableArray alloc] initWithCapacity:4];
broken_ = [[NSMutableArray alloc] initWithCapacity:4];
- UIScreen *screen([UIScreen mainScreen]);
-
- window_ = [[UIWindow alloc] initWithFrame:[screen bounds]];
+ window_ = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[window_ orderFront:self];
[window_ makeKey:self];
[window_ setHidden:NO];
// Show pinstripes while loading data.
[[tabbar_ view] setBackgroundColor:[UIColor pinStripeColor]];
+ [self showFakeTabBarInView:[tabbar_ tabBar]];
[self performSelector:@selector(loadData) withObject:nil afterDelay:0];
_trace();
_setHomePage(self);
}
+ [self showFakeTabBarInView:nil];
+
[starturl_ release];
starturl_ = nil;