Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(185)

Side by Side Diff: mojo/public/bindings/bindings_internal.h

Issue 23913008: C++ bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MOJO_PUBLIC_BINDINGS_BINDINGS_INTERNAL_H_
6 #define MOJO_PUBLIC_BINDINGS_BINDINGS_INTERNAL_H_
7
8 #include <string.h>
9
10 #include <vector>
11
12 #include "mojo/public/bindings/bindings.h"
13
14 namespace mojo {
15 namespace internal {
16
17 void EncodePointer(void* address, uint64_t* offset);
18 uint8_t* DecodePointerRaw(uint64_t* offset);
19
20 template <typename T>
21 inline void DecodePointer(uint64_t* offset, T** ptr) {
22 *ptr = reinterpret_cast<T*>(DecodePointerRaw(offset));
23 }
24
25 bool ValidatePointer(const void* ptr, const Message& message);
26
27 void EncodeHandle(Handle* handle, std::vector<Handle>* handles);
28 bool DecodeHandle(Handle* handle, const std::vector<Handle>& handles);
29
30 template <typename T>
31 inline T* Clone(const T* obj, MessageBuffer* buf) {
32 return obj ? ObjectTraits<T>::Clone(obj, buf) : NULL;
33 }
34
35 template <typename T>
36 inline void EncodePointersAndHandles(T* obj,
37 std::vector<Handle>* handles) {
38 ObjectTraits<T>::EncodePointersAndHandles(obj, handles);
39 }
40
41 template <typename T>
42 inline bool DecodePointersAndHandles(T* obj, const Message& message) {
43 return ObjectTraits<T>::DecodePointersAndHandles(obj, message);
44 }
45
46 template <typename T>
47 inline void Encode(T* obj, std::vector<Handle>* handles) {
48 if (obj->ptr)
49 EncodePointersAndHandles(obj->ptr, handles);
50 EncodePointer(obj->ptr, &obj->offset);
51 }
52
53 template <typename T>
54 inline bool Decode(T* obj, const Message& message) {
55 DecodePointer(&obj->offset, &obj->ptr);
56 if (obj->ptr) {
57 if (!ValidatePointer(obj->ptr, message))
58 return false;
59 if (!DecodePointersAndHandles(obj->ptr, message))
60 return false;
61 }
62 return true;
63 }
64
65 template <typename T>
66 struct ArrayHelper {
67 typedef T ElementType;
68
69 static void CloneElements(MessageBuffer* buf,
70 ArrayHeader* header,
71 ElementType* elements) {
72 }
73
74 static void EncodePointersAndHandles(ArrayHeader* header,
75 ElementType* elements,
76 std::vector<Handle>* handles) {
77 }
78 static bool DecodePointersAndHandles(ArrayHeader* header,
79 ElementType* elements,
80 const Message& message) {
81 return true;
82 }
83 };
84
85 template <>
86 struct ArrayHelper<Handle> {
87 typedef Handle ElementType;
88
89 static void CloneElements(MessageBuffer* buf,
90 ArrayHeader* header,
91 ElementType* elements) {
92 }
93
94 static void EncodePointersAndHandles(ArrayHeader* header,
95 ElementType* elements,
96 std::vector<Handle>* handles) {
97 for (uint32_t i = 0; i < header->num_elements; ++i)
98 EncodeHandle(&elements[i], handles);
99 }
100 static bool DecodePointersAndHandles(ArrayHeader* header,
101 ElementType* elements,
102 const Message& message) {
103 for (uint32_t i = 0; i < header->num_elements; ++i) {
104 if (!DecodeHandle(&elements[i], message.handles))
105 return false;
106 }
107 return true;
108 }
109 };
110
111 template <typename P>
112 struct ArrayHelper<P*> {
113 typedef StructPointer<P> ElementType;
114
115 static void CloneElements(MessageBuffer* buf,
116 ArrayHeader* header,
117 ElementType* elements) {
118 for (uint32_t i = 0; i < header->num_elements; ++i)
119 elements[i].ptr = Clone(elements[i].ptr, buf);
120 }
121
122 static void EncodePointersAndHandles(ArrayHeader* header,
123 ElementType* elements,
124 std::vector<Handle>* handles) {
125 for (uint32_t i = 0; i < header->num_elements; ++i)
126 Encode(&elements[i], handles);
127 }
128 static bool DecodePointersAndHandles(ArrayHeader* header,
129 ElementType* elements,
130 const Message& message) {
131 for (uint32_t i = 0; i < header->num_elements; ++i) {
132 if (!Decode(&elements[i], message))
133 return false;
134 }
135 return true;
136 }
137 };
138
139 template <typename T>
140 class ObjectTraits<Array<T> > {
141 public:
142 static Array<T>* Clone(const Array<T>* array, MessageBuffer* buf) {
143 Array<T>* clone = buf->NewArray<T>(array->header_.num_elements);
144 memcpy(clone, array, array->header_.num_bytes);
145
146 ArrayHelper<T>::CloneElements(buf, &clone->header_, clone->elements_);
147 return clone;
148 }
149
150 static void EncodePointersAndHandles(Array<T>* array,
151 std::vector<Handle>* handles) {
152 ArrayHelper<T>::EncodePointersAndHandles(&array->header_, array->elements_,
153 handles);
154 }
155
156 static bool DecodePointersAndHandles(Array<T>* array,
157 const Message& message) {
158 return ArrayHelper<T>::DecodePointersAndHandles(&array->header_,
159 array->elements_,
160 message);
161 }
162 };
163
164 template <>
165 class ObjectTraits<String> {
166 public:
167 static String* Clone(const String* str, MessageBuffer* buf) {
168 String* clone = buf->NewString(str->size());
169 memcpy(clone, str, str->header_.num_bytes);
170 return clone;
171 }
172
173 static void EncodePointersAndHandles(String* str,
174 std::vector<Handle>* handles) {
175 }
176
177 static bool DecodePointersAndHandles(String* str, const Message& message) {
178 return true;
179 }
180 };
181
182 } // namespace internal
183 } // namespace mojo
184
185 #endif // MOJO_PUBLIC_BINDINGS_BINDINGS_INTERNAL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698