/* }}} */
/* C++ NSString Wrapper Cache {{{ */
+static _finline CFStringRef CYStringCreate(const char *data, size_t size) {
+ return size == 0 ? NULL :
+ CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const uint8_t *>(data), size, kCFStringEncodingUTF8, NO, kCFAllocatorNull) ?:
+ CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const uint8_t *>(data), size, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull);
+}
+
+static _finline CFStringRef CYStringCreate(const char *data) {
+ return CYStringCreate(data, strlen(data));
+}
+
class CYString {
private:
char *data_;
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<uint8_t *>(data_), size_, kCFStringEncodingUTF8, NO, kCFAllocatorNull);
- if (cache_ == NULL)
- cache_ = CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<uint8_t *>(data_), size_, kCFStringEncodingISOLatin1, NO, kCFAllocatorNull);
- } return cache_;
+ _finline operator CFStringRef() {
+ if (cache_ == NULL)
+ cache_ = CYStringCreate(data_, size_);
+ return cache_;
}
_finline operator id() {
return [NSString stringWithFormat:@"%s%.1f %s", (negative ? "-" : ""), size, powers_[power]];
}
-static _finline CFStringRef CFCString(const char *value) {
- return CFStringCreateWithBytesNoCopy(kCFAllocatorDefault, reinterpret_cast<const uint8_t *>(value), strlen(value), kCFStringEncodingUTF8, NO, kCFAllocatorNull);
-}
-
const char *StripVersion_(const char *version) {
const char *colon(strchr(version, ':'));
if (colon != NULL)
version = colon + 1;
return CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast<const uint8_t *>(version), strlen(version), kCFStringEncodingUTF8, NO);
// XXX: performance
- return CFCString(version);
+ return CYStringCreate(version);
}
NSString *LocalizeSection(NSString *section) {
- (void) syncData;
- (void) showSettings;
- (UIProgressHUD *) addProgressHUD;
+- (BOOL) hudIsShowing;
- (void) removeProgressHUD:(UIProgressHUD *)hud;
- (CYViewController *) pageForPackage:(NSString *)name;
- (PackageController *) packageController;
- (void) dealloc {
if (source_ != nil)
[source_ release];
- if (section$_ != nil)
- [section$_ release];
if (latest_ != nil)
[latest_ release];
pool_ = pool;
version_ = version;
- iterator_ = version.ParentPkg();
+
+ _profile(Package$initWithVersion$ParentPkg)
+ iterator_ = version.ParentPkg();
+ _end
+
database_ = database;
_profile(Package$initWithVersion$Latest)
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? :(
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
))
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;
}
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:
goto lookup;
}
- section$_ = [[name stringByReplacingCharacter:'_' withCharacter:' '] retain];
+ section$_ = name;
} return section$_;
}
}
- (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 {
}
- (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 {
return;
}
- _trace();
-
for (pkgSourceList::const_iterator source = list_->begin(); source != list_->end(); ++source) {
std::vector<pkgIndexFile *> *indices = (*source)->GetIndexFiles();
for (std::vector<pkgIndexFile *>::const_iterator index = indices->begin(); index != indices->end(); ++index)
}
}
- _trace();
-
{
/*std::vector<Package *> packages;
packages.reserve(std::max(10000U, [packages_ count] + 1000));
_trace();
}
-}
-} CYPoolEnd() }
+} } CYPoolEnd() _trace(); }
- (void) configure {
NSString *dpkg = [NSString stringWithFormat:@"dpkg --configure -a --status-fd %u", statusfd_];
[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];
[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")
bool dropped_;
bool updating_;
- id updatedelegate_;
+ NSObject<CydiaDelegate> *updatedelegate_;
UITabBarController *root_;
}
}
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
- return IsWildcat_ || orientation == UIInterfaceOrientationPortrait;
+ return ![updatedelegate_ hudIsShowing] && (IsWildcat_ || orientation == UIInterfaceOrientationPortrait);
}
- (void) setTabBarController:(UITabBarController *)controller {
int tag_;
UIKeyboard *keyboard_;
- UIProgressHUD *hud_;
+ int huds_;
SectionsController *sections_;
ChangesController *changes_;
[hud setText:UCLocalize("RELOADING_DATA")];
[database_ yieldToSelector:@selector(reloadData) withObject:nil];
- _trace();
if (hud) [self removeProgressHUD:hud];
[super applicationWillSuspend];
}
+- (BOOL) hudIsShowing {
+ return (huds_ > 0);
+}
+
- (void) applicationSuspend:(__GSEvent *)event {
// Use external process status API internally.
// This is probably a really bad idea.
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];
}
while ([target modalViewController] != nil) target = [target modalViewController];
[[target view] addSubview:hud];
+ huds_++;
return hud;
}
[hud show:NO];
[hud removeFromSuperview];
[window_ setUserInteractionEnabled:YES];
+ huds_--;
}
- (CYViewController *) pageForPackage:(NSString *)name {
}
[tabbar_ setViewControllers:controllers];
- [tabbar_ setSelectedIndex:0];
}
- (void) applicationDidFinishLaunching:(id)unused {
[[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];
PrintTimes();
// Show the home page
+ [tabbar_ setSelectedIndex:0];
_setHomePage(self);
[window_ setUserInteractionEnabled:YES];
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];