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