Files
overwatch/lib/modules/InputDeviceServices/InputDeviceServices.API.php

143 lines
5.2 KiB
PHP

<?php
$inputserver_sock = null;
$inputserver_ref = null;
$inputclients = null;
$inputserver_sock = null;
class InputDeviceServices
{
function loadInst()
{
static $inst = null;
if ($inst === null) {
$inst = new self;
}
return $inst;
}
function module_loaded()
{
self::API_Register();
return true;
}
function API_Register()
{
apiql::register("!OPEN/!INPUT/!SERVER[json]", "InputDeviceServices::InputServer");
apiql::register("!CLOSE/!INPUT/!SERVER","InputDeviceServices::CloseInputServer");
apiql::register("!CONNECT/!INPUT/!DEVICES[json]", "InputDeviceServices::Connect");
apiql::register("!DISCONNECT/!INPUT/!DEVICES","InputDeviceServices::Disconnect");
}
function CloseInputServer($sql)
{
global $inputserver_ref;
global $inputserver_sock;
$inputserver_sock->shutdown();
$inputserver_ref->terminate();
return true;
}
function InputServer($sql)
{
#echo(var_dump($sql));
global $loop;
global $clients;
global $inputserver_ref;
global $inputserver_sock;
global $inputclients;
$keyboard = $sql['SERVER']['keyboard'];
$mouse = $sql['SERVER']['mouse'];
$inputserver_ref = new React\ChildProcess\Process('exec /opt/uinput-mapper/input-read '.$keyboard.' -G '.$mouse.' -D -C');
$inputserver_ref->on('exit', function($exitCode, $termSignal) use ($clients) {
$ResponseArray = array("response_type"=>"success",
"response_msg"=>"Event server has stopped.",
"event_server_code"=>"EVT_201",
"event_server_status"=>"stopped");
foreach($clients as $client)
{
$client->write(json_encode($ResponseArray)."\r\n");
}
return json_encode($ResponseArray);
});
$inputserver_sock = new React\Socket\Server($loop);
$inputclients = new SplObjectStorage();
$i = 0;
$inputserver_sock->on('connection', function($connection) use ($inputclients, &$i) {
LogEcho("Connection to Event Server.","UINPUT");
$connection->id = ++$i;
$inputclients->attach($connection);
});
$inputserver_sock->listen("5055", "0.0.0.0");
LogEcho("Event server started on port 5055", "UINPUT");
#$loop->addTimer(0.001, function($timer) use ($inputserver_ref) {
#});
$inputserver_ref->start($loop);
$inputserver_ref->stdout->on('data', function($output) {
global $inputclients;
foreach($inputclients as $client)
{
$client->write($output);
}
});
$ResponseArray = array("response_type"=>"success",
"response_msg"=>"Event server started on port 5055",
"event_server_code"=>"EVT_200",
"event_server_port"=>5055,
"event_server_status"=>"started");
return json_encode($ResponseArray);
}
function Connect($sql)
{
$IP = $sql['DEVICES']['host'];
$PORT = $sql['DEVICES']['port'];
global $loop;
global $input_client_process;
global $input_client;
#$client = new steam_socket_client('tcp://'.$IP.":".$PORT);
#$client_connection = new React\Stream\Steam($client, $loop);
$input_client_process = new React\ChildProcess\Process('exec /opt/uinput-mapper/input-create -C');
$input_client_process->start($loop);
$dnsResolverFactory = new React\Dns\Resolver\Factory();
$dns = $dnsResolverFactory->createCached($IP, $loop);
$input_client = new React\SocketClient\Connector($loop, $dns);
$input_client->create($IP, $PORT)->then(function (React\Stream\Stream $stream) {
$stream->on('data', function($data) use ($stream) {
global $input_client_process;
$input_client_process->stdin->write($data);
});
});
#$connection->on('data', function($output) {
# $client_process->stdin->write($output);
#});
$ResponseArray = array("response_type"=>"success",
"response_msg"=>"Successfully connected to Event Server socket.",
"event_server_code"=>"EVT_200C");
return json_encode($ResponseArray);
}
function Disconnect($sql)
{
global $input_client_process;
global $input_client;
$input_client_process->terminate();
#$input_client->end();
$ResponseArray = array("response_type"=>"success",
"response_msg"=>"Successfully disconnected from Event Server socket.",
"event_server_code"=>"EVT_200D");
return json_encode($ResponseArray);
}
}