bd98629a2281caa231ccd65283224b6f72efd207
[WebKit-https.git] / Source / WebKit2 / Shared / ShareableResource.cpp
1 /*
2  * Copyright (C) 2012 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 "ShareableResource.h"
28
29 #include "ArgumentCoders.h"
30
31 namespace WebKit {
32
33 ShareableResource::Handle::Handle()
34 {
35 }
36
37 void ShareableResource::Handle::encode(CoreIPC::ArgumentEncoder& encoder) const
38 {
39     encoder << m_handle;
40     encoder << m_offset;
41     encoder << m_size;
42 }
43
44 bool ShareableResource::Handle::decode(CoreIPC::ArgumentDecoder* decoder, Handle& handle)
45 {
46     if (!decoder->decode(handle.m_handle))
47         return false;
48     if (!decoder->decode(handle.m_offset))
49         return false;
50     if (!decoder->decode(handle.m_size))
51         return false;
52     return true;
53 }
54     
55 PassRefPtr<ShareableResource> ShareableResource::create(PassRefPtr<SharedMemory> sharedMemory, unsigned offset, unsigned size)
56 {
57     return adoptRef(new ShareableResource(sharedMemory, offset, size));
58 }
59
60 PassRefPtr<ShareableResource> ShareableResource::create(const Handle& handle)
61 {
62     RefPtr<SharedMemory> sharedMemory = SharedMemory::create(handle.m_handle, SharedMemory::ReadOnly);
63     if (!sharedMemory)
64         return 0;
65
66     return create(sharedMemory.release(), handle.m_offset, handle.m_size);
67 }
68
69 ShareableResource::ShareableResource(PassRefPtr<SharedMemory> sharedMemory, unsigned offset, unsigned size)
70     : m_sharedMemory(sharedMemory)
71     , m_offset(offset)
72     , m_size(size)
73 {
74     ASSERT(m_sharedMemory);
75     ASSERT(m_offset + m_size <= m_sharedMemory->size());
76     
77     // FIXME (NetworkProcess): This data was received from another process.  If it is bogus, should we assume that process is compromised and we should kill it?
78 }
79
80 ShareableResource::~ShareableResource()
81 {
82 }
83
84 bool ShareableResource::createHandle(Handle& handle)
85 {
86     if (!m_sharedMemory->createHandle(handle.m_handle, SharedMemory::ReadOnly))
87         return false;
88
89     handle.m_offset = m_offset;
90     handle.m_size = m_size;
91
92     return true;
93 }
94
95 const char* ShareableResource::data() const
96 {
97     return static_cast<const char*>(m_sharedMemory->data()) + m_offset;
98 }
99
100 unsigned ShareableResource::size() const
101 {
102     return m_size;
103 }
104     
105 } // namespace WebKit