• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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