chore: remove .clangd config, update CMakeLists, Dockerfile, and code

This commit is contained in:
Arthur K. 2025-01-19 14:20:26 +03:00
parent 87a758ecd8
commit d735a356b3
Signed by: wzray
GPG key ID: B97F30FDC4636357
15 changed files with 76 additions and 58 deletions

View file

@ -1,3 +0,0 @@
CompileFlags:
Add: [ -std=c++20, -isystem/usr/lib/gcc/i686-w64-mingw32/12-posix/include/c++, -isystem/usr/lib/gcc/i686-w64-mingw32/12-posix/include/c++/i686-w64-mingw32, -isystem/usr/lib/gcc/i686-w64-mingw32/12-posix/include/c++/backward, -isystem/usr/lib/gcc/i686-w64-mingw32/12-posix/include, -isystem/usr/lib/gcc/i686-w64-mingw32/12-posix/include-fixed, /usr/lib/gcc/i686-w64-mingw32/12-posix/../../../../i686-w64-mingw32/include ]
Compiler: i686-w64-mingw32-g++

View file

@ -9,10 +9,8 @@ add_executable(${PROJECT_NAME}
${sources} ${sources}
) )
if(UNIX)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
target_link_libraries(${PROJECT_NAME} ole32 ws2_32 oleaut32 uuid) target_link_libraries(${PROJECT_NAME} ole32 ws2_32 oleaut32 uuid)
target_link_libraries(${PROJECT_NAME} winpthread -static) target_link_libraries(${PROJECT_NAME} winpthread -static)
endif()
target_include_directories(${PROJECT_NAME} PUBLIC include) target_include_directories(${PROJECT_NAME} PUBLIC include)

View file

