1 /*
2  * Copyright (C) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "mdns_service_stub.h"
17 
18 #include "net_manager_ext_constants.h"
19 #include "netmgr_ext_log_wrapper.h"
20 
21 namespace OHOS {
22 namespace NetManagerStandard {
MDnsServiceStub()23 MDnsServiceStub::MDnsServiceStub()
24 {
25     memberFuncMap_[static_cast<uint32_t>(MdnsServiceInterfaceCode::CMD_DISCOVER)] =
26         &MDnsServiceStub::OnStartDiscoverService;
27     memberFuncMap_[static_cast<uint32_t>(MdnsServiceInterfaceCode::CMD_STOP_DISCOVER)] =
28         &MDnsServiceStub::OnStopDiscoverService;
29     memberFuncMap_[static_cast<uint32_t>(MdnsServiceInterfaceCode::CMD_REGISTER)] = &MDnsServiceStub::OnRegisterService;
30     memberFuncMap_[static_cast<uint32_t>(MdnsServiceInterfaceCode::CMD_STOP_REGISTER)] =
31         &MDnsServiceStub::OnUnRegisterService;
32     memberFuncMap_[static_cast<uint32_t>(MdnsServiceInterfaceCode::CMD_RESOLVE)] = &MDnsServiceStub::OnResolveService;
33 }
34 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)35 int32_t MDnsServiceStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply,
36                                          MessageOption &option)
37 {
38     NETMGR_EXT_LOG_D("stub call start, code = [%{public}d]", code);
39 
40     if (GetDescriptor() != data.ReadInterfaceToken()) {
41         NETMGR_EXT_LOG_E("descriptor checked fail");
42         return NETMANAGER_EXT_ERR_DESCRIPTOR_MISMATCH;
43     }
44 
45     auto itFunc = memberFuncMap_.find(code);
46     if (itFunc != memberFuncMap_.end()) {
47         auto requestFunc = itFunc->second;
48         if (requestFunc != nullptr) {
49             return (this->*requestFunc)(data, reply);
50         }
51     }
52 
53     NETMGR_EXT_LOG_D("stub default case, need check");
54     return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
55 }
56 
OnRegisterService(MessageParcel & data,MessageParcel & reply)57 int32_t MDnsServiceStub::OnRegisterService(MessageParcel &data, MessageParcel &reply)
58 {
59     sptr<MDnsServiceInfo> serviceInfo = MDnsServiceInfo::Unmarshalling(data);
60     if (!serviceInfo) {
61         NETMGR_EXT_LOG_E("serviceInfo is nullptr");
62         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
63     }
64 
65     NETMGR_EXT_LOG_D("MDnsServiceProxy [%{public}s][%{public}s][%{public}d]", serviceInfo->name.c_str(),
66                      serviceInfo->type.c_str(), serviceInfo->port);
67 
68     sptr<IRemoteObject> remote = data.ReadRemoteObject();
69     if (remote == nullptr) {
70         NETMGR_EXT_LOG_E("remote is nullptr.");
71         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
72     }
73 
74     sptr<IRegistrationCallback> callback = iface_cast<IRegistrationCallback>(remote);
75     if (callback == nullptr) {
76         NETMGR_EXT_LOG_E("iface_cast callback is nullptr.");
77         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
78     }
79 
80     int32_t err = RegisterService(*serviceInfo, callback);
81     NETMGR_EXT_LOG_D("MDnsService::RegisterService return:[%{public}d]", err);
82     if (!reply.WriteInt32(err)) {
83         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
84     }
85     return ERR_NONE;
86 }
87 
OnUnRegisterService(MessageParcel & data,MessageParcel & reply)88 int32_t MDnsServiceStub::OnUnRegisterService(MessageParcel &data, MessageParcel &reply)
89 {
90     sptr<IRemoteObject> remote = data.ReadRemoteObject();
91     if (remote == nullptr) {
92         NETMGR_EXT_LOG_E("remote ptr is nullptr.");
93         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
94     }
95 
96     sptr<IRegistrationCallback> callback = iface_cast<IRegistrationCallback>(remote);
97     if (callback == nullptr) {
98         NETMGR_EXT_LOG_E("iface_cast callback is nullptr.");
99         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
100     }
101 
102     int32_t err = UnRegisterService(callback);
103     NETMGR_EXT_LOG_D("MDnsService::UnRegisterService return:[%{public}d]", err);
104     if (!reply.WriteInt32(err)) {
105         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
106     }
107     return ERR_NONE;
108 }
109 
OnStartDiscoverService(MessageParcel & data,MessageParcel & reply)110 int32_t MDnsServiceStub::OnStartDiscoverService(MessageParcel &data, MessageParcel &reply)
111 {
112     std::string type;
113     if (!data.ReadString(type)) {
114         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
115     }
116 
117     sptr<IRemoteObject> remote = data.ReadRemoteObject();
118     if (remote == nullptr) {
119         NETMGR_EXT_LOG_E("remote ptr is nullptr.");
120         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
121     }
122 
123     sptr<IDiscoveryCallback> callback = iface_cast<IDiscoveryCallback>(remote);
124     if (callback == nullptr) {
125         NETMGR_EXT_LOG_E("iface_cast callback is nullptr.");
126         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
127     }
128 
129     int32_t err = StartDiscoverService(type, callback);
130     NETMGR_EXT_LOG_D("MDnsService::StartDiscoverService :[%{public}d]", err);
131     if (!reply.WriteInt32(err)) {
132         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
133     }
134     return ERR_NONE;
135 }
136 
OnStopDiscoverService(MessageParcel & data,MessageParcel & reply)137 int32_t MDnsServiceStub::OnStopDiscoverService(MessageParcel &data, MessageParcel &reply)
138 {
139     sptr<IRemoteObject> remote = data.ReadRemoteObject();
140     if (remote == nullptr) {
141         NETMGR_EXT_LOG_E("remote ptr is nullptr.");
142         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
143     }
144 
145     sptr<IDiscoveryCallback> callback = iface_cast<IDiscoveryCallback>(remote);
146     if (callback == nullptr) {
147         NETMGR_EXT_LOG_E("iface_cast callback is nullptr.");
148         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
149     }
150 
151     int32_t err = StopDiscoverService(callback);
152     NETMGR_EXT_LOG_D("MDnsService::StopDiscoverService :[%{public}d]", err);
153     if (!reply.WriteInt32(err)) {
154         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
155     }
156     return ERR_NONE;
157 }
158 
OnResolveService(MessageParcel & data,MessageParcel & reply)159 int32_t MDnsServiceStub::OnResolveService(MessageParcel &data, MessageParcel &reply)
160 {
161     NETMGR_EXT_LOG_D("MDnsServiceStub::OnResolveService In");
162     sptr<MDnsServiceInfo> serviceInfo = MDnsServiceInfo::Unmarshalling(data);
163     if (!serviceInfo) {
164         NETMGR_EXT_LOG_E("serviceInfo is nullptr");
165         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
166     }
167 
168     sptr<IRemoteObject> remote = data.ReadRemoteObject();
169     if (remote == nullptr) {
170         NETMGR_EXT_LOG_E("remote ptr is nullptr.");
171         return NETMANAGER_EXT_ERR_READ_DATA_FAIL;
172     }
173 
174     sptr<IResolveCallback> callback = iface_cast<IResolveCallback>(remote);
175     if (callback == nullptr) {
176         NETMGR_EXT_LOG_E("iface_cast callback is nullptr.");
177         return NETMANAGER_EXT_ERR_LOCAL_PTR_NULL;
178     }
179 
180     int32_t err = ResolveService(*serviceInfo, callback);
181     NETMGR_EXT_LOG_D("MDnsService::ResolveService :[%{public}d]", err);
182     if (!reply.WriteInt32(err)) {
183         return NETMANAGER_EXT_ERR_WRITE_REPLY_FAIL;
184     }
185     return ERR_NONE;
186 }
187 } // namespace NetManagerStandard
188 } // namespace OHOS