summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2017-02-16 00:07:10 -0800
committerJay Freeman (saurik) <saurik@saurik.com>2017-02-16 00:07:10 -0800
commit68df8c0b7bacec286d4798408b5a110bdac88986 (patch)
treedc33f6ec33efea7da01ff83ec8c7092414dfbed6
parent03ef79ee43de8ebf2ddfeb53c30ad3a12bfce517 (diff)
Put CydiaURLCache/NSURLConnection hook in CyteKit.
-rw-r--r--CyteKit/URLCache.h31
-rw-r--r--CyteKit/URLCache.mm105
-rw-r--r--Menes/ObjectHandle.h4
-rw-r--r--MobileCydia.mm96
-rw-r--r--Substrate.hpp13
5 files changed, 155 insertions, 94 deletions
diff --git a/CyteKit/URLCache.h b/CyteKit/URLCache.h
new file mode 100644
index 0000000..e363b8f
--- /dev/null
+++ b/CyteKit/URLCache.h
@@ -0,0 +1,31 @@
+/* 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/>.
+**/
+/* }}} */
+
+#ifndef CyteKit_URLCache_H
+#define CyteKit_URLCache_H
+
+#include "SDURLCache/SDURLCache.h"
+
+@interface CyteURLCache : SDURLCache
+
+@end
+
+#endif//CyteKit_URLCache_H
diff --git a/CyteKit/URLCache.mm b/CyteKit/URLCache.mm
new file mode 100644
index 0000000..e506130
--- /dev/null
+++ b/CyteKit/URLCache.mm
@@ -0,0 +1,105 @@
+/* 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/URLCache.h"
+#include "Substrate.hpp"
+
+#include <Menes/ObjectHandle.h>
+
+static _H<NSMutableSet> CachedURLs_([NSMutableSet setWithCapacity:32]);
+
+@implementation CyteURLCache {
+}
+
+- (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 (CachedURLs_) {
+ [CachedURLs_ addObject:url];
+ }
+ }
+
+ [super storeCachedResponse:cached forRequest:request];
+}
+
+- (void) createDiskCachePath {
+ [super createDiskCachePath];
+}
+
+@end
+
+MSClassHook(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]);
+
+ @synchronized (CachedURLs_) {
+ 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;
+}
+
+CYHook(NSURLConnection, init$, _initWithRequest:delegate:usesCache:maxContentLength:startImmediately:connectionProperties:)
diff --git a/Menes/ObjectHandle.h b/Menes/ObjectHandle.h
index 9b8d57d..727338b 100644
--- a/Menes/ObjectHandle.h
+++ b/Menes/ObjectHandle.h
@@ -128,4 +128,8 @@ rproperty_(Class, field) \
wproperty_(Class, field, Field) \
@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))
+
#endif//Menes_ObjectHandle_H
diff --git a/MobileCydia.mm b/MobileCydia.mm
index a5e9dbc..d52a38e 100644
--- a/MobileCydia.mm
+++ b/MobileCydia.mm
@@ -117,6 +117,7 @@ extern "C" {
#include "CyteKit/RegEx.hpp"
#include "CyteKit/TableViewCell.h"
#include "CyteKit/TabBarController.h"
+#include "CyteKit/URLCache.h"
#include "CyteKit/WebScriptObject-Cyte.h"
#include "CyteKit/WebViewController.h"
#include "CyteKit/WebViewTableViewCell.h"
@@ -125,8 +126,6 @@ extern "C" {
#include "Cydia/MIMEAddress.h"
#include "Cydia/LoadingViewController.h"
#include "Cydia/ProgressEvent.h"
-
-#include "SDURLCache/SDURLCache.h"
/* }}} */
/* Profiler {{{ */
@@ -199,10 +198,6 @@ void PrintTimes() {
#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)
@@ -800,7 +795,6 @@ static _H<NSMutableDictionary> SessionData_;
static _H<NSObject> HostConfig_;
static _H<NSMutableSet> BridgedHosts_;
static _H<NSMutableSet> InsecureHosts_;
-static _H<NSMutableSet> CachedURLs_;
static NSString *kCydiaProgressEventTypeError = @"Error";
static NSString *kCydiaProgressEventTypeInformation = @"Information";
@@ -8910,57 +8904,6 @@ static void HomeControllerReachabilityCallback(SCNetworkReachabilityRef reachabi
@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 : CyteApplication <
ConfirmationControllerDelegate,
DatabaseDelegate,
@@ -9868,7 +9811,7 @@ _trace();
[BridgedHosts_ addObject:[[NSURL URLWithString:CydiaURL(@"")] host]];
}
- [NSURLCache setSharedURLCache:[[[CYURLCache alloc]
+ [NSURLCache setSharedURLCache:[[[CyteURLCache alloc]
initWithMemoryCapacity:524288
diskCapacity:10485760
diskPath:Cache("SDURLCache")
@@ -10095,33 +10038,6 @@ id Dealloc_(id self, SEL selector) {
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]);
-
- @synchronized (HostConfig_) {
- 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) {
@@ -10200,7 +10116,6 @@ int main(int argc, char *argv[]) {
@synchronized (HostConfig_) {
BridgedHosts_ = [NSMutableSet setWithCapacity:4];
InsecureHosts_ = [NSMutableSet setWithCapacity:4];
- CachedURLs_ = [NSMutableSet setWithCapacity:32];
}
NSString *ui(@"ui/ios");
@@ -10219,13 +10134,6 @@ int main(int argc, char *argv[]) {
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) {
diff --git a/Substrate.hpp b/Substrate.hpp
index 9826b56..57e89fb 100644
--- a/Substrate.hpp
+++ b/Substrate.hpp
@@ -31,8 +31,21 @@ static inline Type_ &MSHookIvar(id self, const char *name) {
return *reinterpret_cast<Type_ *>(pointer);
}
+#define MSClassHook(name) \
+ @class name; \
+ static Class $ ## name = objc_getClass(#name);
+
#define MSHook(type, name, args...) \
static type (*_ ## name)(args); \
static type $ ## name(args)
+#define CYHook(Type, Code, Name) \
+static struct Type ## $ ## Code { Type ## $ ## Code() { \
+ Method Type ## $ ## Code(class_getInstanceMethod($ ## Type, @selector(Name))); \
+ if (Type ## $ ## Code != NULL) { \
+ _ ## Type ## $ ## Code = reinterpret_cast<decltype(_ ## Type ## $ ## Code)>(method_getImplementation(Type ## $ ## Code)); \
+ method_setImplementation(Type ## $ ## Code, reinterpret_cast<IMP>(&$ ## Type ## $ ## Code)); \
+ } \
+} } Type ## $ ## Code;
+
#endif//Substrate_HPP