From d735a356b393c76142ea052b600df8cd29ff1349 Mon Sep 17 00:00:00 2001 From: "Arthur K." Date: Sun, 19 Jan 2025 14:20:26 +0300 Subject: [PATCH] chore: remove .clangd config, update CMakeLists, Dockerfile, and code --- puppy/.clangd | 3 -- puppy/CMakeLists.txt | 8 ++-- puppy/Dockerfile | 12 +++--- puppy/app/main.cpp | 53 ++++++++++++++++++--------- puppy/include/COMWrapper.hpp | 2 - puppy/include/PromtCtlDirection.hpp | 6 ++- puppy/include/PromtCtlDocument.hpp | 2 - puppy/include/PromtFTManager.hpp | 6 +-- puppy/include/PromtFileTranslator.hpp | 16 +++++--- puppy/scripts/dump_registry.ps1 | 1 + puppy/scripts/prepare_envirionment.sh | 8 ++-- puppy/src/PromtCtlDirection.cpp | 1 - puppy/src/PromtCtlDocument.cpp | 2 +- puppy/src/PromtFTManager.cpp | 8 ++-- puppy/src/PromtFileTranslator.cpp | 6 +-- 15 files changed, 76 insertions(+), 58 deletions(-) delete mode 100644 puppy/.clangd diff --git a/puppy/.clangd b/puppy/.clangd deleted file mode 100644 index 08c7de2..0000000 --- a/puppy/.clangd +++ /dev/null @@ -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++ diff --git a/puppy/CMakeLists.txt b/puppy/CMakeLists.txt index e6f88a9..89a586e 100644 --- a/puppy/CMakeLists.txt +++ b/puppy/CMakeLists.txt @@ -9,10 +9,8 @@ add_executable(${PROJECT_NAME} ${sources} ) -if(UNIX) - set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") - target_link_libraries(${PROJECT_NAME} ole32 ws2_32 oleaut32 uuid) - target_link_libraries(${PROJECT_NAME} winpthread -static) -endif() +set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") +target_link_libraries(${PROJECT_NAME} ole32 ws2_32 oleaut32 uuid) +target_link_libraries(${PROJECT_NAME} winpthread -static) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/puppy/Dockerfile b/puppy/Dockerfile index 6c9a576..dab8e62 100644 --- a/puppy/Dockerfile +++ b/puppy/Dockerfile @@ -16,14 +16,12 @@ ENV WINEPREFIX=/wineprefix \ RUN sed -i 's/main/main contrib/' /etc/apt/sources.list.d/debian.sources && \ dpkg --add-architecture i386 && apt-get update && \ apt-get install -y --no-install-recommends \ - winetricks wine64 wine32:i386 xvfb xauth ca-certificates cabextract && \ - wineboot -i && echo "Sleeping for 15 seconds..." && sleep 15 + wine wine64 wine32:i386 ca-certificates && \ + wineboot -i && echo "Sleeping for 15 seconds..." && sleep 15 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* COPY build/ $WINEPREFIX/drive_c -RUN xvfb-run -a winetricks -q mfc42 && \ - wine regedit $WINEPREFIX/drive_c/registry.reg && \ - apt remove -y --autoremove --purge xvfb winetricks && \ - apt-get clean && rm -rf /var/lib/apt/lists/* && \ +RUN wine regedit $WINEPREFIX/drive_c/registry.reg && \ mkdir /tmpfs && ln -sf /tmpfs $WINEPREFIX/drive_c/tmpfs && \ echo "Sleeping for 15 seconds" && sleep 15 @@ -34,4 +32,6 @@ COPY --from=builder /build/promt-puppy.exe . EXPOSE 80/tcp VOLUME /cache +ENV WINEDEBUG=-all + CMD exec wine promt-puppy.exe diff --git a/puppy/app/main.cpp b/puppy/app/main.cpp index d0db4b1..b1652f0 100644 --- a/puppy/app/main.cpp +++ b/puppy/app/main.cpp @@ -2,22 +2,26 @@ #include #include +#include #include -#include -#include -#include +#include #include "PromtCtlDocument.hpp" #include "PromtFTManager.hpp" +template +static inline void print(T... args) { + ((std::cout << args << ' '), ...) << std::endl; +} + static inline std::string random_filename(int len = 65) { - static const char ASCII_PRINTABLE[] = - "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + static const char ASCII_PRINTABLE[] = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; std::random_device random_device; std::mt19937 generator(random_device()); std::uniform_int_distribution distribution(0, static_cast(strlen(ASCII_PRINTABLE) - 1)); 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)]; 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_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) { char *in_buf = nullptr; { @@ -60,17 +77,16 @@ class WebServer { std::mutex m_global_lock; 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; auto direction = m_doc.direction(); auto translator = m_ftman.Translator(ft, direction); { std::ofstream ofs(TMP_IN); - ofs << text; + ofs << utf8_to_cp(text.c_str()); } translator.Translate(TMP_IN, TMP_OUT); res.set_content(read_file(TMP_OUT), "text/html"); - } void TranslateText(const std::string &text, httplib::Response &res) { @@ -87,8 +103,8 @@ class WebServer { else if (target_dir == "ru-en") m_doc.direction(PromtCtlDocument::Direction::kRusEng); else { - res.set_content("X-Translation-Direction must be one of: [\"en-ru\", \"ru-en\"]", - "text/plain"); + print("Wrong X-Translation-Direction header:", target_dir); + res.set_content("X-Translation-Direction must be one of: [\"en-ru\", \"ru-en\"]", "text/plain"); res.status = 400; return false; } @@ -101,11 +117,11 @@ class WebServer { void TranslateHandler(const httplib::Request &req, httplib::Response &res) { const std::lock_guard lock(m_global_lock); - if (!SetDirection(req.headers, res)) - return; + if (!SetDirection(req.headers, res)) return; const auto &body = req.body; if (body.empty()) { + print("Request with empty body"); res.set_content("Request body must not be empty", "text/plain"); res.status = 400; return; @@ -128,7 +144,9 @@ class WebServer { public: WebServer() { if (!std::filesystem::exists(TMP_FOLDER)) std::filesystem::create_directory(TMP_FOLDER); + m_svr.Post("/translate", [this](const httplib::Request &req, httplib::Response &res) { + print("Got request!"); TranslateHandler(req, res); }); } @@ -137,8 +155,8 @@ class WebServer { stop(); } - void listen() { - m_svr.listen("0.0.0.0", 80); + void listen(const char *host = "0.0.0.0", unsigned short port = 80) { + m_svr.listen(host, port); } void stop() { @@ -149,9 +167,10 @@ class WebServer { }; int main() { + print("Starting..."); + CoInitializeEx(NULL, COINIT_MULTITHREADED); - CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_NONE, - RPC_C_IMP_LEVEL_IDENTIFY, nullptr, EOAC_NONE, nullptr); + CoInitializeSecurity(nullptr, -1, nullptr, nullptr, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, nullptr, EOAC_NONE, nullptr); WebServer ws; ws.listen(); diff --git a/puppy/include/COMWrapper.hpp b/puppy/include/COMWrapper.hpp index 3d1d16e..ae9111c 100644 --- a/puppy/include/COMWrapper.hpp +++ b/puppy/include/COMWrapper.hpp @@ -1,9 +1,7 @@ #pragma once -#include #include - class COMWrapper { protected: void Raise(const HRESULT hr, const char *ctx) const; diff --git a/puppy/include/PromtCtlDirection.hpp b/puppy/include/PromtCtlDirection.hpp index cfda36d..9d1d74c 100644 --- a/puppy/include/PromtCtlDirection.hpp +++ b/puppy/include/PromtCtlDirection.hpp @@ -5,13 +5,17 @@ #include "COMWrapper.hpp" class PromtCtlDirection : COMWrapper { + friend class PromtCtlDocument; + public: const void *m_instance = nullptr; static constexpr char m_classname[] = "PromtCtlDirection"; + protected: + explicit PromtCtlDirection(const void *instance) : m_instance(instance){}; + public: PromtCtlDirection() = delete; - explicit PromtCtlDirection(const void *instance) : m_instance(instance){}; ~PromtCtlDirection(); std::wstring Translate(const std::wstring_view src) const; const char *classname() const override; diff --git a/puppy/include/PromtCtlDocument.hpp b/puppy/include/PromtCtlDocument.hpp index 1a7aeb5..15526b8 100644 --- a/puppy/include/PromtCtlDocument.hpp +++ b/puppy/include/PromtCtlDocument.hpp @@ -3,7 +3,6 @@ #include #include "COMWrapper.hpp" #include "PromtCtlDirection.hpp" -#include "PromtFTManager.hpp" // GUIDs 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_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_IUnknown = {0x0, 0x0, 0x0, {0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46}}; class PromtCtlDocument : COMWrapper { public: diff --git a/puppy/include/PromtFTManager.hpp b/puppy/include/PromtFTManager.hpp index 780237e..e7206eb 100644 --- a/puppy/include/PromtFTManager.hpp +++ b/puppy/include/PromtFTManager.hpp @@ -10,8 +10,8 @@ const GUID IID_Inknown2 = {0x0, 0x0, 0x0, {0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0 class PromtFTManager : COMWrapper { private: - void *mInstance = nullptr; - static constexpr char mClassname[] = "PromtFTManager"; + void *m_instance = nullptr; + static constexpr char k_classname[] = "PromtFTManager"; public: enum class FileType { kHTML = 130, kRTF = 32 }; @@ -20,5 +20,5 @@ class PromtFTManager : COMWrapper { PromtFTManager(); ~PromtFTManager(); PromtFileTranslator Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const; - const char* classname() const override { return mClassname; }; + const char* classname() const override { return k_classname; }; }; diff --git a/puppy/include/PromtFileTranslator.hpp b/puppy/include/PromtFileTranslator.hpp index f947ae9..6b411e1 100644 --- a/puppy/include/PromtFileTranslator.hpp +++ b/puppy/include/PromtFileTranslator.hpp @@ -4,17 +4,21 @@ #include "COMWrapper.hpp" class PromtFileTranslator : COMWrapper { + friend class PromtFTManager; + private: - const void *mInstance = nullptr; - const void *mDirection = nullptr; - static constexpr char mClassName[] = "PromtFileTranslator"; + const void *m_instance = nullptr; + const void *m_direction = nullptr; + static constexpr char k_classname[] = "PromtFileTranslator"; + + protected: + explicit PromtFileTranslator(const void *instance, const void *direction) : m_instance(instance), m_direction(direction) {}; public: PromtFileTranslator() = delete; - explicit PromtFileTranslator(const void *instance, const void *direction) : mInstance(instance), mDirection(direction){}; ~PromtFileTranslator(); void Translate(const std::string_view src, const std::string_view dest) const; - const char* classname() const override { - return mClassName; + const char *classname() const override { + return k_classname; }; }; diff --git a/puppy/scripts/dump_registry.ps1 b/puppy/scripts/dump_registry.ps1 index 0e9c114..e8becfa 100644 --- a/puppy/scripts/dump_registry.ps1 +++ b/puppy/scripts/dump_registry.ps1 @@ -902,6 +902,7 @@ $tempfile = "$env:temp\promt.reg" foreach ($key in $keys) { reg export $key $tempfile /y > $null + echo "Exporting `"$key`"" $content = Get-Content -Path $tempfile | Select-Object -Skip 2 $dump += ($content -join "`n") + "`n`n" } diff --git a/puppy/scripts/prepare_envirionment.sh b/puppy/scripts/prepare_envirionment.sh index e2ac0d9..b2c137f 100755 --- a/puppy/scripts/prepare_envirionment.sh +++ b/puppy/scripts/prepare_envirionment.sh @@ -2,13 +2,13 @@ cd "$(basename "$(basename "$(readlink "$0")")")" -SSH_HOST="${1:?}" +SSH_HOST="${1:?Missing SSH host}" mkdir -p build/{"Program Files (x86)/Common Files",ProgramData} -scp ./scripts/dump_registry.ps1 "$SSH_HOST:" -ssh "$SSH_HOST" ./dump_registry.ps1 +# scp ./scripts/dump_registry.ps1 "$SSH_HOST:" +# ssh "$SSH_HOST" "powershell .\dump_registry.ps1" 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)/PRMT6" "./build/Program Files (x86)/PRMT6" diff --git a/puppy/src/PromtCtlDirection.cpp b/puppy/src/PromtCtlDirection.cpp index 35dfe67..89b0072 100644 --- a/puppy/src/PromtCtlDirection.cpp +++ b/puppy/src/PromtCtlDirection.cpp @@ -1,7 +1,6 @@ #include "PromtCtlDirection.hpp" #include -#include #include const char *PromtCtlDirection::classname() const { diff --git a/puppy/src/PromtCtlDocument.cpp b/puppy/src/PromtCtlDocument.cpp index 5d705bf..cb64160 100644 --- a/puppy/src/PromtCtlDocument.cpp +++ b/puppy/src/PromtCtlDocument.cpp @@ -1,7 +1,7 @@ #include "PromtCtlDocument.hpp" -#include "PromtCtlDirection.hpp" #include +#include "PromtCtlDirection.hpp" PromtCtlDocument::PromtCtlDocument() { void *p_unknown = nullptr; diff --git a/puppy/src/PromtFTManager.cpp b/puppy/src/PromtFTManager.cpp index f9b7daf..f3ca505 100644 --- a/puppy/src/PromtFTManager.cpp +++ b/puppy/src/PromtFTManager.cpp @@ -10,7 +10,7 @@ PromtFTManager::PromtFTManager() { auto hr = CoCreateInstance(CLSID_PromtFTManager, nullptr, 0x17u, IID_Inknown2, &p_unknown); 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"); Release(p_unknown); @@ -19,12 +19,12 @@ PromtFTManager::PromtFTManager() { PromtFileTranslator PromtFTManager::Translator(PromtFTManager::FileType ft, PromtCtlDirection &dir) const { void *p_translator = nullptr; VARIANTARG varg{.vt=2, .iVal=(short)ft}; - HRESULT hr = (*(HRESULT(__thiscall **)(void *, void *, VARIANTARG, VARIANTARG, void *))(*(DWORD *) mInstance + 48))( - mInstance, mInstance, varg, varg, &p_translator); + HRESULT hr = (*(HRESULT(__thiscall **)(void *, void *, VARIANTARG, VARIANTARG, void *))(*(DWORD *) m_instance + 48))( + m_instance, m_instance, varg, varg, &p_translator); Raise(hr, "Create file translator"); return PromtFileTranslator(p_translator, dir.m_instance); }; PromtFTManager::~PromtFTManager() { - Release(mInstance); + Release(m_instance); } diff --git a/puppy/src/PromtFileTranslator.cpp b/puppy/src/PromtFileTranslator.cpp index e979982..0aa2bb4 100644 --- a/puppy/src/PromtFileTranslator.cpp +++ b/puppy/src/PromtFileTranslator.cpp @@ -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 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))( - mInstance, mDirection, src, dest, {}); + hr = (*(HRESULT(__stdcall **)(const void *, const void *, BSTR, BSTR, VARIANTARG))(*(DWORD *) m_instance + 80))( + m_instance, m_direction, src, dest, {}); Raise(hr, "yk"); SysFreeString(src); SysFreeString(dest); } PromtFileTranslator::~PromtFileTranslator() { - Release(mInstance); + Release(m_instance); }