Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / ot-br-posix / repo / src / dbus / client / client_error.cpp
1 /*
2  *    Copyright (c) 2020, 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 "client_error.hpp"
30
31 #include "common/code_utils.hpp"
32 #include "dbus/common/dbus_message_helper.hpp"
33
34 #define OTBR_OPENTHREAD_ERROR_PREFIX "io.openthread.Error"
35
36 namespace otbr {
37 namespace DBus {
38
39 static const std::pair<ClientError, const char *> sErrorNames[] = {
40     {ClientError::ERROR_NONE, OTBR_OPENTHREAD_ERROR_PREFIX ".OK"},
41     {ClientError::OT_ERROR_GENERIC, OTBR_OPENTHREAD_ERROR_PREFIX ".Generic"},
42     {ClientError::OT_ERROR_FAILED, OTBR_OPENTHREAD_ERROR_PREFIX ".Failed"},
43     {ClientError::OT_ERROR_DROP, OTBR_OPENTHREAD_ERROR_PREFIX ".Drop"},
44     {ClientError::OT_ERROR_NO_BUFS, OTBR_OPENTHREAD_ERROR_PREFIX ".NoBufs"},
45     {ClientError::OT_ERROR_NO_ROUTE, OTBR_OPENTHREAD_ERROR_PREFIX ".NoRoute"},
46     {ClientError::OT_ERROR_BUSY, OTBR_OPENTHREAD_ERROR_PREFIX ".Busy"},
47     {ClientError::OT_ERROR_PARSE, OTBR_OPENTHREAD_ERROR_PREFIX ".Parse"},
48     {ClientError::OT_ERROR_INVALID_ARGS, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidArgs"},
49     {ClientError::OT_ERROR_SECURITY, OTBR_OPENTHREAD_ERROR_PREFIX ".Security"},
50     {ClientError::OT_ERROR_ADDRESS_QUERY, OTBR_OPENTHREAD_ERROR_PREFIX ".AddressQuery"},
51     {ClientError::OT_ERROR_NO_ADDRESS, OTBR_OPENTHREAD_ERROR_PREFIX ".NoAddress"},
52     {ClientError::OT_ERROR_ABORT, OTBR_OPENTHREAD_ERROR_PREFIX ".Abort"},
53     {ClientError::OT_ERROR_NOT_IMPLEMENTED, OTBR_OPENTHREAD_ERROR_PREFIX ".NotImplemented"},
54     {ClientError::OT_ERROR_INVALID_STATE, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidState"},
55     {ClientError::OT_ERROR_NO_ACK, OTBR_OPENTHREAD_ERROR_PREFIX ".NoAck"},
56     {ClientError::OT_ERROR_CHANNEL_ACCESS_FAILURE, OTBR_OPENTHREAD_ERROR_PREFIX ".ChannelAccessFailure"},
57     {ClientError::OT_ERROR_DETACHED, OTBR_OPENTHREAD_ERROR_PREFIX ".Detached"},
58     {ClientError::OT_ERROR_FCS, OTBR_OPENTHREAD_ERROR_PREFIX ".FcsErr"},
59     {ClientError::OT_ERROR_NO_FRAME_RECEIVED, OTBR_OPENTHREAD_ERROR_PREFIX ".NoFrameReceived"},
60     {ClientError::OT_ERROR_UNKNOWN_NEIGHBOR, OTBR_OPENTHREAD_ERROR_PREFIX ".UnknownNeighbor"},
61     {ClientError::OT_ERROR_INVALID_SOURCE_ADDRESS, OTBR_OPENTHREAD_ERROR_PREFIX ".InvalidSourceAddress"},
62     {ClientError::OT_ERROR_ADDRESS_FILTERED, OTBR_OPENTHREAD_ERROR_PREFIX ".AddressFiltered"},
63     {ClientError::OT_ERROR_DESTINATION_ADDRESS_FILTERED, OTBR_OPENTHREAD_ERROR_PREFIX ".DestinationAddressFiltered"},
64     {ClientError::OT_ERROR_NOT_FOUND, OTBR_OPENTHREAD_ERROR_PREFIX ".NotFound"},
65     {ClientError::OT_ERROR_ALREADY, OTBR_OPENTHREAD_ERROR_PREFIX ".Already"},
66     {ClientError::OT_ERROR_IP6_ADDRESS_CREATION_FAILURE, OTBR_OPENTHREAD_ERROR_PREFIX ".Ipv6AddressCreationFailure"},
67     {ClientError::OT_ERROR_NOT_CAPABLE, OTBR_OPENTHREAD_ERROR_PREFIX ".NotCapable"},
68     {ClientError::OT_ERROR_RESPONSE_TIMEOUT, OTBR_OPENTHREAD_ERROR_PREFIX ".ResponseTimeout"},
69     {ClientError::OT_ERROR_DUPLICATED, OTBR_OPENTHREAD_ERROR_PREFIX ".Duplicated"},
70     {ClientError::OT_ERROR_REASSEMBLY_TIMEOUT, OTBR_OPENTHREAD_ERROR_PREFIX ".ReassemblyTimeout"},
71     {ClientError::OT_ERROR_NOT_TMF, OTBR_OPENTHREAD_ERROR_PREFIX ".NotTmf"},
72     {ClientError::OT_ERROR_NOT_LOWPAN_DATA_FRAME, OTBR_OPENTHREAD_ERROR_PREFIX ".NonLowpanDatatFrame"},
73     {ClientError::OT_ERROR_LINK_MARGIN_LOW, OTBR_OPENTHREAD_ERROR_PREFIX ".LinkMarginLow"},
74 };
75
76 ClientError ConvertFromDBusErrorName(const std::string &aErrorName)
77 {
78     ClientError error = ClientError::ERROR_NONE;
79
80     for (const auto &p : sErrorNames)
81     {
82         if (p.second == aErrorName)
83         {
84             error = static_cast<ClientError>(p.first);
85             break;
86         }
87     }
88     return error;
89 }
90
91 ClientError CheckErrorMessage(DBusMessage *aMessage)
92 {
93     ClientError error = ClientError::ERROR_NONE;
94
95     if (dbus_message_get_type(aMessage) == DBUS_MESSAGE_TYPE_ERROR)
96     {
97         std::string errorMsg;
98         auto        args = std::tie(errorMsg);
99
100         if (dbus_message_get_type(aMessage) == DBUS_MESSAGE_TYPE_ERROR)
101         {
102             error = ConvertFromDBusErrorName(dbus_message_get_error_name(aMessage));
103         }
104         else
105         {
106             VerifyOrExit(DBusMessageToTuple(*aMessage, args) == OTBR_ERROR_NONE, error = ClientError::ERROR_DBUS);
107             error = ConvertFromDBusErrorName(errorMsg);
108         }
109     }
110
111 exit:
112     return error;
113 }
114
115 } // namespace DBus
116 } // namespace otbr