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