1 /* 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #import "config.h" 27 #import "ResourceResponse.h" 28 29 #import "WebCoreURLResponse.h" 30 #import <Foundation/Foundation.h> 31 #import <wtf/StdLibExtras.h> 32 #import <limits> 33 34 @interface NSURLResponse (FoundationSecretsWebCoreKnowsAbout) 35 - (NSTimeInterval)_calculatedExpiration; 36 @end 37 38 #ifdef BUILDING_ON_TIGER 39 typedef int NSInteger; 40 #endif 41 42 namespace WebCore { 43 44 NSURLResponse *ResourceResponse::nsURLResponse() const 45 { 46 if (!m_nsResponse && !m_isNull) { 47 // Work around a mistake in the NSURLResponse class. 48 // The init function takes an NSInteger, even though the accessor returns a long long. 49 // For values that won't fit in an NSInteger, pass -1 instead. 50 NSInteger expectedContentLength; 51 if (m_expectedContentLength < 0 || m_expectedContentLength > std::numeric_limits<NSInteger>::max()) 52 expectedContentLength = -1; 53 else 54 expectedContentLength = static_cast<NSInteger>(m_expectedContentLength); 55 const_cast<ResourceResponse*>(this)->m_nsResponse.adoptNS([[NSURLResponse alloc] initWithURL:m_url MIMEType:m_mimeType expectedContentLength:expectedContentLength textEncodingName:m_textEncodingName]); 56 } 57 return m_nsResponse.get(); 58 } 59 60 void ResourceResponse::platformLazyInit() 61 { 62 if (m_isUpToDate) 63 return; 64 m_isUpToDate = true; 65 66 if (m_isNull) { 67 ASSERT(!m_nsResponse); 68 return; 69 } 70 71 m_url = [m_nsResponse.get() URL]; 72 m_mimeType = [m_nsResponse.get() MIMEType]; 73 m_expectedContentLength = [m_nsResponse.get() expectedContentLength]; 74 m_textEncodingName = [m_nsResponse.get() textEncodingName]; 75 m_suggestedFilename = [m_nsResponse.get() suggestedFilename]; 76 77 if ([m_nsResponse.get() isKindOfClass:[NSHTTPURLResponse class]]) { 78 NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)m_nsResponse.get(); 79 80 m_httpStatusCode = [httpResponse statusCode]; 81 82 // FIXME: it would be nice to have a way to get the real status text eventually. 83 m_httpStatusText = "OK"; 84 85 NSDictionary *headers = [httpResponse allHeaderFields]; 86 NSEnumerator *e = [headers keyEnumerator]; 87 while (NSString *name = [e nextObject]) 88 m_httpHeaderFields.set(name, [headers objectForKey:name]); 89 } else 90 m_httpStatusCode = 0; 91 } 92 93 bool ResourceResponse::platformCompare(const ResourceResponse& a, const ResourceResponse& b) 94 { 95 return a.nsURLResponse() == b.nsURLResponse(); 96 } 97 98 } 99