From 5dc96d714501b097a20bbd1d242dae5d69c59634 Mon Sep 17 00:00:00 2001 From: luddens Date: Fri, 10 May 2019 17:23:55 +0200 Subject: [PATCH] kiwix-serve integration --- include/kiwixserve.h | 33 +++++++++++++++++++++++++ include/meson.build | 3 ++- src/kiwixserve.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++ src/meson.build | 1 + 4 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 include/kiwixserve.h create mode 100644 src/kiwixserve.cpp diff --git a/include/kiwixserve.h b/include/kiwixserve.h new file mode 100644 index 000000000..f0eaeeb8c --- /dev/null +++ b/include/kiwixserve.h @@ -0,0 +1,33 @@ +#ifndef KIWIXLIB_KIWIX_SERVE_H_ +#define KIWIXLIB_KIWIX_SERVE_H_ + +#ifdef _WIN32 +// winsock2.h need to be included before windows.h (included by curl.h) +# include +#endif + +#include +#include +#include +#include "tools/pathTools.h" + +class Subprocess; +namespace kiwix { + +class KiwixServe +{ + public: + KiwixServe(); + ~KiwixServe(); + + void run(); + void shutDown(); + + private: + std::unique_ptr mp_kiwixServe; + int m_port; +}; + +}; //end namespace kiwix + +#endif // KIWIXLIB_KIWIX_SERVE_H_ diff --git a/include/meson.build b/include/meson.build index 75febaf5d..045b7387d 100644 --- a/include/meson.build +++ b/include/meson.build @@ -9,7 +9,8 @@ headers = [ 'downloader.h', 'reader.h', 'entry.h', - 'searcher.h' + 'searcher.h', + 'kiwixserve.h' ] install_headers(headers, subdir:'kiwix') diff --git a/src/kiwixserve.cpp b/src/kiwixserve.cpp new file mode 100644 index 000000000..395734b6e --- /dev/null +++ b/src/kiwixserve.cpp @@ -0,0 +1,57 @@ +#include "kiwixserve.h" +#include "subprocess.h" + +#ifdef _WIN32 + # define KIWIXSERVE_CMD "kiwix-serve.exe" +#else + # define KIWIXSERVE_CMD "kiwix-serve" +#endif + +namespace kiwix { + +KiwixServe::KiwixServe() : m_port(8181) +{ +} + +KiwixServe::~KiwixServe() +{ + shutDown(); +} + +void KiwixServe::run() +{ + #ifdef _WIN32 + int pid = GetCurrentProcessId(); + #else + pid_t pid = getpid(); + + #endif + + std::vector callCmd; + std::string kiwixServeCmd = appendToDirectory( + removeLastPathElement(getExecutablePath(), true, true), + KIWIXSERVE_CMD); + if (fileExists(kiwixServeCmd)) { + // A local kiwix-serve exe exists (packaged with kiwix-desktop), use it. + callCmd.push_back(kiwixServeCmd.c_str()); + } else { + // Try to use a potential installed kiwix-serve. + callCmd.push_back(KIWIXSERVE_CMD); + } + std::string libraryPath = getDataDirectory() + "/library.xml"; + std::string attachProcessOpt = "-a" + to_string(pid); + std::string portOpt = "-p" + to_string(m_port); + callCmd.push_back(attachProcessOpt.c_str()); + callCmd.push_back(portOpt.c_str()); + callCmd.push_back("-l"); + callCmd.push_back(libraryPath.c_str()); + mp_kiwixServe = Subprocess::run(callCmd); +} + +void KiwixServe::shutDown() +{ + if (mp_kiwixServe) + mp_kiwixServe->kill(); +} + +} \ No newline at end of file diff --git a/src/meson.build b/src/meson.build index 98167c875..65635ca7f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -17,6 +17,7 @@ kiwix_sources = [ 'tools/stringTools.cpp', 'tools/networkTools.cpp', 'tools/otherTools.cpp', + 'kiwixserve.cpp', ] kiwix_sources += lib_resources