@ -16,14 +16,12 @@ ENV WINEPREFIX=/wineprefix \
RUN sed -i 's/main/main contrib/' /etc/apt/sources.list.d/debian.sources && \ RUN sed -i 's/main/main contrib/' /etc/apt/sources.list.d/debian.sources && \
dpkg --add-architecture i386 && apt-get update && \ dpkg --add-architecture i386 && apt-get update && \
apt-get install -y --no-install-recommends \ apt-get install -y --no-install-recommends \
winetricks wine64 wine32:i386 xvfb xauth ca-certificates cabextract && \ wine wine64 wine32:i386 ca-certificates && \
wineboot -i && echo "Sleeping for 15 seconds..." && sleep 15 wineboot -i && echo "Sleeping for 15 seconds..." && sleep 15 && \
apt-get clean && rm -rf /var/lib/apt/lists/*
COPY build/ $WINEPREFIX/drive_c COPY build/ $WINEPREFIX/drive_c
RUN xvfb-run -a winetricks -q mfc42 && \ RUN wine regedit $WINEPREFIX/drive_c/registry.reg && \
wine regedit $WINEPREFIX/drive_c/registry.reg && \
apt remove -y --autoremove --purge xvfb winetricks && \
apt-get clean && rm -rf /var/lib/apt/lists/* && \
mkdir /tmpfs && ln -sf /tmpfs $WINEPREFIX/drive_c/tmpfs && \ mkdir /tmpfs && ln -sf /tmpfs $WINEPREFIX/drive_c/tmpfs && \
echo "Sleeping for 15 seconds" && sleep 15 echo "Sleeping for 15 seconds" && sleep 15
@ -34,4 +32,6 @@ COPY --from=builder /build/promt-puppy.exe .
EXPOSE 80/tcp EXPOSE 80/tcp
VOLUME /cache VOLUME /cache
ENV WINEDEBUG=-all
CMD exec wine promt-puppy.exe CMD exec wine promt-puppy.exe

View file

@ -2,22 +2,26 @@
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <iostream>
#include <mutex> #include <mutex>
#include <string> #include <random>
#include <windows.h>
#include <wingdi.h>
#include "PromtCtlDocument.hpp" #include "PromtCtlDocument.hpp"
#include "PromtFTManager.hpp" #include "PromtFTManager.hpp"
template<typename... T>
static inline void print(T... args) {
((std::cout << args << ' '), ...) << std::endl;
}
static inline std::string random_filename(int len = 65) { static inline std::string random_filename(int len = 65) {
static const char ASCII_PRINTABLE[] = static const char ASCII_PRINTABLE[] = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
std::random_device random_device; std::random_device random_device;
std::mt19937 generator(random_device()); std::mt19937 generator(random_device());
std::uniform_int_distribution distribution(0, static_cast<int>(strlen(ASCII_PRINTABLE) - 1)); std::uniform_int_distribution distribution(0, static_cast<int>(strlen(ASCII_PRINTABLE) - 1));
std::string random_string; std::string random_string;
for (std::size_t i = 0; i < len; ++i) random_string.reserve(len);
for (int i = 0; i < len; ++i)
random_string += ASCII_PRINTABLE[distribution(generator)]; random_string += ASCII_PRINTABLE[distribution(generator)];
return random_string; return random_string;
} }
@ -26,6 +30,19 @@ static const char TMP_FOLDER[] = "C:\\tmpfs\\";
static const auto TMP_IN = TMP_FOLDER + random_filename(); static const auto TMP_IN = TMP_FOLDER + random_filename();
static const auto TMP_OUT = TMP_FOLDER + random_filename(); static const auto TMP_OUT = TMP_FOLDER + random_filename();
static inline auto utf8_to_cp(const char *data) {
int size = MultiByteToWideChar(CP_UTF8, 0, data, -1, 0, 0);
auto wstr = new wchar_t[size];
MultiByteToWideChar(CP_UTF8, 0, data, -1, wstr, size);
size = WideCharToMultiByte(1251, 0, wstr, -1, NULL, 0, 0, 0);
std::string out;
out.resize(size);
WideCharToMultiByte(1251, 0, wstr, -1, out.data(), size, 0, 0);
delete[] wstr;
return out;
}
static inline auto read_file(const std::string &filename) { static inline auto read_file(const std::string &filename) {
char *in_buf = nullptr; char *in_buf = nullptr;
{ {
@ -60,17 +77,16 @@ class WebServer {
std::mutex m_global_lock; std::mutex m_global_lock;
private: private:
int TranslateHtml(const std::string &text, httplib::Response &res) { void TranslateHtml(const std::string &text, httplib::Response &res) {
const auto ft = PromtFTManager::FileType::kHTML; const auto ft = PromtFTManager::FileType::kHTML;
auto direction = m_doc.direction(); auto direction = m_doc.direction();
auto translator = m_ftman.Translator(ft, direction); auto translator = m_ftman.Translator(ft, direction);
{ {
std::ofstream ofs(TMP_IN); std::ofstream ofs(TMP_IN);
ofs << text; ofs << utf8_to_cp(text.c_str());
} }
translator.Translate(TMP_IN, TMP_OUT); translator.Translate(TMP_IN, TMP_OUT);
res.set_content(read_file(TMP_OUT), "text/html"); res.set_content(read_file(TMP_OUT), "text/html");
} }
void TranslateText(const std::string &text, httplib::Response &res) { void TranslateText(const std::string &text, httplib::Response &res) {
@ -87,8 +103,8 @@ class WebServer {
else if (target_dir == "ru-en") else if (target_dir == "ru-en")
m_doc.direction(PromtCtlDocument::Direction::kRusEng); m_doc.direction(PromtCtlDocument::Direction::kRusEng);
else { else {
res.set_content("X-Translation-Direction must be one of: [\"en-ru\", \"ru-en\"]", print("Wrong X-Translation-Direction header:", target_dir);
"text/plain"); res.set_content("X-Translation-Direction must be one of: [\"en-ru\", \"ru-en\"]", "text/plain");
res.status = 400; res.status = 400;
return false; return false;
} }
@ -101,11 +117,11 @@ class WebServer {
void TranslateHandler(const httplib::Request &req, httplib::Response &res) { void TranslateHandler(const httplib::Request &req, httplib::Response &res) {
const std::lock_guard lock(m_global_lock); const std::lock_guard lock(m_global_lock);
if (!SetDirection(req.headers, res)) if (!SetDirection(req.headers, res)) return;
return;
const auto &body = req.body; const auto &body = req.body;
if (body.empty()) { if (body.empty()) {
print("Request with empty body");
res.set_content("Request body must not be empty", "text/plain"); res.set_content("Request body must not be empty", "text/plain");
res.status = 400; res.status = 400;
return; return;
@ -128,7 +144,9 @@ class WebServer {
public: public:
WebServer() { WebServer() {
if (!std::filesystem::exists(TMP_FOLDER)) std::filesystem::create_directory(TMP_FOLDER); if (!std::filesystem::exists(TMP_FOLDER)) std::filesystem::create_directory(TMP_FOLDER);
m_svr.Post("/translate", [this](const httplib::Request &req, httplib::Response &res) { m_svr.Post("/translate", [this](const httplib::Request &req, httplib::Response &res) {
print("Got request!");
TranslateHandler(req, res); TranslateHandler(req, res);
}); });
} }
@ -137,8 +155,8 @@ class WebServer {
stop(); stop();
} }
void listen() { void listen(const char *host = "0.0.0.0", unsigned short port = 80) {
m_svr.listen("0.0.0.0", 80); m_svr.listen(host, port);
} }
void stop() { void stop() {
@ -149,9 +167,10 @@ class WebServer {
}; };
int main() { int main() {
print("Starting...");
CoInitializeEx(NULL, COINIT_MULTITHREADED); CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_NONE, CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, nullptr, EOAC_NONE, nullptr);
RPC_C_IMP_LEVEL_IDENTIFY, nullptr, EOAC_NONE, nullptr);
WebServer ws; WebServer ws;
ws.listen(); ws.listen();

View file

@ -1,9 +1,7 @@
#pragma once #pragma once
#include <string>
#include <windows.h> #include <windows.h>
class COMWrapper { class COMWrapper {
protected: protected:
void Raise(const HRESULT hr, const char *ctx) const; void Raise(const HRESULT hr, const char *ctx) const;

View file

@ -5,13 +5,17 @@
#include "COMWrapper.hpp" #include "COMWrapper.hpp"
class PromtCtlDirection : COMWrapper { class PromtCtlDirection : COMWrapper {
friend class PromtCtlDocument;
public: public:
const void *m_instance = nullptr; const void *m_instance = nullptr;
static constexpr char m_classname[] = "PromtCtlDirection"; static constexpr char m_classname[] = "PromtCtlDirection";
protected:
explicit PromtCtlDirection(const void *instance) : m_instance(instance){};
public: public:
PromtCtlDirection() = delete; PromtCtlDirection() = delete;
explicit PromtCtlDirection(const void *instance) : m_instance(instance){};
~PromtCtlDirection(); ~PromtCtlDirection();
std::wstring Translate(const std::wstring_view src) const; std::wstring Translate(const std::wstring_view src) const;
const char *classname() const override; const char *classname() const override;

View file

@ -3,7 +3,6 @@
#include <windows.h> #include <windows.h>
#include "COMWrapper.hpp" #include "COMWrapper.hpp"
#include "PromtCtlDirection.hpp" #include "PromtCtlDirection.hpp"
#include "PromtFTManager.hpp"
// GUIDs // GUIDs
const GUID CLSID_PromtCtlDocument = {0xbdf7dc81, 0xdaae, 0x11d5, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}}; const GUID CLSID_PromtCtlDocument = {0xbdf7dc81, 0xdaae, 0x11d5, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}};
@ -11,7 +10,6 @@ const GUID CLSID_PromtSvrDirectionsIP = {0x212aae21, 0xdaa2, 0x11d5, {0xb3, 0x92
const GUID IID_IPromtCtlDocument = {0xfd163702, 0x2c47, 0x11d6, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}}; const GUID IID_IPromtCtlDocument = {0xfd163702, 0x2c47, 0x11d6, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}};
const GUID IID_IPromtSvrDirections = {0x67c8f1c1, 0x2c4b, 0x11d6, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}}; const GUID IID_IPromtSvrDirections = {0x67c8f1c1, 0x2c4b, 0x11d6, {0xb3, 0x92, 0x0, 0xe0, 0x29, 0x42, 0x4b, 0x73}};
const GUID IID_IPromtSvrDirectionsIP = {0x67c8f1cf, 0x2c4b, 0x11d6, {0xb3, 0x92, 0x0, 0x0e0, 0x29, 0x42, 0x4b, 0x73}}; const GUID IID_IPromtSvrDirectionsIP = {0x67c8f1cf, 0x2c4b, 0x11d6, {0xb3, 0x92, 0x0, 0x0e0, 0x29, 0x42, 0x4b, 0x73}};
//const GUID IID_IUnknown = {0x0, 0x0, 0x0, {0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46}};
class PromtCtlDocument : COMWrapper { class PromtCtlDocument : COMWrapper {
public: public:

View file

@ -10,8 +10,8 @@ const GUID IID_Inknown2 = {0x0, 0x0, 0x0, {0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0
class PromtFTManager : COMWrapper { class PromtFTManager : COMWrapper {
private: private:
void *mInstance = nullptr; void *m_instance = nullptr;
static constexpr char mClassname[] = "PromtFTManager"; static constexpr char k_classname[] = "PromtFTManager";
public: public:
enum class FileType { kHTML = 130, kRTF = 32 }; enum class FileType { kHTML = 130, kRTF = 32 };
@ -20,5 +20,5 @@ class PromtFTManager : COMWrapper {
PromtFTManager(); PromtFTManager();
~PromtFTManager(); ~PromtFTManager();
PromtFileTranslator Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const; PromtFileTranslator Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const;
const char* classname() const override { return mClassname; }; const char* classname() const override { return k_classname; };
}; };

View file

@ -4,17 +4,21 @@
#include "COMWrapper.hpp" #include "COMWrapper.hpp"
class PromtFileTranslator : COMWrapper { class PromtFileTranslator : COMWrapper {
friend class PromtFTManager;
private: private:
const void *mInstance = nullptr; const void *m_instance = nullptr;
const void *mDirection = nullptr; const void *m_direction = nullptr;
static constexpr char mClassName[] = "PromtFileTranslator"; static constexpr char k_classname[] = "PromtFileTranslator";
protected:
explicit PromtFileTranslator(const void *instance, const void *direction) : m_instance(instance), m_direction(direction) {};
public: public:
PromtFileTranslator() = delete; PromtFileTranslator() = delete;
explicit PromtFileTranslator(const void *instance, const void *direction) : mInstance(instance), mDirection(direction){};
~PromtFileTranslator(); ~PromtFileTranslator();
void Translate(const std::string_view src, const std::string_view dest) const; void Translate(const std::string_view src, const std::string_view dest) const;
const char *classname() const override { const char *classname() const override {
return mClassName; return k_classname;
}; };
}; };

View file

@ -902,6 +902,7 @@ $tempfile = "$env:temp\promt.reg"
foreach ($key in $keys) { foreach ($key in $keys) {
reg export $key $tempfile /y > $null reg export $key $tempfile /y > $null
echo "Exporting `"$key`""
$content = Get-Content -Path $tempfile | Select-Object -Skip 2 $content = Get-Content -Path $tempfile | Select-Object -Skip 2
$dump += ($content -join "`n") + "`n`n" $dump += ($content -join "`n") + "`n`n"
} }

View file

@ -2,13 +2,13 @@
cd "$(basename "$(basename "$(readlink "$0")")")" cd "$(basename "$(basename "$(readlink "$0")")")"
SSH_HOST="${1:?}" SSH_HOST="${1:?Missing SSH host}"
mkdir -p build/{"Program Files (x86)/Common Files",ProgramData} mkdir -p build/{"Program Files (x86)/Common Files",ProgramData}
scp ./scripts/dump_registry.ps1 "$SSH_HOST:" # scp ./scripts/dump_registry.ps1 "$SSH_HOST:"
ssh "$SSH_HOST" ./dump_registry.ps1 # ssh "$SSH_HOST" "powershell .\dump_registry.ps1"
scp "$SSH_HOST:promt-registry.reg" build/registry.reg scp "$SSH_HOST:promt-registry.reg" build/registry.reg
ssh "$SSH_HOST" rm promt-registry.reg ssh "$SSH_HOST" powershell -c 'rm promt-registry.reg'
scp -r "$SSH_HOST:/Program Files (x86)/Common Files/PROject MT" "./build/Program Files (x86)/Common Files/PROject MT" scp -r "$SSH_HOST:/Program Files (x86)/Common Files/PROject MT" "./build/Program Files (x86)/Common Files/PROject MT"
scp -r "$SSH_HOST:/Program Files (x86)/PRMT6" "./build/Program Files (x86)/PRMT6" scp -r "$SSH_HOST:/Program Files (x86)/PRMT6" "./build/Program Files (x86)/PRMT6"

View file

@ -1,7 +1,6 @@
#include "PromtCtlDirection.hpp" #include "PromtCtlDirection.hpp"
#include <string> #include <string>
#include <utility>
#include <windows.h> #include <windows.h>
const char *PromtCtlDirection::classname() const { const char *PromtCtlDirection::classname() const {

View file

@ -1,7 +1,7 @@
#include "PromtCtlDocument.hpp" #include "PromtCtlDocument.hpp"
#include "PromtCtlDirection.hpp"
#include <windows.h> #include <windows.h>
#include "PromtCtlDirection.hpp"
PromtCtlDocument::PromtCtlDocument() { PromtCtlDocument::PromtCtlDocument() {
void *p_unknown = nullptr; void *p_unknown = nullptr;

View file

@ -10,7 +10,7 @@ PromtFTManager::PromtFTManager() {
auto hr = CoCreateInstance(CLSID_PromtFTManager, nullptr, 0x17u, IID_Inknown2, &p_unknown); auto hr = CoCreateInstance(CLSID_PromtFTManager, nullptr, 0x17u, IID_Inknown2, &p_unknown);
Raise(hr, "CoCreateInstance"); Raise(hr, "CoCreateInstance");
hr = (**(HRESULT(__stdcall ***)(LPVOID, const GUID *, LPVOID *)) p_unknown)(p_unknown, &IID_IPromtFTManager, &mInstance); hr = (**(HRESULT(__stdcall ***)(LPVOID, const GUID *, LPVOID *)) p_unknown)(p_unknown, &IID_IPromtFTManager, &m_instance);
Raise(hr, "Create PromtFTManager instance"); Raise(hr, "Create PromtFTManager instance");
Release(p_unknown); Release(p_unknown);
@ -19,12 +19,12 @@ PromtFTManager::PromtFTManager() {
PromtFileTranslator PromtFTManager::Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const { PromtFileTranslator PromtFTManager::Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const {
void *p_translator = nullptr; void *p_translator = nullptr;
VARIANTARG varg{.vt=2, .iVal=(short)ft}; VARIANTARG varg{.vt=2, .iVal=(short)ft};
HRESULT hr = (*(HRESULT(__thiscall **)(void *, void *, VARIANTARG, VARIANTARG, void *))(*(DWORD *) mInstance + 48))( HRESULT hr = (*(HRESULT(__thiscall **)(void *, void *, VARIANTARG, VARIANTARG, void *))(*(DWORD *) m_instance + 48))(
mInstance, mInstance, varg, varg, &p_translator); m_instance, m_instance, varg, varg, &p_translator);
Raise(hr, "Create file translator"); Raise(hr, "Create file translator");
return PromtFileTranslator(p_translator, dir.m_instance); return PromtFileTranslator(p_translator, dir.m_instance);
}; };
PromtFTManager::~PromtFTManager() { PromtFTManager::~PromtFTManager() {
Release(mInstance); Release(m_instance);
} }

View file

@ -6,13 +6,13 @@ void PromtFileTranslator::Translate(const std::string_view source_path, const st
BSTR src = SysAllocString(std::wstring(source_path.begin(), source_path.end()).c_str()); BSTR src = SysAllocString(std::wstring(source_path.begin(), source_path.end()).c_str());
BSTR dest = SysAllocString(std::wstring(dest_path.begin(), dest_path.end()).c_str()); BSTR dest = SysAllocString(std::wstring(dest_path.begin(), dest_path.end()).c_str());
hr = (*(HRESULT(__stdcall **)(const void *, const void *, BSTR, BSTR, VARIANTARG))(*(DWORD *) mInstance + 80))( hr = (*(HRESULT(__stdcall **)(const void *, const void *, BSTR, BSTR, VARIANTARG))(*(DWORD *) m_instance + 80))(
mInstance, mDirection, src, dest, {}); m_instance, m_direction, src, dest, {});
Raise(hr, "yk"); Raise(hr, "yk");
SysFreeString(src); SysFreeString(src);
SysFreeString(dest); SysFreeString(dest);
} }
PromtFileTranslator::~PromtFileTranslator() { PromtFileTranslator::~PromtFileTranslator() {
Release(mInstance); Release(m_instance);
} }