#include <QuartzCore/CALayer.h>
#include <WebCore/WebCoreThread.h>
-#include <WebKit/DOMHTMLIFrameElement.h>
#include <algorithm>
#include <fstream>
#include "Substrate.hpp"
#include "Menes/Menes.h"
-#include "CyteKit/IndirectDelegate.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 {{{ */
#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<NSObject *>(lock))
-
extern NSString *Cydia_;
#define lprintf(args...) fprintf(stderr, args)
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) {
/* Insertion Sort {{{ */
-CFIndex SKBSearch_(const void *element, CFIndex elementSize, const void *list, CFIndex count, CFComparatorFunction comparator, void *context) {
+template <typename Type_>
+size_t CFBSearch_(const Type_ &element, const void *list, size_t count, CFComparisonResult (*comparator)(Type_, Type_, void *), void *context) {
const char *ptr = (const char *)list;
while (0 < count) {
- CFIndex half = count / 2;
- const char *probe = ptr + elementSize * half;
- CFComparisonResult cr = comparator(element, probe, context);
- if (0 == cr) return (probe - (const char *)list) / elementSize;
- ptr = (cr < 0) ? ptr : probe + elementSize;
+ size_t half = count / 2;
+ const char *probe = ptr + sizeof(Type_) * half;
+ CFComparisonResult cr = comparator(element, * (const Type_ *) probe, context);
+ if (0 == cr) return (probe - (const char *)list) / sizeof(Type_);
+ ptr = (cr < 0) ? ptr : probe + sizeof(Type_);
count = (cr < 0) ? half : (half + (count & 1) - 1);
}
- return (ptr - (const char *)list) / elementSize;
+ return (ptr - (const char *)list) / sizeof(Type_);
}
-CFIndex CFBSearch_(const void *element, CFIndex elementSize, const void *list, CFIndex count, CFComparatorFunction comparator, void *context) {
- const char *ptr = (const char *)list;
- while (0 < count) {
- CFIndex half = count / 2;
- const char *probe = ptr + elementSize * half;
- CFComparisonResult cr = comparator(element, probe, context);
- if (0 == cr) return (probe - (const char *)list) / elementSize;
- ptr = (cr < 0) ? ptr : probe + elementSize;
- count = (cr < 0) ? half : (half + (count & 1) - 1);
- }
- return (ptr - (const char *)list) / elementSize;
-}
-
-void CFArrayInsertionSortValues(CFMutableArrayRef array, CFRange range, CFComparatorFunction comparator, void *context) {
- if (range.length == 0)
+template <typename Type_>
+void CYArrayInsertionSortValues(Type_ *values, size_t length, CFComparisonResult (*comparator)(Type_, Type_, void *), void *context) {
+ if (length == 0)
return;
- const void **values(new const void *[range.length]);
- CFArrayGetValues(array, range, values);
#if HistogramInsertionSort > 0
- uint32_t total(0), *offsets(new uint32_t[range.length]);
+ uint32_t total(0), *offsets(new uint32_t[length]);
#endif
- for (CFIndex index(1); index != range.length; ++index) {
- const void *value(values[index]);
- //CFIndex correct(SKBSearch_(&value, sizeof(const void *), values, index, comparator, context));
- CFIndex correct(index);
+ for (size_t index(1); index != length; ++index) {
+ Type_ value(values[index]);
+#if 0
+ size_t correct(CFBSearch_(value, values, index, comparator, context));
+#else
+ size_t correct(index);
while (comparator(value, values[correct - 1], context) == kCFCompareLessThan) {
#if HistogramInsertionSort > 1
NSLog(@"%@ < %@", value, values[correct - 1]);
#endif
if (--correct == 0)
break;
+ if (index - correct >= 8) {
+ correct = CFBSearch_(value, values, correct, comparator, context);
+ break;
+ }
}
+#endif
if (correct != index) {
size_t offset(index - correct);
#if HistogramInsertionSort
}
}
- CFArrayReplaceValues(array, range, values, range.length);
- delete [] values;
-
#if HistogramInsertionSort > 0
- for (CFIndex index(0); index != range.length; ++index)
+ for (size_t index(0); index != range.length; ++index)
if (offsets[index] != 0)
NSLog(@"Insertion Displacement [%u]: %u", index, offsets[index]);
NSLog(@"Average Insertion Displacement: %f", double(total) / range.length);
/* }}} */
-/* 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;
static _H<UIFont> Font18Bold_;
static _H<UIFont> Font22Bold_;
-static const char *Machine_ = NULL;
-static _H<NSString> System_;
-static NSString *SerialNumber_ = nil;
-static NSString *ChipID_ = nil;
-static NSString *BBSNum_ = nil;
static _H<NSString> UniqueID_;
-static _H<NSString> UserAgent_;
-static _H<NSString> Product_;
-static _H<NSString> Safari_;
static _H<NSLocale> CollationLocale_;
static _H<NSArray> CollationThumbs_;
static _transient NSNumber *Version_;
static time_t now_;
-bool IsWildcat_;
-CGFloat ScreenScale_;
-static NSString *Idiom_;
static _H<NSString> Firmware_;
static NSString *Major_;
static _H<NSMutableDictionary> SessionData_;
-static _H<NSObject> HostConfig_;
static _H<NSMutableSet> BridgedHosts_;
static _H<NSMutableSet> InsecureHosts_;
-static _H<NSMutableSet> PipelinedHosts_;
-static _H<NSMutableSet> CachedURLs_;
static NSString *kCydiaProgressEventTypeError = @"Error";
static NSString *kCydiaProgressEventTypeInformation = @"Information";
SourceMap sourceMap_;
_H<NSMutableArray> sourceList_;
- CFMutableArrayRef packages_;
+ _H<NSArray> packages_;
_transient NSObject<DatabaseDelegate> *delegate_;
_transient NSObject<ProgressDelegate> *progress_;
+ (Database *) sharedInstance;
- (unsigned) era;
+- (bool) hasPackages;
- (void) _readCydia:(NSNumber *)fd;
- (void) _readStatus:(NSNumber *)fd;
}
//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) {
char version_[8];
char name_[];
-};
+} _packed;
struct MetaValue :
Cytore::Block
{
uint32_t active_;
Cytore::Offset<PackageValue> packages_[1 << 16];
-};
+} _packed;
static Cytore::File<MetaValue> MetaFile_;
// }}}
_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
}
- (Package *) initWithVersion:(pkgCache::VerIterator)version withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database;
++ (Package *) newPackageWithIterator:(pkgCache::PkgIterator)iterator withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database;
+
+ (Package *) packageWithIterator:(pkgCache::PkgIterator)iterator withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database;
- (pkgCache::PkgIterator) iterator;
_end } return self;
}
-+ (Package *) packageWithIterator:(pkgCache::PkgIterator)iterator withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database {
++ (Package *) newPackageWithIterator:(pkgCache::PkgIterator)iterator withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database {
pkgCache::VerIterator version;
_profile(Package$packageWithIterator$GetCandidateVer)
];
_end
- _profile(Package$packageWithIterator$Autorelease)
- package = [package autorelease];
- _end
-
return package;
}
+// XXX: just in case a Cydia extension is using this (I bet this is unlikely, though, due to CYPool?)
++ (Package *) packageWithIterator:(pkgCache::PkgIterator)iterator withZone:(NSZone *)zone inPool:(CYPool *)pool database:(Database *)database {
+ return [[self newPackageWithIterator:iterator withZone:zone inPool:pool database:database] autorelease];
+}
+
- (pkgCache::PkgIterator) iterator {
return iterator_;
}
}
- (void) setIndex:(size_t)index {
- if (metadata_->index_ != index)
- metadata_->index_ = index;
+ if (metadata_->index_ != index + 1)
+ metadata_->index_ = index + 1;
}
- (CYString &) cyname {
}
- (void) releasePackages {
- CFArrayApplyFunction(packages_, CFRangeMake(0, CFArrayGetCount(packages_)), reinterpret_cast<CFArrayApplierFunction>(&CFRelease), NULL);
- CFArrayRemoveAllValues(packages_);
+ packages_ = nil;
+}
+
+- (bool) hasPackages {
+ return [packages_ count] != 0;
}
- (void) dealloc {
, "any"
#endif
));
- return iterator.end() ? nil : [Package packageWithIterator:iterator withZone:NULL inPool:NULL database:self];
+ return iterator.end() ? nil : [[Package newPackageWithIterator:iterator withZone:NULL inPool:NULL database:self] autorelease];
} }
- (id) init {
zone_ = NSCreateZone(1024 * 1024, 256 * 1024, NO);
- size_t capacity(MetaFile_->active_);
- if (capacity == 0)
- capacity = 16384;
- else
- capacity += 1024;
-
- packages_ = CFArrayCreateMutable(kCFAllocatorDefault, capacity, NULL);
sourceList_ = [NSMutableArray arrayWithCapacity:16];
int fds[2];
}
- (NSArray *) packages {
- return (NSArray *) packages_;
+ return packages_;
}
- (NSArray *) sources {
opened = cache_.Open(progress, false);
_end
if (!opened) {
- // XXX: what if there are errors, but Open() == true? this should be merged with popError:
+ // XXX: this block should probably be merged with popError: in some way
while (!_error->empty()) {
std::string error;
bool warning(!_error->PopMessage(error));
}
return;
- }
+ } else if ([self popErrorWithTitle:title forOperation:true])
+ return;
_trace();
unlink("/tmp/cydia.chk");
}
{
- /*std::vector<Package *> packages;
- packages.reserve(std::max(10000U, [packages_ count] + 1000));
- packages_ = nil;*/
+ size_t capacity(MetaFile_->active_);
+ if (capacity == 0)
+ capacity = 128*1024;
+ else
+ capacity += 1024;
+ std::vector<Package *> packages;
+ packages.reserve(capacity);
+ size_t lost(0);
+
+ size_t last(0);
_profile(reloadDataWithInvocation$packageWithIterator)
for (pkgCache::PkgIterator iterator = cache_->PkgBegin(); !iterator.end(); ++iterator)
- if (Package *package = [Package packageWithIterator:iterator withZone:zone_ inPool:&pool_ database:self])
- //packages.push_back(package);
- CFArrayAppendValue(packages_, CFRetain(package));
+ if (Package *package = [Package newPackageWithIterator:iterator withZone:zone_ inPool:&pool_ database:self]) {
+ if (unsigned index = package.metadata->index_) {
+ --index;
+ if (packages.size() == index) {
+ packages.push_back(package);
+ } else if (packages.size() <= index) {
+ packages.resize(index + 1, nil);
+ packages[index] = package;
+ continue;
+ } else {
+ std::swap(package, packages[index]);
+ if (package != nil) {
+ if (package.metadata->index_ == index + 1)
+ ++lost;
+ goto lost;
+ }
+ if (last != index)
+ continue;
+ }
+ } else {
+ ++lost;
+ lost: if (last == packages.size())
+ packages.push_back(package);
+ else
+ packages[last] = package;
+ ++last;
+ }
+
+ for (; last != packages.size(); ++last)
+ if (packages[last] == nil)
+ break;
+ }
_end
+ for (size_t next(last + 1); last != packages.size(); ++last, ++next) {
+ while (true) {
+ if (next == packages.size())
+ goto done;
+ if (packages[next] != nil)
+ break;
+ ++next;
+ }
- /*if (packages.empty())
- packages_ = [[NSArray alloc] init];
- else
- packages_ = [[NSArray alloc] initWithObjects:&packages.front() count:packages.size()];
- _trace();*/
+ std::swap(packages[last], packages[next]);
+ } done:;
- _profile(reloadDataWithInvocation$radix$8)
- [(NSMutableArray *) packages_ radixSortUsingFunction:reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix) withContext:reinterpret_cast<void *>(8)];
- _end
+ packages.resize(last);
- _profile(reloadDataWithInvocation$radix$4)
- [(NSMutableArray *) packages_ radixSortUsingFunction:reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix) withContext:reinterpret_cast<void *>(4)];
- _end
+ if (lost > 128) {
+ NSLog(@"lost = %zu", lost);
- _profile(reloadDataWithInvocation$radix$0)
- [(NSMutableArray *) packages_ radixSortUsingFunction:reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix) withContext:reinterpret_cast<void *>(0)];
- _end
+ _profile(reloadDataWithInvocation$radix$8)
+ CYRadixSortUsingFunction(packages.data(), packages.size(), reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix), reinterpret_cast<void *>(8));
+ _end
+
+ _profile(reloadDataWithInvocation$radix$4)
+ CYRadixSortUsingFunction(packages.data(), packages.size(), reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix), reinterpret_cast<void *>(4));
+ _end
+
+ _profile(reloadDataWithInvocation$radix$0)
+ CYRadixSortUsingFunction(packages.data(), packages.size(), reinterpret_cast<MenesRadixSortFunction>(&PackagePrefixRadix), reinterpret_cast<void *>(0));
+ _end
+ }
_profile(reloadDataWithInvocation$insertion)
- CFArrayInsertionSortValues(packages_, CFRangeMake(0, CFArrayGetCount(packages_)), reinterpret_cast<CFComparatorFunction>(&PackageNameCompare), NULL);
+ CYArrayInsertionSortValues(packages.data(), packages.size(), &PackageNameCompare, NULL);
_end
+ packages_ = [[[NSArray alloc] initWithObjects:packages.data() count:packages.size()] autorelease];
+
/*_profile(reloadDataWithInvocation$CFQSortArray)
CFQSortArray(&packages.front(), packages.size(), sizeof(packages.front()), reinterpret_cast<CFComparatorFunction>(&PackageNameCompare_), NULL);
_end*/
[packages_ sortUsingFunction:reinterpret_cast<NSComparisonResult (*)(id, id, void *)>(&PackageNameCompare) context:NULL];
_end*/
-
- size_t count(CFArrayGetCount(packages_));
- MetaFile_->active_ = count;
- for (size_t index(0); index != count; ++index)
- [(Package *) CFArrayGetValueAtIndex(packages_, index) setIndex:index];
+ MetaFile_->active_ = packages.size();
+ for (size_t index(0), count(packages.size()); index != count; ++index) {
+ auto package(packages[index]);
+ [package setIndex:index];
+ [package release];
+ }
}
} }
@end
/* }}} */
-static _H<NSMutableSet> Diversions_;
-
-@interface Diversion : NSObject {
- RegEx pattern_;
- _H<NSString> key_;
- _H<NSString> 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<CyteWebViewController> indirect_;
_transient id delegate_;
}
-- (id) initWithDelegate:(IndirectDelegate *)indirect;
+- (id) initWithDelegate:(CyteWebViewController *)indirect;
@end
_H<CydiaObject> cydia_;
}
-+ (void) addDiversion:(Diversion *)diversion;
+ (NSURLRequest *) requestWithHeaders:(NSURLRequest *)request;
+ (void) didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame withCydia:(CydiaObject *)cydia;
- (void) setDelegate:(id)delegate;
/* Web Scripting {{{ */
@implementation CydiaObject
-- (id) initWithDelegate:(IndirectDelegate *)indirect {
+- (id) initWithDelegate:(CyteWebViewController *)indirect {
if ((self = [super init]) != nil) {
- indirect_ = (CyteWebViewController *) indirect;
+ indirect_ = indirect;
} return self;
}
}
- (NSString *) build {
- return System_;
+ return [NSString stringWithUTF8String:System_];
}
- (NSString *) coreFoundationVersionNumber {
}
- (NSString *) idiom {
- return (id) Idiom_ ?: [NSNull null];
+ return IsWildcat_ ? @"ipad" : @"iphone";
}
- (NSArray *) cells {
}
- (NSString *) bbsnum {
- return (id) BBSNum_ ?: [NSNull null];
+ return (id) CYHex((NSData *) CYIOGetValue("IOService:/AppleARMPE/baseband", @"snum"), false) ?: [NSNull null];
}
- (NSString *) ecid {
- return (id) ChipID_ ?: [NSNull null];
+ return (id) [CYHex((NSData *) CYIOGetValue("IODeviceTree:/chosen", @"unique-chip-id"), true) uppercaseString] ?: [NSNull null];
}
- (NSString *) serial {
- return SerialNumber_;
+ return (NSString *) CYIOGetValue("IOService:/", @"IOPlatformSerialNumber");
}
- (NSString *) role {
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:))
}
- (void) unload {
- [delegate_ performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO];
+ [[indirect_ rootViewController] performSelectorOnMainThread:@selector(unloadData) withObject:nil waitUntilDone:NO];
}
- (void) setScrollAlwaysBounceVertical:(NSNumber *)value {
}
- (void) addInternalRedirect:(NSString *)from :(NSString *)to {
- [CydiaWebViewController performSelectorOnMainThread:@selector(addDiversion:) withObject:[[[Diversion alloc] initWithFrom:from to:to] autorelease] waitUntilDone:NO];
+ [CyteWebViewController performSelectorOnMainThread:@selector(addDiversion:) withObject:[[[Diversion alloc] initWithFrom:from to:to] autorelease] waitUntilDone:NO];
}
- (NSDictionary *) getApplicationInfo:(NSString *)display value:(NSString *)key {
}
- (NSArray *) getDisplayIdentifiers {
- NSSet *set([SBSCopyApplicationDisplayIdentifiers() autorelease]);
- if (set == nil || ![set isKindOfClass:[NSSet class]])
- return [NSArray array];
- return [set allObjects];
+ return SBSCopyApplicationDisplayIdentifiers(false, false);
}
- (NSString *) getLocalizedNameForDisplayIdentifier:(NSString *)identifier {
} }
- (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];
}
- (NSNumber *) isReachable:(NSString *)name {
- return [NSNumber numberWithBool:IsReachable([name UTF8String])];
+ return [NSNumber numberWithBool:CyteIsReachable([name UTF8String])];
}
- (void) installPackages:(NSArray *)packages {
}
- (NSString *) substitutePackageNames:(NSString *)message {
+ auto database([Database sharedInstance]);
+
+ // XXX: this check is less racy than you'd expect, but this entire concept is a little awkward
+ if (![database hasPackages])
+ return message;
+
NSMutableArray *words([[[message componentsSeparatedByString:@" "] mutableCopy] autorelease]);
for (size_t i(0), e([words count]); i != e; ++i) {
NSString *word([words objectAtIndex:i]);
- if (Package *package = [[Database sharedInstance] packageWithName:word])
+ if (Package *package = [database packageWithName:word])
[words replaceObjectAtIndex:i withObject:[package name]];
}
if ([[[self scheme] lowercaseString] isEqualToString:@"https"])
return true;
- @synchronized (HostConfig_) {
+ @synchronized (InsecureHosts_) {
if ([InsecureHosts_ containsObject:[self host]])
return true;
}
@implementation CydiaWebViewController
- (NSURL *) navigationURL {
- return request_ == nil ? nil : [NSURL URLWithString:[NSString stringWithFormat:@"cydia://url/%@", [[request_ URL] absoluteString]]];
-}
-
-+ (void) _initialize {
- [super _initialize];
-
- Diversions_ = [NSMutableSet setWithCapacity:0];
-}
-
-+ (void) addDiversion:(Diversion *)diversion {
- [Diversions_ addObject:diversion];
+ if (NSURLRequest *request = self.request)
+ return [NSURL URLWithString:[NSString stringWithFormat:@"cydia://url/%@", [[request URL] absoluteString]]];
+ else
+ return nil;
}
- (void) webView:(WebView *)view didClearWindowObject:(WebScriptObject *)window forFrame:(WebFrame *)frame {
bool bridged(false);
- @synchronized (HostConfig_) {
+ @synchronized (BridgedHosts_) {
if ([scheme isEqualToString:@"file"])
bridged = true;
else if ([scheme isEqualToString:@"https"])
[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]];
}
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];
}
[cydia_ setDelegate:delegate];
}
-- (NSString *) applicationNameForUserAgent {
- return UserAgent_;
-}
-
- (id) init {
if ((self = [super initWithWidth:0 ofClass:[CydiaWebViewController class]]) != nil) {
- cydia_ = [[[CydiaObject alloc] initWithDelegate:indirect_] autorelease];
+ cydia_ = [[[CydiaObject alloc] initWithDelegate:self.indirect] autorelease];
} return self;
}
@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())
- (void) complete {
if (substrate_)
RestartSubstrate_ = true;
- [delegate_ confirmWithNavigationController:[self navigationController]];
+ [self.delegate confirmWithNavigationController:[self navigationController]];
}
- (void) alertView:(UIAlertView *)alert clickedButtonAtIndex:(NSInteger)button {
}
- (void) _doContinue {
- [delegate_ cancelAndClear:NO];
+ [self.delegate cancelAndClear:NO];
[self dismissModalViewControllerAnimated:YES];
}
#endif
- (void) cancelButtonClicked {
- [delegate_ cancelAndClear:YES];
+ [self.delegate cancelAndClear:YES];
[self dismissModalViewControllerAnimated:YES];
}
- (id) initWithDatabase:(Database *)database delegate:(id)delegate {
if ((self = [super init]) != nil) {
database_ = database;
- delegate_ = delegate;
+ self.delegate = delegate;
[database_ setProgressDelegate:self];
[self setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/#!/progress/", UI_]]];
- [scroller_ setBackgroundColor:[UIColor blackColor]];
+ [self setPageColor:[UIColor blackColor]];
[[self navigationItem] setHidesBackButton:YES];
UpdateExternalStatus(0);
if (Finish_ > 1)
- [delegate_ saveState];
+ [self.delegate saveState];
switch (Finish_) {
case 0:
- [delegate_ returnToCydia];
+ [self.delegate returnToCydia];
break;
case 1:
- [delegate_ terminateWithSuccess];
- /*if ([delegate_ respondsToSelector:@selector(suspendWithAnimation:)])
- [delegate_ suspendWithAnimation:YES];
+ [self.delegate terminateWithSuccess];
+ /*if ([self.delegate respondsToSelector:@selector(suspendWithAnimation:)])
+ [self.delegate suspendWithAnimation:YES];
else
- [delegate_ suspend];*/
+ [self.delegate suspend];*/
break;
case 2:
goto reload;
reload: {
- UIProgressHUD *hud([delegate_ addProgressHUD]);
+ UIProgressHUD *hud([self.delegate addProgressHUD]);
[hud setText:UCLocalize("LOADING")];
- [delegate_ performSelector:@selector(reloadSpringBoard) withObject:nil afterDelay:0.5];
+ [self.delegate performSelector:@selector(reloadSpringBoard) withObject:nil afterDelay:0.5];
return;
}
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content addSubview:content_];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:self.content];
- [content_ setDelegate:self];
- [content_ setOpaque:YES];
+ [self.content setDelegate:self];
+ [self.content setOpaque:YES];
} return self;
}
placard_ = nil;
if (package == nil)
- [content_ setBackgroundColor:[UIColor whiteColor]];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
else {
[package parse];
placard = nil;
}
- [content_ setBackgroundColor:color];
+ [self.content setBackgroundColor:color];
if (placard != nil)
placard_ = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/%@.png", App_, placard]];
}
[self setNeedsDisplay];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (void) drawSummaryContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width([self bounds].size.width);
if (icon_ != nil) {
}
- (void) drawNormalContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width([self bounds].size.width);
if (icon_ != nil) {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content addSubview:content_];
- [content_ setBackgroundColor:[UIColor whiteColor]];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [content addSubview:self.content];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
- [content_ setDelegate:self];
+ [self.content setDelegate:self];
} return self;
}
[self setAccessoryType:editing ? UITableViewCellAccessoryNone : UITableViewCellAccessoryDisclosureIndicator];
[self setSelectionStyle:editing ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (void) setFrame:(CGRect)frame {
}
- (void) drawContentRect:(CGRect)rect {
- bool highlighted(highlighted_ && !editing_);
+ bool highlighted(self.highlighted && !editing_);
[icon_ drawInRect:CGRectMake(7, 7, 32, 32)];
}
- (void) _clickButtonWithPackage:(Package *)package {
- [delegate_ installPackage:package];
+ [self.delegate installPackage:package];
}
- (void) _clickButtonWithName:(NSString *)name {
if ([name isEqualToString:@"CLEAR"])
- return [delegate_ clearPackage:package_];
+ return [self.delegate clearPackage:package_];
else if ([name isEqualToString:@"REMOVE"])
- return [delegate_ removePackage:package_];
+ return [self.delegate removePackage:package_];
else if ([name isEqualToString:@"DOWNGRADE"]) {
sheet_ = [[[UIActionSheet alloc]
initWithTitle:nil
[sheet_ addButtonWithTitle:[version latest]];
[sheet_ setContext:@"version"];
- [delegate_ showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
+ [self.delegate showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
return;
}
else if ([name isEqualToString:@"UPGRADE"]);
else _assert(false);
- [delegate_ installPackage:package_];
+ [self.delegate installPackage:package_];
}
- (void) actionSheet:(UIActionSheet *)sheet clickedButtonAtIndex:(NSInteger)button {
#if !AlwaysReload
- (void) _customButtonClicked {
+ if (commercial_ && self.isLoading && [package_ uninstalled])
+ return [self reloadURLWithCache:NO];
+
size_t count(buttons_.size());
if (count == 0)
return;
[sheet_ addButtonWithTitle:button];
[sheet_ setContext:@"modify"];
- [delegate_ showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
+ [self.delegate showActionSheet:sheet_ fromItem:[[self navigationItem] rightBarButtonItem]];
}
}
-- (void) reloadButtonClicked {
- if (commercial_ && function_ == nil && [package_ uninstalled])
- return;
- [self customButtonClicked];
-}
-
- (void) applyLoadingTitle {
// Don't show "Loading" as the title. Ever.
}
}
- (id) initWithDatabase:(Database *)database title:(NSString *)title;
-- (void) setDelegate:(id)delegate;
- (void) resetCursor;
- (void) clearData;
[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];
+ UIViewController *base([self rootViewController]);
CGRect viewframe = [[base view] convertRect:[list_ frame] fromView:[list_ superview]];
CGRect intersection = CGRectIntersection(viewframe, kbframe);
- (void) didSelectPackage:(Package *)package {
CYPackageController *view([[[CYPackageController alloc] initWithDatabase:database_ forPackage:[package id] withReferrer:[[self referrerURL] absoluteString]] autorelease]);
- [view setDelegate:delegate_];
+ [view setDelegate:self.delegate];
[[self navigationController] pushViewController:view animated:YES];
}
[super releaseSubviews];
}
-- (void) setDelegate:(id)delegate {
- delegate_ = delegate;
-}
-
- (bool) shouldYield {
return false;
}
if (![self shouldBlock])
hud = nil;
else {
- hud = [delegate_ addProgressHUD];
+ hud = [self.delegate addProgressHUD];
[hud setText:UCLocalize("LOADING")];
}
packages = [self yieldToSelector:@selector(_reloadPackages)];
if (hud != nil)
- [delegate_ removeProgressHUD:hud];
+ [self.delegate removeProgressHUD:hud];
} while (reloading_ == 2);
} else {
packages = [self _reloadPackages];
@end
/* }}} */
-/* Cydia Navigation Controller Interface {{{ */
-@interface UINavigationController (Cydia)
-
-- (NSArray *) navigationURLCollection;
-- (void) unloadData;
-
-@end
-/* }}} */
-
/* Cydia Tab Bar Controller {{{ */
@interface CydiaTabBarController : CyteTabBarController <
UITabBarControllerDelegate,
_transient NSObject<CydiaDelegate> *updatedelegate_;
}
-- (NSArray *) navigationURLCollection;
- (void) beginUpdate;
- (BOOL) updating;
@implementation CydiaTabBarController
-- (NSArray *) navigationURLCollection {
- NSMutableArray *items([NSMutableArray array]);
-
- // XXX: Should this deal with transient view controllers?
- for (id navigation in [self viewControllers]) {
- NSArray *stack = [navigation performSelector:@selector(navigationURLCollection)];
- if (stack != nil)
- [items addObject:stack];
- }
-
- return items;
-}
-
- (id) initWithDatabase:(Database *)database {
if ((self = [super init]) != nil) {
database_ = database;
@end
/* }}} */
-/* Cydia Navigation Controller Implementation {{{ */
-@implementation UINavigationController (Cydia)
-
-- (NSArray *) navigationURLCollection {
- NSMutableArray *stack([NSMutableArray array]);
-
- for (CyteViewController *controller in [self viewControllers]) {
- NSString *url = [[controller navigationURL] absoluteString];
- if (url != nil)
- [stack addObject:url];
- }
-
- return stack;
-}
-
-- (void) reloadData {
- [super reloadData];
-
- UIViewController *visible([self visibleViewController]);
- if (visible != nil)
- [visible reloadData];
-
- // on the iPad, this view controller is ALSO visible. :(
- if (IsWildcat_)
- if (UIViewController *modal = [self modalViewController])
- if ([modal modalPresentationStyle] == UIModalPresentationFormSheet)
- if (UIViewController *top = [self topViewController])
- if (top != visible)
- [top reloadData];
-}
-
-- (void) unloadData {
- for (CyteViewController *page in [self viewControllers])
- [page unloadData];
-
- [super unloadData];
-}
-
-@end
-/* }}} */
-
/* Cydia:// Protocol {{{ */
@interface CydiaURLProtocol : NSURLProtocol {
}
if (editing)
[list_ reloadData];
else
- [delegate_ updateData];
+ [self.delegate updateData];
[self updateNavigationItem];
}
source:[self source]
section:[section name]
] autorelease];
- [controller setDelegate:delegate_];
+ [controller setDelegate:self.delegate];
[[self navigationController] pushViewController:controller animated:YES];
}
}
- (void) setLeftBarButtonItem {
- if ([delegate_ updating])
+ if ([self.delegate updating])
[[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc]
initWithTitle:UCLocalize("CANCEL")
style:UIBarButtonItemStyleDone
}
- (void) refreshButtonClicked {
- if ([delegate_ requestUpdate])
+ if ([self.delegate requestUpdate])
[self setLeftBarButtonItem];
}
- (void) cancelButtonClicked {
- [delegate_ cancelUpdate];
+ [self.delegate cancelUpdate];
}
- (void) upgradeButtonClicked {
- [delegate_ distUpgrade];
+ [self.delegate distUpgrade];
[[self navigationItem] setRightBarButtonItem:nil animated:YES];
}
if (package_ == nil)
return;
if ([package_ setSubscribed:value])
- [delegate_ updateData];
+ [self.delegate updateData];
}
- (void) _updateIgnored {
[invocation setTarget:self];
[invocation setSelector:@selector(_updateIgnored)];
- [delegate_ reloadDataWithInvocation:invocation];
+ [self.delegate reloadDataWithInvocation:invocation];
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
#if !AlwaysReload
- (void) queueButtonClicked {
- [delegate_ queue];
+ [self.delegate queue];
}
#endif
- (void) _setImage:(NSArray *)data {
if ([url_ isEqual:[data objectAtIndex:0]]) {
icon_ = [data objectAtIndex:1];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
}
origin_ = [source name];
label_ = [source rooturi];
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
url_ = [source iconURL];
[NSThread detachNewThreadSelector:@selector(_setSource:) toTarget:self withObject:url_];
icon_ = [UIImage imageNamed:@"folder.png"];
origin_ = UCLocalize("ALL_SOURCES");
label_ = UCLocalize("ALL_SOURCES_EX");
- [content_ setNeedsDisplay];
+ [self.content setNeedsDisplay];
}
- (SourceCell *) initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
UIView *content([self contentView]);
CGRect bounds([content bounds]);
- content_ = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
- [content_ setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
- [content_ setBackgroundColor:[UIColor whiteColor]];
- [content addSubview:content_];
+ self.content = [[[CyteTableViewCellContentView alloc] initWithFrame:bounds] autorelease];
+ [self.content setAutoresizingMask:UIViewAutoresizingFlexibleBoth];
+ [self.content setBackgroundColor:[UIColor whiteColor]];
+ [content addSubview:self.content];
- [content_ setDelegate:self];
- [content_ setOpaque:YES];
+ [self.content setDelegate:self];
+ [self.content setOpaque:YES];
indicator_ = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGraySmall] autorelease];
[indicator_ setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin];// | UIViewAutoresizingFlexibleBottomMargin];
[content addSubview:indicator_];
- [[content_ layer] setContentsGravity:kCAGravityTopLeft];
+ [[self.content layer] setContentsGravity:kCAGravityTopLeft];
} return self;
}
}
- (void) drawContentRect:(CGRect)rect {
- bool highlighted(highlighted_);
+ bool highlighted(self.highlighted);
float width(rect.size.width);
if (icon_ != nil) {
source:[self sourceAtIndexPath:indexPath]
] autorelease]);
- [controller setDelegate:delegate_];
+ [controller setDelegate:self.delegate];
[[self navigationController] pushViewController:controller animated:YES];
}
[Sources_ removeObjectForKey:[source key]];
- [delegate_ _saveConfig];
- [delegate_ reloadDataWithInvocation:nil];
+ [self.delegate syncData];
}
}
}
- (void) complete {
- [delegate_ addTrivialSource:href_];
+ [self.delegate addTrivialSource:href_];
href_ = nil;
- [delegate_ syncData];
+ [self.delegate syncData];
}
- (NSString *) getWarning {
) {
NSString *warning(cydia_ ? [self yieldToSelector:@selector(getWarning)] : nil);
- [delegate_ releaseNetworkActivityIndicator];
+ [self.delegate releaseNetworkActivityIndicator];
- [delegate_ removeProgressHUD:hud_];
+ [self.delegate removeProgressHUD:hud_];
hud_ = nil;
if (cydia_) {
cydia_ = false;
// XXX: this is stupid
- hud_ = [delegate_ addProgressHUD];
+ hud_ = [self.delegate addProgressHUD];
[hud_ setText:UCLocalize("VERIFYING_URL")];
- [delegate_ retainNetworkActivityIndicator];
+ [self.delegate retainNetworkActivityIndicator];
} break;
case 0:
target:self
action:@selector(addButtonClicked)
] autorelease] animated:animated];
- else if ([delegate_ updating])
+ else if ([self.delegate updating])
[[self navigationItem] setLeftBarButtonItem:[[[UIBarButtonItem alloc]
initWithTitle:UCLocalize("CANCEL")
style:UIBarButtonItemStyleDone
[alert setNumberOfRows:1];
[alert addTextFieldWithValue:@"http://" label:@""];
- UITextInputTraits *traits = [[alert textField] textInputTraits];
+ NSObject<UITextInputTraits> *traits = [[alert textField] textInputTraits];
[traits setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[traits setAutocorrectionType:UITextAutocorrectionTypeNo];
[traits setKeyboardType:UIKeyboardTypeURL];
}
- (void) refreshButtonClicked {
- if ([delegate_ requestUpdate])
+ if ([self.delegate requestUpdate])
[self updateButtonsForEditingStatusAnimated:YES];
}
- (void) cancelButtonClicked {
- [delegate_ cancelUpdate];
+ [self.delegate cancelUpdate];
}
- (void) editButtonClicked {
@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 : UIApplication <
+@interface Cydia : CyteApplication <
ConfirmationControllerDelegate,
DatabaseDelegate,
CydiaDelegate
> {
- _H<UIWindow> window_;
+ _H<CyteWindow> window_;
_H<CydiaTabBarController> tabbar_;
_H<CyteTabBarController> emulated_;
_H<AppCacheController> appcache_;
}
- (bool) requestUpdate {
- if (IsReachable("cydia.saurik.com")) {
+ if (CyteIsReachable("cydia.saurik.com")) {
[self beginUpdate];
return true;
} else {
- (void) reloadSpringBoard {
if (kCFCoreFoundationVersionNumber >= 700) // XXX: iOS 6.x
- system("/bin/launchctl stop com.apple.backboardd");
+ system("/usr/libexec/cydia/cydo /bin/launchctl stop com.apple.backboardd");
else
- system("/bin/launchctl stop com.apple.SpringBoard");
+ system("/usr/libexec/cydia/cydo /bin/launchctl stop com.apple.SpringBoard");
sleep(15);
system("/usr/bin/killall backboardd SpringBoard");
}
return [controllers objectAtIndex:3];
}
-- (void) unloadData {
- [tabbar_ unloadData];
-}
-
- (void) _updateData {
[self _saveConfig];
- [self unloadData];
+ [window_ unloadData];
UINavigationController *navigation = [self queueNavigationController];
// - 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;
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];
}
[super applicationSuspend];
}
-- (void) applicationSuspend:(__GSEvent *)event {
+- (void) applicationSuspend:(GSEventRef)event {
if ([self isSafeToSuspend])
[super applicationSuspend:event];
}
}
if (interval <= -(15*60)) {
- if (IsReachable("cydia.saurik.com")) {
+ if (CyteIsReachable("cydia.saurik.com")) {
[tabbar_ beginUpdate];
[appcache_ reloadURLWithCache:YES];
}
[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) _sendMemoryWarningNotification {
- if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iPhoneOS_3_0) // XXX: maybe 4_0?
- [[NSNotificationCenter defaultCenter] postNotificationName:@"UIApplicationMemoryWarningNotification" object:[UIApplication sharedApplication]];
- else
- [[NSNotificationCenter defaultCenter] postNotificationName:@"UIApplicationDidReceiveMemoryWarningNotification" object:[UIApplication sharedApplication]];
-}
-
-- (void) _sendMemoryWarningNotifications {
- while (true) {
- [self performSelectorOnMainThread:@selector(_sendMemoryWarningNotification) withObject:nil waitUntilDone:NO];
- sleep(2);
- //usleep(2000000);
- }
-}
-
-- (void) applicationDidReceiveMemoryWarning:(UIApplication *)application {
- NSLog(@"--");
- [[NSURLCache sharedURLCache] removeAllCachedResponses];
-}
-
- (void) applicationDidFinishLaunching:(id)unused {
- //[NSThread detachNewThreadSelector:@selector(_sendMemoryWarningNotifications) toTarget:self withObject:nil];
-
+ [super applicationDidFinishLaunching:unused];
_trace();
- if ([self respondsToSelector:@selector(setApplicationSupportsShakeToEdit:)])
- [self setApplicationSupportsShakeToEdit:NO];
- @synchronized (HostConfig_) {
+ @synchronized (BridgedHosts_) {
[BridgedHosts_ addObject:[[NSURL URLWithString:CydiaURL(@"")] host]];
}
- [NSURLCache setSharedURLCache:[[[CYURLCache alloc]
- initWithMemoryCapacity:524288
- diskCapacity:10485760
- diskPath:Cache("SDURLCache")
- ] autorelease]];
-
- [CydiaWebViewController _initialize];
+ [CyteWebViewController _initialize];
[NSURLProtocol registerClass:[CydiaURLProtocol class]];
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];
[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]);
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();
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;
_trace();
+ CyteInitialize(@"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]+).*");
+ UIDevice *device([UIDevice currentDevice]);
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~%@/%@", IsWildcat_ ? @"ipad" : @"iphone", Major_]);
PackageName = reinterpret_cast<CYString &(*)(Package *, SEL)>(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<id (*)(NSURLConnection *, SEL, NSURLRequest *, id, BOOL, int64_t, BOOL, NSDictionary *)>(method_getImplementation(NSURLConnection$init$));
- method_setImplementation(NSURLConnection$init$, reinterpret_cast<IMP>(&$NSURLConnection$init$));
- }
-
- $NSUserDefaults = objc_getClass("NSUserDefaults");
- Method NSUserDefaults$objectForKey$(class_getInstanceMethod($NSUserDefaults, @selector(objectForKey:)));
- if (NSUserDefaults$objectForKey$ != NULL) {
- _NSUserDefaults$objectForKey$ = reinterpret_cast<id (*)(NSUserDefaults *, SEL, NSString *)>(method_getImplementation(NSUserDefaults$objectForKey$));
- method_setImplementation(NSUserDefaults$objectForKey$, reinterpret_cast<IMP>(&$NSUserDefaults$objectForKey$));
- }
- /* }}} */
/* Set Locale {{{ */
Locale_ = CFLocaleCopyCurrent();
Languages_ = [NSLocale preferredLanguages];
- //CFStringRef locale(CFLocaleGetIdentifier(Locale_));
- //NSLog(@"%@", [Languages_ description]);
+ std::string languages;
+ const char *translation(NULL);
- const char *lang;
+ // XXX: this isn't really a language, but this is compatible with older Cydia builds
if (Locale_ != NULL)
- lang = [(NSString *) CFLocaleGetIdentifier(Locale_) UTF8String];
- else if (Languages_ != nil && [Languages_ count] != 0)
- lang = [[Languages_ objectAtIndex:0] UTF8String];
- else
- // XXX: consider just setting to C and then falling through?
- lang = NULL;
-
- if (lang != NULL) {
- RegEx pattern("([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?");
- lang = !pattern(lang) ? NULL : [pattern->*@"%1$@%2$@" UTF8String];
- }
+ if (const char *language = [(NSString *) CFLocaleGetIdentifier(Locale_) UTF8String]) {
+ RegEx pattern("([a-z][a-z])(?:-[A-Za-z]*)?(_[A-Z][A-Z])?");
+ if (pattern(language)) {
+ translation = strdup([pattern->*@"%1$@%2$@" UTF8String]);
+ languages += translation;
+ languages += ",";
+ }
+ }
- NSLog(@"Setting Language: %s", lang);
+ if (Languages_ != nil)
+ 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 += ",";
+ }
- if (lang != NULL) {
- setenv("LANG", lang, true);
- setlocale(LC_ALL, lang);
- }
+ languages += "en";
+ NSLog(@"Setting Language: [%s] %s", translation, languages.c_str());
/* }}} */
/* Index Collation {{{ */
if (Class $UILocalizedIndexedCollation = objc_getClass("UILocalizedIndexedCollation")) { @try {
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;
void *gestalt(dlopen("/usr/lib/libMobileGestalt.dylib", RTLD_GLOBAL | RTLD_LAZY));
$MGCopyAnswer = reinterpret_cast<CFStringRef (*)(CFStringRef)>(dlsym(gestalt, "MGCopyAnswer"));
+ UniqueID_ = UniqueIdentifier(device);
/* System Information {{{ */
size_t size;
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];
_config->Set("Dir::Bin::Methods::store", "/Applications/Cydia.app/store");
_config->Set("pkgCacheGen::ForceEssential", "");
- _config->Set("APT::Acquire::Translation", "environment");
+
+ if (translation != NULL)
+ _config->Set("APT::Acquire::Translation", translation);
+ _config->Set("Acquire::Languages", languages);
// 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);