summaryrefslogtreecommitdiff
path: root/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc')
-rw-r--r--src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc86
1 files changed, 85 insertions, 1 deletions
diff --git a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
index 20dc059385..1429a57e9e 100644
--- a/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
+++ b/src/components/transport_manager/src/iap2_emulation/iap2_transport_adapter.cc
@@ -32,6 +32,21 @@
#include "transport_manager/iap2_emulation/iap2_transport_adapter.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include "utils/threads/thread.h"
+#include "utils/file_system.h"
+
+namespace {
+mode_t mode = 0666;
+const auto in_signals_channel = "iap_signals_in";
+const auto out_signals_channel = "iap_signals_out";
+} // namespace
+
namespace transport_manager {
namespace transport_adapter {
@@ -58,17 +73,86 @@ IAP2USBEmulationTransportAdapter::IAP2USBEmulationTransportAdapter(
const uint16_t port,
resumption::LastState& last_state,
const TransportManagerSettings& settings)
- : TcpTransportAdapter(port, last_state, settings) {}
+ : TcpTransportAdapter(port, last_state, settings), out_(0) {
+ auto delegate = new IAPSignalHandlerDelegate(this);
+ signal_handler_ =
+ threads::CreateThread("iAP signal handler", delegate);
+ signal_handler_->start();
+ LOG4CXX_DEBUG(logger_, "Out signals channel creation result: "
+ << mkfifo(out_signals_channel, mode));
+}
+
+IAP2USBEmulationTransportAdapter::~IAP2USBEmulationTransportAdapter() {
+ signal_handler_->join();
+ threads::DeleteThread(signal_handler_);
+ LOG4CXX_DEBUG(logger_, "Out close result: " << close(out_));
+ LOG4CXX_DEBUG(logger_, "Out unlink result: " << unlink(out_signals_channel));
+}
void IAP2USBEmulationTransportAdapter::DeviceSwitched(
const DeviceUID& device_handle) {
LOG4CXX_AUTO_TRACE(logger_);
UNUSED(device_handle);
+ const auto switch_signal_ack = std::string("SDL_TRANSPORT_SWITCH_ACK\n");
+
+ auto out_ = open(out_signals_channel, O_WRONLY);
+ LOG4CXX_DEBUG(logger_, "Out channel descriptor: " << out_);
+
+ const auto bytes =
+ write(out_, switch_signal_ack.c_str(), switch_signal_ack.size());
+ LOG4CXX_DEBUG(logger_, "Written bytes to out: " << bytes);
+
+ LOG4CXX_DEBUG(logger_, "Switching signal ACK is sent");
LOG4CXX_DEBUG(logger_, "iAP2 USB device is switched with iAP2 Bluetooth");
}
DeviceType IAP2USBEmulationTransportAdapter::GetDeviceType() const {
return IOS_USB;
}
+
+IAP2USBEmulationTransportAdapter::
+IAPSignalHandlerDelegate::IAPSignalHandlerDelegate(
+ IAP2USBEmulationTransportAdapter* adapter)
+ : adapter_(adapter),
+ run_flag_(true),
+ in_(0) {
+ LOG4CXX_DEBUG(logger_, "In signals channel creation result: "
+ << mkfifo(in_signals_channel, mode));
+}
+
+void IAP2USBEmulationTransportAdapter::IAPSignalHandlerDelegate::threadMain() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(logger_, "Signal handling is started");
+ const auto switch_signal = "SDL_TRANSPORT_SWITCH";
+ LOG4CXX_DEBUG(logger_, "Waiting for signal: " << switch_signal);
+
+ in_ = open(in_signals_channel, O_RDONLY);
+ LOG4CXX_DEBUG(logger_, "In channel descriptor: " << in_);
+
+ const auto size = 32;
+ while (run_flag_) {
+ char buffer[size];
+ auto bytes = read(in_, &buffer, size);
+ if (!bytes) {
+ continue;
+ }
+ LOG4CXX_DEBUG(logger_, "Read in bytes: " << bytes);
+ std::string str(buffer);
+ if (std::string::npos != str.find(switch_signal)) {
+ LOG4CXX_DEBUG(logger_, "Switch signal received.");
+ adapter_->DoTransportSwitch();
+ }
+ }
+}
+
+void IAP2USBEmulationTransportAdapter::
+IAPSignalHandlerDelegate::exitThreadMain() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ LOG4CXX_DEBUG(logger_, "Stopping signal handling.");
+ run_flag_ = false;
+ LOG4CXX_DEBUG(logger_, "In close result: " << close(in_));
+ LOG4CXX_DEBUG(logger_, "In unlink result: " << unlink(in_signals_channel));
+}
+
}
} // namespace transport_manager::transport_adapter