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 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 CyteKit/URLProtocol.h create mode 100644 CyteKit/URLProtocol.mm (limited to 'CyteKit') 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 -- cgit v1.2.3