X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/5bd9467c2b5d1b32ce0f7527127cee9c280ad5df..900095fdf69cc72c5a0d5b1f75c4451a0bc4440e:/MobileCydia.mm diff --git a/MobileCydia.mm b/MobileCydia.mm index 233d2ef4..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 {{{ */ @@ -3391,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]); @@ -4052,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 { @@ -4117,6 +4113,8 @@ 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:)) @@ -4125,8 +4123,12 @@ static NSString *Warning_; 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:)) @@ -4279,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]; } @@ -4295,10 +4308,20 @@ static NSString *Warning_; [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; @@ -4431,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]; @@ -4852,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") @@ -5043,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; @@ -5052,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; } @@ -5064,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 { @@ -5858,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; @@ -5871,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/ */ @@ -5980,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) @@ -6012,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; @@ -6022,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]; } @@ -6417,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 { @@ -6453,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") @@ -6491,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 { @@ -7126,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; @@ -7619,7 +7618,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @interface SearchController : FilteredPackageListController < UISearchBarDelegate > { - UISearchBar *search_; + _H search_; BOOL searchloaded_; } @@ -7632,7 +7631,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @implementation SearchController - (void) dealloc { - [search_ release]; + [search_ setDelegate:nil]; [super dealloc]; } @@ -7661,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; } @@ -7681,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]; } @@ -9559,6 +9558,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { ] autorelease]; [alert setContext:@"conffile"]; + [alert setNumberOfRows:2]; [alert show]; } @@ -9870,7 +9870,20 @@ int main(int argc, char *argv[]) { _pooled else ScreenScale_ = 1; - UI_ = CydiaURL([NSString stringWithFormat:@"ui/ios%@", (IsWildcat_ ? @"~ipad" : @"~iphone")]); + 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)))); @@ -9911,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); /* }}} */ @@ -9944,7 +9957,6 @@ int main(int argc, char *argv[]) { _pooled /* }}} */ App_ = [[NSBundle mainBundle] bundlePath]; - Home_ = NSHomeDirectory(); Advanced_ = YES; setuid(0); @@ -10084,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)