diff options
Diffstat (limited to 'CyteKit/URLProtocol.mm')
-rw-r--r-- | CyteKit/URLProtocol.mm | 98 |
1 files changed, 98 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. +**/ +/* }}} */ + +#include "CyteKit/UCPlatform.h" + +#include "CyteKit/URLProtocol.h" + +#include "iPhonePrivate.h" +#include <Menes/ObjectHandle.h> + +@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<NSURLProtocolClient> 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<NSURLProtocolClient> 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 |