mirror of
https://github.com/NohamR/RMHook.git
synced 2026-04-08 07:59:58 +00:00
Implement a native macOS HTTP server for RMHook and wire it into the app. Adds HttpServer.h/.mm (CFSocket-based) with start/stop/isRunning APIs, broadcasts incoming POST /exportFile and /documentAccepted requests to the QML MessageBroker, and starts the server on port 8080 from reMarkable.m. Update CMakeLists to include HttpServer.mm and link Qt Qml when building qmlrebuild mode. Add documentation (docs/HTTP_SERVER.md) and QML snippets for MessageBroker integration, plus Python helper scripts (scripts/http_server.py and scripts/test_http_server.py) for invoking the endpoints. Also add small MessageBroker examples (src/utils/mb.m, src/utils/mb.qml) and update ResourceUtils to include additional QML resources.
146 lines
4.3 KiB
CMake
146 lines
4.3 KiB
CMake
cmake_minimum_required(VERSION 3.15)
|
|
project(RMHook)
|
|
|
|
enable_language(OBJC OBJCXX)
|
|
|
|
set(CMAKE_C_STANDARD 11)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
# Build mode options
|
|
# - rmfakecloud: Redirect reMarkable cloud to rmfakecloud server (default)
|
|
# - qmlrebuild: Qt resource data registration hooking
|
|
# - dev: Development/reverse engineering mode with all hooks
|
|
option(BUILD_MODE_RMFAKECLOUD "Build with rmfakecloud support" ON)
|
|
option(BUILD_MODE_QMLREBUILD "Build with QML resource rebuilding" OFF)
|
|
option(BUILD_MODE_DEV "Build with dev/reverse engineering hooks" OFF)
|
|
|
|
# Compiler settings for macOS
|
|
set(CMAKE_MACOSX_RPATH 1)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
|
|
|
|
# Architecture: x86_64 only for reMarkable
|
|
set(CMAKE_OSX_ARCHITECTURES "x86_64" "arm64")
|
|
|
|
# Project root directory
|
|
set(PROJECT_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
|
|
# Include directories
|
|
include_directories(
|
|
${PROJECT_ROOT_DIR}/src/core
|
|
${PROJECT_ROOT_DIR}/src/utils
|
|
${PROJECT_ROOT_DIR}/src/reMarkable
|
|
${PROJECT_ROOT_DIR}/libs/include
|
|
)
|
|
|
|
# Find required libraries
|
|
find_library(FOUNDATION_LIBRARY Foundation REQUIRED)
|
|
find_library(COCOA_LIBRARY Cocoa REQUIRED)
|
|
find_library(SECURITY_LIBRARY Security REQUIRED)
|
|
|
|
# Common libraries
|
|
set(LIBS
|
|
${FOUNDATION_LIBRARY}
|
|
${COCOA_LIBRARY}
|
|
${SECURITY_LIBRARY}
|
|
${PROJECT_ROOT_DIR}/libs/tinyhook.a # tinyhook for function hooking
|
|
${PROJECT_ROOT_DIR}/libs/libzstd.a # libzstd for compression/decompression
|
|
z # zlib for compression/decompression
|
|
)
|
|
|
|
# Locate Qt libraries
|
|
set(QT_LIB_TARGETS "")
|
|
set(_qt_candidate_roots "$ENV{HOME}/Qt/6.10.0")
|
|
|
|
foreach(_qt_root ${_qt_candidate_roots})
|
|
if(_qt_root AND EXISTS "${_qt_root}")
|
|
list(APPEND CMAKE_PREFIX_PATH "${_qt_root}")
|
|
endif()
|
|
endforeach()
|
|
|
|
find_package(Qt6 COMPONENTS Core Network WebSockets Qml QUIET)
|
|
if(Qt6_FOUND)
|
|
set(QT_LIB_TARGETS Qt6::Core Qt6::Network Qt6::WebSockets Qt6::Qml)
|
|
else()
|
|
find_package(Qt5 COMPONENTS Core Network WebSockets Qml QUIET)
|
|
if(Qt5_FOUND)
|
|
set(QT_LIB_TARGETS Qt5::Core Qt5::Network Qt5::WebSockets Qt5::Qml)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT QT_LIB_TARGETS)
|
|
message(FATAL_ERROR "Qt Core, Network and WebSockets not found. Set CMAKE_PREFIX_PATH to your Qt installation.")
|
|
endif()
|
|
|
|
# Common sources
|
|
set(COMMON_SOURCES
|
|
${PROJECT_ROOT_DIR}/src/utils/MemoryUtils.m
|
|
${PROJECT_ROOT_DIR}/src/utils/Constant.m
|
|
${PROJECT_ROOT_DIR}/src/utils/ResourceUtils.m
|
|
)
|
|
|
|
# reMarkable dylib
|
|
set(REMARKABLE_SOURCES
|
|
${PROJECT_ROOT_DIR}/src/reMarkable/reMarkable.m
|
|
${PROJECT_ROOT_DIR}/src/reMarkable/DevHooks.m
|
|
)
|
|
|
|
add_library(reMarkable SHARED
|
|
${COMMON_SOURCES}
|
|
${REMARKABLE_SOURCES}
|
|
)
|
|
|
|
# Set source files as Objective-C++
|
|
set_source_files_properties(
|
|
${REMARKABLE_SOURCES}
|
|
PROPERTIES LANGUAGE OBJCXX
|
|
)
|
|
|
|
set_target_properties(reMarkable PROPERTIES
|
|
PREFIX ""
|
|
SUFFIX ".dylib"
|
|
OUTPUT_NAME "reMarkable"
|
|
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_ROOT_DIR}/build/dylibs"
|
|
MACOSX_RPATH ON
|
|
)
|
|
|
|
add_definitions(-DQT_NO_VERSION_TAGGING)
|
|
|
|
# Add build mode compile definitions and conditionally add sources
|
|
if(BUILD_MODE_RMFAKECLOUD)
|
|
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_RMFAKECLOUD=1)
|
|
message(STATUS "Build mode: rmfakecloud (cloud redirection)")
|
|
endif()
|
|
|
|
if(BUILD_MODE_QMLREBUILD)
|
|
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_QMLREBUILD=1)
|
|
|
|
# Enable Qt MOC for MessageBroker (HttpServer is pure Obj-C/Foundation, no MOC needed)
|
|
set_target_properties(reMarkable PROPERTIES AUTOMOC ON)
|
|
|
|
# Add MessageBroker (needs MOC) and HttpServer (native macOS)
|
|
target_sources(reMarkable PRIVATE
|
|
${PROJECT_ROOT_DIR}/src/utils/MessageBroker.mm
|
|
${PROJECT_ROOT_DIR}/src/utils/HttpServer.mm
|
|
)
|
|
|
|
find_package(Qt6 COMPONENTS Qml QUIET)
|
|
if(Qt6Qml_FOUND)
|
|
target_link_libraries(reMarkable PRIVATE Qt6::Qml)
|
|
else()
|
|
find_package(Qt5 COMPONENTS Qml QUIET)
|
|
if(Qt5Qml_FOUND)
|
|
target_link_libraries(reMarkable PRIVATE Qt5::Qml)
|
|
endif()
|
|
endif()
|
|
message(STATUS "Build mode: qmlrebuild (resource hooking)")
|
|
endif()
|
|
|
|
if(BUILD_MODE_DEV)
|
|
target_compile_definitions(reMarkable PRIVATE BUILD_MODE_DEV=1)
|
|
message(STATUS "Build mode: dev (reverse engineering)")
|
|
endif()
|
|
|
|
target_link_libraries(reMarkable PRIVATE
|
|
${LIBS}
|
|
${QT_LIB_TARGETS}
|
|
) |