]> git.saurik.com Git - cydia.git/blobdiff - Cydia.mm
Apple's Reachability code is ludicrously complex (and APSL).
[cydia.git] / Cydia.mm
index f56107842b9aa87b4bcde0910dd16c61f29292ed..090823dd804a217a205b8cd67ec8e80adaecd916 100644 (file)
--- a/Cydia.mm
+++ b/Cydia.mm
@@ -59,6 +59,8 @@
 #include <CoreFoundation/CFPriv.h>
 #include <CoreFoundation/CFUniChar.h>
 
 #include <CoreFoundation/CFPriv.h>
 #include <CoreFoundation/CFUniChar.h>
 
+#include <SystemConfiguration/SystemConfiguration.h>
+
 #include <UIKit/UIKit.h>
 #include "iPhonePrivate.h"
 
 #include <UIKit/UIKit.h>
 #include "iPhonePrivate.h"
 
@@ -119,12 +121,8 @@ extern "C" {
 #include <ext/hash_map>
 
 #include "UICaboodle/BrowserView.h"
 #include <ext/hash_map>
 
 #include "UICaboodle/BrowserView.h"
-#include "UICaboodle/ResetView.h"
 
 #include "substrate.h"
 
 #include "substrate.h"
-
-// Apple's sample Reachability code, ASPL licensed.
-#include "Reachability.h"
 /* }}} */
 
 /* Profiler {{{ */
 /* }}} */
 
 /* Profiler {{{ */
@@ -375,7 +373,7 @@ static const CFStringCompareFlags LaxCompareFlags_ = kCFCompareCaseInsensitive |
 
 #define lprintf(args...) fprintf(stderr, args)
 
 
 #define lprintf(args...) fprintf(stderr, args)
 
-#define ForRelease 0
+#define ForRelease 1
 #define TraceLogging (1 && !ForRelease)
 #define HistogramInsertionSort (0 && !ForRelease)
 #define ProfileTimes (0 && !ForRelease)
 #define TraceLogging (1 && !ForRelease)
 #define HistogramInsertionSort (0 && !ForRelease)
 #define ProfileTimes (0 && !ForRelease)
@@ -1215,7 +1213,7 @@ bool isSectionVisible(NSString *section) {
 - (void) showSettings;
 - (UIProgressHUD *) addProgressHUD;
 - (void) removeProgressHUD:(UIProgressHUD *)hud;
 - (void) showSettings;
 - (UIProgressHUD *) addProgressHUD;
 - (void) removeProgressHUD:(UIProgressHUD *)hud;
-- (UCViewController *) pageForPackage:(NSString *)name;
+- (CYViewController *) pageForPackage:(NSString *)name;
 - (PackageController *) packageController;
 - (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item;
 @end
 - (PackageController *) packageController;
 - (void) showActionSheet:(UIActionSheet *)sheet fromItem:(UIBarButtonItem *)item;
 @end
@@ -2482,11 +2480,13 @@ struct PackageNameOrdering :
     UIImage *icon(nil);
     if (!icon_.empty())
         if ([icon_ hasPrefix:@"file:///"])
     UIImage *icon(nil);
     if (!icon_.empty())
         if ([icon_ hasPrefix:@"file:///"])
+            // XXX: correct escaping
             icon = [UIImage imageAtPath:[icon_ substringFromIndex:7]];
     if (icon == nil) if (section != nil)
         icon = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/Sections/%@.png", App_, section]];
     if (icon == nil) if (source_ != nil) if (NSString *dicon = [source_ defaultIcon])
         if ([dicon hasPrefix:@"file:///"])
             icon = [UIImage imageAtPath:[icon_ substringFromIndex:7]];
     if (icon == nil) if (section != nil)
         icon = [UIImage imageAtPath:[NSString stringWithFormat:@"%@/Sections/%@.png", App_, section]];
     if (icon == nil) if (source_ != nil) if (NSString *dicon = [source_ defaultIcon])
         if ([dicon hasPrefix:@"file:///"])
+            // XXX: correct escaping
             icon = [UIImage imageAtPath:[dicon substringFromIndex:7]];
     if (icon == nil)
         icon = [UIImage applicationImageNamed:@"unknown.png"];
             icon = [UIImage imageAtPath:[dicon substringFromIndex:7]];
     if (icon == nil)
         icon = [UIImage applicationImageNamed:@"unknown.png"];
@@ -3862,14 +3862,7 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) {
 @end
 /* }}} */
 
 @end
 /* }}} */
 
-/* Cydia View Controller {{{ */
-@interface CYViewController : UCViewController { }
-@end
-
-@implementation CYViewController
-@end
-/* }}} */
-
+/* Cydia Browser Controller {{{ */
 @interface CYBrowserController : BrowserController {
     CydiaObject *cydia_;
 }
 @interface CYBrowserController : BrowserController {
     CydiaObject *cydia_;
 }
@@ -3959,7 +3952,9 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) {
 }
 
 @end
 }
 
 @end
+/* }}} */
 
 
+/* Confirmation {{{ */
 @protocol ConfirmationControllerDelegate
 - (void) cancelAndClear:(bool)clear;
 - (void) confirmWithNavigationController:(UINavigationController *)navigation;
 @protocol ConfirmationControllerDelegate
 - (void) cancelAndClear:(bool)clear;
 - (void) confirmWithNavigationController:(UINavigationController *)navigation;
@@ -5227,9 +5222,12 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) {
     }
 }
 
     }
 }
 
