X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/f30eaf83a30871aeefeaf511369d519026077dd1..0fc560b63efa94e4aef1d48fd6c2d07b6f615f3f:/Cydia.mm?ds=sidebyside diff --git a/Cydia.mm b/Cydia.mm index 9962b655..e069dd7f 100644 --- a/Cydia.mm +++ b/Cydia.mm @@ -1,5 +1,5 @@ /* Cydia - iPhone UIKit Front-End for Debian APT - * Copyright (C) 2008 Jay Freeman (saurik) + * Copyright (C) 2008-2009 Jay Freeman (saurik) */ /* @@ -216,6 +216,11 @@ class _H { } public: + _finline _H(const This_ &rhs) : + value_(rhs.value_ == nil ? nil : [rhs.value_ retain]) + { + } + _finline _H(Type_ *value = NULL, bool mended = false) : value_(value) { @@ -403,7 +408,7 @@ extern NSString * const kCAFilterNearest; #define lprintf(args...) fprintf(stderr, args) -#define ForRelease 0 +#define ForRelease 1 #define TraceLogging (1 && !ForRelease) #define HistogramInsertionSort (0 && !ForRelease) #define ProfileTimes (0 && !ForRelease) @@ -1046,7 +1051,6 @@ static const int ButtonBarHeight_ = 48; static const float KeyboardTime_ = 0.3f; #define SpringBoard_ "/System/Library/LaunchDaemons/com.apple.SpringBoard.plist" -#define SandboxTemplate_ "/usr/share/sandbox/SandboxTemplate.sb" #define NotifyConfig_ "/etc/notify.conf" static bool Queuing_; @@ -1145,10 +1149,19 @@ 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) + version = colon + 1; + return version; +} + CFStringRef StripVersion(const char *version) { const char *colon(strchr(version, ':')); if (colon != NULL) version = colon + 1; + return CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast(version), strlen(version), kCFStringEncodingUTF8, NO); + // XXX: performance return CFCString(version); } @@ -1418,6 +1431,7 @@ typedef std::map< unsigned long, _H > SourceMap; /* Source Class {{{ */ @interface Source : NSObject { + CYString depiction_; CYString description_; CYString label_; CYString origin_; @@ -1440,6 +1454,7 @@ typedef std::map< unsigned long, _H > SourceMap; - (NSComparisonResult) compareByNameAndType:(Source *)source; +- (NSString *) depictionForPackage:(NSString *)package; - (NSString *) supportForPackage:(NSString *)package; - (NSDictionary *) record; @@ -1471,6 +1486,7 @@ typedef std::map< unsigned long, _H > SourceMap; description_.clear(); label_.clear(); origin_.clear(); + depiction_.clear(); support_.clear(); version_.clear(); defaultIcon_.clear(); @@ -1528,6 +1544,7 @@ typedef std::map< unsigned long, _H > SourceMap; CYString *value_; } names[] = { {"default-icon", &defaultIcon_}, + {"depiction", &depiction_}, {"description", &description_}, {"label", &label_}, {"origin", &origin_}, @@ -1582,6 +1599,10 @@ typedef std::map< unsigned long, _H > SourceMap; return [lhs compare:rhs options:LaxCompareOptions_]; } +- (NSString *) depictionForPackage:(NSString *)package { + return depiction_.empty() ? nil : [depiction_ stringByReplacingOccurrencesOfString:@"*" withString:package]; +} + - (NSString *) supportForPackage:(NSString *)package { return support_.empty() ? nil : [support_ stringByReplacingOccurrencesOfString:@"*" withString:package]; } @@ -1695,7 +1716,7 @@ typedef std::map< unsigned long, _H > SourceMap; bool visible_; NSString *latest_; - NSString *installed_; + CYString installed_; CYString id_; CYString name_; @@ -1749,6 +1770,7 @@ typedef std::map< unsigned long, _H > SourceMap; - (NSString *) latest; - (NSString *) installed; +- (BOOL) uninstalled; - (BOOL) valid; - (BOOL) upgradableAndEssential:(BOOL)essential; @@ -1940,8 +1962,6 @@ struct PackageNameOrdering : if (latest_ != nil) [latest_ release]; - if (installed_ != nil) - [installed_ release]; if (sponsor$_ != nil) [sponsor$_ release]; @@ -2065,7 +2085,7 @@ struct PackageNameOrdering : _profile(Package$initWithVersion$Versions) current = iterator_.CurrentVer(); if (!current.end()) - installed_ = (NSString *) StripVersion(current.VerStr()); + installed_.set(pool_, StripVersion_(current.VerStr())); if (!version_.end()) file_ = version_.FileList(); @@ -2089,6 +2109,8 @@ struct PackageNameOrdering : _end } + visible_ = true; + _profile(Package$initWithVersion$Tags) pkgCache::TagIterator tag(iterator_.TagList()); if (!tag.end()) { @@ -2096,8 +2118,12 @@ struct PackageNameOrdering : do { const char *name(tag.Name()); [tags_ addObject:(NSString *)CFCString(name)]; - if (role_ == nil && strncmp(name, "role::", 6) == 0) + if (role_ == nil && strncmp(name, "role::", 6) == 0 /*&& strcmp(name, "role::leaper") != 0*/) role_ = (NSString *) CFCString(name + 6); + if (visible_ && strncmp(name, "require::", 9) == 0 && ( + true + )) + visible_ = false; ++tag; } while (!tag.end()); } @@ -2136,12 +2162,13 @@ struct PackageNameOrdering : if (version == nil) { [metadata_ setObject:latest_ forKey:@"LastVersion"]; changed = true; - } else if (![version isEqualToString:latest_]) { + } else { + if (![version isEqualToString:latest_]) { [metadata_ setObject:latest_ forKey:@"LastVersion"]; lastSeen_ = now_; [metadata_ setObject:lastSeen_ forKey:@"LastSeen"]; changed = true; - } + } } } metadata_ = [metadata_ retain]; @@ -2157,7 +2184,7 @@ struct PackageNameOrdering : _end essential_ = ((iterator_->Flags & pkgCache::Flag::Essential) == 0 ? NO : YES) || [self hasTag:@"cydia::essential"]; - visible_ = [self hasSupportingRole] && [self unfiltered]; + visible_ = visible_ && [self hasSupportingRole] && [self unfiltered]; } _end } return self; } @@ -2308,6 +2335,10 @@ struct PackageNameOrdering : return installed_; } +- (BOOL) uninstalled { + return installed_.empty(); +} + - (BOOL) valid { return !version_.end(); } @@ -2423,7 +2454,7 @@ struct PackageNameOrdering : } - (NSString *) depiction { - return depiction_; + return !depiction_.empty() ? depiction_ : [[self source] depictionForPackage:id_]; } - (Address *) sponsor { @@ -2712,7 +2743,7 @@ struct PackageNameOrdering : } - (bool) isInstalledAndVisible:(NSNumber *)number { - return (![number boolValue] || [self visible]) && [self installed] != nil; + return (![number boolValue] || [self visible]) && ![self uninstalled]; } - (bool) isVisiblyUninstalledInSection:(NSString *)name { @@ -2720,7 +2751,7 @@ struct PackageNameOrdering : return [self visible] && - [self installed] == nil && ( + [self uninstalled] && ( name == nil || section == nil && [name length] == 0 || [name isEqualToString:section] @@ -3326,6 +3357,8 @@ static NSArray *Finishes_; for (pkgAcquire::ItemIterator item = fetcher_->ItemsBegin(); item != fetcher_->ItemsEnd(); item++) { if ((*item)->Status == pkgAcquire::Item::StatDone && (*item)->Complete) continue; + if ((*item)->Status == pkgAcquire::Item::StatIdle) + continue; std::string uri = (*item)->DescURI(); std::string error = (*item)->ErrorText; @@ -3428,7 +3461,8 @@ static NSArray *Finishes_; } - (Source *) getSource:(pkgCache::PkgFileIterator)file { - return sources_[file->ID]; + SourceMap::const_iterator i(sources_.find(file->ID)); + return i == sources_.end() ? nil : i->second; } @end @@ -3985,92 +4019,52 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [transition_ transition:6 toView:view_]; } -- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button { - NSString *context([sheet context]); - - if ([context isEqualToString:@"error"]) - [sheet dismiss]; - else if ([context isEqualToString:@"conffile"]) { - FILE *input = [database_ input]; - - switch (button) { - case 1: - fprintf(input, "N\n"); - fflush(input); - break; - case 2: - fprintf(input, "Y\n"); - fflush(input); - break; - default: - _assert(false); - } - - [sheet dismiss]; - } -} - -- (void) closeButtonPushed { - running_ = NO; - - switch (Finish_) { - case 0: - [self resetView]; - break; - - case 1: - [delegate_ suspendWithAnimation:YES]; - break; +- (void) _checkError { + if (_error->PendingError()) { + std::string error; + if (!_error->PopMessage(error)) + _assert(false); - case 2: - system("launchctl stop com.apple.SpringBoard"); - break; + UIActionSheet *sheet = [[[UIActionSheet alloc] + initWithTitle:CYLocalize("ERROR") + buttons:[NSArray arrayWithObjects:CYLocalize("OKAY"), nil] + defaultButtonIndex:0 + delegate:self + context:@"_error" + ] autorelease]; - case 3: - system("launchctl unload "SpringBoard_"; launchctl load "SpringBoard_); - break; + [sheet setBodyText:[NSString stringWithUTF8String:error.c_str()]]; + [sheet popupAlertAnimated:YES]; - case 4: - system("reboot"); - break; + return; } -} - -- (void) _retachThread { - UINavigationItem *item = [navbar_ topItem]; - [item setTitle:CYLocalize("COMPLETE")]; - - [overlay_ addSubview:close_]; - [progress_ removeFromSuperview]; - [status_ removeFromSuperview]; [delegate_ progressViewIsComplete:self]; if (Finish_ < 4) { - FileFd file(SandboxTemplate_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - if (!(sandplate_ == sha1.Result())) - Finish_ = 4; - } - - if (Finish_ < 4) { - FileFd file(NotifyConfig_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - if (!(notifyconf_ == sha1.Result())) - Finish_ = 4; + FileFd file; + if (!file.Open(NotifyConfig_, FileFd::ReadOnly)) + _error->Discard(); + else { + MMap mmap(file, MMap::ReadOnly); + SHA1Summation sha1; + sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); + if (!(notifyconf_ == sha1.Result())) + Finish_ = 4; + } } if (Finish_ < 3) { - FileFd file(SpringBoard_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - if (!(springlist_ == sha1.Result())) - Finish_ = 3; + FileFd file; + if (!file.Open(SpringBoard_, FileFd::ReadOnly)) + _error->Discard(); + else { + MMap mmap(file, MMap::ReadOnly); + SHA1Summation sha1; + sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); + if (!(springlist_ == sha1.Result())) + Finish_ = 3; + } } switch (Finish_) { @@ -4131,6 +4125,71 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [delegate_ setStatusBarShowsProgress:NO]; } +- (void) alertSheet:(UIActionSheet *)sheet buttonClicked:(int)button { + NSString *context([sheet context]); + + if ([context isEqualToString:@"error"]) + [sheet dismiss]; + else if ([context isEqualToString:@"_error"]) { + [sheet dismiss]; + [self _checkError]; + } else if ([context isEqualToString:@"conffile"]) { + FILE *input = [database_ input]; + + switch (button) { + case 1: + fprintf(input, "N\n"); + fflush(input); + break; + case 2: + fprintf(input, "Y\n"); + fflush(input); + break; + default: + _assert(false); + } + + [sheet dismiss]; + } +} + +- (void) closeButtonPushed { + running_ = NO; + + switch (Finish_) { + case 0: + [self resetView]; + break; + + case 1: + [delegate_ suspendWithAnimation:YES]; + break; + + case 2: + system("launchctl stop com.apple.SpringBoard"); + break; + + case 3: + system("launchctl unload "SpringBoard_"; launchctl load "SpringBoard_); + break; + + case 4: + system("reboot"); + break; + } +} + +- (void) _retachThread { + UINavigationItem *item = [navbar_ topItem]; + [item setTitle:CYLocalize("COMPLETE")]; + + [overlay_ addSubview:close_]; + [progress_ removeFromSuperview]; + [status_ removeFromSuperview]; + + [self _checkError]; +} + - (void) _detachNewThreadData:(ProgressData *)data { _pooled [[data target] performSelector:[data selector] withObject:[data object]]; [data release]; @@ -4154,27 +4213,27 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { running_ = YES; { - FileFd file(SandboxTemplate_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - sandplate_ = sha1.Result(); - } - - { - FileFd file(NotifyConfig_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - notifyconf_ = sha1.Result(); + FileFd file; + if (!file.Open(NotifyConfig_, FileFd::ReadOnly)) + _error->Discard(); + else { + MMap mmap(file, MMap::ReadOnly); + SHA1Summation sha1; + sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); + notifyconf_ = sha1.Result(); + } } { - FileFd file(SpringBoard_, FileFd::ReadOnly); - MMap mmap(file, MMap::ReadOnly); - SHA1Summation sha1; - sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); - springlist_ = sha1.Result(); + FileFd file; + if (!file.Open(SpringBoard_, FileFd::ReadOnly)) + _error->Discard(); + else { + MMap mmap(file, MMap::ReadOnly); + SHA1Summation sha1; + sha1.Add(reinterpret_cast(mmap.Data()), mmap.Size()); + springlist_ = sha1.Result(); + } } [transition_ transition:6 toView:overlay_]; @@ -4595,7 +4654,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { section_ = [section localized]; if (section_ != nil) section_ = [section_ retain]; - name_ = [(section_ == nil ? CYLocalize("NO_SECTION") : section_) retain]; + name_ = [(section_ == nil || [section_ length] == 0 ? CYLocalize("NO_SECTION") : section_) retain]; count_ = [[NSString stringWithFormat:@"%d", [section count]] retain]; if (editing_) @@ -4907,11 +4966,11 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { if ([package_ source] == nil); else if ([package_ upgradableAndEssential:NO]) [buttons_ addObject:CYLocalize("UPGRADE")]; - else if ([package_ installed] == nil) + else if ([package_ uninstalled]) [buttons_ addObject:CYLocalize("INSTALL")]; else [buttons_ addObject:CYLocalize("REINSTALL")]; - if ([package_ installed] != nil) + if (![package_ uninstalled]) [buttons_ addObject:CYLocalize("REMOVE")]; if (special_ != NULL) { @@ -6408,7 +6467,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [*section addToCount]; _profile(SectionsView$reloadData$Filter) - if (![package valid] || [package installed] != nil || ![package visible]) + if (![package valid] || ![package uninstalled] || ![package visible]) continue; _end @@ -6429,7 +6488,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [section addToCount]; _profile(SectionsView$reloadData$Filter) - if (![package valid] || [package installed] != nil || ![package visible]) + if (![package valid] || ![package uninstalled] || ![package visible]) continue; _end @@ -6620,7 +6679,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { _trace(); for (Package *package in packages) if ( - [package installed] == nil && [package valid] && [package visible] || + [package uninstalled] && [package valid] && [package visible] || [package upgradableAndEssential:YES] ) [packages_ addObject:package]; @@ -7879,12 +7938,12 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { Changed_ = true; + [sheet dismiss]; + if (reset) [self updateData]; else [self finish]; - - [sheet dismiss]; } else if ([context isEqualToString:@"upgrade"]) { switch (button) { case 1: @@ -8072,8 +8131,10 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { if ( readlink("/Applications", NULL, 0) == -1 && errno == EINVAL || readlink("/Library/Ringtones", NULL, 0) == -1 && errno == EINVAL || - readlink("/Library/Wallpaper", NULL, 0) == -1 && errno == EINVAL || + readlink("/Library/Wallpaper", NULL, 0) == -1 && errno == EINVAL /*|| + readlink("/usr/bin", NULL, 0) == -1 && errno == EINVAL*/ || readlink("/usr/include", NULL, 0) == -1 && errno == EINVAL || + readlink("/usr/lib/pam", NULL, 0) == -1 && errno == EINVAL || readlink("/usr/libexec", NULL, 0) == -1 && errno == EINVAL || readlink("/usr/share", NULL, 0) == -1 && errno == EINVAL /*|| readlink("/var/lib", NULL, 0) == -1 && errno == EINVAL*/