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
16 #include "sensor_data_channel.h"
17
18 #include "errors.h"
19
20 #include "fd_listener.h"
21 #include "sensor_errors.h"
22 #include "sensor_file_descriptor_listener.h"
23
24 #undef LOG_TAG
25 #define LOG_TAG "SensorDataChannel"
26 namespace OHOS {
27 namespace Sensors {
28 using namespace OHOS::HiviewDFX;
29 using namespace OHOS::AppExecFwk;
30
CreateSensorDataChannel(DataChannelCB callBack,void * data)31 int32_t SensorDataChannel::CreateSensorDataChannel(DataChannelCB callBack, void *data)
32 {
33 CHKPR(callBack, SENSOR_NATIVE_REGSITER_CB_ERR);
34 dataCB_ = callBack;
35 privateData_ = data;
36 return InnerSensorDataChannel();
37 }
38
RestoreSensorDataChannel()39 int32_t SensorDataChannel::RestoreSensorDataChannel()
40 {
41 CHKPR(dataCB_, SENSOR_NATIVE_REGSITER_CB_ERR);
42 if (GetReceiveDataFd() != -1) {
43 SEN_HILOGW("Restore sensor data channel failed, please destroy sensor data channel first");
44 return SENSOR_CHANNEL_RESTORE_FD_ERR;
45 }
46 return InnerSensorDataChannel();
47 }
48
InnerSensorDataChannel()49 int32_t SensorDataChannel::InnerSensorDataChannel()
50 {
51 std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
52 // create basic data channel
53 int32_t ret = CreateSensorBasicChannel();
54 if (ret != ERR_OK) {
55 SEN_HILOGE("Create basic channel failed, ret:%{public}d", ret);
56 return ret;
57 }
58 auto listener = std::make_shared<SensorFileDescriptorListener>();
59 listener->SetChannel(this);
60 if (eventHandler_ == nullptr) {
61 auto myRunner = AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT);
62 CHKPR(myRunner, ERROR);
63 eventHandler_ = std::make_shared<SensorEventHandler>(myRunner);
64 }
65 int32_t receiveFd = GetReceiveDataFd();
66 auto inResult = eventHandler_->AddFileDescriptorListener(receiveFd,
67 AppExecFwk::FILE_DESCRIPTOR_INPUT_EVENT, listener, "SensorTask");
68 if (inResult != 0) {
69 SEN_HILOGE("AddFileDescriptorListener fail");
70 return ERROR;
71 }
72 auto pairRet = listenedFdSet_.insert(receiveFd);
73 if (!pairRet.second) {
74 SEN_HILOGE("ListenedFdSet insert fd fail, fd:%{public}d", receiveFd);
75 return ERROR;
76 }
77 return ERR_OK;
78 }
79
DestroySensorDataChannel()80 int32_t SensorDataChannel::DestroySensorDataChannel()
81 {
82 DelFdListener(GetReceiveDataFd());
83 return DestroySensorBasicChannel();
84 }
85
~SensorDataChannel()86 SensorDataChannel::~SensorDataChannel()
87 {
88 DestroySensorDataChannel();
89 }
90
AddFdListener(int32_t fd,ReceiveMessageFun receiveMessage,DisconnectFun disconnect)91 int32_t SensorDataChannel::AddFdListener(int32_t fd, ReceiveMessageFun receiveMessage, DisconnectFun disconnect)
92 {
93 receiveMessage_ = receiveMessage;
94 disconnect_ = disconnect;
95 std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
96 if (eventHandler_ == nullptr) {
97 auto myRunner = AppExecFwk::EventRunner::Create(true, AppExecFwk::ThreadMode::FFRT);
98 CHKPR(myRunner, ERROR);
99 eventHandler_ = std::make_shared<SensorEventHandler>(myRunner);
100 }
101 auto listener = std::make_shared<FdListener>();
102 listener->SetChannel(this);
103 auto errCode = eventHandler_->AddFileDescriptorListener(fd, AppExecFwk::FILE_DESCRIPTOR_INPUT_EVENT, listener,
104 "SensorTask");
105 if (errCode != ERR_OK) {
106 SEN_HILOGE("Add fd listener failed, fd:%{public}d, errCode:%{public}u", fd, errCode);
107 return ERROR;
108 }
109 auto pairRet = listenedFdSet_.insert(fd);
110 if (!pairRet.second) {
111 SEN_HILOGE("ListenedFdSet insert fd fail, fd:%{public}d", fd);
112 return ERROR;
113 }
114 return ERR_OK;
115 }
116
DelFdListener(int32_t fd)117 int32_t SensorDataChannel::DelFdListener(int32_t fd)
118 {
119 std::lock_guard<std::mutex> eventRunnerLock(eventRunnerMutex_);
120 CHKPR(eventHandler_, ERROR);
121 eventHandler_->RemoveFileDescriptorListener(fd);
122 auto it = listenedFdSet_.find(fd);
123 if (it == listenedFdSet_.end()) {
124 SEN_HILOGE("ListenedFdSet not find fd, fd:%{public}d", fd);
125 return ERROR;
126 }
127 listenedFdSet_.erase(it);
128 if (listenedFdSet_.empty() && eventHandler_ != nullptr) {
129 eventHandler_ = nullptr;
130 SEN_HILOGD("Set eventHandler_ nullptr");
131 }
132 return ERR_OK;
133 }
134
GetReceiveMessageFun() const135 ReceiveMessageFun SensorDataChannel::GetReceiveMessageFun() const
136 {
137 return receiveMessage_;
138 }
139
GetDisconnectFun() const140 DisconnectFun SensorDataChannel::GetDisconnectFun() const
141 {
142 return disconnect_;
143 }
144 } // namespace Sensors
145 } // namespace OHOS
146