+// We don't want to allow non-commercial packages to do custom things to the install button,
+// so it must call customButtonClicked with a custom commercial_ == 1 fallthrough.
 - (void) customButtonClicked {
 - (void) customButtonClicked {
-    // Wait until it's done loading.
-    if (![self isLoading])
+    if (commercial_)
+        [super customButtonClicked];
+    else
         [self _customButtonClicked];
 }
 
         [self _customButtonClicked];
 }
 
@@ -5240,6 +5238,16 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) {
 - (void) applyLoadingTitle {
     // Don't show "Loading" as the title. Ever.
 }
 - (void) applyLoadingTitle {
     // Don't show "Loading" as the title. Ever.
 }
+
+- (UIBarButtonItem *) rightButton {
+    int count = [buttons_ count];
+    return [[[UIBarButtonItem alloc]
+        initWithTitle:count == 0 ? nil : count != 1 ? UCLocalize("MODIFY") : [buttons_ objectAtIndex:0]
+        style:UIBarButtonItemStylePlain
+        target:self
+        action:@selector(customButtonClicked)
+    ] autorelease];
+}
 #endif
 
 - (id) initWithDatabase:(Database *)database {
 #endif
 
 - (id) initWithDatabase:(Database *)database {
@@ -5307,19 +5315,6 @@ bool DepSubstrate(const pkgCache::VerIterator &iterator) {
     }
 }
 
     }
 }
 
-- (void) applyRightButton {
-    int count = [buttons_ count];
-    UIBarButtonItem *actionItem = [[UIBarButtonItem alloc]
-        initWithTitle:count == 0 ? nil : count != 1 ? UCLocalize("MODIFY") : [buttons_ objectAtIndex:0]
-        style:UIBarButtonItemStylePlain
-        target:self
-        action:@selector(customButtonClicked)
-    ];
-    if (![self isLoading]) [[self navigationItem] setRightBarButtonItem:actionItem];
-    else [super applyRightButton];
-    [actionItem release];
-}
-
 - (bool) isLoading {
     return commercial_ ? [super isLoading] : false;
 }
 - (bool) isLoading {
     return commercial_ ? [super isLoading] : false;
 }
@@ -6564,7 +6559,7 @@ freeing the view controllers on tab change */
     }
 }
 
     }
 }
 
-- (id) initWithDatabase: (Database *)database {
+- (id) initWithDatabase:(Database *)database {
     if ((self = [super init]) != nil) {
         database_ = database;
     } return self;
     if ((self = [super init]) != nil) {
         database_ = database;
     } return self;
@@ -7650,7 +7645,7 @@ freeing the view controllers on tab change */
 }
 
 - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
 }
 
 - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
-    return YES; /* XXX: return YES; */
+    return IsWildcat_;
 }
 
 - (void) setTabBarController:(UITabBarController *)controller {
 }
 
 - (void) setTabBarController:(UITabBarController *)controller {
@@ -7767,8 +7762,8 @@ freeing the view controllers on tab change */
     if (animated) [UIView beginAnimations:nil context:NULL];
     CGRect barframe = [refreshbar_ frame];
     CGRect viewframe = [[root_ view] frame];
     if (animated) [UIView beginAnimations:nil context:NULL];
     CGRect barframe = [refreshbar_ frame];
     CGRect viewframe = [[root_ view] frame];
-    viewframe.origin.y += barframe.size.height + 20.0f;
-    viewframe.size.height -= barframe.size.height + 20.0f;
+    viewframe.origin.y += barframe.size.height;
+    viewframe.size.height -= barframe.size.height;
     [[root_ view] setFrame:viewframe];
     if (animated) [UIView commitAnimations];
 
     [[root_ view] setFrame:viewframe];
     if (animated) [UIView commitAnimations];
 
@@ -7789,8 +7784,8 @@ freeing the view controllers on tab change */
     if (animated) [UIView beginAnimations:nil context:NULL];
     CGRect barframe = [refreshbar_ frame];
     CGRect viewframe = [[root_ view] frame];
     if (animated) [UIView beginAnimations:nil context:NULL];
     CGRect barframe = [refreshbar_ frame];
     CGRect viewframe = [[root_ view] frame];
-    viewframe.origin.y -= barframe.size.height + 20.0f;
-    viewframe.size.height += barframe.size.height + 20.0f;
+    viewframe.origin.y -= barframe.size.height;
+    viewframe.size.height += barframe.size.height;
     [[root_ view] setFrame:viewframe];
     if (animated) [UIView commitAnimations];
 
     [[root_ view] setFrame:viewframe];
     if (animated) [UIView commitAnimations];
 
@@ -7876,8 +7871,8 @@ typedef enum {
     bool loaded_;
 }
 
     bool loaded_;
 }
 
