18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebDownload.h> 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/NSURLAuthenticationChallenge.h> 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/NSURLDownload.h> 330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/AuthenticationMac.h> 34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/Credential.h> 35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/CredentialStorage.h> 36231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#import <WebCore/ProtectionSpace.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/WebPanelAuthenticationHandler.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebTypesInternal.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochusing namespace WebCore; 430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@class NSURLConnectionDelegateProxy; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: The following are NSURLDownload SPI - it would be nice to not have to override them at 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// some point in the future 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface NSURLDownload (WebDownloadCapability) 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithLoadingConnection:(NSURLConnection *)connection 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request:(NSURLRequest *)request 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project response:(NSURLResponse *)response 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate:(id)delegate 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project proxy:(NSURLConnectionDelegateProxy *)proxy; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithRequest:(NSURLRequest *)request 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate:(id)delegate 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directory:(NSString *)directory; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block@interface WebDownloadInternal : NSObject <NSURLDownloadDelegate> 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id realDelegate; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setRealDelegate:(id)rd; 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDownloadInternal 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate release]; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setRealDelegate:(id)rd 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [rd retain]; 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate release]; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project realDelegate = rd; 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)respondsToSelector:(SEL)selector 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (selector == @selector(downloadDidBegin:) || 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:willSendRequest:redirectResponse:) || 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:didReceiveResponse:) || 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:didReceiveDataOfLength:) || 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:shouldDecodeSourceDataOfMIMEType:) || 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:decideDestinationWithSuggestedFilename:) || 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:didCreateDestination:) || 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(downloadDidFinish:) || 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:didFailWithError:) || 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:shouldBeginChildDownloadOfSource:delegate:) || 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project selector == @selector(download:didBeginChildDownload:)) { 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [realDelegate respondsToSelector:selector]; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [super respondsToSelector:selector]; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)downloadDidBegin:(NSURLDownload *)download 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate downloadDidBegin:download]; 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLRequest *)download:(NSURLDownload *)download willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [realDelegate download:download willSendRequest:request redirectResponse:redirectResponse]; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Try previously stored credential first. 1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (![challenge previousFailureCount]) { 117231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block NSURLCredential *credential = mac(CredentialStorage::get(core([challenge protectionSpace]))); 1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (credential) { 1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return; 1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([realDelegate respondsToSelector:@selector(download:didReceiveAuthenticationChallenge:)]) { 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didReceiveAuthenticationChallenge:challenge]; 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSWindow *window = nil; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([realDelegate respondsToSelector:@selector(downloadWindowForAuthenticationSheet:)]) { 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project window = [realDelegate downloadWindowForAuthenticationSheet:(WebDownload *)download]; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[WebPanelAuthenticationHandler sharedHandler] startAuthentication:challenge window:window]; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([realDelegate respondsToSelector:@selector(download:didCancelAuthenticationChallenge:)]) { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didCancelAuthenticationChallenge:challenge]; 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[WebPanelAuthenticationHandler sharedHandler] cancelAuthentication:challenge]; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didReceiveResponse:response]; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)length 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didReceiveDataOfLength:length]; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)download:(NSURLDownload *)download shouldDecodeSourceDataOfMIMEType:(NSString *)encodingType 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [realDelegate download:download shouldDecodeSourceDataOfMIMEType:encodingType]; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download decideDestinationWithSuggestedFilename:(NSString *)filename 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download decideDestinationWithSuggestedFilename:filename]; 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didCreateDestination:(NSString *)path 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didCreateDestination:path]; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)downloadDidFinish:(NSURLDownload *)download 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate downloadDidFinish:download]; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:download didFailWithError:error]; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLRequest *)download:(NSURLDownload *)download shouldBeginChildDownloadOfSource:(NSURLRequest *)child delegate:(id *)childDelegate 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [realDelegate download:download shouldBeginChildDownloadOfSource:child delegate:childDelegate]; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)download:(NSURLDownload *)parent didBeginChildDownload:(NSURLDownload *)child 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [realDelegate download:parent didBeginChildDownload:child]; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDownload 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setRealDelegate:(id)delegate 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_webInternal == nil) { 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _webInternal = [[WebDownloadInternal alloc] init]; 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_webInternal setRealDelegate:delegate]; 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else { 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(_webInternal == delegate); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project self = [super init]; 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (self != nil) { 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // _webInternal can be set up before init by _setRealDelegate 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_webInternal == nil) { 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _webInternal = [[WebDownloadInternal alloc] init]; 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_webInternal release]; 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 222e14391e94c850b8bd03680c23b38978db68687a8John Reck- (id)initWithRequest:(NSURLRequest *)request delegate:(id<NSURLDownloadDelegate>)delegate 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setRealDelegate:delegate]; 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [super initWithRequest:request delegate:_webInternal]; 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithLoadingConnection:(NSURLConnection *)connection 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project request:(NSURLRequest *)request 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project response:(NSURLResponse *)response 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate:(id)delegate 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project proxy:(NSURLConnectionDelegateProxy *)proxy 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setRealDelegate:delegate]; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [super _initWithLoadingConnection:connection request:request response:response delegate:_webInternal proxy:proxy]; 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithRequest:(NSURLRequest *)request 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delegate:(id)delegate 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project directory:(NSString *)directory 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setRealDelegate:delegate]; 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [super _initWithRequest:request delegate:_webInternal directory:directory]; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)connection:(NSURLConnection *)connection willStopBufferingData:(NSData *)data 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // NSURLConnection calls this method even if it is not implemented. 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This happens because NSURLConnection caches the results of respondsToSelector. 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Those results become invalid when the delegate of NSURLConnectionDelegateProxy is changed. 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This is a workaround since this problem needs to be fixed in NSURLConnectionDelegateProxy. 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // <rdar://problem/3913270> NSURLConnection calls unimplemented delegate method in WebDownload 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 256