Message decoding functions should take a MessageDecoder reference
[WebKit-https.git] / Source / WebKit2 / Platform / CoreIPC / ArgumentDecoder.h
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 #ifndef ArgumentDecoder_h
27 #define ArgumentDecoder_h
28
29 #include "ArgumentCoder.h"
30 #include "Attachment.h"
31 #include <wtf/PassOwnPtr.h>
32 #include <wtf/TypeTraits.h>
33 #include <wtf/Vector.h>
34
35 namespace CoreIPC {
36
37 class DataReference;
38     
39 class ArgumentDecoder {
40 public:
41     static PassOwnPtr<ArgumentDecoder> create(const uint8_t* buffer, size_t bufferSize);
42     virtual ~ArgumentDecoder();
43
44     uint64_t destinationID() const { return m_destinationID; }
45
46     bool isInvalid() const { return m_bufferPos > m_bufferEnd; }
47     void markInvalid() { m_bufferPos = m_bufferEnd + 1; }
48
49     bool decodeFixedLengthData(uint8_t*, size_t, unsigned alignment);
50
51     // The data in the data reference here will only be valid for the lifetime of the ArgumentDecoder object.
52     bool decodeVariableLengthByteArray(DataReference&);
53
54     bool decode(bool&);
55     bool decode(uint8_t&);
56     bool decode(uint16_t&);
57     bool decode(uint32_t&);
58     bool decode(uint64_t&);
59     bool decode(int32_t&);
60     bool decode(int64_t&);
61     bool decode(float&);
62     bool decode(double&);
63
64     template<typename T> bool decodeEnum(T& result)
65     {
66         COMPILE_ASSERT(sizeof(T) <= sizeof(uint64_t), enum_type_must_not_be_larger_than_64_bits);
67
68         uint64_t value;
69         if (!decode(value))
70             return false;
71         
72         result = static_cast<T>(value);
73         return true;
74     }
75
76     template<typename T>
77     bool bufferIsLargeEnoughToContain(size_t numElements) const
78     {
79         COMPILE_ASSERT(WTF::IsArithmetic<T>::value, type_must_have_known_encoded_size);
80       
81         if (numElements > std::numeric_limits<size_t>::max() / sizeof(T))
82             return false;
83
84         return bufferIsLargeEnoughToContain(__alignof(T), numElements * sizeof(T));
85     }
86
87     // Generic type decode function.
88     template<typename T> bool decode(T& t)
89     {
90         return ArgumentCoder<T>::decode(*this, t);
91     }
92
93     bool removeAttachment(Attachment&);
94
95 protected:
96     ArgumentDecoder(const uint8_t* buffer, size_t bufferSize, Vector<Attachment>&);
97
98     void initialize(const uint8_t* buffer, size_t bufferSize);
99
100     bool alignBufferPosition(unsigned alignment, size_t size);
101     bool bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const;
102
103 // FIXME: Move m_destinationID to MessageDecoder.
104 protected:
105     uint64_t m_destinationID;
106
107 private:
108     uint8_t* m_allocatedBase;
109     uint8_t* m_buffer;
110     uint8_t* m_bufferPos;
111     uint8_t* m_bufferEnd;
112
113     Vector<Attachment> m_attachments;
114 };
115
116 } // namespace CoreIPC
117
118 #endif // ArgumentDecoder_h