CYString latest_;
CYString installed_;
- time_t updated_;
+ time_t upgraded_;
const char *section_;
_transient NSString *section$_;
@"state",
@"support",
@"tags",
+ @"upgraded",
@"warnings",
nil];
}
memcpy(lower + prefix + size, ".list", 6);
struct stat info;
if (stat(lower, &info) != -1)
- updated_ = info.st_birthtime;
+ upgraded_ = info.st_birthtime;
}
PackageValue *metadata(PackageFind(lower + prefix, size));
bool user = false;
bool _private = false;
bool stash = false;
+ bool dsstore = false;
bool repository = [[self section] isEqualToString:@"Repositories"];
_private = true;
else if (!stash && [file isEqualToString:@"/var/stash"])
stash = true;
+ else if (!dsstore && [file hasSuffix:@"/.DS_Store"])
+ dsstore = true;
/* XXX: this is not sensitive enough. only some folders are valid. */
if (cydia && !repository)
[warnings addObject:[NSString stringWithFormat:UCLocalize("FILES_INSTALLED_TO"), @"/private"]];
if (stash)
[warnings addObject:[NSString stringWithFormat:UCLocalize("FILES_INSTALLED_TO"), @"/var/stash"]];
+ if (dsstore)
+ [warnings addObject:[NSString stringWithFormat:UCLocalize("FILES_INSTALLED_TO"), @".DS_Store"]];
}
return [warnings count] == 0 ? nil : warnings;
return source_ == (Source *) [NSNull null] ? nil : source_;
}
-- (uint32_t) updated {
- return std::numeric_limits<uint32_t>::max() - updated_;
+- (time_t) upgraded {
+ return upgraded_;
+}
+
+- (uint32_t) recent {
+ return std::numeric_limits<uint32_t>::max() - upgraded_;
}
- (uint32_t) rank {
string = [self name];
length = [string length];
+ if (length != 0)
for (NSString *term in query) {
range = [string rangeOfString:term options:MatchCompareOptions_];
if (range.location != NSNotFound)
string = [self id];
length = [string length];
+ if (length != 0)
for (NSString *term in query) {
range = [string rangeOfString:term options:MatchCompareOptions_];
if (range.location != NSNotFound)
length = [string length];
NSUInteger stop(std::min<NSUInteger>(length, 200));
+ if (length != 0)
for (NSString *term in query) {
range = [string rangeOfString:term options:MatchCompareOptions_ range:NSMakeRange(0, stop)];
if (range.location != NSNotFound)
return [NSURL URLWithString:@"cydia://installed"];
}
-- (bool) showsSections {
- return sectioned_;
-}
-
-- (void) useUpdated {
+- (void) useRecent {
sectioned_ = false;
@synchronized (self) {
}];
[self setSorter:[](NSMutableArray *packages) {
- [packages radixSortUsingSelector:@selector(updated)];
+ [packages radixSortUsingSelector:@selector(recent)];
}];
} }
- (void) useFilter:(UISegmentedControl *)segmented {
NSInteger selected([segmented selectedSegmentIndex]);
if (selected == 2)
- return [self useUpdated];
+ return [self useRecent];
bool simple(selected == 0);
sectioned_ = true;
[self setSorter:nullptr];
} }
+- (NSArray *) sectionsForPackages:(NSMutableArray *)packages {
+ if (sectioned_)
+ return [super sectionsForPackages:packages];
+
+ CFDateFormatterRef formatter(CFDateFormatterCreate(NULL, Locale_, kCFDateFormatterLongStyle, kCFDateFormatterNoStyle));
+
+ NSMutableArray *sections([NSMutableArray arrayWithCapacity:16]);
+ Section *section(nil);
+ time_t last(0);
+
+ for (size_t offset(0), count([packages count]); offset != count; ++offset) {
+ Package *package([packages objectAtIndex:offset]);
+
+ time_t upgraded([package upgraded]);
+ if (upgraded < 1168364520)
+ upgraded = 0;
+ else
+ upgraded -= upgraded % (60 * 60 * 24);
+
+ if (section == nil || upgraded != last) {
+ last = upgraded;
+
+ NSString *name;
+ if (upgraded == 0)
+ continue; // XXX: name = UCLocalize("...");
+ else {
+ name = (NSString *) CFDateFormatterCreateStringWithDate(NULL, formatter, (CFDateRef) [NSDate dateWithTimeIntervalSince1970:upgraded]);
+ [name autorelease];
+ }
+
+ section = [[[Section alloc] initWithName:name row:offset localize:NO] autorelease];
+ [sections addObject:section];
+ }
+
+ [section addToCount];
+ }
+
+ CFRelease(formatter);
+ return sections;
+}
+
- (id) initWithDatabase:(Database *)database {
if ((self = [super initWithDatabase:database title:UCLocalize("INSTALLED")]) != nil) {
UISegmentedControl *segmented([[[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:UCLocalize("USER"), UCLocalize("EXPERT"), UCLocalize("RECENT"), nil]] autorelease]);
static Pcre href_r("^http(s?)://[^# ]*$");
if (!href_r(href)) {
UIAlertView *alert = [[[UIAlertView alloc]
- initWithTitle:Error_
- message:UCLocalize("INVALID_URL")
+ initWithTitle:[NSString stringWithFormat:Colon_, Error_, UCLocalize("INVALID_URL")]
+ message:UCLocalize("INVALID_URL_EX")
delegate:self
cancelButtonTitle:UCLocalize("OK")
otherButtonTitles:nil
MSHook(BOOL, CFXPreferencesPropertyListSource$_backingPlistChangedSinceLastSync, CFXPreferencesPropertyListSource *self, SEL _cmd) {
NSURL *&url(MSHookIvar<NSURL *>(self, "_url")), *old(url);
NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]);
+
url = MobilizeURL(url);
- BOOL value(_CFXPreferencesPropertyListSource$_backingPlistChangedSinceLastSync(self, _cmd));
- //NSLog(@"%@ %s", [url absoluteString], value ? "YES" : "NO");
- url = old;
+ BOOL value; @try {
+ value = _CFXPreferencesPropertyListSource$_backingPlistChangedSinceLastSync(self, _cmd);
+ //NSLog(@"CFX %@ %s", [url absoluteString], value ? "YES" : "NO");
+ } @finally {
+ url = old;
+ }
+
[pool release];
return value;
}
MSHook(void *, CFXPreferencesPropertyListSource$createPlistFromDisk, CFXPreferencesPropertyListSource *self, SEL _cmd) {
NSURL *&url(MSHookIvar<NSURL *>(self, "_url")), *old(url);
NSAutoreleasePool *pool([[NSAutoreleasePool alloc] init]);
+
url = MobilizeURL(url);
- void *value(_CFXPreferencesPropertyListSource$createPlistFromDisk(self, _cmd));
- //NSLog(@"%@ %@", [url absoluteString], value);
- url = old;
+ void *value; @try {
+ value = _CFXPreferencesPropertyListSource$createPlistFromDisk(self, _cmd);
+ //NSLog(@"CFX %@ %@", [url absoluteString], value);
+ } @finally {
+ url = old;
+ }
+
[pool release];
return value;
}
PackageName = reinterpret_cast<CYString &(*)(Package *, SEL)>(method_getImplementation(class_getInstanceMethod([Package class], @selector(cyname))));
MobilizedFiles_ = [NSMutableSet setWithObjects:
+ @"Library/Preferences/.GlobalPreferences.plist",
@"Library/Preferences/com.apple.Accessibility.plist",
@"Library/Preferences/com.apple.preferences.sounds.plist",
nil];
if (Method method = class_getInstanceMethod($WAKWindow, @selector(screenSize)))
method_setImplementation(method, (IMP) &$WAKWindow$screenSize);
- $CFXPreferencesPropertyListSource = objc_getClass("CFXPreferencesPropertyListSource");
+ $CFXPreferencesPropertyListSource = objc_getClass("CFXPreferencesPropertyListSourceSynchronizer");
+ if ($CFXPreferencesPropertyListSource == Nil)
+ $CFXPreferencesPropertyListSource = objc_getClass("CFXPreferencesPropertyListSource");
Method CFXPreferencesPropertyListSource$_backingPlistChangedSinceLastSync(class_getInstanceMethod($CFXPreferencesPropertyListSource, @selector(_backingPlistChangedSinceLastSync)));
if (CFXPreferencesPropertyListSource$_backingPlistChangedSinceLastSync != NULL) {