• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 #ifndef DISTRIBUTEDDATAFWK_SRC_SOFTBUS_ADAPTER_H
17 #define DISTRIBUTEDDATAFWK_SRC_SOFTBUS_ADAPTER_H
18 #include <concurrent_map.h>
19 #include <condition_variable>
20 #include <functional>
21 #include <map>
22 #include <memory>
23 #include <mutex>
24 #include <set>
25 #include <tuple>
26 #include <vector>
27 
28 #include "app_data_change_listener.h"
29 #include "block_data.h"
30 #include "task_scheduler.h"
31 #include "platform_specific.h"
32 #include "session.h"
33 #include "softbus_bus_center.h"
34 namespace OHOS {
35 namespace AppDistributedKv {
36 class SoftBusAdapter {
37 public:
38     SoftBusAdapter();
39     ~SoftBusAdapter();
40     static std::shared_ptr<SoftBusAdapter> GetInstance();
41 
42     static std::string ToBeAnonymous(const std::string &name);
43 
44     // add DataChangeListener to watch data change;
45     Status StartWatchDataChange(const AppDataChangeListener *observer, const PipeInfo &pipeInfo);
46 
47     // stop DataChangeListener to watch data change;
48     Status StopWatchDataChange(const AppDataChangeListener *observer, const PipeInfo &pipeInfo);
49 
50     // Send data to other device, function will be called back after sent to notify send result.
51     Status SendData(const PipeInfo &pipeInfo, const DeviceId &deviceId, const uint8_t *data, int size,
52         const MessageInfo &info);
53 
54     bool IsSameStartedOnPeer(const struct PipeInfo &pipeInfo, const struct DeviceId &peer);
55 
56     void SetMessageTransFlag(const PipeInfo &pipeInfo, bool flag);
57 
58     int CreateSessionServerAdapter(const std::string &sessionName);
59 
60     int RemoveSessionServerAdapter(const std::string &sessionName) const;
61 
62     std::string DeleteSession(int32_t connId);
63 
64     void NotifyDataListeners(const uint8_t *data, int size, const std::string &deviceId, const PipeInfo &pipeInfo);
65 
66     int32_t GetSessionStatus(int32_t connId);
67 
68     void OnSessionOpen(int32_t connId, int32_t status);
69 
70     void OnSessionClose(int32_t connId);
71 
72     int32_t Broadcast(const PipeInfo &pipeInfo, uint16_t mask);
73     void OnBroadcast(const DeviceId &device, uint16_t mask);
74     int32_t ListenBroadcastMsg(const PipeInfo &pipeInfo, std::function<void(const std::string &, uint16_t)> listener);
75 
76     uint32_t GetMtuSize(const DeviceId &deviceId);
77 private:
78 
79     struct ConnectInfo {
80         int32_t connId = INVALID_CONNECT_ID;
81         uint32_t idleCount = 0;
82         bool hasReconnect = false;
83         std::string deviceId;
84         uint32_t mtu = DEFAULT_MTU_SIZE;
85     };
86     std::shared_ptr<BlockData<int32_t>> GetSemaphore(int32_t connId);
87     uint32_t GetConnectMtuSize(int32_t connId);
88     Status GetConnect(const PipeInfo &pipeInfo, const DeviceId &deviceId, int32_t dataSize, int32_t &connId);
89     Status OpenConnect(const PipeInfo &pipeInfo, const DeviceId &deviceId, const std::vector <LinkType> &linkTypes,
90         int32_t &connId);
91     void InitSessionAttribute(const std::vector <LinkType> &linkTypes, SessionAttribute &attr);
92     std::function<void()> CloseIdleConnect();
93     std::shared_ptr<std::recursive_mutex> GetMutex(const PipeInfo &pipeInfo, const DeviceId &deviceId);
94 
95     static std::shared_ptr<SoftBusAdapter> instance_;
96     ConcurrentMap<std::string, const AppDataChangeListener *> dataChangeListeners_{};
97     ConcurrentMap<std::string, ConnectInfo> connects_{};
98     bool flag_ = true; // only for br flag
99     ISessionListener sessionListener_{};
100     std::mutex statusMutex_{};
101     std::map<int32_t, std::shared_ptr<BlockData<int32_t>>> sessionsStatus_;
102     std::function<void(const std::string &, uint16_t)> onBroadcast_;
103     TaskScheduler scheduler_ { 1 };
104     bool schedulerRunning_ = true;
105     static constexpr uint32_t CONNECT_IDLE_CLOSE_COUNT = 10;
106     static constexpr int32_t INVALID_CONNECT_ID = -1;
107     static constexpr uint32_t DEFAULT_MTU_SIZE = 4096;
108     std::mutex mutex_ {};
109     std::map<std::string, std::shared_ptr<std::recursive_mutex>> mutexes_;
110 };
111 } // namespace AppDistributedKv
112 } // namespace OHOS
113 #endif /* DISTRIBUTEDDATAFWK_SRC_SOFTBUS_ADAPTER_H */
114