1 /*
2 * Copyright (c) 2019, The OpenThread Authors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 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 * 3. Neither the name of the copyright holder nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "dbus/common/dbus_message_helper.hpp"
30
31 namespace otbr {
32 namespace DBus {
33
DbusMessageIterRecurse(DBusMessageIter * aIter,DBusMessageIter * aSubIter,int aType)34 otbrError DbusMessageIterRecurse(DBusMessageIter *aIter, DBusMessageIter *aSubIter, int aType)
35 {
36 otbrError error = OTBR_ERROR_NONE;
37
38 VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == aType, error = OTBR_ERROR_DBUS);
39 dbus_message_iter_recurse(aIter, aSubIter);
40
41 exit:
42 return error;
43 }
44
DBusMessageExtract(DBusMessageIter * aIter,bool & aValue)45 otbrError DBusMessageExtract(DBusMessageIter *aIter, bool &aValue)
46 {
47 otbrError error = OTBR_ERROR_DBUS;
48 dbus_bool_t val;
49
50 VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_BOOLEAN);
51 dbus_message_iter_get_basic(aIter, &val);
52 dbus_message_iter_next(aIter);
53 aValue = (val != 0);
54 error = OTBR_ERROR_NONE;
55
56 exit:
57 return error;
58 }
59
DBusMessageExtract(DBusMessageIter * aIter,int8_t & aValue)60 otbrError DBusMessageExtract(DBusMessageIter *aIter, int8_t &aValue)
61 {
62 otbrError error = OTBR_ERROR_NONE;
63 uint8_t val;
64
65 SuccessOrExit(error = DBusMessageExtract(aIter, val));
66 aValue = static_cast<int8_t>(val);
67 exit:
68 return error;
69 }
70
DBusMessageExtract(DBusMessageIter * aIter,std::string & aValue)71 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::string &aValue)
72 {
73 const char *buf;
74 otbrError error = OTBR_ERROR_NONE;
75
76 VerifyOrExit(dbus_message_iter_get_arg_type(aIter) == DBUS_TYPE_STRING, error = OTBR_ERROR_DBUS);
77 dbus_message_iter_get_basic(aIter, &buf);
78 dbus_message_iter_next(aIter);
79 aValue = buf;
80
81 exit:
82 return error;
83 }
84
DBusMessageExtract(DBusMessageIter * aIter,std::vector<uint8_t> & aValue)85 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint8_t> &aValue)
86 {
87 return DBusMessageExtractPrimitive(aIter, aValue);
88 }
89
DBusMessageExtract(DBusMessageIter * aIter,std::vector<uint16_t> & aValue)90 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint16_t> &aValue)
91 {
92 return DBusMessageExtractPrimitive(aIter, aValue);
93 }
94
DBusMessageExtract(DBusMessageIter * aIter,std::vector<uint32_t> & aValue)95 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint32_t> &aValue)
96 {
97 return DBusMessageExtractPrimitive(aIter, aValue);
98 }
99
DBusMessageExtract(DBusMessageIter * aIter,std::vector<uint64_t> & aValue)100 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<uint64_t> &aValue)
101 {
102 return DBusMessageExtractPrimitive(aIter, aValue);
103 }
104
DBusMessageExtract(DBusMessageIter * aIter,std::vector<int16_t> & aValue)105 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int16_t> &aValue)
106 {
107 return DBusMessageExtractPrimitive(aIter, aValue);
108 }
109
DBusMessageExtract(DBusMessageIter * aIter,std::vector<int32_t> & aValue)110 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int32_t> &aValue)
111 {
112 return DBusMessageExtractPrimitive(aIter, aValue);
113 }
114
DBusMessageExtract(DBusMessageIter * aIter,std::vector<int64_t> & aValue)115 otbrError DBusMessageExtract(DBusMessageIter *aIter, std::vector<int64_t> &aValue)
116 {
117 return DBusMessageExtractPrimitive(aIter, aValue);
118 }
119
DBusMessageEncode(DBusMessageIter * aIter,bool aValue)120 otbrError DBusMessageEncode(DBusMessageIter *aIter, bool aValue)
121 {
122 dbus_bool_t val = aValue ? 1 : 0;
123 otbrError error = OTBR_ERROR_NONE;
124
125 VerifyOrExit(dbus_message_iter_append_basic(aIter, DBUS_TYPE_BOOLEAN, &val), error = OTBR_ERROR_DBUS);
126
127 exit:
128 return error;
129 }
130
DBusMessageEncode(DBusMessageIter * aIter,int8_t aValue)131 otbrError DBusMessageEncode(DBusMessageIter *aIter, int8_t aValue)
132 {
133 return DBusMessageEncode(aIter, static_cast<uint8_t>(aValue));
134 }
135
DBusMessageEncode(DBusMessageIter * aIter,const std::string & aValue)136 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::string &aValue)
137 {
138 otbrError error = OTBR_ERROR_NONE;
139 const char *buf = aValue.c_str();
140
141 VerifyOrExit(dbus_message_iter_append_basic(aIter, DBUS_TYPE_STRING, &buf), error = OTBR_ERROR_DBUS);
142
143 exit:
144 return error;
145 }
146
DBusMessageEncode(DBusMessageIter * aIter,const char * aValue)147 otbrError DBusMessageEncode(DBusMessageIter *aIter, const char *aValue)
148 {
149 otbrError error = OTBR_ERROR_NONE;
150
151 VerifyOrExit(dbus_message_iter_append_basic(aIter, DBUS_TYPE_STRING, &aValue), error = OTBR_ERROR_DBUS);
152 exit:
153 return error;
154 }
155
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<uint8_t> & aValue)156 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<uint8_t> &aValue)
157 {
158 return DBusMessageEncodePrimitive(aIter, aValue);
159 }
160
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<uint16_t> & aValue)161 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<uint16_t> &aValue)
162 {
163 return DBusMessageEncodePrimitive(aIter, aValue);
164 }
165
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<uint32_t> & aValue)166 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<uint32_t> &aValue)
167 {
168 return DBusMessageEncodePrimitive(aIter, aValue);
169 }
170
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<uint64_t> & aValue)171 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<uint64_t> &aValue)
172 {
173 return DBusMessageEncodePrimitive(aIter, aValue);
174 }
175
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<int16_t> & aValue)176 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<int16_t> &aValue)
177 {
178 return DBusMessageEncodePrimitive(aIter, aValue);
179 }
180
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<int32_t> & aValue)181 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<int32_t> &aValue)
182 {
183 return DBusMessageEncodePrimitive(aIter, aValue);
184 }
185
DBusMessageEncode(DBusMessageIter * aIter,const std::vector<int64_t> & aValue)186 otbrError DBusMessageEncode(DBusMessageIter *aIter, const std::vector<int64_t> &aValue)
187 {
188 return DBusMessageEncodePrimitive(aIter, aValue);
189 }
190
IsDBusMessageEmpty(DBusMessage & aMessage)191 bool IsDBusMessageEmpty(DBusMessage &aMessage)
192 {
193 DBusMessageIter iter;
194
195 if (!dbus_message_iter_init(&aMessage, &iter))
196 {
197 return true;
198 }
199 return dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INVALID;
200 }
201
202 } // namespace DBus
203 } // namespace otbr
204