/* }}} */
/* 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 {
[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_;
[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 {