); \
} while (false)
+#define _assert(test) do \
+ if (!(test)) { \
+ fprintf(stderr, "_assert(%d:%s)@%s:%u[%s]\n", errno, #test, __FILE__, __LINE__, __FUNCTION__); \
+ exit(-1); \
+ } \
+while (false)
+
@protocol CydgetController
- (NSDictionary *) currentConfiguration;
@end
- (void) stopLoading {
}
+@end
+/* }}} */
+/* Cydget-PHP:// Protocol {{{ */
+@interface CydgetPHPURLProtocol : NSURLProtocol {
+}
+
+@end
+
+@implementation CydgetPHPURLProtocol
+
++ (BOOL) canInitWithRequest:(NSURLRequest *)request {
+ NSURL *url([request URL]);
+ if (url == nil)
+ return NO;
+ NSString *scheme([[url scheme] lowercaseString]);
+ if (scheme == nil || ![scheme isEqualToString:@"cydget-php"])
+ return NO;
+ return YES;
+}
+
++ (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request {
+ return request;
+}
+
+- (void) startLoading {
+ id<NSURLProtocolClient> client([self client]);
+ NSURLRequest *request([self request]);
+ NSURL *url([request URL]);
+ NSString *href([url absoluteString]);
+
+ NSString *path([href substringFromIndex:13]);
+ if (path == nil || ![path hasSuffix:@".php"])
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil]];
+
+ NSFileManager *manager([NSFileManager defaultManager]);
+ if (![manager fileExistsAtPath:path])
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]];
+
+ int fds[2];
+ _assert(pipe(fds) != -1);
+
+ pid_t pid(fork());
+ if (pid == 0) {
+ _assert(dup2(fds[1], 1) != -1);
+ _assert(close(fds[0]) != -1);
+ _assert(close(fds[1]) != -1);
+ execl("/usr/bin/php", "php", [path UTF8String], NULL);
+ exit(1);
+ _assert(false);
+ }
+
+ _assert(close(fds[1]) != -1);
+
+ NSMutableData *data([NSMutableData dataWithCapacity:16*1024]);
+
+ if (FILE *file = fdopen(fds[0], "r")) {
+ char buffer[16*1024];
+ read:
+ size_t count(fread(buffer, 1, sizeof(buffer), file));
+ if (count != 0)
+ [data appendBytes:buffer length:count];
+ if (count == sizeof(buffer))
+ goto read;
+ if (ferror(file))
+ [client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorNetworkConnectionLost userInfo:nil]];
+ fclose(file);
+ } else _assert(close(fds[0]));
+
+ NSURLResponse *response([[[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"text/html" expectedContentLength:-1 textEncodingName:nil] autorelease]);
+
+ [client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
+ [client URLProtocol:self didLoadData:data];
+ [client URLProtocolDidFinishLoading:self];
+}
+
+- (void) stopLoading {
+}
+
@end
/* }}} */
apr_initialize();
[NSURLProtocol registerClass:[CydgetURLProtocol class]];
+ [NSURLProtocol registerClass:[CydgetPHPURLProtocol class]];
void (*_ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE)(JSC::SourceCode **, JSC::JSGlobalData *, int *, JSC::UString *);
dlset(_ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE, "_ZN3JSC6Parser5parseEPNS_12JSGlobalDataEPiPNS_7UStringE");