1/*
2 * Copyright (C) 2021-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#ifndef OHOS_DHCP_CLIENT_PROXY_H
16#define OHOS_DHCP_CLIENT_PROXY_H
17
18#ifdef OHOS_ARCH_LITE
19#include "iproxy_client.h"
20#include "serializer.h"
21#else
22#include "iremote_proxy.h"
23#endif
24#include <string>
25#include "i_dhcp_client.h"
26#include "i_dhcp_client_callback.h"
27#include "inner_api/dhcp_client.h"
28
29namespace OHOS {
30namespace DHCP {
31#ifdef OHOS_ARCH_LITE
32class DhcpClientProxy : public IDhcpClient {
33public:
34    static DhcpClientProxy *GetInstance(void);
35    static void ReleaseInstance(void);
36    explicit DhcpClientProxy();
37#else
38class DhcpClientProxy : public IRemoteProxy<IDhcpClient> {
39public:
40    explicit DhcpClientProxy(const sptr<IRemoteObject> &impl);
41#endif
42    ~DhcpClientProxy();
43
44#ifdef OHOS_ARCH_LITE
45    ErrCode RegisterDhcpClientCallBack(const std::string& ifname,
46        const std::shared_ptr<IDhcpClientCallBack> &callback) override;
47#else
48    ErrCode RegisterDhcpClientCallBack(const std::string& ifname, const sptr<IDhcpClientCallBack> &callback) override;
49#endif
50    ErrCode StartDhcpClient(const std::string& ifname, bool bIpv6) override;
51    ErrCode SetConfiguration(const std::string& ifname, const RouterConfig& config) override;
52    ErrCode StopDhcpClient(const std::string& ifname, bool bIpv6) override;
53    bool IsRemoteDied() override;
54#ifdef OHOS_ARCH_LITE
55    void OnRemoteDied(void);
56private:
57    static DhcpClientProxy *g_instance;
58    IClientProxy *remote_ = nullptr;
59    SvcIdentity svcIdentity_ = { 0 };
60    bool remoteDied_;
61#else
62private:
63    class DhcpClientDeathRecipient : public IRemoteObject::DeathRecipient {
64    public:
65        explicit DhcpClientDeathRecipient(DhcpClientProxy &client) : client_(client) {}
66        ~DhcpClientDeathRecipient() override = default;
67        void OnRemoteDied(const wptr<IRemoteObject> &remote) override
68        {
69            client_.OnRemoteDied(remote);
70        }
71
72    private:
73        DhcpClientProxy &client_;
74    };
75    void OnRemoteDied(const wptr<IRemoteObject> &remoteObject);
76    void RemoveDeathRecipient(void);
77
78    static inline BrokerDelegator<DhcpClientProxy> delegator_;
79    sptr<IRemoteObject> remote_ = nullptr;
80    bool mRemoteDied;
81    std::mutex mutex_;
82    sptr<IRemoteObject::DeathRecipient> deathRecipient_ = nullptr;
83#endif
84};
85}  // namespace DHCP
86}  // namespace OHOS
87#endif
88