diff options
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.cc | 86 |
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 |