From a02d4e989ec1ecf82da7044375b4010f1b572883 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Sun, 5 Mar 2017 00:11:32 -0800 Subject: Try to abstract CydiaURLProtocol as CyteKit class. --- CyteKit/CyteKit.h | 1 + CyteKit/URLProtocol.h | 36 +++++++++++++++++++ CyteKit/URLProtocol.mm | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ MobileCydia.mm | 56 ++++------------------------- 4 files changed, 141 insertions(+), 50 deletions(-) create mode 100644 CyteKit/URLProtocol.h create mode 100644 CyteKit/URLProtocol.mm diff --git a/CyteKit/CyteKit.h b/CyteKit/CyteKit.h index 0bfba3c..7f1df37 100644 --- a/CyteKit/CyteKit.h +++ b/CyteKit/CyteKit.h @@ -28,6 +28,7 @@ #include "CyteKit/TableViewCell.h" #include "CyteKit/TabBarController.h" #include "CyteKit/URLCache.h" +#include "CyteKit/URLProtocol.h" #include "CyteKit/WebViewController.h" #include "CyteKit/WebViewTableViewCell.h" #include "CyteKit/Window.h" diff --git a/CyteKit/URLProtocol.h b/CyteKit/URLProtocol.h new file mode 100644 index 0000000..9b1796d --- /dev/null +++ b/CyteKit/URLProtocol.h @@ -0,0 +1,36 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#ifndef CyteKit_URLProtocol_H +#define CyteKit_URLProtocol_H + +#include + +@interface CyteURLProtocol : NSURLProtocol + ++ (NSString *) scheme; + +- (void) _returnPNGWithImage:(UIImage *)icon forRequest:(NSURLRequest *)request; +- (bool) loadForPath:(NSString *)path ofRequest:(NSURLRequest *)request; + +@end + +#endif//CyteKit_URLProtocol_H diff --git a/CyteKit/URLProtocol.mm b/CyteKit/URLProtocol.mm new file mode 100644 index 0000000..eccd2f7 --- /dev/null +++ b/CyteKit/URLProtocol.mm @@ -0,0 +1,98 @@ +/* Cydia - iPhone UIKit Front-End for Debian APT + * Copyright (C) 2008-2015 Jay Freeman (saurik) +*/ + +/* GNU General Public License, Version 3 {{{ */ +/* + * Cydia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * Cydia is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Cydia. If not, see . +**/ +/* }}} */ + +#include "CyteKit/UCPlatform.h" + +#include "CyteKit/URLProtocol.h" + +#include "iPhonePrivate.h" +#include + +@implementation CyteURLProtocol { +} + ++ (NSString *) scheme { + return NULL; +} + ++ (BOOL) canInitWithRequest:(NSURLRequest *)request { + NSURL *url([request URL]); + if (url == nil) + return NO; + + auto local([self scheme]); + _assert(local != NULL); + + NSString *scheme([[url scheme] lowercaseString]); + if (scheme != nil && [scheme isEqualToString:local]) + return YES; + if ([[url absoluteString] hasPrefix:[NSString stringWithFormat:@"about:%@-", local]]) + 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]; + } +} + +- (bool) loadForPath:(NSString *)path ofRequest:(NSURLRequest *)request { + return false; +} + +- (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); + + if (![self loadForPath:path ofRequest:request]) + [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil]]; +} + +- (void) stopLoading { +} + +@end diff --git a/MobileCydia.mm b/MobileCydia.mm index 0d0ac83..dce9dec 100644 --- a/MobileCydia.mm +++ b/MobileCydia.mm @@ -6631,61 +6631,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; ++ (NSString *) scheme { + return @"cydia"; } -- (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]; - } -} - -- (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; @@ -6745,11 +6702,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 -- cgit v1.2.3