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 #include "sensor_file_descriptor_listener.h"
17 #include "sensor_agent_type.h"
18 #include "sensor_basic_data_channel.h"
19 #include "sensor_errors.h"
20 #include "sys/socket.h"
21
22 #undef LOG_TAG
23 #define LOG_TAG "SensorFileDescriptorListener"
24
25 namespace OHOS {
26 namespace Sensors {
27 using namespace OHOS::HiviewDFX;
28 using namespace OHOS::AppExecFwk;
29
30 namespace {
31 constexpr int32_t RECEIVE_DATA_SIZE = 100;
32 } // namespace
33
SensorFileDescriptorListener()34 SensorFileDescriptorListener::SensorFileDescriptorListener()
35 {
36 receiveDataBuff_ = new (std::nothrow) SensorData[RECEIVE_DATA_SIZE];
37 CHKPL(receiveDataBuff_);
38 }
39
~SensorFileDescriptorListener()40 SensorFileDescriptorListener::~SensorFileDescriptorListener()
41 {
42 CALL_LOG_ENTER;
43 if (receiveDataBuff_ != nullptr) {
44 delete[] receiveDataBuff_;
45 receiveDataBuff_ = nullptr;
46 }
47 }
48
OnReadable(int32_t fileDescriptor)49 void SensorFileDescriptorListener::OnReadable(int32_t fileDescriptor)
50 {
51 if (fileDescriptor < 0) {
52 SEN_HILOGE("fileDescriptor:%{public}d", fileDescriptor);
53 return;
54 }
55 CHKPV(channel_);
56 if (receiveDataBuff_ == nullptr) {
57 SEN_HILOGE("Receive data buff_ is null");
58 return;
59 }
60 int32_t len =
61 recv(fileDescriptor, receiveDataBuff_, sizeof(SensorData) * RECEIVE_DATA_SIZE, 0);
62 int32_t eventSize = static_cast<int32_t>(sizeof(SensorData));
63 while (len > 0) {
64 int32_t num = len / eventSize;
65 for (int i = 0; i < num; i++) {
66 SensorEvent event = {
67 .sensorTypeId = receiveDataBuff_[i].sensorTypeId,
68 .version = receiveDataBuff_[i].version,
69 .timestamp = receiveDataBuff_[i].timestamp,
70 .option = receiveDataBuff_[i].option,
71 .mode = receiveDataBuff_[i].mode,
72 .data = receiveDataBuff_[i].data,
73 .dataLen = receiveDataBuff_[i].dataLen
74 };
75 channel_->dataCB_(&event, 1, channel_->privateData_);
76 }
77 len = recv(fileDescriptor, receiveDataBuff_, sizeof(SensorData) * RECEIVE_DATA_SIZE, 0);
78 }
79 }
80
SetChannel(SensorDataChannel * channel)81 void SensorFileDescriptorListener::SetChannel(SensorDataChannel *channel)
82 {
83 channel_ = channel;
84 }
85
OnShutdown(int32_t fileDescriptor)86 void SensorFileDescriptorListener::OnShutdown(int32_t fileDescriptor)
87 {
88 if (fileDescriptor < 0) {
89 SEN_HILOGE("Invalid fd:%{public}d", fileDescriptor);
90 }
91 if (receiveDataBuff_ != nullptr) {
92 delete[] receiveDataBuff_;
93 receiveDataBuff_ = nullptr;
94 }
95 CHKPV(channel_);
96 channel_->DestroySensorDataChannel();
97 }
98
OnException(int32_t fileDescriptor)99 void SensorFileDescriptorListener::OnException(int32_t fileDescriptor)
100 {
101 if (fileDescriptor < 0) {
102 SEN_HILOGE("Invalid fd:%{public}d", fileDescriptor);
103 }
104 if (receiveDataBuff_ != nullptr) {
105 delete[] receiveDataBuff_;
106 receiveDataBuff_ = nullptr;
107 }
108 CHKPV(channel_);
109 channel_->DestroySensorDataChannel();
110 }
111 } // namespace Sensors
112 } // namespace OHOS