X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/44c1771c52b99d592437e867c64c1d56820b50a5..900095fdf69cc72c5a0d5b1f75c4451a0bc4440e:/MobileCydia.mm diff --git a/MobileCydia.mm b/MobileCydia.mm index 51588303..932cb890 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -1028,7 +1028,6 @@ static UIColor *InstallingColor_; static UIColor *RemovingColor_; static NSString *App_; -static NSString *Home_; static BOOL Advanced_; static BOOL Ignored_; @@ -1066,6 +1065,7 @@ static time_t now_; bool IsWildcat_; static CGFloat ScreenScale_; +static NSString *Idiom_; /* }}} */ /* Display Helpers {{{ */ @@ -1210,6 +1210,7 @@ bool isSectionVisible(NSString *section) { @protocol ProgressDelegate - (void) addProgressEvent:(CydiaProgressEvent *)event; - (void) setProgressPercent:(NSNumber *)percent; +- (void) setProgressStatus:(NSDictionary *)status; - (void) setProgressCancellable:(NSNumber *)cancellable; - (bool) isProgressCancelled; - (void) setTitle:(NSString *)title; @@ -1272,12 +1273,19 @@ class Status : virtual bool Pulse(pkgAcquire *Owner) { bool value = pkgAcquireStatus::Pulse(Owner); - float percent( + double percent( double(CurrentBytes + CurrentItems) / double(TotalBytes + TotalItems) ); - [delegate_ performSelectorOnMainThread:@selector(setProgressPercent:) withObject:[NSNumber numberWithFloat:percent] waitUntilDone:YES]; + [delegate_ performSelectorOnMainThread:@selector(setProgressStatus:) withObject:[NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithDouble:percent], @"Percent", + + [NSNumber numberWithDouble:CurrentBytes], @"Current", + [NSNumber numberWithDouble:TotalBytes], @"Total", + [NSNumber numberWithDouble:CurrentCPS], @"Speed", + nil] waitUntilDone:YES]; + if (value && ![delegate_ isProgressCancelled]) return true; else { @@ -1298,6 +1306,7 @@ class Status : virtual void Stop() { pkgAcquireStatus::Stop(); [delegate_ performSelectorOnMainThread:@selector(setProgressCancellable:) withObject:[NSNumber numberWithBool:NO] waitUntilDone:YES]; + [delegate_ performSelectorOnMainThread:@selector(setProgressStatus:) withObject:nil waitUntilDone:YES]; } }; /* }}} */ @@ -3382,11 +3391,17 @@ static NSString *Warning_; size_t size(line.size()); lprintf("S:%s\n", data); - if (conffile_r(data, size)) + if (conffile_r(data, size)) { + // status: /fail : conffile-prompt : '/fail' '/fail.dpkg-new' 1 1 [delegate_ performSelectorOnMainThread:@selector(setConfigurationData:) withObject:conffile_r[1] waitUntilDone:YES]; - else if (strncmp(data, "status: ", 8) == 0) { + } else if (strncmp(data, "status: ", 8) == 0) { + // status: : {unpacked,half-configured,installed} CydiaProgressEvent *event([CydiaProgressEvent eventWithMessage:[NSString stringWithUTF8String:(data + 8)] ofType:@"STATUS"]); - [progress_ performSelectorOnMainThread:@selector(addProgressEvent) withObject:event waitUntilDone:YES]; + [progress_ performSelectorOnMainThread:@selector(addProgressEvent:) withObject:event waitUntilDone:YES]; + } else if (strncmp(data, "processing: ", 12) == 0) { + // processing: configure: config-test + CydiaProgressEvent *event([CydiaProgressEvent eventWithMessage:[NSString stringWithUTF8String:(data + 12)] ofType:@"STATUS"]); + [progress_ performSelectorOnMainThread:@selector(addProgressEvent:) withObject:event waitUntilDone:YES]; } else if (pmstatus_r(data, size)) { std::string type([pmstatus_r[1] UTF8String]); @@ -3623,8 +3638,9 @@ static NSString *Warning_; [delegate_ repairWithSelector:@selector(configure)]; else if (error == "The package lists or status file could not be parsed or opened.") [delegate_ repairWithSelector:@selector(update)]; - // else if (error == "Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)") // else if (error == "Could not get lock /var/lib/dpkg/lock - open (35 Resource temporarily unavailable)") + // else if (error == "Could not open lock file /var/lib/dpkg/lock - open (13 Permission denied)") + // else if (error == "Malformed Status line") // else if (error == "The list of sources could not be read.") else { [delegate_ addProgressEventOnMainThread:[CydiaProgressEvent eventWithMessage:[NSString stringWithUTF8String:error.c_str()] ofType:(warning ? @"WARNING" : @"ERROR")] forTask:title]; @@ -4013,6 +4029,7 @@ static NSString *Warning_; @"role", @"serial", @"token", + @"version", nil]; } @@ -4024,6 +4041,10 @@ static NSString *Warning_; return ![[self _attributeKeys] containsObject:[NSString stringWithUTF8String:name]] && [super isKeyExcludedFromWebScript:name]; } +- (NSString *) version { + return @ Cydia_; +} + - (NSString *) device { return [[UIDevice currentDevice] uniqueIdentifier]; } @@ -4037,17 +4058,7 @@ static NSString *Warning_; } - (NSString *) idiom { - UIDevice *device([UIDevice currentDevice]); - if (![device respondsToSelector:@selector(userInterfaceIdiom)]) - return @"iphone"; - - UIUserInterfaceIdiom idiom([device userInterfaceIdiom]); - if (idiom == UIUserInterfaceIdiomPhone) - return @"iphone"; - else if (idiom == UIUserInterfaceIdiomPad) - return @"ipad"; - else - return @"unknown"; + return (id) Idiom_ ?: [NSNull null]; } - (NSString *) plmn { @@ -4102,12 +4113,22 @@ static NSString *Warning_; return @"refreshSources"; else if (selector == @selector(removeButton)) return @"removeButton"; + else if (selector == @selector(substitutePackageNames:)) + return @"substitutePackageNames"; else if (selector == @selector(scrollToBottom:)) return @"scrollToBottom"; else if (selector == @selector(setButtonImage:withStyle:toFunction:)) return @"setButtonImage"; else if (selector == @selector(setButtonTitle:withStyle:toFunction:)) return @"setButtonTitle"; + else if (selector == @selector(setHidesBackButton:)) + return @"setHidesBackButton"; + else if (selector == @selector(setHidesNavigationBar:)) + return @"setHidesNavigationBar"; + else if (selector == @selector(setNavigationBarStyle:)) + return @"setNavigationBarStyle"; + else if (selector == @selector(setNavigationBarTintRed:green:blue:alpha:)) + return @"setNavigationBarTintColor"; else if (selector == @selector(setPopupHook:)) return @"setPopupHook"; else if (selector == @selector(setToken:)) @@ -4188,9 +4209,11 @@ static NSString *Warning_; } } - (Package *) getPackageById:(NSString *)id { - Package *package([[Database sharedInstance] packageWithName:id]); - [package parse]; - return package; + if (Package *package = [[Database sharedInstance] packageWithName:id]) { + [package parse]; + return package; + } else + return (Package *) [NSNull null]; } - (NSArray *) statfs:(NSString *)path { @@ -4258,6 +4281,17 @@ static NSString *Warning_; [delegate_ performSelectorOnMainThread:@selector(installPackages:) withObject:packages waitUntilDone:NO]; } +- (NSString *) substitutePackageNames:(NSString *)message { + NSMutableArray *words([[message componentsSeparatedByString:@" "] mutableCopy]); + for (size_t i(0), e([words count]); i != e; ++i) { + NSString *word([words objectAtIndex:i]); + if (Package *package = [[Database sharedInstance] packageWithName:word]) + [words replaceObjectAtIndex:i withObject:[package name]]; + } + + return [words componentsJoinedByString:@" "]; +} + - (void) removeButton { [indirect_ removeButton]; } @@ -4270,6 +4304,24 @@ static NSString *Warning_; [indirect_ setButtonTitle:button withStyle:style toFunction:function]; } +- (void) setHidesBackButton:(NSString *)value { + [indirect_ performSelectorOnMainThread:@selector(setHidesBackButtonByNumber:) withObject:value waitUntilDone:NO]; +} + +- (void) setHidesNavigationBar:(NSString *)value { + [indirect_ performSelectorOnMainThread:@selector(setHidesNavigationBarByNumber:) withObject:value waitUntilDone:NO]; +} + +- (void) setNavigationBarStyle:(NSString *)value { + [indirect_ performSelectorOnMainThread:@selector(setNavigationBarStyle:) withObject:value waitUntilDone:NO]; +} + +- (void) setNavigationBarTintRed:(NSNumber *)red green:(NSNumber *)green blue:(NSNumber *)blue alpha:(NSNumber *)alpha { + float opacity(alpha == (id) [WebUndefined undefined] ? 1 : [alpha floatValue]); + UIColor *color([UIColor colorWithRed:[red floatValue] green:[green floatValue] blue:[blue floatValue] alpha:opacity]); + [indirect_ performSelectorOnMainThread:@selector(setNavigationBarTintColor:) withObject:color waitUntilDone:NO]; +} + - (void) _setToken:(NSString *)token { Token_ = token; @@ -4402,9 +4454,16 @@ static NSString *Warning_; } return self; } +// XXX: factor this out somewhere +- (UIColor *) groupTableViewBackgroundColor { + UIDevice *device([UIDevice currentDevice]); + bool iPad([device respondsToSelector:@selector(userInterfaceIdiom)] && [device userInterfaceIdiom] == UIUserInterfaceIdiomPad); + return iPad ? [UIColor colorWithRed:0.821 green:0.834 blue:0.860 alpha:1] : [UIColor groupTableViewBackgroundColor]; +} + - (void) loadView { [self setView:[[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]]; - [[self view] setBackgroundColor:[UIColor pinStripeColor]]; + [[self view] setBackgroundColor:[self groupTableViewBackgroundColor]]; indicator_ = [[[CYLoadingIndicator alloc] initWithFrame:[[self view] bounds]] autorelease]; [indicator_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; @@ -4823,7 +4882,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [NSNumber numberWithInteger:[database_ fetcher].PartialPresent()], @"resuming", nil]; - [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/confirm/", UI_]]]; + [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/confirm/", UI_]]]; [[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithTitle:UCLocalize("CANCEL") @@ -4870,7 +4929,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { _transient id delegate_; bool running_; - float progress_; + float percent_; + + float current_; + float total_; + float speed_; _H events_; _H title_; @@ -4885,11 +4948,14 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { + (NSArray *) _attributeKeys { return [NSArray arrayWithObjects: + @"current", @"events", @"finish", - @"progress", + @"percent", @"running", + @"speed", @"title", + @"total", nil]; } @@ -4911,12 +4977,36 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { delegate_ = delegate; } -- (void) setProgress:(float)value { - progress_ = value; +- (void) setPercent:(float)value { + percent_ = value; +} + +- (NSNumber *) percent { + return [NSNumber numberWithFloat:percent_]; +} + +- (void) setCurrent:(float)value { + current_ = value; +} + +- (NSNumber *) current { + return [NSNumber numberWithFloat:current_]; +} + +- (void) setTotal:(float)value { + total_ = value; +} + +- (NSNumber *) total { + return [NSNumber numberWithFloat:total_]; +} + +- (void) setSpeed:(float)value { + speed_ = value; } -- (NSNumber *) progress { - return [NSNumber numberWithFloat:progress_]; +- (NSNumber *) speed { + return [NSNumber numberWithFloat:speed_]; } - (NSArray *) events { @@ -4983,6 +5073,15 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [super dealloc]; } +- (void) updateCancel { + [[self navigationItem] setLeftBarButtonItem:(cancel_ == 1 ? [[[UIBarButtonItem alloc] + initWithTitle:UCLocalize("CANCEL") + style:UIBarButtonItemStylePlain + target:self + action:@selector(cancel) + ] autorelease] : nil)]; +} + - (id) initWithDatabase:(Database *)database delegate:(id)delegate { if ((self = [super init]) != nil) { database_ = database; @@ -4992,6 +5091,14 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { progress_ = [[[CydiaProgressData alloc] init] autorelease]; [progress_ setDelegate:self]; + + [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/progress/", UI_]]]; + + [scroller_ setBackgroundColor:[UIColor blackColor]]; + + [[self navigationItem] setHidesBackButton:YES]; + + [self updateCancel]; } return self; } @@ -5004,28 +5111,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [self dispatchEvent:@"CydiaProgressUpdate"]; } -- (void) updateCancel { - [[self navigationItem] setLeftBarButtonItem:(cancel_ == 1 ? [[[UIBarButtonItem alloc] - initWithTitle:UCLocalize("CANCEL") - style:UIBarButtonItemStylePlain - target:self - action:@selector(cancel) - ] autorelease] : nil)]; -} - - (void) viewWillAppear:(BOOL)animated { - if (![self hasLoaded]) { - [scroller_ setBackgroundColor:[UIColor blackColor]]; - [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/progress/", UI_]]]; - } - - [super viewDidAppear:animated]; - - [[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlack]; - - [[self navigationItem] setHidesBackButton:YES]; + if (![self hasLoaded]) + [[[self navigationController] navigationBar] setBarStyle:UIBarStyleBlack]; - [self updateCancel]; + [super viewWillAppear:animated]; } - (void) close { @@ -5202,7 +5292,23 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } - (void) setProgressPercent:(NSNumber *)percent { - [progress_ setProgress:[percent floatValue]]; + [progress_ setPercent:[percent floatValue]]; + [self updateProgress]; +} + +- (void) setProgressStatus:(NSDictionary *)status { + if (status == nil) { + [progress_ setCurrent:0]; + [progress_ setTotal:0]; + [progress_ setSpeed:0]; + } else { + [progress_ setPercent:[[status objectForKey:@"Percent"] floatValue]]; + + [progress_ setCurrent:[[status objectForKey:@"Current"] floatValue]]; + [progress_ setTotal:[[status objectForKey:@"Total"] floatValue]]; + [progress_ setSpeed:[[status objectForKey:@"Speed"] floatValue]]; + } + [self updateProgress]; } @@ -5782,11 +5888,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { UIActionSheetDelegate > { _transient Database *database_; - Package *package_; - NSString *name_; + _H package_; + _H name_; bool commercial_; - NSMutableArray *buttons_; - UIBarButtonItem *button_; + _H buttons_; + _H button_; } - (id) initWithDatabase:(Database *)database forPackage:(NSString *)name; @@ -5795,22 +5901,13 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @implementation CYPackageController -- (void) dealloc { - if (package_ != nil) - [package_ release]; - if (name_ != nil) - [name_ release]; - - [buttons_ release]; - - if (button_ != nil) - [button_ release]; - - [super dealloc]; +- (NSURL *) navigationURL { + return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://package/%@", (id) name_]]; } -- (NSURL *) navigationURL { - return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://package/%@", name_]]; +- (bool) _allowNavigationAction { + // XXX: damn it... I really want this. + return true; } /* XXX: this is not safe at all... localization of /fail/ */ @@ -5904,23 +6001,20 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (id) initWithDatabase:(Database *)database forPackage:(NSString *)name { if ((self = [super init]) != nil) { database_ = database; - buttons_ = [[NSMutableArray alloc] initWithCapacity:4]; - name_ = [[NSString alloc] initWithString:name]; - [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/package/#!/%@", UI_, name_]]]; + buttons_ = [NSMutableArray arrayWithCapacity:4]; + name_ = [NSString stringWithString:name]; + [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/package/%@", UI_, (id) name_]]]; } return self; } - (void) reloadData { - if (package_ != nil) - [package_ autorelease]; package_ = [database_ packageWithName:name_]; [buttons_ removeAllObjects]; if (package_ != nil) { - [package_ parse]; + [(Package *) package_ parse]; - package_ = [package_ retain]; commercial_ = [package_ isCommercial]; if ([package_ mode] != nil) @@ -5936,9 +6030,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [buttons_ addObject:UCLocalize("REMOVE")]; } - if (button_ != nil) - [button_ release]; - NSString *title; switch ([buttons_ count]) { case 0: title = nil; break; @@ -5946,12 +6037,12 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { default: title = UCLocalize("MODIFY"); break; } - button_ = [[UIBarButtonItem alloc] + button_ = [[[UIBarButtonItem alloc] initWithTitle:title style:UIBarButtonItemStylePlain target:self action:@selector(customButtonClicked) - ]; + ] autorelease]; [super reloadData]; } @@ -6341,8 +6432,10 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @implementation HomeController -+ (BOOL) shouldHideNavigationBar { - return NO; +- (id) init { + if ((self = [super init]) != nil) { + [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/home/", UI_]]]; + } return self; } - (NSURL *) navigationURL { @@ -6377,23 +6470,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [alert show]; } -- (void) viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - if ([[self class] shouldHideNavigationBar]) - [[self navigationController] setNavigationBarHidden:NO animated:animated]; -} - -- (void) viewWillAppear:(BOOL)animated { - if (![self hasLoaded]) - [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/home/", UI_]]]; - - [super viewWillAppear:animated]; - - if ([[self class] shouldHideNavigationBar]) - [[self navigationController] setNavigationBarHidden:YES animated:animated]; -} - - (void) viewDidLoad { [[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc] initWithTitle:UCLocalize("ABOUT") @@ -6415,15 +6491,14 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @implementation ManageController -- (NSURL *) navigationURL { - return [NSURL URLWithString:@"cydia://manage"]; +- (id) init { + if ((self = [super init]) != nil) { + [self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/manage/", UI_]]]; + } return self; } -- (void) viewWillAppear:(BOOL)animated { - if (![self hasLoaded]) - [self loadURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/manage/", UI_]]]; - - [super viewWillAppear:animated]; +- (NSURL *) navigationURL { + return [NSURL URLWithString:@"cydia://manage"]; } - (void) viewDidLoad { @@ -6769,6 +6844,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [refreshbar_ setProgress:[percent floatValue]]; } +- (void) setProgressStatus:(NSDictionary *)status { + if (status != nil) + [self setProgressPercent:[status objectForKey:@"Percent"]]; +} + - (void) setUpdateDelegate:(id)delegate { updatedelegate_ = delegate; } @@ -7045,7 +7125,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { /* Section Controller {{{ */ @interface SectionController : FilteredPackageListController { - NSString *section_; + _H section_; } - (id) initWithDatabase:(Database *)database section:(NSString *)section; @@ -7538,7 +7618,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @interface SearchController : FilteredPackageListController < UISearchBarDelegate > { - UISearchBar *search_; + _H search_; BOOL searchloaded_; } @@ -7551,7 +7631,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @implementation SearchController - (void) dealloc { - [search_ release]; + [search_ setDelegate:nil]; [super dealloc]; } @@ -7580,7 +7660,8 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (id) initWithDatabase:(Database *)database { if ((self = [super initWithDatabase:database title:UCLocalize("SEARCH") filter:@selector(isUnfilteredAndSearchedForBy:) with:nil])) { - search_ = [[UISearchBar alloc] init]; + search_ = [[[UISearchBar alloc] init] autorelease]; + [search_ setDelegate:self]; } return self; } @@ -7600,7 +7681,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { textField = MSHookIvar(search_, "_searchField"); [textField setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin]; - [search_ setDelegate:self]; [textField setEnablesReturnKeyAutomatically:NO]; [[self navigationItem] setTitleView:textField]; } @@ -8796,6 +8876,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { ] autorelease]; [alert setContext:@"fixhalf"]; + [alert setNumberOfRows:2]; [alert show]; } else if (!Ignored_ && [essential_ count] != 0) { int count = [essential_ count]; @@ -8973,11 +9054,33 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } } -- (void) presentModalViewController:(UIViewController *)controller { +- (void) disemulate { + if (emulated_ == nil) + return; + + [window_ addSubview:[tabbar_ view]]; + [[emulated_ view] removeFromSuperview]; + [emulated_ release]; + emulated_ = nil; + [window_ setUserInteractionEnabled:YES]; +} + +- (void) presentModalViewController:(UIViewController *)controller force:(BOOL)force { UINavigationController *navigation([[[CYNavigationController alloc] initWithRootViewController:controller] autorelease]); if (IsWildcat_) [navigation setModalPresentationStyle:UIModalPresentationFormSheet]; - [((UIViewController *) emulated_ ?: tabbar_) presentModalViewController:navigation animated:YES]; + + UIViewController *parent; + if (emulated_ == nil) + parent = tabbar_; + else if (!force) + parent = emulated_; + else { + [self disemulate]; + parent = tabbar_; + } + + [parent presentModalViewController:navigation animated:YES]; } - (ProgressController *) invokeNewProgress:(NSInvocation *)invocation forController:(UINavigationController *)navigation withTitle:(NSString *)title { @@ -8986,7 +9089,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { if (navigation != nil) [navigation pushViewController:progress animated:YES]; else - [self presentModalViewController:progress]; + [self presentModalViewController:progress force:YES]; [progress invoke:invocation withTitle:title]; return progress; @@ -9455,6 +9558,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { ] autorelease]; [alert setContext:@"conffile"]; + [alert setNumberOfRows:2]; [alert show]; } @@ -9580,7 +9684,7 @@ _trace(); _trace(); if (Role_ == nil) { [window_ setUserInteractionEnabled:YES]; - [self presentModalViewController:[[[SettingsController alloc] initWithDatabase:database_ delegate:self] autorelease]]; + [self presentModalViewController:[[[SettingsController alloc] initWithDatabase:database_ delegate:self] autorelease] force:NO]; return; } else { if ([emulated_ modalViewController] != nil) @@ -9591,13 +9695,7 @@ _trace(); [self reloadData]; PrintTimes(); - [window_ addSubview:[tabbar_ view]]; - - [[emulated_ view] removeFromSuperview]; - [emulated_ release]; - emulated_ = nil; - - [window_ setUserInteractionEnabled:YES]; + [self disemulate]; int selectedIndex = 0; NSMutableArray *items = nil; @@ -9772,11 +9870,20 @@ int main(int argc, char *argv[]) { _pooled else ScreenScale_ = 1; - NSMutableArray *parts([NSMutableArray arrayWithCapacity:2]); - if (ScreenScale_ > 1) - [parts addObject:@"@2x"]; - [parts addObject:(IsWildcat_ ? @"~ipad" : @"~iphone")]; - UI_ = CydiaURL([NSString stringWithFormat:@"ui/ios%@", [parts componentsJoinedByString:@""]]); + UIDevice *device([UIDevice currentDevice]); + if (![device respondsToSelector:@selector(userInterfaceIdiom)]) + Idiom_ = @"iphone"; + else { + UIUserInterfaceIdiom idiom([device userInterfaceIdiom]); + if (idiom == UIUserInterfaceIdiomPhone) + Idiom_ = @"iphone"; + else if (idiom == UIUserInterfaceIdiomPad) + Idiom_ = @"ipad"; + else + NSLog(@"unknown UIUserInterfaceIdiom!"); + } + + UI_ = CydiaURL([NSString stringWithFormat:@"ui/ios~%@", Idiom_]); PackageName = reinterpret_cast(method_getImplementation(class_getInstanceMethod([Package class], @selector(cyname)))); @@ -9817,9 +9924,9 @@ int main(int argc, char *argv[]) { _pooled else { lang = [[Languages_ objectAtIndex:0] UTF8String]; setenv("LANG", lang, true); + std::setlocale(LC_ALL, lang); } - //std::setlocale(LC_ALL, lang); NSLog(@"Setting Language: %s", lang); /* }}} */ @@ -9850,7 +9957,6 @@ int main(int argc, char *argv[]) { _pooled /* }}} */ App_ = [[NSBundle mainBundle] bundlePath]; - Home_ = NSHomeDirectory(); Advanced_ = YES; setuid(0); @@ -9990,8 +10096,11 @@ int main(int argc, char *argv[]) { _pooled Finishes_ = [NSArray arrayWithObjects:@"return", @"reopen", @"restart", @"reload", @"reboot", nil]; #define MobileSubstrate_(name) \ - if (substrate && access("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", F_OK) == 0) \ - dlopen("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", RTLD_LAZY | RTLD_GLOBAL); + if (substrate && access("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", F_OK) == 0) { \ + void *handle(dlopen("/Library/MobileSubstrate/DynamicLibraries/" #name ".dylib", RTLD_LAZY | RTLD_GLOBAL)); \ + if (handle == NULL) \ + NSLog(@"%s", dlerror()); \ + } MobileSubstrate_(Activator) MobileSubstrate_(libstatusbar)