X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/3a3ed4dc408995d66f2f91bf263b31537e64dc43..f03174c228eade8a273a17ba26edbc6626c95897:/MobileCydia.mm?ds=sidebyside diff --git a/MobileCydia.mm b/MobileCydia.mm index 40f1d259..dae7d615 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -118,8 +118,6 @@ extern "C" { #include #include -#include - #include "UICaboodle/BrowserView.h" #include "substrate.h" @@ -953,6 +951,11 @@ class CYColor { private: CGColorRef color_; + static CGColorRef Create_(CGColorSpaceRef space, float red, float green, float blue, float alpha) { + CGFloat color[] = {red, green, blue, alpha}; + return CGColorCreate(space, color); + } + public: CYColor() : color_(NULL) @@ -960,7 +963,7 @@ class CYColor { } CYColor(CGColorSpaceRef space, float red, float green, float blue, float alpha) : - color_(NULL) + color_(Create_(space, red, green, blue, alpha)) { Set(space, red, green, blue, alpha); } @@ -976,8 +979,7 @@ class CYColor { void Set(CGColorSpaceRef space, float red, float green, float blue, float alpha) { Clear(); - float color[] = {red, green, blue, alpha}; - color_ = CGColorCreate(space, (CGFloat *) color); + color_ = Create_(space, red, green, blue, alpha); } operator CGColorRef() { @@ -1362,8 +1364,6 @@ typedef std::map< unsigned long, _H > SourceMap; - (bool) upgrade; - (void) update; -- (void) setVisible; - - (void) updateWithStatus:(Status &)status; - (void) setDelegate:(id)delegate; @@ -1708,8 +1708,6 @@ typedef std::map< unsigned long, _H > SourceMap; CYString section_; _transient NSString *section$_; bool essential_; - bool required_; - bool visible_; bool obsolete_; NSString *latest_; @@ -1733,8 +1731,6 @@ typedef std::map< unsigned long, _H > SourceMap; NSMutableArray *tags_; NSString *role_; - NSArray *relationships_; - NSMutableDictionary *metadata_; _transient NSDate *firstSeen_; _transient NSDate *lastSeen_; @@ -1783,8 +1779,6 @@ typedef std::map< unsigned long, _H > SourceMap; - (BOOL) hasMode; - (NSString *) mode; -- (void) setVisible; - - (NSString *) id; - (NSString *) name; - (UIImage *) icon; @@ -1795,7 +1789,6 @@ typedef std::map< unsigned long, _H > SourceMap; - (NSString *) support; - (NSArray *) files; -- (NSArray *) relationships; - (NSArray *) warnings; - (NSArray *) applications; @@ -1814,14 +1807,12 @@ typedef std::map< unsigned long, _H > SourceMap; - (uint32_t) compareBySection:(NSArray *)sections; -- (uint32_t) compareForChanges; - - (void) install; - (void) remove; - (bool) isUnfilteredAndSearchedForBy:(NSString *)search; - (bool) isUnfilteredAndSelectedForBy:(NSString *)search; -- (bool) isInstalledAndVisible:(NSNumber *)number; +- (bool) isInstalledAndUnfiltered:(NSNumber *)number; - (bool) isVisibleInSection:(NSString *)section; - (bool) isVisibleInSource:(Source *)source; @@ -1979,8 +1970,6 @@ struct PackageNameOrdering : if (role_ != nil) [role_ release]; - if (relationships_ != nil) - [relationships_ release]; if (metadata_ != nil) [metadata_ release]; @@ -2074,10 +2063,6 @@ struct PackageNameOrdering : _end } -- (void) setVisible { - visible_ = required_ && [self unfiltered]; -} - - (Package *) initWithVersion:(pkgCache::VerIterator)version withZone:(NSZone *)zone inPool:(apr_pool_t *)pool database:(Database *)database { if ((self = [super init]) != nil) { _profile(Package$initWithVersion) @@ -2123,14 +2108,6 @@ struct PackageNameOrdering : data[i] |= 0x20; _end - if (!file_.end()) { - _profile(Package$initWithVersion$Source) - source_ = [([database_ getSource:file_.File()] ?: (Source *) [NSNull null]) retain]; - _end - } - - required_ = true; - _profile(Package$initWithVersion$Tags) pkgCache::TagIterator tag(iterator_.TagList()); if (!tag.end()) { @@ -2140,10 +2117,6 @@ struct PackageNameOrdering : [tags_ addObject:[(NSString *)CYStringCreate(name) autorelease]]; if (role_ == nil && strncmp(name, "role::", 6) == 0 /*&& strcmp(name, "role::leaper") != 0*/) role_ = (NSString *) CYStringCreate(name + 6); - if (required_ && strncmp(name, "require::", 9) == 0 && ( - true - )) - required_ = false; ++tag; } while (!tag.end()); } @@ -2205,10 +2178,6 @@ struct PackageNameOrdering : 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; } @@ -2239,17 +2208,11 @@ struct PackageNameOrdering : if (section_.empty()) return nil; - std::replace(section_.data(), section_.data() + section_.size(), '_', ' '); - NSString *name(section_); - - lookup: - if (NSDictionary *value = [SectionMap_ objectForKey:name]) - if (NSString *rename = [value objectForKey:@"Rename"]) { - name = rename; - goto lookup; - } - - section$_ = name; + _profile(Package$section) + std::replace(section_.data(), section_.data() + section_.size(), '_', ' '); + NSString *name(section_); + section$_ = [SectionMap_ objectForKey:name] ?: name; + _end } return section$_; } @@ -2282,16 +2245,22 @@ struct PackageNameOrdering : } - (Address *) maintainer { - if (file_.end()) +@synchronized (database_) { + if ([database_ era] != era_ || file_.end()) return nil; + pkgRecords::Parser *parser = &[database_ records]->Lookup(file_); const std::string &maintainer(parser->Maintainer()); return maintainer.empty() ? nil : [Address addressWithString:[NSString stringWithUTF8String:maintainer.c_str()]]; -} +} } - (size_t) size { - return version_.end() ? 0 : version_->InstalledSize; -} +@synchronized (database_) { + if ([database_ era] != era_ || version_.end()) + return 0; + + return version_->InstalledSize; +} } - (NSString *) longDescription { @synchronized (database_) { @@ -2373,9 +2342,9 @@ struct PackageNameOrdering : _profile(Package$upgradableAndEssential) pkgCache::VerIterator current(iterator_.CurrentVer()); if (current.end()) - return essential && essential_ && visible_; + return essential && essential_; else - return !version_.end() && version_ != current;// && (!essential || ![database_ cache][iterator_].Keep()); + return !version_.end() && version_ != current; _end } @@ -2398,13 +2367,16 @@ struct PackageNameOrdering : return false; _end - NSString *section; + return true; +} - _profile(Package$unfiltered$section) - section = [self section]; - _end +- (BOOL) visible { + if (![self unfiltered]) + return false; + + NSString *section([self section]); - _profile(Package$unfiltered$isSectionVisible) + _profile(Package$visible$isSectionVisible) if (section != nil && !isSectionVisible(section)) return false; _end @@ -2412,10 +2384,6 @@ struct PackageNameOrdering : return true; } -- (BOOL) visible { - return visible_; -} - - (BOOL) half { unsigned char current(iterator_->CurrentState); return current == pkgCache::State::HalfConfigured || current == pkgCache::State::HalfInstalled; @@ -2486,7 +2454,7 @@ struct PackageNameOrdering : icon = [UIImage imageAtPath:[static_cast(icon_) substringFromIndex:7]]; if (icon == nil) if (section != nil) icon = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/Sections/%@.png", App_, section]]; - if (icon == nil) if (source_ != nil) if (NSString *dicon = [source_ defaultIcon]) + if (icon == nil) if (Source *source = [self source]) if (NSString *dicon = [source defaultIcon]) if ([dicon hasPrefix:@"file:///"]) // XXX: correct escaping icon = [UIImage imageAtPath:[dicon substringFromIndex:7]]; @@ -2539,10 +2507,6 @@ struct PackageNameOrdering : return files; } -- (NSArray *) relationships { - return relationships_; -} - - (NSArray *) warnings { NSMutableArray *warnings([NSMutableArray arrayWithCapacity:4]); const char *name(iterator_.Name()); @@ -2720,33 +2684,6 @@ struct PackageNameOrdering : return _not(uint32_t); } -- (uint32_t) compareForChanges { - union { - uint32_t key; - - struct { - uint32_t timestamp : 30; - uint32_t ignored : 1; - uint32_t upgradable : 1; - } bits; - } value; - - bool upgradable([self upgradableAndEssential:YES]); - value.bits.upgradable = upgradable ? 1 : 0; - - if (upgradable) { - value.bits.timestamp = 0; - value.bits.ignored = [self ignored] ? 0 : 1; - value.bits.upgradable = 1; - } else { - value.bits.timestamp = static_cast([[self seen] timeIntervalSince1970]) >> 2; - value.bits.ignored = 0; - value.bits.upgradable = 0; - } - - return _not(uint32_t) - value.key; -} - - (void) clear { @synchronized (database_) { pkgProblemResolver *resolver = [database_ resolver]; @@ -2819,19 +2756,18 @@ struct PackageNameOrdering : _end } -- (bool) isInstalledAndVisible:(NSNumber *)number { - return ((![number boolValue] && ![role_ isEqualToString:@"cydia"]) || [self visible]) && ![self uninstalled]; +- (bool) isInstalledAndUnfiltered:(NSNumber *)number { + return ![self uninstalled] && (![number boolValue] && ![role_ isEqualToString:@"cydia"] || [self unfiltered]); } - (bool) isVisibleInSection:(NSString *)name { - NSString *section = [self section]; + NSString *section([self section]); - return - [self visible] && ( - name == nil || - section == nil && [name length] == 0 || - [name isEqualToString:section] - ); + return ( + name == nil || + section == nil && [name length] == 0 || + [name isEqualToString:section] + ) && [self visible]; } - (bool) isVisibleInSource:(Source *)source { @@ -2960,6 +2896,7 @@ struct PackageNameOrdering : /* }}} */ static NSString *Colon_; +static NSString *Elision_; static NSString *Error_; static NSString *Warning_; @@ -2977,12 +2914,17 @@ static NSString *Warning_; return era_; } +- (void) releasePackages { + CFArrayApplyFunction(packages_, CFRangeMake(0, CFArrayGetCount(packages_)), reinterpret_cast(&CFRelease), NULL); + CFArrayRemoveAllValues(packages_); +} + - (void) dealloc { // XXX: actually implement this thing _assert(false); - NSRecycleZone(zone_); - // XXX: malloc_destroy_zone(zone_); + [self releasePackages]; apr_pool_destroy(pool_); + NSRecycleZone(zone_); [super dealloc]; } @@ -3270,9 +3212,7 @@ static NSString *Warning_; @synchronized (self) { ++era_; - CFArrayApplyFunction(packages_, CFRangeMake(0, CFArrayGetCount(packages_)), reinterpret_cast(&CFRelease), NULL); - CFArrayRemoveAllValues(packages_); - + [self releasePackages]; sources_.clear(); _error->Discard(); @@ -3577,11 +3517,6 @@ static NSString *Warning_; [self updateWithStatus:status_]; } -- (void) setVisible { - for (Package *package in [self packages]) - [package setVisible]; -} - - (void) updateWithStatus:(Status &)status { _transient NSObject *delegate(status.getDelegate()); NSString *title(UCLocalize("REFRESHING_DATA")); @@ -3743,7 +3678,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (NSArray *) getInstalledPackages { NSArray *packages([[Database sharedInstance] packages]); - NSMutableArray *installed([NSMutableArray arrayWithCapacity:[packages count]]); + NSMutableArray *installed([NSMutableArray arrayWithCapacity:1024]); for (Package *package in packages) if ([package installed] != nil) [installed addObject:package]; @@ -4624,9 +4559,9 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @end @implementation ContentView + - (id) initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame]) != nil) { - /* Fix landscape stretching. */ [self setNeedsDisplayOnBoundsChange:YES]; } return self; } @@ -4639,10 +4574,47 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [super drawRect:rect]; [delegate_ drawContentRect:rect]; } + +@end +/* }}} */ +/* Cydia TableView Cell {{{ */ +@interface CYTableViewCell : UITableViewCell { + ContentView *content_; + bool highlighted_; +} + +@end + +@implementation CYTableViewCell + +- (void) dealloc { + [content_ release]; + [super dealloc]; +} + +- (void) _updateHighlightColorsForView:(id)view highlighted:(BOOL)highlighted { + //NSLog(@"_updateHighlightColorsForView:%@ highlighted:%s [content_=%@]", view, highlighted ? "YES" : "NO", content_); + + if (view == content_) { + //NSLog(@"_updateHighlightColorsForView:content_ highlighted:%s", highlighted ? "YES" : "NO", content_); + highlighted_ = highlighted; + } + + [super _updateHighlightColorsForView:view highlighted:highlighted]; +} + +- (void) setSelected:(BOOL)selected animated:(BOOL)animated { + //NSLog(@"setSelected:%s animated:%s", selected ? "YES" : "NO", animated ? "YES" : "NO"); + highlighted_ = selected; + + [super setSelected:selected animated:animated]; + [content_ setNeedsDisplay]; +} + @end /* }}} */ /* Package Cell {{{ */ -@interface PackageCell : UITableViewCell < +@interface PackageCell : CYTableViewCell < ContentDelegate > { UIImage *icon_; @@ -4652,10 +4624,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { NSString *source_; UIImage *badge_; Package *package_; - UIColor *color_; - ContentView *content_; - BOOL faded_; - float fade_; UIImage *placard_; } @@ -4706,15 +4674,9 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (void) dealloc { [self clearPackage]; - [content_ release]; - [color_ release]; [super dealloc]; } -- (float) fade { - return faded_ ? [self selectionPercent] : fade_; -} - - (PackageCell *) init { CGRect frame(CGRectMake(0, 0, 320, 74)); if ((self = [super initWithFrame:frame reuseIdentifier:@"Package"]) != nil) { @@ -4727,8 +4689,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [content_ setDelegate:self]; [content_ setOpaque:YES]; - if ([self respondsToSelector:@selector(selectionPercent)]) - faded_ = YES; } return self; } @@ -4799,7 +4759,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } - (void) drawContentRect:(CGRect)rect { - bool selected([self isSelected]); + bool highlighted(highlighted_); float width([self bounds].size.width); #if 0 @@ -4830,15 +4790,15 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { )]; } - if (selected) + if (highlighted) UISetColor(White_); - if (!selected) + if (!highlighted) UISetColor(commercial_ ? Purple_ : Black_); [name_ drawAtPoint:CGPointMake(48, 8) forWidth:(width - (placard_ == nil ? 80 : 106)) withFont:Font18Bold_ lineBreakMode:UILineBreakModeTailTruncation]; [source_ drawAtPoint:CGPointMake(58, 29) forWidth:(width - 95) withFont:Font12_ lineBreakMode:UILineBreakModeTailTruncation]; - if (!selected) + if (!highlighted) UISetColor(commercial_ ? Purplish_ : Gray_); [description_ drawAtPoint:CGPointMake(12, 46) forWidth:(width - 46) withFont:Font14_ lineBreakMode:UILineBreakModeTailTruncation]; @@ -4846,12 +4806,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [placard_ drawAtPoint:CGPointMake(width - 52, 9)]; } -- (void) setSelected:(BOOL)selected animated:(BOOL)fade { - //[self _setBackgroundColor]; - [super setSelected:selected animated:fade]; - [content_ setNeedsDisplay]; -} - + (int) heightForPackage:(Package *)package { return 73; } @@ -4859,7 +4813,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @end /* }}} */ /* Section Cell {{{ */ -@interface SectionCell : UITableViewCell < +@interface SectionCell : CYTableViewCell < ContentDelegate > { NSString *basic_; @@ -4867,7 +4821,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { NSString *name_; NSString *count_; UIImage *icon_; - ContentView *content_; UISwitch *switch_; BOOL editing_; } @@ -4904,8 +4857,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [self clearSection]; [icon_ release]; [switch_ release]; - [content_ release]; - [super dealloc]; } @@ -4982,20 +4933,19 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } - (void) drawContentRect:(CGRect)rect { - BOOL selected = [self isSelected]; + bool highlighted(highlighted_); [icon_ drawInRect:CGRectMake(8, 7, 32, 32)]; - if (selected) + if (highlighted) UISetColor(White_); - if (!selected) - UISetColor(Black_); - float width(rect.size.width); if (editing_) width -= 87; + if (!highlighted) + UISetColor(Black_); [name_ drawAtPoint:CGPointMake(48, 9) forWidth:(width - 70) withFont:Font22Bold_ lineBreakMode:UILineBreakModeTailTruncation]; CGSize size = [count_ sizeWithFont:Font14_]; @@ -5672,14 +5622,13 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @end /* }}} */ /* Source Cell {{{ */ -@interface SourceCell : UITableViewCell < +@interface SourceCell : CYTableViewCell < ContentDelegate > { UIImage *icon_; NSString *origin_; NSString *description_; NSString *label_; - ContentView *content_; } - (void) setSource:(Source *)source; @@ -5718,7 +5667,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (void) dealloc { [self clearSource]; - [content_ release]; [super dealloc]; } @@ -5737,30 +5685,25 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } return self; } -- (void) setSelected:(BOOL)selected animated:(BOOL)animated { - [super setSelected:selected animated:animated]; - [content_ setNeedsDisplay]; -} - - (void) drawContentRect:(CGRect)rect { - bool selected([self isSelected]); + bool highlighted(highlighted_); float width(rect.size.width); if (icon_ != nil) [icon_ drawInRect:CGRectMake(10, 10, 30, 30)]; - if (selected) + if (highlighted) UISetColor(White_); - if (!selected) + if (!highlighted) UISetColor(Black_); [origin_ drawAtPoint:CGPointMake(48, 8) forWidth:(width - 80) withFont:Font18Bold_ lineBreakMode:UILineBreakModeTailTruncation]; - if (!selected) + if (!highlighted) UISetColor(Blue_); [label_ drawAtPoint:CGPointMake(58, 29) forWidth:(width - 95) withFont:Font12_ lineBreakMode:UILineBreakModeTailTruncation]; - if (!selected) + if (!highlighted) UISetColor(Gray_); [description_ drawAtPoint:CGPointMake(12, 46) forWidth:(width - 40) withFont:Font14_ lineBreakMode:UILineBreakModeTailTruncation]; } @@ -6246,7 +6189,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (NSString *) title { return UCLocalize("INSTALLED"); } - (id) initWithDatabase:(Database *)database { - if ((self = [super initWithDatabase:database title:UCLocalize("INSTALLED") filter:@selector(isInstalledAndVisible:) with:[NSNumber numberWithBool:YES]]) != nil) { + if ((self = [super initWithDatabase:database title:UCLocalize("INSTALLED") filter:@selector(isInstalledAndUnfiltered:) with:[NSNumber numberWithBool:YES]]) != nil) { [self updateRoleButton]; [self queueStatusDidChange]; } return self; @@ -6850,40 +6793,13 @@ freeing the view controllers on tab change */ [sections_ removeAllObjects]; [filtered_ removeAllObjects]; -#if 0 - typedef __gnu_cxx::hash_map SectionMap; - SectionMap sections; - sections.resize(64); -#else NSMutableDictionary *sections([NSMutableDictionary dictionaryWithCapacity:32]); -#endif _trace(); for (Package *package in packages) { NSString *name([package section]); NSString *key(name == nil ? @"" : name); -#if 0 - Section **section; - - _profile(SectionsView$reloadData$Section) - section = §ions[key]; - if (*section == nil) { - _profile(SectionsView$reloadData$Section$Allocate) - *section = [[[Section alloc] initWithName:name localize:YES] autorelease]; - _end - } - _end - - [*section addToCount]; - - _profile(SectionsView$reloadData$Filter) - if (![package valid] || ![package visible]) - continue; - _end - - [*section addToRow]; -#else Section *section; _profile(SectionsView$reloadData$Section) @@ -6904,16 +6820,10 @@ freeing the view controllers on tab change */ _end [section addToRow]; -#endif } _trace(); -#if 0 - for (SectionMap::const_iterator i(sections.begin()), e(sections.end()); i != e; ++i) - [sections_ addObject:i->second]; -#else [sections_ addObjectsFromArray:[sections allValues]]; -#endif [sections_ sortUsingSelector:@selector(compareByLocalized:)]; @@ -7084,10 +6994,7 @@ freeing the view controllers on tab change */ - (void) _reloadPackages:(NSArray *)packages { _trace(); for (Package *package in packages) - if ( - [package uninstalled] && [package valid] && [package visible] || - [package upgradableAndEssential:YES] - ) + if ([package upgradableAndEssential:YES] || [package visible]) CFArrayAppendValue(packages_, package); _trace(); @@ -7102,10 +7009,9 @@ freeing the view controllers on tab change */ [sections_ removeAllObjects]; -#if 0 +#if 1 UIProgressHUD *hud([delegate_ addProgressHUD]); - // XXX: localize - [hud setText:@"Loading Changes"]; + [hud setText:UCLocalize("LOADING")]; //NSLog(@"HUD:%@::%@", delegate_, hud); [self yieldToSelector:@selector(_reloadPackages:) withObject:packages]; [delegate_ removeProgressHUD:hud]; @@ -8206,7 +8112,6 @@ static _finline void _setHomePage(Cydia *self) { } - (void) updateData { - [database_ setVisible]; [self _updateData]; } @@ -8488,8 +8393,7 @@ static _finline void _setHomePage(Cydia *self) { [[[self queueBadgeController] tabBarItem] setBadgeValue:UCLocalize("Q_D")]; } - // Show the changes in the current view. - [(CYNavigationController *) [tabbar_ selectedViewController] reloadData]; + [self _updateData]; [queueDelegate_ queueStatusDidChange]; } } @@ -8817,7 +8721,7 @@ _trace(); [label setTextColor:[UIColor blackColor]]; [label setShadowColor:[UIColor whiteColor]]; [label setShadowOffset:CGSizeMake(0, 1)]; - [label setText:UCLocalize("LOADING_DATA")]; + [label setText:[NSString stringWithFormat:Elision_, UCLocalize("LOADING"), nil]]; [container addSubview:label]; CGSize viewsize = [[tabbar_ view] frame].size; @@ -9182,6 +9086,7 @@ int main(int argc, char *argv[]) { _pooled /* }}} */ Colon_ = UCLocalize("COLON_DELIMITED"); + Elision_ = UCLocalize("ELISION"); Error_ = UCLocalize("ERROR"); Warning_ = UCLocalize("WARNING");