-- (UCViewController *) _pageForURL:(NSURL *)url withClass:(Class)_class;
-- (void) setPage:(UCViewController *)page;
+- (CYViewController *) _pageForURL:(NSURL *)url withClass:(Class)_class;
+- (void) setPage:(CYViewController *)page;
 - (void) loadData;
 
 @end
 - (void) loadData;
 
 @end
@@ -7976,10 +7971,25 @@ static _finline void _setHomePage(Cydia *self) {
 - (void) _refreshIfPossible {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
 - (void) _refreshIfPossible {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
-    Reachability* reachability = [Reachability reachabilityWithHostName:@"cydia.saurik.com"];
-    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];
+    SCNetworkReachabilityFlags flags; {
+        SCNetworkReachabilityRef reachability(SCNetworkReachabilityCreateWithName(NULL, "cydia.saurik.com"));
+        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?
+    bool reachable(
+        (flags & kSCNetworkReachabilityFlagsReachable) != 0 && (
+            (flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0 || (
+                (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) != 0 ||
+                (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0
+            ) && (flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0 ||
+            (flags & kSCNetworkReachabilityFlagsIsWWAN) != 0
+        )
+    );
 
 
-    if (loaded_ || ManualRefresh || remoteHostStatus == NotReachable) loaded:
+    if (loaded_ || ManualRefresh || !reachable) loaded:
         [self performSelectorOnMainThread:@selector(_loaded) withObject:nil waitUntilDone:NO];
     else {
         loaded_ = true;
         [self performSelectorOnMainThread:@selector(_loaded) withObject:nil waitUntilDone:NO];
     else {
         loaded_ = true;
@@ -8200,7 +8210,7 @@ static _finline void _setHomePage(Cydia *self) {
     [self complete];
 }
 
     [self complete];
 }
 
-- (void) setPage:(UCViewController *)page {
+- (void) setPage:(CYViewController *)page {
     [page setDelegate:self];
 
     CYNavigationController *navController = (CYNavigationController *) [tabbar_ selectedViewController];
     [page setDelegate:self];
 
     CYNavigationController *navController = (CYNavigationController *) [tabbar_ selectedViewController];
@@ -8210,7 +8220,7 @@ static _finline void _setHomePage(Cydia *self) {
     }
 }
 
     }
 }
 
-- (UCViewController *) _pageForURL:(NSURL *)url withClass:(Class)_class {
+- (CYViewController *) _pageForURL:(NSURL *)url withClass:(Class)_class {
     CYBrowserController *browser = [[[_class alloc] init] autorelease];
     [browser loadURL:url];
     return browser;
     CYBrowserController *browser = [[[_class alloc] init] autorelease];
     [browser loadURL:url];
     return browser;
@@ -8439,7 +8449,7 @@ static _finline void _setHomePage(Cydia *self) {
     [window_ setUserInteractionEnabled:YES];
 }
 
     [window_ setUserInteractionEnabled:YES];
 }
 
-- (UCViewController *) pageForPackage:(NSString *)name {
+- (CYViewController *) pageForPackage:(NSString *)name {
     if (Package *package = [database_ packageWithName:name]) {
         PackageController *view([self packageController]);
         [view setPackage:package];
     if (Package *package = [database_ packageWithName:name]) {
         PackageController *view([self packageController]);
         [view setPackage:package];
@@ -8451,7 +8461,7 @@ static _finline void _setHomePage(Cydia *self) {
     }
 }
 
     }
 }
 
-- (UCViewController *) pageForURL:(NSURL *)url hasTag:(int *)tag {
+- (CYViewController *) pageForURL:(NSURL *)url hasTag:(int *)tag {
     if (tag != NULL)
         *tag = -1;
 
     if (tag != NULL)
         *tag = -1;
 
@@ -8503,7 +8513,7 @@ static _finline void _setHomePage(Cydia *self) {
 - (void) applicationOpenURL:(NSURL *)url {
     [super applicationOpenURL:url];
     int tag;
 - (void) applicationOpenURL:(NSURL *)url {
     [super applicationOpenURL:url];
     int tag;
-    if (UCViewController *page = [self pageForURL:url hasTag:&tag]) {
+    if (CYViewController *page = [self pageForURL:url hasTag:&tag]) {
         [self setPage:page];
         tag_ = tag;
         [tabbar_ setSelectedViewController:(tag_ == -1 ? nil : [[tabbar_ viewControllers] objectAtIndex:tag_])];
         [self setPage:page];
         tag_ = tag;
         [tabbar_ setSelectedViewController:(tag_ == -1 ? nil : [[tabbar_ viewControllers] objectAtIndex:tag_])];