Program Listing for File MainProcess.hpp
↰ Return to documentation for file (include/input/IPC/transmission/MainProcess.hpp)
#pragma once
#include "PDJE_LOG_SETTER.hpp"
#include "ipc_shared_memory.hpp"
#include "PDJE_Buffer.hpp"
#include "PDJE_Input_DataLine.hpp"
#include <filesystem>
#include <functional>
#include <httplib.h>
#include <nlohmann/json.hpp>
#include <optional>
#include <unordered_map>
#ifdef WIN32
#elif defined(__linux__)
#include <sys/socket.h>
#include "pack_ipc.hpp"
#endif
namespace PDJE_IPC {
using nj = nlohmann::json;
struct Importants {
#ifdef WIN32
STARTUPINFOW start_up_info{};
PROCESS_INFORMATION process_info{};
#elif defined(__linux__)
int socket_fd = -1;
int child_fd = -1;
pid_t child_pid = -1;
std::string socket_path =
"/tmp/pdje_input_module_libevdev_socket_path.sock";
#endif
};
class MainProcess {
private:
std::optional<httplib::Client> cli;
Importants imp;
public:
template <typename T, int MEM_PROT_FLAG>
bool
SendIPCSharedMemory(const SharedMem<T, MEM_PROT_FLAG> &mem,
const std::string &mem_path,
const std::string &dataType);
template <typename T>
bool
SendBufferArena(const PDJE_Buffer_Arena<T> &mem);
std::vector<DeviceData>
GetDevices(){
auto res = cli->Get("/lsdev");
std::vector<DeviceData> ddvector;
if(res->status == 200){
nj jj = nj::parse(res->body);
for(const auto& i : jj["body"]){
DeviceData dd;
dd.device_specific_id = i.at("id").get<std::string>();
dd.Name = i.at("name").get<std::string>();
std::string tp = i.at("type").get<std::string>();
if(tp == "KEYBOARD"){
dd.Type = PDJE_Dev_Type::KEYBOARD;
}
else if(tp == "MOUSE"){
dd.Type = PDJE_Dev_Type::MOUSE;
}
else if(tp == "MIDI"){
dd.Type = PDJE_Dev_Type::MIDI;
}
else if(tp == "HID"){
dd.Type = PDJE_Dev_Type::HID;
}
else{
continue;
}
ddvector.push_back(dd);
}
return ddvector;
}else{
critlog("failed to get device. status code: ");
critlog(res->status);
return {};
}
}
bool
QueryConfig(const std::string& dumped_json){
auto res = cli->Post("/config", dumped_json, "application/json");
if(res->status == 200){
return true;
}
else{
critlog(res->body);
return false;
}
}
bool
EndTransmission();
bool
Kill(){
auto res = cli->Get("/kill");
if(res->status == 200){
return true;
}
else{
critlog(res->body);
return false;
}
}
MainProcess(const int port);
~MainProcess();
};
}; // namespace PDJE_IPC
#ifdef WIN32
#include "ipc_Send_Windows.tpp"
#elif defined(__linux__)
#include "ipc_Send_Linux.tpp"
#endif