1 /* 2 * Copyright (C) 2010 Apple 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 INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #include "config.h" 27 #include "WebCoreArgumentCoders.h" 28 29 #if USE(CFNETWORK) 30 #include "ArgumentCodersCF.h" 31 #include "PlatformCertificateInfo.h" 32 #include <WebCore/CertificateCFWin.h> 33 #include <WebKitSystemInterface/WebKitSystemInterface.h> 34 #endif 35 36 namespace CoreIPC { 37 38 // FIXME: These coders should really go in a WebCoreArgumentCodersCFNetwork file. 39 40 void encodeResourceRequest(ArgumentEncoder* encoder, const WebCore::ResourceRequest& resourceRequest) 41 { 42 #if USE(CFNETWORK) 43 bool requestIsPresent = resourceRequest.cfURLRequest(); 44 encoder->encode(requestIsPresent); 45 46 if (!requestIsPresent) 47 return; 48 49 RetainPtr<CFDictionaryRef> dictionary(AdoptCF, wkCFURLRequestCreateSerializableRepresentation(resourceRequest.cfURLRequest(), CoreIPC::tokenNullTypeRef())); 50 encode(encoder, dictionary.get()); 51 #endif 52 } 53 54 bool decodeResourceRequest(ArgumentDecoder* decoder, WebCore::ResourceRequest& resourceRequest) 55 { 56 #if USE(CFNETWORK) 57 bool requestIsPresent; 58 if (!decoder->decode(requestIsPresent)) 59 return false; 60 61 if (!requestIsPresent) { 62 resourceRequest = WebCore::ResourceRequest(); 63 return true; 64 } 65 66 RetainPtr<CFDictionaryRef> dictionary; 67 if (!decode(decoder, dictionary)) 68 return false; 69 70 CFURLRequestRef cfURLRequest = wkCFURLRequestCreateFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef()); 71 if (!cfURLRequest) 72 return false; 73 74 resourceRequest = WebCore::ResourceRequest(cfURLRequest); 75 return true; 76 #else 77 return false; 78 #endif 79 } 80 81 void encodeResourceResponse(ArgumentEncoder* encoder, const WebCore::ResourceResponse& resourceResponse) 82 { 83 #if USE(CFNETWORK) 84 bool responseIsPresent = resourceResponse.cfURLResponse(); 85 encoder->encode(responseIsPresent); 86 87 if (!responseIsPresent) 88 return; 89 90 RetainPtr<CFDictionaryRef> dictionary(AdoptCF, wkCFURLResponseCreateSerializableRepresentation(resourceResponse.cfURLResponse(), CoreIPC::tokenNullTypeRef())); 91 encode(encoder, dictionary.get()); 92 #endif 93 } 94 95 bool decodeResourceResponse(ArgumentDecoder* decoder, WebCore::ResourceResponse& resourceResponse) 96 { 97 #if USE(CFNETWORK) 98 bool responseIsPresent; 99 if (!decoder->decode(responseIsPresent)) 100 return false; 101 102 if (!responseIsPresent) { 103 resourceResponse = WebCore::ResourceResponse(); 104 return true; 105 } 106 107 RetainPtr<CFDictionaryRef> dictionary; 108 if (!decode(decoder, dictionary)) 109 return false; 110 111 CFURLResponseRef cfURLResponse = wkCFURLResponseCreateFromSerializableRepresentation(dictionary.get(), CoreIPC::tokenNullTypeRef()); 112 if (!cfURLResponse) 113 return false; 114 115 resourceResponse = WebCore::ResourceResponse(cfURLResponse); 116 return true; 117 #else 118 return false; 119 #endif 120 } 121 122 void encodeResourceError(ArgumentEncoder* encoder, const WebCore::ResourceError& resourceError) 123 { 124 encoder->encode(CoreIPC::In(resourceError.domain(), resourceError.errorCode(), resourceError.failingURL(), resourceError.localizedDescription())); 125 126 #if USE(CFNETWORK) 127 encoder->encode(WebKit::PlatformCertificateInfo(resourceError.certificate())); 128 #endif 129 } 130 131 bool decodeResourceError(ArgumentDecoder* decoder, WebCore::ResourceError& resourceError) 132 { 133 String domain; 134 int errorCode; 135 String failingURL; 136 String localizedDescription; 137 if (!decoder->decode(CoreIPC::Out(domain, errorCode, failingURL, localizedDescription))) 138 return false; 139 140 #if USE(CFNETWORK) 141 WebKit::PlatformCertificateInfo certificate; 142 if (!decoder->decode(certificate)) 143 return false; 144 145 const Vector<PCCERT_CONTEXT> certificateChain = certificate.certificateChain(); 146 if (!certificateChain.isEmpty()) { 147 ASSERT(certificateChain.size() == 1); 148 resourceError = WebCore::ResourceError(domain, errorCode, failingURL, localizedDescription, WebCore::copyCertificateToData(certificateChain.first()).get()); 149 return true; 150 } 151 #endif 152 153 resourceError = WebCore::ResourceError(domain, errorCode, failingURL, localizedDescription); 154 return true; 155 } 156 157 } // namespace CoreIPC 158