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