xref: /aosp_15_r20/external/ot-br-posix/src/dbus/common/dbus_message_helper.cpp (revision 4a64e381480ef79f0532b2421e44e6ee336b8e0d)
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