Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / mojo / public / cpp / bindings / lib / bindings_serialization.h
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_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_H_
6 #define MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_H_
7
8 #include <vector>
9
10 #include "mojo/public/cpp/bindings/buffer.h"
11 #include "mojo/public/cpp/bindings/message.h"
12
13 namespace mojo {
14 namespace internal {
15
16 size_t Align(size_t size);
17 char* AlignPointer(char* ptr);
18
19 // Pointers are encoded as relative offsets. The offsets are relative to the
20 // address of where the offset value is stored, such that the pointer may be
21 // recovered with the expression:
22 //
23 //   ptr = reinterpret_cast<char*>(offset) + *offset
24 //
25 // A null pointer is encoded as an offset value of 0.
26 //
27 void EncodePointer(const void* ptr, uint64_t* offset);
28 const void* DecodePointerRaw(const uint64_t* offset);
29
30 template <typename T>
31 inline void DecodePointer(const uint64_t* offset, T** ptr) {
32   *ptr = reinterpret_cast<T*>(const_cast<void*>(DecodePointerRaw(offset)));
33 }
34
35 // Check that the given pointer references memory contained within the message.
36 bool ValidatePointer(const void* ptr, const Message& message);
37
38 // Handles are encoded as indices into a vector of handles. These functions
39 // manipulate the value of |handle|, mapping it to and from an index.
40 void EncodeHandle(Handle* handle, std::vector<Handle>* handles);
41 bool DecodeHandle(Handle* handle, std::vector<Handle>* handles);
42
43 // The following 2 functions are used to encode/decode all objects (structs and
44 // arrays) in a consistent manner.
45
46 template <typename T>
47 inline void Encode(T* obj, std::vector<Handle>* handles) {
48   if (obj->ptr)
49     obj->ptr->EncodePointersAndHandles(handles);
50   EncodePointer(obj->ptr, &obj->offset);
51 }
52
53 template <typename T>
54 inline bool Decode(T* obj, Message* message) {
55   DecodePointer(&obj->offset, &obj->ptr);
56   if (obj->ptr) {
57     if (!ValidatePointer(obj->ptr, *message))
58       return false;
59     if (!obj->ptr->DecodePointersAndHandles(message))
60       return false;
61   }
62   return true;
63 }
64
65 }  // namespace internal
66 }  // namespace mojo
67
68 #endif  // MOJO_PUBLIC_CPP_BINDINGS_LIB_BINDINGS_SERIALIZATION_H_