120dc3446dce487436c23a0ed5ce10998c90ee73
[WebKit-https.git] / WebKit2 / Shared / mac / WebCoreArgumentCodersMac.mm
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 "WebCoreArgumentCoders.h"
27
28 namespace CoreIPC {
29
30 static void encodeWithNSKeyedArchiver(ArgumentEncoder* encoder, id rootObject)
31 {
32     NSData *data = [NSKeyedArchiver archivedDataWithRootObject:rootObject];
33     encoder->encodeBytes(static_cast<const uint8_t*>([data bytes]), [data length]);
34 }
35
36 static id decodeWithNSKeyedArchiver(ArgumentDecoder* decoder)
37 {
38     Vector<uint8_t> bytes;
39     if (!decoder->decodeBytes(bytes))
40         return nil;
41
42     RetainPtr<NSData> nsData(AdoptNS, [[NSData alloc] initWithBytesNoCopy:bytes.data() length:bytes.size() freeWhenDone:NO]);
43     return [NSKeyedUnarchiver unarchiveObjectWithData:nsData.get()];
44 }
45
46 void encodeResourceRequest(ArgumentEncoder* encoder, const WebCore::ResourceRequest& resourceRequest)
47 {
48     encodeWithNSKeyedArchiver(encoder, resourceRequest.nsURLRequest());
49 }
50
51 bool decodeResourceRequest(ArgumentDecoder* decoder, WebCore::ResourceRequest& resourceRequest)
52 {
53     NSURLRequest *nsURLRequest = decodeWithNSKeyedArchiver(decoder);
54     if (!nsURLRequest)
55         return false;
56
57     resourceRequest = WebCore::ResourceRequest(nsURLRequest);
58     return true;
59 }
60
61 void encodeResourceResponse(ArgumentEncoder* encoder, const WebCore::ResourceResponse& resourceResponse)
62 {
63     bool responseIsPresent = resourceResponse.nsURLResponse();
64     encoder->encode(responseIsPresent);
65     
66     // FIXME: <rdar://problem/8741799> - We can't use NSKeyedArchiver here.
67     encodeWithNSKeyedArchiver(encoder, resourceResponse.nsURLResponse());
68 }
69
70 bool decodeResourceResponse(ArgumentDecoder* decoder, WebCore::ResourceResponse& resourceResponse)
71 {
72     bool responseIsPresent;
73     decoder->decode(responseIsPresent);
74     
75     // FIXME: <rdar://problem/8741799> - We can't use NSKeyedArchiver here.
76     NSURLResponse *nsURLResponse = decodeWithNSKeyedArchiver(decoder);
77     if (responseIsPresent && !nsURLResponse)
78         return false;
79
80     if (responseIsPresent)
81         resourceResponse = WebCore::ResourceResponse(nsURLResponse);
82
83     return true;
84 }
85
86
87 } // namespace CoreIPC