From 24461f362a51af54d5dccced0c5916556358de16 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Sat, 14 Oct 2023 20:23:27 -0400 Subject: [PATCH] Add support for adding filenames via HTTP Meant to be used by the new Dalamud plugin --- CMakeLists.txt | 8 +-- sagasu/CMakeLists.txt | 2 +- sagasu/src/indexer.cpp | 113 ++++++++++++++++++++++++++++++++--------- 3 files changed, 90 insertions(+), 33 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c097542..856afaf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ ecm_setup_version(${PROJECT_VERSION} VERSION_HEADER ${CMAKE_CURRENT_BINARY_DIR}/novus-version.h ) -find_package(Qt6 ${QT_MIN_VERSION} COMPONENTS Core Widgets Concurrent Core5Compat Sql CONFIG REQUIRED) +find_package(Qt6 ${QT_MIN_VERSION} COMPONENTS Core Widgets Concurrent Core5Compat Sql HttpServer CONFIG REQUIRED) find_package(KF6 ${KF_MIN_VERSION} REQUIRED COMPONENTS CoreAddons Config XmlGui) find_package(Vulkan REQUIRED) find_package(glm REQUIRED) @@ -44,12 +44,6 @@ if (NOT TARGET glm::glm) endif() add_subdirectory(extern) - -# macos -if(APPLE) - set(USE_STANDALONE_WINDOW TRUE) -endif() - add_subdirectory(renderer) add_subdirectory(karuku) add_subdirectory(armoury) diff --git a/sagasu/CMakeLists.txt b/sagasu/CMakeLists.txt index ebd3fe7..a4c1196 100644 --- a/sagasu/CMakeLists.txt +++ b/sagasu/CMakeLists.txt @@ -11,7 +11,7 @@ target_include_directories(novus-sagasu-static PRIVATE include) add_executable(novus-sagasu-indexer) target_sources(novus-sagasu-indexer PRIVATE src/indexer.cpp) -target_link_libraries(novus-sagasu-indexer PRIVATE novus-sagasu-static) +target_link_libraries(novus-sagasu-indexer PRIVATE Qt6::HttpServer novus-sagasu-static) target_include_directories(novus-sagasu-indexer PRIVATE include) add_executable(novus-sagasu) diff --git a/sagasu/src/indexer.cpp b/sagasu/src/indexer.cpp index 31e3756..e40b305 100644 --- a/sagasu/src/indexer.cpp +++ b/sagasu/src/indexer.cpp @@ -2,7 +2,13 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "hashdatabase.h" +#include "physis.hpp" #include "settings.h" +#include +#include +#include +#include +#include const std::array known_folders{"common", "common/font", @@ -147,14 +153,95 @@ const std::array common_font{"common/VulgarWordsFilter.dic", "common/font/Jupiter_90_lobby.fdt", "common/font/Jupiter_45_lobby.fdt"}; +static std::optional byteArrayToJsonObject(const QByteArray &arr) +{ + QJsonParseError err; + const auto json = QJsonDocument::fromJson(arr, &err); + if (err.error || !json.isObject()) + return std::nullopt; + return json.object(); +} + int main(int argc, char *argv[]) { + QCoreApplication app(argc, argv); + + QCommandLineParser parser; + + QCommandLineOption indexExcelOption(QStringLiteral("excel"), QStringLiteral("Enable the indexing of known Excel files, will take a very long time.")); + parser.addOption(indexExcelOption); + + QCommandLineOption listenOption(QStringLiteral("listen"), QStringLiteral("Listen for incoming filename requests, for the SqPackIndexer Dalamud plugin.")); + parser.addOption(listenOption); + + parser.process(app); + HashDatabase database; + if (parser.isSet(indexExcelOption)) { + const QString gameDir{getGameDirectory()}; + const std::string gameDirStd{gameDir.toStdString()}; + auto data = physis_gamedata_initialize(gameDirStd.c_str()); + + auto sheetNames = physis_gamedata_get_all_sheet_names(data); + + for (int i = 0; i < sheetNames.name_count; i++) { + auto sheetName = sheetNames.names[i]; + auto nameLowercase = QString::fromStdString(sheetName).toLower().toStdString(); + + QString headerName = QStringLiteral("exd/") + QLatin1String(nameLowercase.c_str()) + QStringLiteral(".exh"); + + database.addFile(headerName); + + std::string headerNameStd = headerName.toStdString(); + auto exh = physis_parse_excel_sheet_header(physis_gamedata_extract_file(data, headerNameStd.c_str())); + for (int j = 0; j < exh->page_count; j++) { + for (int z = 0; z < exh->language_count; z++) { + std::string path = physis_gamedata_get_exd_filename(nameLowercase.c_str(), exh, exh->languages[z], j); + + database.addFile(QStringLiteral("exd/") + QString::fromStdString(path)); + } + } + } + + return 0; + } + + if (parser.isSet(listenOption)) { + QHttpServer server; + + server.route(QStringLiteral("/add_hash"), QHttpServerRequest::Method::Post, [&database](const QHttpServerRequest &request) { + const auto json = byteArrayToJsonObject(request.body()); + if (!json) + return QHttpServerResponse(QHttpServerResponder::StatusCode::BadRequest); + + const QString filename = (*json)[QLatin1String("filename")].toString(); + int lastSlashIndex = filename.lastIndexOf(QStringLiteral("/")); + QString folder = filename.left(lastSlashIndex); + + qInfo() << "Adding hash for file" << filename; + + qInfo() << "Adding hash for folder" << folder; + + database.addFile(filename); + database.addFolder(folder); + + return QHttpServerResponse(QHttpServerResponder::StatusCode::Ok); + }); + + server.listen(QHostAddress::Any, 3500); + + qInfo() << "Now listening on port 3500."; + + return QCoreApplication::exec(); + } + for (auto &folder : known_folders) { database.addFolder(QLatin1String(folder)); } + qInfo() << "No special options set, adding all known static files."; + for (auto &file : common_font) { database.addFile(QLatin1String(file)); } @@ -170,29 +257,5 @@ int main(int argc, char *argv[]) database.addFile(QStringLiteral("chara/xls/charamake/human.cmp")); database.addFile(QStringLiteral("chara/human/c0101/skeleton/base/b0001/skl_c0101b0001.sklb")); - /*const QString gameDir{getGameDirectory()}; - const std::string gameDirStd{gameDir.toStdString()}; - auto data = physis_gamedata_initialize(gameDirStd.c_str()); - - addPath(QStringLiteral("common/font/AXIS_12.fdt")); - - addPath(QStringLiteral("exd/root.exl")); - - auto sheetNames = physis_gamedata_get_all_sheet_names(data); - - for(int i = 0; i < sheetNames.name_count; i++) { - auto sheetName = sheetNames.names[i]; - auto nameLowercase = QString::fromStdString(sheetName).toLower().toStdString(); - - addPath(QStringLiteral("exd/") + QLatin1String(nameLowercase.c_str()) + QStringLiteral(".exh")); - - auto exh = physis_gamedata_read_excel_sheet_header(data, sheetName); - for (int j = 0; j < exh->page_count; j++) { - for (int z = 0; z < exh->language_count; z++) { - std::string path = physis_gamedata_get_exd_filename(nameLowercase.c_str(), exh, exh->languages[z], j); - - addPath(QStringLiteral("exd/") + QString::fromStdString(path)); - } - } - }*/ + return 0; } \ No newline at end of file