X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/2148c5caea6db848067ec0e37537407bc2e0dde3..0df874bdd0eb406410000fefe47798010605de8d:/MobileCydia.mm diff --git a/MobileCydia.mm b/MobileCydia.mm index 95eee35d..151cae37 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -695,6 +695,16 @@ NSUInteger DOMNodeList$countByEnumeratingWithState$objects$count$(DOMNodeList *s /* }}} */ /* C++ NSString Wrapper Cache {{{ */ +static _finline CFStringRef CYStringCreate(const char *data, size_t size) { + return size == 0 ? NULL : + CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast(data), size, kCFStringEncodingUTF8, NO, kCFAllocatorNull) ?: + CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast(data), size, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull); +} + +static _finline CFStringRef CYStringCreate(const char *data) { + return CYStringCreate(data, strlen(data)); +} + class CYString { private: char *data_; @@ -773,14 +783,10 @@ class CYString { return size_ == rhs.size_ && memcmp(data_, rhs.data_, size_) == 0; } - operator CFStringRef() { - if (cache_ == NULL) { - if (size_ == 0) - return nil; - cache_ = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast(data_), size_, kCFStringEncodingUTF8, NO, kCFAllocatorNull); - if (cache_ == NULL) - cache_ = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast(data_), size_, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull); - } return cache_; + _finline operator CFStringRef() { + if (cache_ == NULL) + cache_ = CYStringCreate(data_, size_); + return cache_; } _finline operator id() { @@ -1069,10 +1075,6 @@ NSString *SizeString(double size) { return [NSString stringWithFormat:@"%s%.1f %s", (negative ? "-" : ""), size, powers_[power]]; } -static _finline CFStringRef CFCString(const char *value) { - return CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast(value), strlen(value), kCFStringEncodingUTF8, NO, kCFAllocatorNull); -} - const char *StripVersion_(const char *version) { const char *colon(strchr(version, ':')); if (colon != NULL) @@ -1086,7 +1088,7 @@ CFStringRef StripVersion(const char *version) { version = colon + 1; return CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast(version), strlen(version), kCFStringEncodingUTF8, NO); // XXX: performance - return CFCString(version); + return CYStringCreate(version); } NSString *LocalizeSection(NSString *section) { @@ -1183,6 +1185,7 @@ bool isSectionVisible(NSString *section) { - (void) syncData; - (void) showSettings; - (UIProgressHUD *) addProgressHUD; +- (BOOL) hudIsShowing; - (void) removeProgressHUD:(UIProgressHUD *)hud; - (CYViewController *) pageForPackage:(NSString *)name; - (PackageController *) packageController; @@ -1972,8 +1975,6 @@ struct PackageNameOrdering : - (void) dealloc { if (source_ != nil) [source_ release]; - if (section$_ != nil) - [section$_ release]; if (latest_ != nil) [latest_ release]; @@ -2093,7 +2094,11 @@ struct PackageNameOrdering : pool_ = pool; version_ = version; - iterator_ = version.ParentPkg(); + + _profile(Package$initWithVersion$ParentPkg) + iterator_ = version.ParentPkg(); + _end + database_ = database; _profile(Package$initWithVersion$Latest) @@ -2119,7 +2124,7 @@ struct PackageNameOrdering : name_.set(pool, iterator_.Display()); _end - _profile(Package$lowercaseString) + _profile(Package$initWithVersion$lowercaseString) char *data(id_.data()); for (size_t i(0), e(id_.size()); i != e; ++i) // XXX: do not use tolower() as this is not locale-specific? :( @@ -2143,9 +2148,9 @@ struct PackageNameOrdering : tags_ = [[NSMutableArray alloc] initWithCapacity:8]; do { const char *name(tag.Name()); - [tags_ addObject:(NSString *)CFCString(name)]; + [tags_ addObject:(NSString *)CYStringCreate(name)]; if (role_ == nil && strncmp(name, "role::", 6) == 0 /*&& strcmp(name, "role::leaper") != 0*/) - role_ = (NSString *) CFCString(name + 6); + role_ = (NSString *) CYStringCreate(name + 6); if (required_ && strncmp(name, "require::", 9) == 0 && ( true )) @@ -2207,9 +2212,14 @@ struct PackageNameOrdering : section_.set(pool_, iterator_.Section()); _end - obsolete_ = [self hasTag:@"cydia::obsolete"]; - essential_ = ((iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES) || [self hasTag:@"cydia::essential"]; - [self setVisible]; + _profile(Package$initWithVersion$hasTag) + obsolete_ = [self hasTag:@"cydia::obsolete"]; + essential_ = ((iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES) || [self hasTag:@"cydia::essential"]; + _end + + _profile(Package$initWithVersion$setVisible) + [self setVisible]; + _end _end } return self; } @@ -2240,7 +2250,7 @@ struct PackageNameOrdering : if (section_.empty()) return nil; - std::replace(section_.data(), section_.data() + section_.size(), ' ', '_'); + std::replace(section_.data(), section_.data() + section_.size(), '_', ' '); NSString *name(section_); lookup: @@ -2250,7 +2260,7 @@ struct PackageNameOrdering : goto lookup; } - section$_ = [[name stringByReplacingCharacter:'_' withCharacter:' '] retain]; + section$_ = name; } return section$_; } @@ -2389,8 +2399,28 @@ struct PackageNameOrdering : } - (BOOL) unfiltered { - NSString *section([self section]); - return !obsolete_ && [self hasSupportingRole] && (section == nil || isSectionVisible(section)); + _profile(Package$unfiltered$obsolete) + if (obsolete_) + return false; + _end + + _profile(Package$unfiltered$hasSupportingRole) + if (![self hasSupportingRole]) + return false; + _end + + NSString *section; + + _profile(Package$unfiltered$section) + section = [self section]; + _end + + _profile(Package$unfiltered$isSectionVisible) + if (section != nil && !isSectionVisible(section)) + return false; + _end + + return true; } - (BOOL) visible { @@ -2794,7 +2824,7 @@ struct PackageNameOrdering : } - (bool) isInstalledAndVisible:(NSNumber *)number { - return (![number boolValue] || [self visible]) && ![self uninstalled]; + return ((![number boolValue] && ![role_ isEqualToString:@"cydia"]) || [self visible]) && ![self uninstalled]; } - (bool) isVisibleInSection:(NSString *)name { @@ -3338,8 +3368,6 @@ static NSString *Warning_; return; } - _trace(); - for (pkgSourceList::const_iterator source = list_->begin(); source != list_->end(); ++source) { std::vector *indices = (*source)->GetIndexFiles(); for (std::vector::const_iterator index = indices->begin(); index != indices->end(); ++index) @@ -3351,8 +3379,6 @@ static NSString *Warning_; } } - _trace(); - { /*std::vector packages; packages.reserve(std::max(10000U, [packages_ count] + 1000)); @@ -3396,8 +3422,7 @@ static NSString *Warning_; _trace(); } -} -} CYPoolEnd() } +} } CYPoolEnd() _trace(); } - (void) configure { NSString *dpkg = [NSString stringWithFormat:@"dpkg --configure -a --status-fd %u", statusfd_]; @@ -7065,12 +7090,16 @@ freeing the view controllers on tab change */ [sections_ removeAllObjects]; +#if 0 UIProgressHUD *hud([delegate_ addProgressHUD]); // XXX: localize [hud setText:@"Loading Changes"]; //NSLog(@"HUD:%@::%@", delegate_, hud); [self yieldToSelector:@selector(_reloadPackages:) withObject:packages]; [delegate_ removeProgressHUD:hud]; +#else + [self _reloadPackages:packages]; +#endif Section *upgradable = [[[Section alloc] initWithName:UCLocalize("AVAILABLE_UPGRADES") localize:NO] autorelease]; Section *ignored = [[[Section alloc] initWithName:UCLocalize("IGNORED_UPGRADES") localize:NO] autorelease]; @@ -7526,11 +7555,22 @@ freeing the view controllers on tab change */ [self showDoneButton]; } -- (void) doneButtonClicked { +- (void) saveAndClose { [self save]; + + [[self navigationItem] setRightBarButtonItem:nil]; [[self navigationController] dismissModalViewControllerAnimated:YES]; } +- (void) doneButtonClicked { + UIActivityIndicatorView *spinner = [[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20.0f, 20.0f)] autorelease]; + [spinner startAnimating]; + UIBarButtonItem *spinItem = [[[UIBarButtonItem alloc] initWithCustomView:spinner] autorelease]; + [[self navigationItem] setRightBarButtonItem:spinItem]; + + [self performSelector:@selector(saveAndClose) withObject:nil afterDelay:0]; +} + - (void) showDoneButton { UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:UCLocalize("DONE") @@ -7650,7 +7690,7 @@ freeing the view controllers on tab change */ bool dropped_; bool updating_; - id updatedelegate_; + NSObject *updatedelegate_; UITabBarController *root_; } @@ -7693,7 +7733,7 @@ freeing the view controllers on tab change */ } - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation { - return IsWildcat_ || orientation == UIInterfaceOrientationPortrait; + return ![updatedelegate_ hudIsShowing] && (IsWildcat_ || orientation == UIInterfaceOrientationPortrait); } - (void) setTabBarController:(UITabBarController *)controller { @@ -7929,7 +7969,7 @@ typedef enum { int tag_; UIKeyboard *keyboard_; - UIProgressHUD *hud_; + int huds_; SectionsController *sections_; ChangesController *changes_; @@ -8102,7 +8142,6 @@ static _finline void _setHomePage(Cydia *self) { [hud setText:UCLocalize("RELOADING_DATA")]; [database_ yieldToSelector:@selector(reloadData) withObject:nil]; - _trace(); if (hud) [self removeProgressHUD:hud]; @@ -8491,6 +8530,10 @@ static _finline void _setHomePage(Cydia *self) { [super applicationWillSuspend]; } +- (BOOL) hudIsShowing { + return (huds_ > 0); +} + - (void) applicationSuspend:(__GSEvent *)event { // Use external process status API internally. // This is probably a really bad idea. @@ -8501,17 +8544,17 @@ static _finline void _setHomePage(Cydia *self) { notify_cancel(notify_token); } - if (hud_ == nil && status == 0) + if (![self hudIsShowing] && status == 0) [super applicationSuspend:event]; } - (void) _animateSuspension:(BOOL)arg0 duration:(double)arg1 startTime:(double)arg2 scale:(float)arg3 { - if (hud_ == nil) + if (![self hudIsShowing]) [super _animateSuspension:arg0 duration:arg1 startTime:arg2 scale:arg3]; } - (void) _setSuspended:(BOOL)value { - if (hud_ == nil) + if (![self hudIsShowing]) [super _setSuspended:value]; } @@ -8526,6 +8569,7 @@ static _finline void _setHomePage(Cydia *self) { while ([target modalViewController] != nil) target = [target modalViewController]; [[target view] addSubview:hud]; + huds_++; return hud; } @@ -8533,6 +8577,7 @@ static _finline void _setHomePage(Cydia *self) { [hud show:NO]; [hud removeFromSuperview]; [window_ setUserInteractionEnabled:YES]; + huds_--; } - (CYViewController *) pageForPackage:(NSString *)name { @@ -8671,7 +8716,6 @@ static _finline void _setHomePage(Cydia *self) { } [tabbar_ setViewControllers:controllers]; - [tabbar_ setSelectedIndex:0]; } - (void) applicationDidFinishLaunching:(id)unused { @@ -8727,16 +8771,16 @@ static _finline void _setHomePage(Cydia *self) { [[container_ view] setBackgroundColor:[UIColor pinStripeColor]]; [self performSelector:@selector(loadData) withObject:nil afterDelay:0]; +_trace(); } - (void) loadData { +_trace(); if (Role_ == nil) { [self showSettings]; return; } - [UIKeyboard initImplementationNow]; - [window_ setUserInteractionEnabled:NO]; UIView *container = [[UIView alloc] init]; @@ -8785,6 +8829,7 @@ static _finline void _setHomePage(Cydia *self) { PrintTimes(); // Show the home page + [tabbar_ setSelectedIndex:0]; _setHomePage(self); [window_ setUserInteractionEnabled:YES]; @@ -9014,7 +9059,6 @@ int main(int argc, char *argv[]) { _pooled Metadata_ = [[[NSMutableDictionary alloc] initWithContentsOfFile:@"/var/lib/cydia/metadata.plist"] autorelease]; _trace(); SectionMap_ = [[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Sections" ofType:@"plist"]] autorelease]; - _trace(); if (Metadata_ == NULL) Metadata_ = [NSMutableDictionary dictionaryWithCapacity:2];