X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/5ddde60fb69b9b9d2466044e208977981d2e1fcb..80f25cc9d4d64c4df417557cf2967d157d466f4c:/MobileCydia.mm?ds=inline diff --git a/MobileCydia.mm b/MobileCydia.mm index 47033741..76a3a3f1 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -48,8 +48,6 @@ #include #include "iPhonePrivate.h" -#include - #include #include @@ -112,21 +110,12 @@ extern "C" { #include "Substrate.hpp" #include "Menes/Menes.h" -#include "CyteKit/Application.h" -#include "CyteKit/NavigationController.h" +#include "CyteKit/CyteKit.h" #include "CyteKit/RegEx.hpp" -#include "CyteKit/TableViewCell.h" -#include "CyteKit/TabBarController.h" -#include "CyteKit/WebScriptObject-Cyte.h" -#include "CyteKit/WebViewController.h" -#include "CyteKit/WebViewTableViewCell.h" -#include "CyteKit/stringWithUTF8Bytes.h" #include "Cydia/MIMEAddress.h" #include "Cydia/LoadingViewController.h" #include "Cydia/ProgressEvent.h" - -#include "SDURLCache/SDURLCache.h" /* }}} */ /* Profiler {{{ */ @@ -199,10 +188,6 @@ void PrintTimes() { #define _end } /* }}} */ -// XXX: I hate clang. Apple: please get over your petty hatred of GPL and fix your gcc fork -#define synchronized(lock) \ - synchronized(static_cast(lock)) - extern NSString *Cydia_; #define lprintf(args...) fprintf(stderr, args) @@ -240,16 +225,6 @@ union SplitHash { }; // }}} -@implementation NSDictionary (Cydia) -- (id) invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)arguments { - if (false); - else if ([name isEqualToString:@"get"]) - return [self objectForKey:[arguments objectAtIndex:0]]; - else if ([name isEqualToString:@"keys"]) - return [self allKeys]; - return nil; -} @end - static NSString *Colon_; NSString *Elision_; static NSString *Error_; @@ -271,26 +246,6 @@ static NSString *UniqueIdentifier(UIDevice *device = nil) { return [(id)$MGCopyAnswer(CFSTR("UniqueDeviceID")) autorelease]; } -static bool IsReachable(const char *name) { - SCNetworkReachabilityFlags flags; { - SCNetworkReachabilityRef reachability(SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, name)); - SCNetworkReachabilityGetFlags(reachability, &flags); - CFRelease(reachability); - } - - // XXX: this elaborate mess is what Apple is using to determine this? :( - // XXX: do we care if the user has to intervene? maybe that's ok? - return - (flags & kSCNetworkReachabilityFlagsReachable) != 0 && ( - (flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0 || ( - (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) != 0 || - (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0 - ) && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0 || - (flags & kSCNetworkReachabilityFlagsIsWWAN) != 0 - ) - ; -} - static const NSUInteger UIViewAutoresizingFlexibleBoth(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); static _finline NSString *CydiaURL(NSString *path) { @@ -317,11 +272,6 @@ static _finline void UpdateExternalStatus(uint64_t newStatus) { notify_post("com.saurik.Cydia.status"); } -static CGFloat CYStatusBarHeight() { - CGSize size([[UIApplication sharedApplication] statusBarFrame].size); - return UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]) ? size.height : size.width; -} - /* NSForcedOrderingSearch doesn't work on the iPhone */ static const NSStringCompareOptions MatchCompareOptions_ = NSLiteralSearch | NSCaseInsensitiveSearch; static const NSStringCompareOptions LaxCompareOptions_ = NSNumericSearch | NSDiacriticInsensitiveSearch | NSWidthInsensitiveSearch | NSCaseInsensitiveSearch; @@ -394,47 +344,6 @@ void CYArrayInsertionSortValues(Type_ *values, size_t length, CFComparisonResult /* }}} */ -/* Apple Bug Fixes {{{ */ -@implementation UIWebDocumentView (Cydia) - -- (void) _setScrollerOffset:(CGPoint)offset { - UIScroller *scroller([self _scroller]); - - CGSize size([scroller contentSize]); - CGSize bounds([scroller bounds].size); - - CGPoint max; - max.x = size.width - bounds.width; - max.y = size.height - bounds.height; - - // wtf Apple?! - if (max.x < 0) - max.x = 0; - if (max.y < 0) - max.y = 0; - - offset.x = offset.x < 0 ? 0 : offset.x > max.x ? max.x : offset.x; - offset.y = offset.y < 0 ? 0 : offset.y > max.y ? max.y : offset.y; - - [scroller setOffset:offset]; -} - -@end -/* }}} */ - -NSUInteger DOMNodeList$countByEnumeratingWithState$objects$count$(DOMNodeList *self, SEL sel, NSFastEnumerationState *state, id *objects, NSUInteger count) { - size_t length([self length] - state->state); - if (length <= 0) - return 0; - else if (length > count) - length = count; - for (size_t i(0); i != length; ++i) - objects[i] = [self item:state->state++]; - state->itemsPtr = objects; - state->mutationsPtr = (unsigned long *) self; - return length; -} - /* Cydia NSString Additions {{{ */ @interface NSString (Cydia) - (NSComparisonResult) compareByPath:(NSString *)other; @@ -715,15 +624,7 @@ static _H Font18_; static _H Font18Bold_; static _H Font22Bold_; -static const char *Machine_ = NULL; -static _H System_; -static NSString *SerialNumber_ = nil; -static NSString *ChipID_ = nil; -static NSString *BBSNum_ = nil; static _H UniqueID_; -static _H UserAgent_; -static _H Product_; -static _H Safari_; static _H CollationLocale_; static _H CollationThumbs_; @@ -790,18 +691,9 @@ _H Sources_; static _transient NSNumber *Version_; static time_t now_; -bool IsWildcat_; -CGFloat ScreenScale_; -static NSString *Idiom_; -static _H Firmware_; -static NSString *Major_; - static _H SessionData_; -static _H HostConfig_; static _H BridgedHosts_; static _H InsecureHosts_; -static _H PipelinedHosts_; -static _H CachedURLs_; static NSString *kCydiaProgressEventTypeError = @"Error"; static NSString *kCydiaProgressEventTypeInformation = @"Information"; @@ -810,30 +702,6 @@ static NSString *kCydiaProgressEventTypeWarning = @"Warning"; /* }}} */ /* Display Helpers {{{ */ -inline float Interpolate(float begin, float end, float fraction) { - return (end - begin) * fraction + begin; -} - -static inline double Retina(double value) { - value *= ScreenScale_; - value = round(value); - value /= ScreenScale_; - return value; -} - -static inline CGRect Retina(CGRect value) { - value.origin.x *= ScreenScale_; - value.origin.y *= ScreenScale_; - value.size.width *= ScreenScale_; - value.size.height *= ScreenScale_; - value = CGRectIntegral(value); - value.origin.x /= ScreenScale_; - value.origin.y /= ScreenScale_; - value.size.width /= ScreenScale_; - value.size.height /= ScreenScale_; - return value; -} - static _finline const char *StripVersion_(const char *version) { const char *colon(strchr(version, ':')); return colon == NULL ? version : colon + 1; @@ -880,34 +748,6 @@ bool isSectionVisible(NSString *section) { return hidden == nil || ![hidden boolValue]; } -static NSObject *CYIOGetValue(const char *path, NSString *property) { - io_registry_entry_t entry(IORegistryEntryFromPath(kIOMasterPortDefault, path)); - if (entry == MACH_PORT_NULL) - return nil; - - CFTypeRef value(IORegistryEntryCreateCFProperty(entry, (CFStringRef) property, kCFAllocatorDefault, 0)); - IOObjectRelease(entry); - - if (value == NULL) - return nil; - return [(id) value autorelease]; -} - -static NSString *CYHex(NSData *data, bool reverse = false) { - if (data == nil) - return nil; - - size_t length([data length]); - uint8_t bytes[length]; - [data getBytes:bytes]; - - char string[length * 2 + 1]; - for (size_t i(0); i != length; ++i) - sprintf(string + i * 2, "%.2x", bytes[reverse ? length - i - 1 : i]); - - return [NSString stringWithUTF8String:string]; -} - static NSString *VerifySource(NSString *href) { static RegEx href_r("(http(s?)://|file:///)[^# ]*"); if (!href_r(href)) { @@ -1194,7 +1034,10 @@ class SourceStatus : } //printf("Set(%s, %s)\n", fetch ? "true" : "false", uri.c_str()); - [database_ setFetch:fetch forURI:uri.c_str()]; + + auto slash(uri.rfind('/')); + if (slash != std::string::npos) + [database_ setFetch:fetch forURI:uri.substr(0, slash).c_str()]; } _finline void Set(bool fetch, pkgAcquire::Item *item) { @@ -1659,13 +1502,10 @@ static void SaveConfig(NSObject *lock) { _profile(Source$setMetaIndex$DescURI) for (pkgAcquire::ItemIterator item(acquire.ItemsBegin()); item != acquire.ItemsEnd(); item++) { std::string file((*item)->DescURI()); - files_.insert(file); - if (file.length() < sizeof("Packages.bz2") || file.substr(file.length() - sizeof("Packages.bz2")) != "/Packages.bz2") + auto slash(file.rfind('/')); + if (slash == std::string::npos) continue; - file = file.substr(0, file.length() - 4); - files_.insert(file); - files_.insert(file + ".gz"); - files_.insert(file + "Index"); + files_.insert(file.substr(0, slash)); } _end @@ -3966,20 +3806,21 @@ class CydiaLogCleaner : continue; } else { std::swap(package, packages[index]); - if (package != nil) + if (package != nil) { + if (package.metadata->index_ == index + 1) + ++lost; goto lost; + } if (last != index) continue; } - } else lost: { + } else { ++lost; - if (last == packages.size()) { + lost: if (last == packages.size()) packages.push_back(package); - ++last; - } else { + else packages[last] = package; - ++last; - } + ++last; } for (; last != packages.size(); ++last) @@ -4314,76 +4155,16 @@ class CydiaLogCleaner : @end /* }}} */ -static _H Diversions_; - -@interface Diversion : NSObject { - RegEx pattern_; - _H key_; - _H format_; -} - -@end - -@implementation Diversion - -- (id) initWithFrom:(NSString *)from to:(NSString *)to { - if ((self = [super init]) != nil) { - pattern_ = [from UTF8String]; - key_ = from; - format_ = to; - } return self; -} - -- (NSString *) divert:(NSString *)url { - return !pattern_(url) ? nil : pattern_->*format_; -} - -+ (NSURL *) divertURL:(NSURL *)url { - divert: - NSString *href([url absoluteString]); - - for (Diversion *diversion in (id) Diversions_) - if (NSString *diverted = [diversion divert:href]) { -#if !ForRelease - NSLog(@"div: %@", diverted); -#endif - url = [NSURL URLWithString:diverted]; - goto divert; - } - - return url; -} - -- (NSString *) key { - return key_; -} - -- (NSUInteger) hash { - return [key_ hash]; -} - -- (BOOL) isEqual:(Diversion *)object { - return self == object || [self class] == [object class] && [key_ isEqual:[object key]]; -} - -@end - -@interface CydiaObject : NSObject { - _H indirect_; +@interface CydiaObject : CyteObject { _transient id delegate_; } -- (id) initWithDelegate:(CyteWebViewController *)indirect; - @end -@class CydiaObject; - @interface CydiaWebViewController : CyteWebViewController { _H cydia_; } -+ (void) addDiversion:(Diversion *)diversion; + (NSURLRequest *) requestWithHeaders:(NSURLRequest *)request; + (void) didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame withCydia:(CydiaObject *)cydia; - (void) setDelegate:(id)delegate; @@ -4393,85 +4174,30 @@ static _H Diversions_; /* Web Scripting {{{ */ @implementation CydiaObject -- (id) initWithDelegate:(CyteWebViewController *)indirect { - if ((self = [super init]) != nil) { - indirect_ = indirect; - } return self; -} - - (void) setDelegate:(id)delegate { delegate_ = delegate; } -+ (NSArray *) _attributeKeys { - return [NSArray arrayWithObjects: - @"bittage", - @"bbsnum", - @"build", +- (NSArray *) attributeKeys { + return [[NSArray arrayWithObjects: @"cells", - @"coreFoundationVersionNumber", @"device", - @"ecid", - @"firmware", - @"hostname", - @"idiom", @"mcc", @"mnc", - @"model", @"operator", @"role", - @"serial", @"version", - nil]; -} - -- (NSArray *) attributeKeys { - return [[self class] _attributeKeys]; -} - -+ (BOOL) isKeyExcludedFromWebScript:(const char *)name { - return ![[self _attributeKeys] containsObject:[NSString stringWithUTF8String:name]] && [super isKeyExcludedFromWebScript:name]; + nil] arrayByAddingObjectsFromArray:[super attributeKeys]]; } - (NSString *) version { return Cydia_; } -- (unsigned) bittage { -#if 0 -#elif defined(__arm64__) - return 64; -#elif defined(__arm__) - return 32; -#else - return 0; -#endif -} - -- (NSString *) build { - return System_; -} - -- (NSString *) coreFoundationVersionNumber { - return [NSString stringWithFormat:@"%.2f", kCFCoreFoundationVersionNumber]; -} - - (NSString *) device { return UniqueIdentifier(); } -- (NSString *) firmware { - return [[UIDevice currentDevice] systemVersion]; -} - -- (NSString *) hostname { - return [[UIDevice currentDevice] name]; -} - -- (NSString *) idiom { - return (id) Idiom_ ?: [NSNull null]; -} - - (NSArray *) cells { auto *$_CTServerConnectionCreate(reinterpret_cast(dlsym(RTLD_DEFAULT, "_CTServerConnectionCreate"))); if ($_CTServerConnectionCreate == NULL) @@ -4513,46 +4239,22 @@ static _H Diversions_; return nil; } -- (NSString *) bbsnum { - return (id) BBSNum_ ?: [NSNull null]; -} - -- (NSString *) ecid { - return (id) ChipID_ ?: [NSNull null]; -} - -- (NSString *) serial { - return SerialNumber_; -} - - (NSString *) role { return (id) [NSNull null]; } -- (NSString *) model { - return [NSString stringWithUTF8String:Machine_]; -} - + (NSString *) webScriptNameForSelector:(SEL)selector { if (false); else if (selector == @selector(addBridgedHost:)) return @"addBridgedHost"; else if (selector == @selector(addInsecureHost:)) return @"addInsecureHost"; - else if (selector == @selector(addInternalRedirect::)) - return @"addInternalRedirect"; - else if (selector == @selector(addPipelinedHost:scheme:)) - return @"addPipelinedHost"; else if (selector == @selector(addSource:::)) return @"addSource"; else if (selector == @selector(addTrivialSource:)) return @"addTrivialSource"; - else if (selector == @selector(close)) - return @"close"; else if (selector == @selector(du:)) return @"du"; - else if (selector == @selector(stringWithFormat:arguments:)) - return @"format"; else if (selector == @selector(getAllSources)) return @"getAllSources"; else if (selector == @selector(getApplicationInfo:value:)) @@ -4561,18 +4263,8 @@ static _H Diversions_; return @"getDisplayIdentifiers"; else if (selector == @selector(getLocalizedNameForDisplayIdentifier:)) return @"getLocalizedNameForDisplayIdentifier"; - else if (selector == @selector(getKernelNumber:)) - return @"getKernelNumber"; - else if (selector == @selector(getKernelString:)) - return @"getKernelString"; else if (selector == @selector(getInstalledPackages)) return @"getInstalledPackages"; - else if (selector == @selector(getIORegistryEntry::)) - return @"getIORegistryEntry"; - else if (selector == @selector(getLocaleIdentifier)) - return @"getLocaleIdentifier"; - else if (selector == @selector(getPreferredLanguages)) - return @"getPreferredLanguages"; else if (selector == @selector(getPackageById:)) return @"getPackageById"; else if (selector == @selector(getMetadataKeys)) @@ -4583,18 +4275,8 @@ static _H Diversions_; return @"getSessionValue"; else if (selector == @selector(installPackages:)) return @"installPackages"; - else if (selector == @selector(isReachable:)) - return @"isReachable"; - else if (selector == @selector(localizedStringForKey:value:table:)) - return @"localize"; - else if (selector == @selector(popViewController:)) - return @"popViewController"; else if (selector == @selector(refreshSources)) return @"refreshSources"; - else if (selector == @selector(registerFrame:)) - return @"registerFrame"; - else if (selector == @selector(removeButton)) - return @"removeButton"; else if (selector == @selector(saveConfig)) return @"saveConfig"; else if (selector == @selector(setMetadataValue::)) @@ -4603,42 +4285,8 @@ static _H Diversions_; return @"setSessionValue"; else if (selector == @selector(substitutePackageNames:)) return @"substitutePackageNames"; - else if (selector == @selector(scrollToBottom:)) - return @"scrollToBottom"; - else if (selector == @selector(setAllowsNavigationAction:)) - return @"setAllowsNavigationAction"; - else if (selector == @selector(setBadgeValue:)) - return @"setBadgeValue"; - else if (selector == @selector(setButtonImage:withStyle:toFunction:)) - return @"setButtonImage"; - else if (selector == @selector(setButtonTitle:withStyle:toFunction:)) - return @"setButtonTitle"; - else if (selector == @selector(setHidesBackButton:)) - return @"setHidesBackButton"; - else if (selector == @selector(setHidesNavigationBar:)) - return @"setHidesNavigationBar"; - else if (selector == @selector(setNavigationBarStyle:)) - return @"setNavigationBarStyle"; - else if (selector == @selector(setNavigationBarTintRed:green:blue:alpha:)) - return @"setNavigationBarTintColor"; - else if (selector == @selector(setPasteboardString:)) - return @"setPasteboardString"; - else if (selector == @selector(setPasteboardURL:)) - return @"setPasteboardURL"; - else if (selector == @selector(setScrollAlwaysBounceVertical:)) - return @"setScrollAlwaysBounceVertical"; - else if (selector == @selector(setScrollIndicatorStyle:)) - return @"setScrollIndicatorStyle"; else if (selector == @selector(setToken:)) return @"setToken"; - else if (selector == @selector(setViewportWidth:)) - return @"setViewportWidth"; - else if (selector == @selector(statfs:)) - return @"statfs"; - else if (selector == @selector(supports:)) - return @"supports"; - else if (selector == @selector(unload)) - return @"unload"; else return nil; } @@ -4647,26 +4295,6 @@ static _H Diversions_; return [self webScriptNameForSelector:selector] == nil; } -- (BOOL) supports:(NSString *)feature { - return [feature isEqualToString:@"window.open"]; -} - -- (void) unload { - [delegate_ performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO]; -} - -- (void) setScrollAlwaysBounceVertical:(NSNumber *)value { - [indirect_ performSelectorOnMainThread:@selector(setScrollAlwaysBounceVerticalNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setScrollIndicatorStyle:(NSString *)style { - [indirect_ performSelectorOnMainThread:@selector(setScrollIndicatorStyleWithName:) withObject:style waitUntilDone:NO]; -} - -- (void) addInternalRedirect:(NSString *)from :(NSString *)to { - [CydiaWebViewController performSelectorOnMainThread:@selector(addDiversion:) withObject:[[[Diversion alloc] initWithFrom:from to:to] autorelease] waitUntilDone:NO]; -} - - (NSDictionary *) getApplicationInfo:(NSString *)display value:(NSString *)key { char path[1024]; if (SBBundlePathForDisplayIdentifier(SBSSpringBoardServerPort(), [display UTF8String], path) != 0) @@ -4702,43 +4330,11 @@ static _H Diversions_; return [NSNumber numberWithInt:value]; } -- (NSString *) getKernelString:(NSString *)name { - const char *string([name UTF8String]); - - size_t size; - if (sysctlbyname(string, NULL, &size, NULL, 0) == -1) - return (id) [NSNull null]; - - char value[size + 1]; - if (sysctlbyname(string, value, &size, NULL, 0) == -1) - return (id) [NSNull null]; - - // XXX: just in case you request something ludicrous - value[size] = '\0'; - - return [NSString stringWithCString:value]; -} - -- (NSObject *) getIORegistryEntry:(NSString *)path :(NSString *)entry { - NSObject *value(CYIOGetValue([path UTF8String], entry)); - - if (value != nil) - if ([value isKindOfClass:[NSData class]]) - value = CYHex((NSData *) value); - - return value; -} - - (NSArray *) getMetadataKeys { @synchronized (Values_) { return [Values_ allKeys]; } } -- (void) registerFrame:(DOMHTMLIFrameElement *)iframe { - WebFrame *frame([iframe contentFrame]); - [indirect_ registerFrame:frame]; -} - - (id) getMetadataValue:(NSString *)key { @synchronized (Values_) { return [Values_ objectForKey:key]; @@ -4766,29 +4362,15 @@ static _H Diversions_; } } - (void) addBridgedHost:(NSString *)host { -@synchronized (HostConfig_) { +@synchronized (BridgedHosts_) { [BridgedHosts_ addObject:host]; } } - (void) addInsecureHost:(NSString *)host { -@synchronized (HostConfig_) { +@synchronized (InsecureHosts_) { [InsecureHosts_ addObject:host]; } } -- (void) addPipelinedHost:(NSString *)host scheme:(NSString *)scheme { -@synchronized (HostConfig_) { - if (scheme != (id) [WebUndefined undefined]) - host = [NSString stringWithFormat:@"%@:%@", [scheme lowercaseString], host]; - - [PipelinedHosts_ addObject:host]; -} } - -- (void) popViewController:(NSNumber *)value { - if (value == (id) [WebUndefined undefined]) - value = [NSNumber numberWithBool:YES]; - [indirect_ performSelectorOnMainThread:@selector(popViewControllerWithNumber:) withObject:value waitUntilDone:NO]; -} - - (void) addSource:(NSString *)href :(NSString *)distribution :(WebScriptObject *)sections { NSMutableArray *array([NSMutableArray arrayWithCapacity:[sections count]]); @@ -4842,27 +4424,6 @@ static _H Diversions_; return (Package *) [NSNull null]; } -- (NSString *) getLocaleIdentifier { - return Locale_ == NULL ? (NSString *) [NSNull null] : (NSString *) CFLocaleGetIdentifier(Locale_); -} - -- (NSArray *) getPreferredLanguages { - return Languages_; -} - -- (NSArray *) statfs:(NSString *)path { - struct statfs stat; - - if (path == nil || statfs([path UTF8String], &stat) == -1) - return nil; - - return [NSArray arrayWithObjects: - [NSNumber numberWithUnsignedLong:stat.f_bsize], - [NSNumber numberWithUnsignedLong:stat.f_blocks], - [NSNumber numberWithUnsignedLong:stat.f_bfree], - nil]; -} - - (NSNumber *) du:(NSString *)path { NSNumber *value(nil); @@ -4884,14 +4445,6 @@ static _H Diversions_; return value; } -- (void) close { - [indirect_ performSelectorOnMainThread:@selector(close) withObject:nil waitUntilDone:NO]; -} - -- (NSNumber *) isReachable:(NSString *)name { - return [NSNumber numberWithBool:IsReachable([name UTF8String])]; -} - - (void) installPackages:(NSArray *)packages { [delegate_ performSelectorOnMainThread:@selector(installPackages:) withObject:packages waitUntilDone:NO]; } @@ -4913,81 +4466,10 @@ static _H Diversions_; return [words componentsJoinedByString:@" "]; } -- (void) removeButton { - [indirect_ removeButton]; -} - -- (void) setButtonImage:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { - [indirect_ setButtonImage:button withStyle:style toFunction:function]; -} - -- (void) setButtonTitle:(NSString *)button withStyle:(NSString *)style toFunction:(id)function { - [indirect_ setButtonTitle:button withStyle:style toFunction:function]; -} - -- (void) setBadgeValue:(id)value { - [indirect_ performSelectorOnMainThread:@selector(setBadgeValue:) withObject:value waitUntilDone:NO]; -} - -- (void) setAllowsNavigationAction:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setAllowsNavigationActionByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setHidesBackButton:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setHidesBackButtonByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setHidesNavigationBar:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setHidesNavigationBarByNumber:) withObject:value waitUntilDone:NO]; -} - -- (void) setNavigationBarStyle:(NSString *)value { - [indirect_ performSelectorOnMainThread:@selector(setNavigationBarStyle:) withObject:value waitUntilDone:NO]; -} - -- (void) setNavigationBarTintRed:(NSNumber *)red green:(NSNumber *)green blue:(NSNumber *)blue alpha:(NSNumber *)alpha { - float opacity(alpha == (id) [WebUndefined undefined] ? 1 : [alpha floatValue]); - UIColor *color([UIColor colorWithRed:[red floatValue] green:[green floatValue] blue:[blue floatValue] alpha:opacity]); - [indirect_ performSelectorOnMainThread:@selector(setNavigationBarTintColor:) withObject:color waitUntilDone:NO]; -} - -- (void) setPasteboardString:(NSString *)value { - [[objc_getClass("UIPasteboard") generalPasteboard] setString:value]; -} - -- (void) setPasteboardURL:(NSString *)value { - [[objc_getClass("UIPasteboard") generalPasteboard] setURL:[NSURL URLWithString:value]]; -} - - (void) setToken:(NSString *)token { // XXX: the website expects this :/ } -- (void) scrollToBottom:(NSNumber *)animated { - [indirect_ performSelectorOnMainThread:@selector(scrollToBottomAnimated:) withObject:animated waitUntilDone:NO]; -} - -- (void) setViewportWidth:(float)width { - [indirect_ setViewportWidthOnMainThread:width]; -} - -- (NSString *) stringWithFormat:(NSString *)format arguments:(WebScriptObject *)arguments { - //NSLog(@"SWF:\"%@\" A:%@", format, [arguments description]); - unsigned count([arguments count]); - id values[count]; - for (unsigned i(0); i != count; ++i) - values[i] = [arguments objectAtIndex:i]; - return [[[NSString alloc] initWithFormat:format arguments:reinterpret_cast(values)] autorelease]; -} - -- (NSString *) localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)table { - if (reinterpret_cast(value) == [WebUndefined undefined]) - value = nil; - if (reinterpret_cast(table) == [WebUndefined undefined]) - table = nil; - return [[NSBundle mainBundle] localizedStringForKey:key value:value table:table]; -} - @end /* }}} */ @@ -5000,7 +4482,7 @@ static _H Diversions_; if ([[[self scheme] lowercaseString] isEqualToString:@"https"]) return true; - @synchronized (HostConfig_) { + @synchronized (InsecureHosts_) { if ([InsecureHosts_ containsObject:[self host]]) return true; } @@ -5020,16 +4502,6 @@ static _H Diversions_; return nil; } -+ (void) _initialize { - [super _initialize]; - - Diversions_ = [NSMutableSet setWithCapacity:0]; -} - -+ (void) addDiversion:(Diversion *)diversion { - [Diversions_ addObject:diversion]; -} - - (void) webView:(WebView *)view didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame { [super webView:view didClearWindowObject:window forFrame:frame]; [CydiaWebViewController didClearWindowObject:window forFrame:frame withCydia:cydia_]; @@ -5043,7 +4515,7 @@ static _H Diversions_; bool bridged(false); - @synchronized (HostConfig_) { + @synchronized (BridgedHosts_) { if ([scheme isEqualToString:@"file"]) bridged = true; else if ([scheme isEqualToString:@"https"]) @@ -5062,10 +4534,6 @@ static _H Diversions_; [controller addAttachmentData:[NSData dataWithContentsOfFile:@"/tmp/dpkgl.log"] mimeType:@"text/plain" fileName:@"dpkgl.log"]; } -- (NSURL *) URLWithURL:(NSURL *)url { - return [Diversion divertURL:url]; -} - - (NSURLRequest *) webView:(WebView *)view resource:(id)resource willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response fromDataSource:(WebDataSource *)source { return [CydiaWebViewController requestWithHeaders:[super webView:view resource:resource willSendRequest:request redirectResponse:response fromDataSource:source]]; } @@ -5099,7 +4567,7 @@ static _H Diversions_; if (Machine_ != NULL && [copy valueForHTTPHeaderField:@"X-Machine"] == nil) [copy setValue:[NSString stringWithUTF8String:Machine_] forHTTPHeaderField:@"X-Machine"]; - bool bridged; @synchronized (HostConfig_) { + bool bridged; @synchronized (BridgedHosts_) { bridged = [BridgedHosts_ containsObject:host]; } @@ -5114,10 +4582,6 @@ static _H Diversions_; [cydia_ setDelegate:delegate]; } -- (NSString *) applicationNameForUserAgent { - return UserAgent_; -} - - (id) init { if ((self = [super initWithWidth:0 ofClass:[CydiaWebViewController class]]) != nil) { cydia_ = [[[CydiaObject alloc] initWithDelegate:self.indirect] autorelease]; @@ -5144,42 +4608,6 @@ static _H Diversions_; @end /* }}} */ -// CydiaScript {{{ -@interface NSObject (CydiaScript) -- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context; -@end - -@implementation NSObject (CydiaScript) - -- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { - return self; -} - -@end - -@implementation NSArray (CydiaScript) - -- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { - WebScriptObject *object([context evaluateWebScript:@"[]"]); - for (size_t i(0), e([self count]); i != e; ++i) - [object setWebScriptValueAtIndex:i value:[[self objectAtIndex:i] Cydia$webScriptObjectInContext:context]]; - return object; -} - -@end - -@implementation NSDictionary (CydiaScript) - -- (id) Cydia$webScriptObjectInContext:(WebScriptObject *)context { - WebScriptObject *object([context evaluateWebScript:@"({})"]); - for (id i in self) - [object setValue:[[self objectForKey:i] Cydia$webScriptObjectInContext:context] forKey:i]; - return object; -} - -@end -// }}} - /* Confirmation Controller {{{ */ bool DepSubstrate(const pkgCache::VerIterator &iterator) { if (!iterator.end()) @@ -5909,14 +5337,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { - (PackageCell *) init { CGRect frame(CGRectMake(0, 0, 320, 74)); if ((self = [super initWithFrame:frame reuseIdentifier:@"Package"]) != nil) { - UIView *content([self contentView]); - CGRect bounds([content bounds]); - - self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease]; - [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; - [content addSubview:self.content]; - - [self.content setDelegate:self]; [self.content setOpaque:YES]; } return self; } @@ -6132,15 +5552,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { switch_ = [[[UISwitch alloc] initWithFrame:CGRectMake(218, 9, 60, 25)] autorelease]; [switch_ addTarget:self action:@selector(onSwitch:) forEvents:UIControlEventValueChanged]; - UIView *content([self contentView]); - CGRect bounds([content bounds]); - - self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease]; - [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; - [content addSubview:self.content]; [self.content setBackgroundColor:[UIColor whiteColor]]; - - [self.content setDelegate:self]; } return self; } @@ -6226,7 +5638,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { /* }}} */ /* File Table {{{ */ -@interface FileTable : CyteViewController < +@interface FileTable : CyteListController < UITableViewDataSource, UITableViewDelegate > { @@ -6234,11 +5646,9 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { _H package_; _H name_; _H files_; - _H list_; } -- (id) initWithDatabase:(Database *)database; -- (void) setPackage:(Package *)package; +- (id) initWithDatabase:(Database *)database forPackage:(NSString *)name; @end @@ -6270,47 +5680,36 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://package/%@/files", [package_ id]]]; } -- (void) loadView { - list_ = [[[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]; - [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; - [list_ setRowHeight:24.0f]; - [(UITableView *) list_ setDataSource:self]; - [list_ setDelegate:self]; - [self setView:list_]; -} - -- (void) viewDidLoad { - [super viewDidLoad]; - - [[self navigationItem] setTitle:UCLocalize("INSTALLED_FILES")]; +- (CGFloat) rowHeight { + return 24; } - (void) releaseSubviews { - list_ = nil; - package_ = nil; files_ = nil; [super releaseSubviews]; } -- (id) initWithDatabase:(Database *)database { - if ((self = [super init]) != nil) { +- (id) initWithDatabase:(Database *)database forPackage:(NSString *)name { + if ((self = [super initWithTitle:UCLocalize("INSTALLED_FILES")]) != nil) { database_ = database; + name_ = name; } return self; } -- (void) setPackage:(Package *)package { - package_ = nil; - name_ = nil; +- (bool) shouldYield { + return false; +} - files_ = [NSMutableArray arrayWithCapacity:32]; +- (void) _reloadData { + files_ = nil; - if (package != nil) { - package_ = package; - name_ = [package id]; + package_ = [database_ packageWithName:name_]; + if (package_ != nil) { + files_ = [NSMutableArray arrayWithCapacity:32]; - if (NSArray *files = [package files]) + if (NSArray *files = [package_ files]) [files_ addObjectsFromArray:files]; if ([files_ count] != 0) { @@ -6335,13 +5734,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { } } - [list_ reloadData]; -} - -- (void) reloadData { - [super reloadData]; - - [self setPackage:[database_ packageWithName:name_]]; + [super _reloadData]; } @end @@ -6437,7 +5830,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { #if !AlwaysReload - (void) _customButtonClicked { - if (commercial_ && [package_ uninstalled]) + if (commercial_ && self.isLoading && [package_ uninstalled]) return [self reloadURLWithCache:NO]; size_t count(buttons_.size()); @@ -6542,7 +5935,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { /* }}} */ /* Package List Controller {{{ */ -@interface PackageListController : CyteViewController < +@interface PackageListController : CyteListController < UITableViewDataSource, UITableViewDelegate > { @@ -6550,18 +5943,14 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { unsigned era_; _H packages_; _H sections_; - _H list_; _H thumbs_; std::vector offset_; - _H title_; unsigned reloading_; } - (id) initWithDatabase:(Database *)database title:(NSString *)title; -- (void) resetCursor; -- (void) clearData; - (NSArray *) sectionsForPackages:(NSMutableArray *)packages; @@ -6581,95 +5970,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { return true; } -- (void) deselectWithAnimation:(BOOL)animated { - [list_ deselectRowAtIndexPath:[list_ indexPathForSelectedRow] animated:animated]; -} - -- (void) resizeForKeyboardBounds:(CGRect)bounds duration:(NSTimeInterval)duration curve:(UIViewAnimationCurve)curve { - CGRect base = [[self view] bounds]; - base.size.height -= bounds.size.height; - base.origin = [list_ frame].origin; - - [UIView beginAnimations:nil context:NULL]; - [UIView setAnimationBeginsFromCurrentState:YES]; - [UIView setAnimationCurve:curve]; - [UIView setAnimationDuration:duration]; - [list_ setFrame:base]; - [UIView commitAnimations]; -} - -- (void) resizeForKeyboardBounds:(CGRect)bounds duration:(NSTimeInterval)duration { - [self resizeForKeyboardBounds:bounds duration:duration curve:UIViewAnimationCurveLinear]; -} - -- (void) resizeForKeyboardBounds:(CGRect)bounds { - [self resizeForKeyboardBounds:bounds duration:0]; -} - -- (void) getKeyboardCurve:(UIViewAnimationCurve *)curve duration:(NSTimeInterval *)duration forNotification:(NSNotification *)notification { - if (&UIKeyboardAnimationCurveUserInfoKey == NULL) - *curve = UIViewAnimationCurveEaseInOut; - else - [[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:curve]; - - if (&UIKeyboardAnimationDurationUserInfoKey == NULL) - *duration = 0.3; - else - [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:duration]; -} - -- (void) keyboardWillShow:(NSNotification *)notification { - CGRect bounds; - CGPoint center; - [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] getValue:&bounds]; - [[[notification userInfo] objectForKey:UIKeyboardCenterEndUserInfoKey] getValue:¢er]; - - NSTimeInterval duration; - UIViewAnimationCurve curve; - [self getKeyboardCurve:&curve duration:&duration forNotification:notification]; - - CGRect kbframe = CGRectMake(Retina(center.x - bounds.size.width / 2), Retina(center.y - bounds.size.height / 2), bounds.size.width, bounds.size.height); - UIViewController *base = self; - while ([base parentOrPresentingViewController] != nil) - base = [base parentOrPresentingViewController]; - CGRect viewframe = [[base view] convertRect:[list_ frame] fromView:[list_ superview]]; - CGRect intersection = CGRectIntersection(viewframe, kbframe); - - if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) // XXX: _UIApplicationLinkedOnOrAfter(4) - intersection.size.height += CYStatusBarHeight(); - - [self resizeForKeyboardBounds:intersection duration:duration curve:curve]; -} - -- (void) keyboardWillHide:(NSNotification *)notification { - NSTimeInterval duration; - UIViewAnimationCurve curve; - [self getKeyboardCurve:&curve duration:&duration forNotification:notification]; - - [self resizeForKeyboardBounds:CGRectZero duration:duration curve:curve]; -} - -- (void) viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self resizeForKeyboardBounds:CGRectZero]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; -} - -- (void) viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - [self resizeForKeyboardBounds:CGRectZero]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; -} - -- (void) viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - [self deselectWithAnimation:animated]; -} - - (void) didSelectPackage:(Package *)package { CYPackageController *view([[[CYPackageController alloc] initWithDatabase:database_ forPackage:[package id] withReferrer:[[self referrerURL] absoluteString]] autorelease]); [view setDelegate:self.delegate]; @@ -6728,39 +6028,17 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { return offset_[index]; } -- (void) updateHeight { - [list_ setRowHeight:([self isSummarized] ? 38 : 73)]; +- (CGFloat) rowHeight { + return [self isSummarized] ? 38 : 73; } - (id) initWithDatabase:(Database *)database title:(NSString *)title { - if ((self = [super init]) != nil) { + if ((self = [super initWithTitle:title]) != nil) { database_ = database; - title_ = [title copy]; - [[self navigationItem] setTitle:title_]; } return self; } -- (void) loadView { - UIView *view([[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease]); - [view setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; - [self setView:view]; - - list_ = [[[UITableView alloc] initWithFrame:[[self view] bounds] style:UITableViewStylePlain] autorelease]; - [list_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; - [view addSubview:list_]; - - // XXX: is 20 the most optimal number here? - [list_ setSectionIndexMinimumDisplayRowCount:20]; - - [(UITableView *) list_ setDataSource:self]; - [list_ setDelegate:self]; - - [self updateHeight]; -} - - (void) releaseSubviews { - list_ = nil; - packages_ = nil; sections_ = nil; @@ -6770,10 +6048,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { [super releaseSubviews]; } -- (bool) shouldYield { - return false; -} - - (bool) shouldBlock { return false; } @@ -6834,12 +6108,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { sections_ = [NSArray arrayWithObject:section]; } - [self updateHeight]; - - _profile(PackageTable$reloadData$List) - [(UITableView *) list_ setDataSource:self]; - [list_ reloadData]; - _end + [super _reloadData]; } PrintTimes(); @@ -6898,28 +6167,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) { return sections; } -- (void) reloadData { - [super reloadData]; - - if ([self shouldYield]) - [self performSelector:@selector(_reloadData) withObject:nil afterDelay:0]; - else - [self _reloadData]; -} - -- (void) resetCursor { - [list_ scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; -} - -- (void) clearData { - [self updateHeight]; - - [list_ setDataSource:nil]; - [list_ reloadData]; - - [self resetCursor]; -} - @end /* }}} */ /* Filtered Package List Controller {{{ */ @@ -7176,61 +6423,18 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi /* }}} */ /* Cydia:// Protocol {{{ */ -@interface CydiaURLProtocol : NSURLProtocol { +@interface CydiaURLProtocol : CyteURLProtocol { } @end @implementation CydiaURLProtocol -+ (BOOL) canInitWithRequest:(NSURLRequest *)request { - NSURL *url([request URL]); - if (url == nil) - return NO; - - NSString *scheme([[url scheme] lowercaseString]); - if (scheme != nil && [scheme isEqualToString:@"cydia"]) - return YES; - if ([[url absoluteString] hasPrefix:@"about:cydia-"]) - return YES; - - return NO; -} - -+ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request { - return request; -} - -- (void) _returnPNGWithImage:(UIImage *)icon forRequest:(NSURLRequest *)request { - id client([self client]); - if (icon == nil) - [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]]; - else { - NSData *data(UIImagePNGRepresentation(icon)); - - NSURLResponse *response([[[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"image/png" expectedContentLength:-1 textEncodingName:nil] autorelease]); - [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed]; - [client URLProtocol:self didLoadData:data]; - [client URLProtocolDidFinishLoading:self]; - } ++ (NSString *) scheme { + return @"cydia"; } -- (void) startLoading { - id client([self client]); - NSURLRequest *request([self request]); - - NSURL *url([request URL]); - NSString *href([url absoluteString]); - NSString *scheme([[url scheme] lowercaseString]); - - NSString *path; - - if ([scheme isEqualToString:@"cydia"]) - path = [href substringFromIndex:8]; - else if ([scheme isEqualToString:@"about"]) - path = [href substringFromIndex:12]; - else _assert(false); - +- (bool) loadForPath:(NSString *)path ofRequest:(NSURLRequest *)request { NSRange slash([path rangeOfString:@"/"]); NSString *command; @@ -7290,11 +6494,10 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi icon = [UIImage imageNamed:@"unknown.png"]; [self _returnPNGWithImage:icon forRequest:request]; } else fail: { - [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil]]; + return [super loadForPath:path ofRequest:request]; } -} -- (void) stopLoading { + return true; } @end @@ -7753,8 +6956,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi if (upgrades_ != 0) [sections insertObject:upgradable atIndex:0]; - [list_ reloadData]; - [[self navigationItem] setRightBarButtonItem:(upgrades_ == 0 ? nil : [[[UIBarButtonItem alloc] initWithTitle:[NSString stringWithFormat:UCLocalize("PARENTHETICAL"), UCLocalize("UPGRADE"), [NSString stringWithFormat:@"%u", upgrades_]] style:UIBarButtonItemStylePlain @@ -8307,20 +7508,12 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi - (SourceCell *) initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier { if ((self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) != nil) { - UIView *content([self contentView]); - CGRect bounds([content bounds]); - - self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease]; - [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth]; [self.content setBackgroundColor:[UIColor whiteColor]]; - [content addSubview:self.content]; - - [self.content setDelegate:self]; [self.content setOpaque:YES]; indicator_ = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGraySmall] autorelease]; [indicator_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin];// | UIViewAutoresizingFlexibleBottomMargin]; - [content addSubview:indicator_]; + [[self contentView] addSubview:indicator_]; [[self.content layer] setContentsGravity:kCAGravityTopLeft]; } return self; @@ -8921,63 +8114,12 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi @end /* }}} */ -@interface CYURLCache : SDURLCache { -} - -@end - -@implementation CYURLCache - -- (void) logEvent:(NSString *)event forRequest:(NSURLRequest *)request { -#if !ForRelease - if (false); - else if ([event isEqualToString:@"no-cache"]) - event = @"!!!"; - else if ([event isEqualToString:@"store"]) - event = @">>>"; - else if ([event isEqualToString:@"invalid"]) - event = @"???"; - else if ([event isEqualToString:@"memory"]) - event = @"mem"; - else if ([event isEqualToString:@"disk"]) - event = @"ssd"; - else if ([event isEqualToString:@"miss"]) - event = @"---"; - - NSLog(@"%@: %@", event, [[request URL] absoluteString]); -#endif -} - -- (void) storeCachedResponse:(NSCachedURLResponse *)cached forRequest:(NSURLRequest *)request { - if (NSURLResponse *response = [cached response]) - if (NSString *mime = [response MIMEType]) - if ([mime isEqualToString:@"text/cache-manifest"]) { - NSURL *url([response URL]); - -#if !ForRelease - NSLog(@"###: %@", [url absoluteString]); -#endif - - @synchronized (HostConfig_) { - [CachedURLs_ addObject:url]; - } - } - - [super storeCachedResponse:cached forRequest:request]; -} - -- (void) createDiskCachePath { - [super createDiskCachePath]; -} - -@end - @interface Cydia : CyteApplication < ConfirmationControllerDelegate, DatabaseDelegate, CydiaDelegate > { - _H window_; + _H window_; _H tabbar_; _H emulated_; _H appcache_; @@ -8990,7 +8132,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi _H starturl_; unsigned locked_; - unsigned activity_; _H stash_; @@ -9030,7 +8171,7 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi } - (bool) requestUpdate { - if (IsReachable("cydia.saurik.com")) { + if (CyteIsReachable("cydia.saurik.com")) { [self beginUpdate]; return true; } else { @@ -9112,13 +8253,9 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi return [controllers objectAtIndex:3]; } -- (void) unloadData { - [tabbar_ unloadData]; -} - - (void) _updateData { [self _saveConfig]; - [self unloadData]; + [window_ unloadData]; UINavigationController *navigation = [self queueNavigationController]; @@ -9147,7 +8284,7 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi // - We already auto-refreshed this launch. // - Auto-refresh is disabled. // - Cydia's server is not reachable - if (recently || loaded_ || ManualRefresh || !IsReachable("cydia.saurik.com")) { + if (recently || loaded_ || ManualRefresh || !CyteIsReachable("cydia.saurik.com")) { // If we are cancelling, we need to make sure it knows it's already loaded. loaded_ = true; @@ -9237,14 +8374,9 @@ _end if (emulated_ == nil) return; - if ([window_ respondsToSelector:@selector(setRootViewController:)]) - [window_ setRootViewController:tabbar_]; - else { - [window_ addSubview:[tabbar_ view]]; - [[emulated_ view] removeFromSuperview]; - } - + [window_ setRootViewController:tabbar_]; emulated_ = nil; + [window_ setUserInteractionEnabled:YES]; } @@ -9420,25 +8552,6 @@ _end [self unlockSuspend]; } -- (void) retainNetworkActivityIndicator { - if (activity_++ == 0) - [self setNetworkActivityIndicatorVisible:YES]; - -#if TraceLogging - NSLog(@"retainNetworkActivityIndicator->%d", activity_); -#endif -} - -- (void) releaseNetworkActivityIndicator { - if (--activity_ == 0) - [self setNetworkActivityIndicatorVisible:NO]; - -#if TraceLogging - NSLog(@"releaseNetworkActivityIndicator->%d", activity_); -#endif - -} - - (void) cancelAndClear:(bool)clear { @synchronized (self) { if (clear) { @@ -9701,10 +8814,7 @@ _end if ([arg2 isEqualToString:@"settings"]) { controller = [[[PackageSettingsController alloc] initWithDatabase:database_ package:arg1] autorelease]; } else if ([arg2 isEqualToString:@"files"]) { - if (Package *package = [database_ packageWithName:arg1]) { - controller = [[[FileTable alloc] initWithDatabase:database_] autorelease]; - [(FileTable *)controller setPackage:package]; - } + controller = [[[FileTable alloc] initWithDatabase:database_ forPackage:arg1] autorelease]; } } @@ -9779,7 +8889,7 @@ _end } if (interval <= -(15*60)) { - if (IsReachable("cydia.saurik.com")) { + if (CyteIsReachable("cydia.saurik.com")) { [tabbar_ beginUpdate]; [appcache_ reloadURLWithCache:YES]; } @@ -9838,54 +8948,11 @@ _end [self reloadSpringBoard]; } -- (void) setupViewControllers { - tabbar_ = [[[CydiaTabBarController alloc] initWithDatabase:database_] autorelease]; - - NSMutableArray *items; - if (kCFCoreFoundationVersionNumber < 800) { - items = [NSMutableArray arrayWithObjects: - [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage imageNamed:@"home.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage imageNamed:@"install.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage imageNamed:@"changes.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage imageNamed:@"manage.png"] tag:0] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage imageNamed:@"search.png"] tag:0] autorelease], - nil]; - } else { - items = [NSMutableArray arrayWithObjects: - [[[UITabBarItem alloc] initWithTitle:@"Cydia" image:[UIImage imageNamed:@"home7.png"] selectedImage:[UIImage imageNamed:@"home7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SOURCES") image:[UIImage imageNamed:@"install7.png"] selectedImage:[UIImage imageNamed:@"install7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("CHANGES") image:[UIImage imageNamed:@"changes7.png"] selectedImage:[UIImage imageNamed:@"changes7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("INSTALLED") image:[UIImage imageNamed:@"manage7.png"] selectedImage:[UIImage imageNamed:@"manage7s.png"]] autorelease], - [[[UITabBarItem alloc] initWithTitle:UCLocalize("SEARCH") image:[UIImage imageNamed:@"search7.png"] selectedImage:[UIImage imageNamed:@"search7s.png"]] autorelease], - nil]; - } - - NSMutableArray *controllers([NSMutableArray array]); - for (UITabBarItem *item in items) { - UINavigationController *controller([[[UINavigationController alloc] init] autorelease]); - [controller setTabBarItem:item]; - [controllers addObject:controller]; - } - [tabbar_ setViewControllers:controllers]; - - [tabbar_ setUpdateDelegate:self]; -} - - (void) applicationDidFinishLaunching:(id)unused { [super applicationDidFinishLaunching:unused]; -_trace(); + [CyteWebViewController _initialize]; - @synchronized (HostConfig_) { - [BridgedHosts_ addObject:[[NSURL URLWithString:CydiaURL(@"")] host]]; - } - - [NSURLCache setSharedURLCache:[[[CYURLCache alloc] - initWithMemoryCapacity:524288 - diskCapacity:10485760 - diskPath:Cache("SDURLCache") - ] autorelease]]; - - [CydiaWebViewController _initialize]; + [BridgedHosts_ addObject:[[NSURL URLWithString:CydiaURL(@"")] host]]; [NSURLProtocol registerClass:[CydiaURLProtocol class]]; @@ -9906,7 +8973,7 @@ _trace(); appcache_ = [[[AppCacheController alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/appcache/", UI_]]] autorelease]; [appcache_ reloadData]; - window_ = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; + window_ = [[[CyteWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; [window_ orderFront:self]; [window_ makeKey:self]; [window_ setHidden:NO]; @@ -9953,7 +9020,18 @@ _trace(); [database_ setDelegate:self]; [window_ setUserInteractionEnabled:NO]; - [self setupViewControllers]; + + tabbar_ = [[[CydiaTabBarController alloc] initWithDatabase:database_] autorelease]; + + [tabbar_ addViewControllers:nil, + @"Cydia", @"home.png", @"home7.png", @"home7s.png", + UCLocalize("SOURCES"), @"install.png", @"install7.png", @"install7s.png", + UCLocalize("CHANGES"), @"changes.png", @"changes7.png", @"changes7s.png", + UCLocalize("INSTALLED"), @"manage.png", @"manage7.png", @"manage7s.png", + UCLocalize("SEARCH"), @"search.png", @"search7.png", @"search7s.png", + nil]; + + [tabbar_ setUpdateDelegate:self]; CydiaLoadingViewController *loading([[[CydiaLoadingViewController alloc] init] autorelease]); UINavigationController *navigation([[[UINavigationController alloc] init] autorelease]); @@ -9966,10 +9044,7 @@ _trace(); if ([emulated_ respondsToSelector:@selector(concealTabBarSelection)]) [emulated_ concealTabBarSelection]; - if ([window_ respondsToSelector:@selector(setRootViewController:)]) - [window_ setRootViewController:emulated_]; - else - [window_ addSubview:[emulated_ view]]; + [window_ setRootViewController:emulated_]; [self performSelector:@selector(loadData) withObject:nil afterDelay:0]; _trace(); @@ -10106,60 +9181,6 @@ id Dealloc_(id self, SEL selector) { return object; }*/ -Class $NSURLConnection; - -MSHook(id, NSURLConnection$init$, NSURLConnection *self, SEL _cmd, NSURLRequest *request, id delegate, BOOL usesCache, int64_t maxContentLength, BOOL startImmediately, NSDictionary *connectionProperties) { - NSMutableURLRequest *copy([[request mutableCopy] autorelease]); - - NSURL *url([copy URL]); - - NSString *host([url host]); - NSString *scheme([[url scheme] lowercaseString]); - - NSString *compound([NSString stringWithFormat:@"%@:%@", scheme, host]); - - @synchronized (HostConfig_) { - if ([copy respondsToSelector:@selector(setHTTPShouldUsePipelining:)]) - if ([PipelinedHosts_ containsObject:host] || [PipelinedHosts_ containsObject:compound]) - [copy setHTTPShouldUsePipelining:YES]; - - if (NSString *control = [copy valueForHTTPHeaderField:@"Cache-Control"]) - if ([control isEqualToString:@"max-age=0"]) - if ([CachedURLs_ containsObject:url]) { -#if !ForRelease - NSLog(@"~~~: %@", url); -#endif - - [copy setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; - - [copy setValue:nil forHTTPHeaderField:@"Cache-Control"]; - [copy setValue:nil forHTTPHeaderField:@"If-Modified-Since"]; - [copy setValue:nil forHTTPHeaderField:@"If-None-Match"]; - } - } - - if ((self = _NSURLConnection$init$(self, _cmd, copy, delegate, usesCache, maxContentLength, startImmediately, connectionProperties)) != nil) { - } return self; -} - -Class $WAKWindow; - -static CGSize $WAKWindow$screenSize(WAKWindow *self, SEL _cmd) { - CGSize size([[UIScreen mainScreen] bounds].size); - /*if ([$WAKWindow respondsToSelector:@selector(hasLandscapeOrientation)]) - if ([$WAKWindow hasLandscapeOrientation]) - std::swap(size.width, size.height);*/ - return size; -} - -Class $NSUserDefaults; - -MSHook(id, NSUserDefaults$objectForKey$, NSUserDefaults *self, SEL _cmd, NSString *key) { - if ([key respondsToSelector:@selector(isEqualToString:)] && [key isEqualToString:@"WebKitLocalStorageDatabasePathPreferenceKey"]) - return Cache("LocalStorage"); - return _NSUserDefaults$objectForKey$(self, _cmd, key); -} - static NSMutableDictionary *AutoreleaseDeepMutableCopyOfDictionary(CFTypeRef type) { if (type == NULL) return nil; @@ -10190,70 +9211,16 @@ int main(int argc, char *argv[]) { _trace(); + CyteInitialize([NSString stringWithFormat:@"Cydia/%@", Cydia_]); UpdateExternalStatus(0); - UIScreen *screen([UIScreen mainScreen]); - if ([screen respondsToSelector:@selector(scale)]) - ScreenScale_ = [screen scale]; - else - ScreenScale_ = 1; - - UIDevice *device([UIDevice currentDevice]); - if ([device respondsToSelector:@selector(userInterfaceIdiom)]) { - UIUserInterfaceIdiom idiom([device userInterfaceIdiom]); - if (idiom == UIUserInterfaceIdiomPad) - IsWildcat_ = true; - } - - Idiom_ = IsWildcat_ ? @"ipad" : @"iphone"; - - RegEx pattern("([0-9]+\\.[0-9]+).*"); - - if (pattern([device systemVersion])) - Firmware_ = pattern[1]; - if (pattern(Cydia_)) - Major_ = pattern[1]; - SessionData_ = [NSMutableDictionary dictionaryWithCapacity:4]; + BridgedHosts_ = [NSMutableSet setWithCapacity:4]; + InsecureHosts_ = [NSMutableSet setWithCapacity:4]; - HostConfig_ = [[[NSObject alloc] init] autorelease]; - @synchronized (HostConfig_) { - BridgedHosts_ = [NSMutableSet setWithCapacity:4]; - InsecureHosts_ = [NSMutableSet setWithCapacity:4]; - PipelinedHosts_ = [NSMutableSet setWithCapacity:4]; - CachedURLs_ = [NSMutableSet setWithCapacity:32]; - } - - NSString *ui(@"ui/ios"); - if (Idiom_ != nil) - ui = [ui stringByAppendingString:[NSString stringWithFormat:@"~%@", Idiom_]]; - ui = [ui stringByAppendingString:[NSString stringWithFormat:@"/%@", Major_]]; - UI_ = CydiaURL(ui); - + UI_ = CydiaURL([NSString stringWithFormat:@"ui/ios~%@/1.1", IsWildcat_ ? @"ipad" : @"iphone"]); PackageName = reinterpret_cast(method_getImplementation(class_getInstanceMethod([Package class], @selector(cyname)))); - /* Library Hacks {{{ */ - class_addMethod(objc_getClass("DOMNodeList"), @selector(countByEnumeratingWithState:objects:count:), (IMP) &DOMNodeList$countByEnumeratingWithState$objects$count$, "I20@0:4^{NSFastEnumerationState}8^@12I16"); - - $WAKWindow = objc_getClass("WAKWindow"); - if ($WAKWindow != NULL) - if (Method method = class_getInstanceMethod($WAKWindow, @selector(screenSize))) - method_setImplementation(method, (IMP) &$WAKWindow$screenSize); - - $NSURLConnection = objc_getClass("NSURLConnection"); - Method NSURLConnection$init$(class_getInstanceMethod($NSURLConnection, @selector(_initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:))); - if (NSURLConnection$init$ != NULL) { - _NSURLConnection$init$ = reinterpret_cast(method_getImplementation(NSURLConnection$init$)); - method_setImplementation(NSURLConnection$init$, reinterpret_cast(&$NSURLConnection$init$)); - } - - $NSUserDefaults = objc_getClass("NSUserDefaults"); - Method NSUserDefaults$objectForKey$(class_getInstanceMethod($NSUserDefaults, @selector(objectForKey:))); - if (NSUserDefaults$objectForKey$ != NULL) { - _NSUserDefaults$objectForKey$ = reinterpret_cast(method_getImplementation(NSUserDefaults$objectForKey$)); - method_setImplementation(NSUserDefaults$objectForKey$, reinterpret_cast(&$NSUserDefaults$objectForKey$)); - } - /* }}} */ /* Set Locale {{{ */ Locale_ = CFLocaleCopyCurrent(); Languages_ = [NSLocale preferredLanguages]; @@ -10273,7 +9240,11 @@ int main(int argc, char *argv[]) { } if (Languages_ != nil) - for (NSString *language : Languages_) { + for (NSString *locale : Languages_) { + auto components([NSLocale componentsFromLocaleIdentifier:locale]); + NSString *language([components objectForKey:(id)kCFLocaleLanguageCode]); + if (NSString *script = [components objectForKey:(id)kCFLocaleScriptCode]) + language = [NSString stringWithFormat:@"%@-%@", language, script]; languages += [language UTF8String]; languages += ","; } @@ -10332,29 +9303,6 @@ int main(int argc, char *argv[]) { CollationStarts_ = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m",@"n",@"o",@"p",@"q",@"r",@"s",@"t",@"u",@"v",@"w",@"x",@"y",@"z",@"ʒ",nil]; } /* }}} */ - /* Parse Arguments {{{ */ - bool substrate(false); - - if (argc != 0) { - char **args(argv); - int arge(1); - - for (int argi(1); argi != argc; ++argi) - if (strcmp(argv[argi], "--") == 0) { - arge = argi; - argv[argi] = argv[0]; - argv += argi; - argc -= argi; - break; - } - - for (int argi(1); argi != arge; ++argi) - if (strcmp(args[argi], "--substrate") == 0) - substrate = true; - else - fprintf(stderr, "unknown argument: %s\n", args[argi]); - } - /* }}} */ App_ = [[NSBundle mainBundle] bundlePath]; Advanced_ = YES; @@ -10372,6 +9320,7 @@ int main(int argc, char *argv[]) { void *gestalt(dlopen("/usr/lib/libMobileGestalt.dylib", RTLD_GLOBAL | RTLD_LAZY)); $MGCopyAnswer = reinterpret_cast(dlsym(gestalt, "MGCopyAnswer")); + UniqueID_ = UniqueIdentifier([UIDevice currentDevice]); /* System Information {{{ */ size_t size; @@ -10385,47 +9334,6 @@ int main(int argc, char *argv[]) { if (sysctlbyname("kern.maxproc", NULL, NULL, &maxproc, sizeof(maxproc)) == -1) perror("sysctlbyname(\"kern.maxproc\", #)"); } - - sysctlbyname("kern.osversion", NULL, &size, NULL, 0); - char *osversion = new char[size]; - if (sysctlbyname("kern.osversion", osversion, &size, NULL, 0) == -1) - perror("sysctlbyname(\"kern.osversion\", ?)"); - else - System_ = [NSString stringWithUTF8String:osversion]; - - sysctlbyname("hw.machine", NULL, &size, NULL, 0); - char *machine = new char[size]; - if (sysctlbyname("hw.machine", machine, &size, NULL, 0) == -1) - perror("sysctlbyname(\"hw.machine\", ?)"); - else - Machine_ = machine; - - int64_t usermem(0); - size = sizeof(usermem); - if (sysctlbyname("hw.usermem", &usermem, &size, NULL, 0) == -1) - usermem = 0; - - SerialNumber_ = (NSString *) CYIOGetValue("IOService:/", @"IOPlatformSerialNumber"); - ChipID_ = [CYHex((NSData *) CYIOGetValue("IODeviceTree:/chosen", @"unique-chip-id"), true) uppercaseString]; - BBSNum_ = CYHex((NSData *) CYIOGetValue("IOService:/AppleARMPE/baseband", @"snum"), false); - - UniqueID_ = UniqueIdentifier(device); - - if (NSDictionary *info = [NSDictionary dictionaryWithContentsOfFile:@"/Applications/MobileSafari.app/Info.plist"]) { - Product_ = [info objectForKey:@"SafariProductVersion"]; - Safari_ = [info objectForKey:@"CFBundleVersion"]; - } - - NSString *agent([NSString stringWithFormat:@"Cydia/%@ CyF/%.2f", Cydia_, kCFCoreFoundationVersionNumber]); - - if (RegEx match = RegEx("([0-9]+(\\.[0-9]+)+).*", Safari_)) - agent = [NSString stringWithFormat:@"Safari/%@ %@", match[1], agent]; - if (RegEx match = RegEx("([0-9]+[A-Z][0-9]+[a-z]?).*", System_)) - agent = [NSString stringWithFormat:@"Mobile/%@ %@", match[1], agent]; - if (RegEx match = RegEx("([0-9]+(\\.[0-9]+)+).*", Product_)) - agent = [NSString stringWithFormat:@"Version/%@ %@", match[1], agent]; - - UserAgent_ = agent; /* }}} */ /* Load Database {{{ */ SectionMap_ = [[[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Sections" ofType:@"plist"]] autorelease]; @@ -10538,6 +9446,10 @@ int main(int argc, char *argv[]) { // XXX: this timeout might be important :( //_config->Set("Acquire::http::Timeout", 15); + int64_t usermem(0); + size = sizeof(usermem); + if (sysctlbyname("hw.usermem", &usermem, &size, NULL, 0) == -1) + usermem = 0; _config->Set("Acquire::http::MaxParallel", usermem >= 384 * 1024 * 1024 ? 16 : 3); mkdir([Cache("archives") UTF8String], 0755);