blob: 75fbb0bcbe12d6db8472d0fc4122825db133e83e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ANDROID_SENSORHAL_EXT_CONNECTION_DETECTOR_H
#define ANDROID_SENSORHAL_EXT_CONNECTION_DETECTOR_H
#include "BaseDynamicSensorDaemon.h"
#include <utils/Thread.h>
#include <utils/Looper.h>
#include <regex>
#include <poll.h>
namespace android {
namespace SensorHalExt {
// Abstraction of connection detector: an entity that calls
// BaseDynamicSensorDaemon::onConnectionChange() when necessary.
class ConnectionDetector : virtual public RefBase {
public:
ConnectionDetector(BaseDynamicSensorDaemon *d) : mDaemon(d) { }
virtual ~ConnectionDetector() = default;
virtual void Init() {}
protected:
BaseDynamicSensorDaemon* mDaemon;
};
// Open a socket that listen to localhost:port and notify sensor daemon of connection and
// disconnection event when socket is connected or disconnected, respectively. Only one concurrent
// client is accepted.
class SocketConnectionDetector : public ConnectionDetector, public Thread {
public:
SocketConnectionDetector(BaseDynamicSensorDaemon *d, int port);
virtual ~SocketConnectionDetector();
void Init() override;
private:
// implement virtual of Thread
virtual bool threadLoop();
int waitForConnection();
static void waitForDisconnection(int connFd);
int mListenFd;
std::string mDevice;
};
// Detect file change under path and notify sensor daemon of connection and disconnection event when
// file is created in or removed from the directory, respectively.
class FileConnectionDetector : public ConnectionDetector, public Thread {
public:
FileConnectionDetector(
BaseDynamicSensorDaemon *d, const std::string &path, const std::string ®ex);
virtual ~FileConnectionDetector();
void Init() override;
private:
static constexpr int POLL_IDENT = 1;
// implement virtual of Thread
virtual bool threadLoop();
bool matches(const std::string &name) const;
void processExistingFiles() const;
void handleInotifyData(ssize_t len, const char *data);
bool readInotifyData();
std::string getFullName(const std::string name) const;
std::string mPath;
std::regex mRegex;
sp<Looper> mLooper;
int mInotifyFd;
};
} // namespace SensorHalExt
} // namespace android
#endif // ANDROID_SENSORHAL_EXT_DYNAMIC_SENSOR_DAEMON_H
|