X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/2089799747c7ba078205b8e32426118887d627bf..f35f9983c2c2518c6ede1be4bf4b1031ea7d5d41:/MobileCydia.mm diff --git a/MobileCydia.mm b/MobileCydia.mm index cb5df28d..3ec3ceba 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -118,8 +118,6 @@ extern "C" { #include #include -#include - #include "UICaboodle/BrowserView.h" #include "substrate.h" @@ -792,6 +790,10 @@ class CYString { _finline operator id() { return (NSString *) static_cast(*this); } + + _finline operator const char *() { + return reinterpret_cast(data_); + } }; /* }}} */ /* C++ NSString Algorithm Adapters {{{ */ @@ -953,6 +955,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 +967,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 +983,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() { @@ -1048,7 +1054,7 @@ static _transient NSMutableDictionary *Packages_; static _transient NSMutableDictionary *Sections_; static _transient NSMutableDictionary *Sources_; static bool Changed_; -static NSDate *now_; +static time_t now_; static bool IsWildcat_; /* }}} */ @@ -1362,8 +1368,6 @@ typedef std::map< unsigned long, _H > SourceMap; - (bool) upgrade; - (void) update; -- (void) setVisible; - - (void) updateWithStatus:(Status &)status; - (void) setDelegate:(id)delegate; @@ -1708,10 +1712,9 @@ typedef std::map< unsigned long, _H > SourceMap; CYString section_; _transient NSString *section$_; bool essential_; - bool visible_; bool obsolete_; - NSString *latest_; + CYString latest_; CYString installed_; CYString id_; @@ -1733,9 +1736,10 @@ typedef std::map< unsigned long, _H > SourceMap; NSString *role_; NSMutableDictionary *metadata_; - _transient NSDate *firstSeen_; - _transient NSDate *lastSeen_; + time_t firstSeen_; + time_t lastSeen_; bool subscribed_; + bool ignored_; } - (Package *) initWithVersion:(pkgCache::VerIterator)version withZone:(NSZone *)zone inPool:(apr_pool_t *)pool database:(Database *)database; @@ -1759,7 +1763,7 @@ typedef std::map< unsigned long, _H > SourceMap; - (unichar) index; - (NSMutableDictionary *) metadata; -- (NSDate *) seen; +- (time_t) seen; - (BOOL) subscribed; - (BOOL) ignored; @@ -1780,8 +1784,6 @@ typedef std::map< unsigned long, _H > SourceMap; - (BOOL) hasMode; - (NSString *) mode; -- (void) setVisible; - - (NSString *) id; - (NSString *) name; - (UIImage *) icon; @@ -1810,14 +1812,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; @@ -1842,7 +1842,7 @@ uint32_t PackageChangesRadix(Package *self, void *) { value.bits.ignored = [self ignored] ? 0 : 1; value.bits.upgradable = 1; } else { - value.bits.timestamp = static_cast([[self seen] timeIntervalSince1970]) >> 2; + value.bits.timestamp = static_cast([self seen]) >> 2; value.bits.ignored = 0; value.bits.upgradable = 0; } @@ -1963,9 +1963,6 @@ struct PackageNameOrdering : if (source_ != nil) [source_ release]; - if (latest_ != nil) - [latest_ release]; - if (sponsor$_ != nil) [sponsor$_ release]; if (author$_ != nil) @@ -2068,10 +2065,6 @@ struct PackageNameOrdering : _end } -- (void) setVisible { - visible_ = [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) @@ -2087,8 +2080,7 @@ struct PackageNameOrdering : database_ = database; _profile(Package$initWithVersion$Latest) - const char *latest(StripVersion_(version_.VerStr())); - latest_ = (NSString *) CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast(latest), strlen(latest), kCFStringEncodingASCII, NO); + latest_.set(pool_, StripVersion_(version_.VerStr())); _end pkgCache::VerIterator current; @@ -2140,23 +2132,23 @@ struct PackageNameOrdering : firstSeen_ = now_; metadata_ = [[NSMutableDictionary dictionaryWithObjectsAndKeys: - firstSeen_, @"FirstSeen", - latest_, @"LastVersion", + [NSDate dateWithTimeIntervalSince1970:firstSeen_], @"FirstSeen", + static_cast(latest_), @"LastVersion", nil] mutableCopy]; changed = true; } else { - firstSeen_ = [metadata_ objectForKey:@"FirstSeen"]; - lastSeen_ = [metadata_ objectForKey:@"LastSeen"]; + firstSeen_ = [[metadata_ objectForKey:@"FirstSeen"] timeIntervalSince1970]; + lastSeen_ = [[metadata_ objectForKey:@"LastSeen"] timeIntervalSince1970]; if (NSNumber *subscribed = [metadata_ objectForKey:@"IsSubscribed"]) subscribed_ = [subscribed boolValue]; NSString *version([metadata_ objectForKey:@"LastVersion"]); - if (firstSeen_ == nil) { - firstSeen_ = lastSeen_ == nil ? now_ : lastSeen_; - [metadata_ setObject:firstSeen_ forKey:@"FirstSeen"]; + if (firstSeen_ == 0) { + firstSeen_ = lastSeen_ == 0 ? now_ : lastSeen_; + [metadata_ setObject:[NSDate dateWithTimeIntervalSince1970:firstSeen_] forKey:@"FirstSeen"]; changed = true; } @@ -2166,7 +2158,7 @@ struct PackageNameOrdering : } else if (![version isEqualToString:latest_]) { [metadata_ setObject:latest_ forKey:@"LastVersion"]; lastSeen_ = now_; - [metadata_ setObject:lastSeen_ forKey:@"LastSeen"]; + [metadata_ setObject:[NSDate dateWithTimeIntervalSince1970:lastSeen_] forKey:@"LastSeen"]; changed = true; } } @@ -2188,9 +2180,7 @@ struct PackageNameOrdering : essential_ = ((iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES) || [self hasTag:@"cydia::essential"]; _end - _profile(Package$initWithVersion$setVisible) - [self setVisible]; - _end + ignored_ = iterator_->SelectedState == pkgCache::State::Hold; _end } return self; } @@ -2221,17 +2211,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$_; } @@ -2264,16 +2248,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_) { @@ -2317,10 +2307,8 @@ struct PackageNameOrdering : return metadata_; } -- (NSDate *) seen { - if (subscribed_ && lastSeen_ != nil) - return lastSeen_; - return firstSeen_; +- (time_t) seen { + return subscribed_ ? lastSeen_ : firstSeen_; } - (BOOL) subscribed { @@ -2328,11 +2316,7 @@ struct PackageNameOrdering : } - (BOOL) ignored { - NSDictionary *metadata([self metadata]); - if (NSNumber *ignored = [metadata objectForKey:@"IsIgnored"]) - return [ignored boolValue]; - else - return false; + return ignored_; } - (NSString *) latest { @@ -2355,9 +2339,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 } @@ -2380,13 +2364,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; - _profile(Package$unfiltered$isSectionVisible) + NSString *section([self section]); + + _profile(Package$visible$isSectionVisible) if (section != nil && !isSectionVisible(section)) return false; _end @@ -2394,10 +2381,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; @@ -2468,7 +2451,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]]; @@ -2698,33 +2681,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]; @@ -2797,19 +2753,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 { @@ -2938,6 +2893,7 @@ struct PackageNameOrdering : /* }}} */ static NSString *Colon_; +static NSString *Elision_; static NSString *Error_; static NSString *Warning_; @@ -2955,12 +2911,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]; } @@ -3248,9 +3209,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(); @@ -3269,11 +3228,6 @@ static NSString *Warning_; delete policy_; policy_ = NULL; - if (now_ != nil) { - [now_ release]; - now_ = nil; - } - cache_.Close(); apr_pool_clear(pool_); @@ -3310,7 +3264,7 @@ static NSString *Warning_; unlink("/tmp/cydia.chk"); - now_ = [[NSDate date] retain]; + now_ = [[NSDate date] timeIntervalSince1970]; policy_ = new pkgDepCache::Policy(); records_ = new pkgRecords(cache_); @@ -3555,11 +3509,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")); @@ -3721,7 +3670,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]; @@ -4602,9 +4551,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; } @@ -4617,10 +4566,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_; @@ -4630,10 +4616,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { NSString *source_; UIImage *badge_; Package *package_; - UIColor *color_; - ContentView *content_; - BOOL faded_; - float fade_; UIImage *placard_; } @@ -4684,15 +4666,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) { @@ -4705,8 +4681,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [content_ setDelegate:self]; [content_ setOpaque:YES]; - if ([self respondsToSelector:@selector(selectionPercent)]) - faded_ = YES; } return self; } @@ -4777,7 +4751,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 @@ -4808,15 +4782,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]; @@ -4824,12 +4798,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; } @@ -4837,7 +4805,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { @end /* }}} */ /* Section Cell {{{ */ -@interface SectionCell : UITableViewCell < +@interface SectionCell : CYTableViewCell < ContentDelegate > { NSString *basic_; @@ -4845,7 +4813,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { NSString *name_; NSString *count_; UIImage *icon_; - ContentView *content_; UISwitch *switch_; BOOL editing_; } @@ -4882,8 +4849,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [self clearSection]; [icon_ release]; [switch_ release]; - [content_ release]; - [super dealloc]; } @@ -4960,20 +4925,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_]; @@ -5650,14 +5614,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; @@ -5696,7 +5659,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (void) dealloc { [self clearSource]; - [content_ release]; [super dealloc]; } @@ -5715,30 +5677,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]; } @@ -6224,7 +6181,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; @@ -6828,40 +6785,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) @@ -6882,16 +6812,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:)]; @@ -7062,10 +6986,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(); @@ -7080,10 +7001,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]; @@ -7092,9 +7012,9 @@ freeing the view controllers on tab change */ #endif Section *upgradable = [[[Section alloc] initWithName:UCLocalize("AVAILABLE_UPGRADES") localize:NO] autorelease]; - Section *ignored = [[[Section alloc] initWithName:UCLocalize("IGNORED_UPGRADES") localize:NO] autorelease]; + Section *ignored = nil; Section *section = nil; - NSDate *last = nil; + time_t last = 0; upgrades_ = 0; bool unseens = false; @@ -7108,22 +7028,14 @@ freeing the view controllers on tab change */ if (!uae) { unseens = true; - NSDate *seen; - - _profile(ChangesController$reloadData$Remember) - seen = [package seen]; - _end + time_t seen([package seen]); - if (section == nil || last != seen && (seen == nil || [seen compare:last] != NSOrderedSame)) { + if (section == nil || last != seen) { last = seen; NSString *name; - if (seen == nil) - name = UCLocalize("UNKNOWN"); - else { - name = (NSString *) CFDateFormatterCreateStringWithDate(NULL, formatter, (CFDateRef) seen); - [name autorelease]; - } + name = (NSString *) CFDateFormatterCreateStringWithDate(NULL, formatter, (CFDateRef) [NSDate dateWithTimeIntervalSince1970:seen]); + [name autorelease]; _profile(ChangesController$reloadData$Allocate) name = [NSString stringWithFormat:UCLocalize("NEW_AT"), name]; @@ -7133,9 +7045,12 @@ freeing the view controllers on tab change */ } [section addToCount]; - } else if ([package ignored]) + } else if ([package ignored]) { + if (ignored == nil) { + ignored = [[[Section alloc] initWithName:UCLocalize("IGNORED_UPGRADES") row:offset localize:NO] autorelease]; + } [ignored addToCount]; - else { + } else { ++upgrades_; [upgradable addToCount]; } @@ -7321,7 +7236,7 @@ freeing the view controllers on tab change */ } - (void) onIgnored:(id)control { - [self onSomething:(int) [control isOn] withKey:@"IsIgnored"]; + // TODO: set Held state - possibly call out to dpkg, etc. } - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { @@ -7962,9 +7877,8 @@ typedef enum { Database *database_; int tag_; - - UIKeyboard *keyboard_; - int huds_; + int hudcount_; + NSURL *starturl_; SectionsController *sections_; ChangesController *changes_; @@ -8184,7 +8098,6 @@ static _finline void _setHomePage(Cydia *self) { } - (void) updateData { - [database_ setVisible]; [self _updateData]; } @@ -8525,7 +8438,7 @@ static _finline void _setHomePage(Cydia *self) { } - (BOOL) hudIsShowing { - return (huds_ > 0); + return (hudcount_ > 0); } - (void) applicationSuspend:(__GSEvent *)event { @@ -8563,7 +8476,7 @@ static _finline void _setHomePage(Cydia *self) { while ([target modalViewController] != nil) target = [target modalViewController]; [[target view] addSubview:hud]; - huds_++; + hudcount_++; return hud; } @@ -8571,7 +8484,7 @@ static _finline void _setHomePage(Cydia *self) { [hud show:NO]; [hud removeFromSuperview]; [window_ setUserInteractionEnabled:YES]; - huds_--; + hudcount_--; } - (CYViewController *) pageForPackage:(NSString *)name { @@ -8635,14 +8548,26 @@ static _finline void _setHomePage(Cydia *self) { return nil; } -- (void) applicationOpenURL:(NSURL *)url { - [super applicationOpenURL:url]; - int tag; - if (CYViewController *page = [self pageForURL:url hasTag:&tag]) { +- (BOOL) openCydiaURL:(NSURL *)url { + CYViewController *page = nil; + int tag = 0; + + NSLog(@"open url: %@", url); + + if ((page = [self pageForURL:url hasTag:&tag])) { [self setPage:page]; tag_ = tag; [tabbar_ setSelectedViewController:(tag_ == -1 ? nil : [[tabbar_ viewControllers] objectAtIndex:tag_])]; } + + return !!page; +} + +- (void) applicationOpenURL:(NSURL *)url { + [super applicationOpenURL:url]; + NSLog(@"first: %@", url); + if (!loaded_) starturl_ = [url retain]; + else [self openCydiaURL:url]; } - (void) applicationWillResignActive:(UIApplication *)application { @@ -8794,7 +8719,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; @@ -8823,9 +8748,15 @@ _trace(); [self reloadData]; PrintTimes(); - // Show the home page - [tabbar_ setSelectedIndex:0]; - _setHomePage(self); + // Show the initial page + if (starturl_ == nil || ![self openCydiaURL:starturl_]) { + [tabbar_ setSelectedIndex:0]; + _setHomePage(self); + } + + [starturl_ release]; + starturl_ = nil; + [window_ setUserInteractionEnabled:YES]; // XXX: does this actually slow anything down? @@ -9159,6 +9090,7 @@ int main(int argc, char *argv[]) { _pooled /* }}} */ Colon_ = UCLocalize("COLON_DELIMITED"); + Elision_ = UCLocalize("ELISION"); Error_ = UCLocalize("ERROR"); Warning_ = UCLocalize("WARNING");