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