1 // Copyright 2015 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 CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_READ_MACROS_H_
6 #define CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_READ_MACROS_H_
7 
8 // Null out all the macros that need nulling.
9 #include "chrome/common/safe_browsing/ipc_protobuf_message_null_macros.h"
10 
11 // Set up so next include will generate read methods.
12 #undef IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN
13 #undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER
14 #undef IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER
15 #undef IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER
16 #undef IPC_PROTOBUF_MESSAGE_TRAITS_END
17 
18 #define IPC_PROTOBUF_MESSAGE_TRAITS_BEGIN(message_name)                 \
19   template <class P>                                                    \
20   bool ParamTraits<message_name>::ReadParamF(                           \
21       const base::Pickle* m, base::PickleIterator* iter, param_type* p, \
22       void (param_type::*setter_function)(P)) {                         \
23     P value;                                                            \
24     if (!ReadParam(m, iter, &value))                                    \
25       return false;                                                     \
26     (p->*setter_function)(value);                                       \
27     return true;                                                        \
28   }                                                                     \
29   bool ParamTraits<message_name>::Read(                                 \
30       const base::Pickle* m, base::PickleIterator* iter, param_type* p) {
31 #define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_FUNDAMENTAL_MEMBER(name) \
32     {                                                                 \
33       bool is_present;                                                \
34       if (!iter->ReadBool(&is_present))                               \
35         return false;                                                 \
36       if (!is_present)                                                \
37         p->clear_##name();                                            \
38       else if (!ReadParamF(m, iter, p, &param_type::set_##name))      \
39         return false;                                                 \
40     }
41 
42 #define IPC_PROTOBUF_MESSAGE_TRAITS_OPTIONAL_COMPLEX_MEMBER(name)     \
43     {                                                                 \
44       bool is_present;                                                \
45       if (!iter->ReadBool(&is_present))                               \
46         return false;                                                 \
47       if (!is_present)                                                \
48         p->clear_##name();                                            \
49       else if (!ReadParam(m, iter, p->mutable_##name()))              \
50         return false;                                                 \
51     }
52 
53 #define IPC_PROTOBUF_MESSAGE_TRAITS_REPEATED_COMPLEX_MEMBER(name) \
54     if (!ReadParam(m, iter, p->mutable_##name()))                 \
55       return false;
56 
57 #define IPC_PROTOBUF_MESSAGE_TRAITS_END() \
58     return true;                          \
59   }
60 
61 #endif  // CHROME_COMMON_SAFE_BROWSING_PROTOBUF_MESSAGE_READ_MACROS_H_
62