33#include < odr/document.hpp>
44#include < odr/file.hpp>
55#include < odr/html.hpp>
6+ #include < odr/logger.hpp>
67#include < odr/odr.hpp>
78#include < odr/exceptions.hpp>
89#include < odr/http_server.hpp>
@@ -35,6 +36,43 @@ std::string getStringField(JNIEnv *env, jobject object, const char *name) {
3536 return getStringField (env, clazz, object, name);
3637}
3738
39+ class AndroidLogger final : public odr::Logger {
40+ public:
41+ static int to_android_log_level (odr::LogLevel level) {
42+ switch (level) {
43+ case odr::LogLevel::verbose:
44+ return ANDROID_LOG_VERBOSE;
45+ case odr::LogLevel::debug:
46+ return ANDROID_LOG_DEBUG;
47+ case odr::LogLevel::info:
48+ return ANDROID_LOG_INFO;
49+ case odr::LogLevel::warning:
50+ return ANDROID_LOG_WARN;
51+ case odr::LogLevel::error:
52+ return ANDROID_LOG_ERROR;
53+ case odr::LogLevel::fatal:
54+ return ANDROID_LOG_FATAL;
55+ default :
56+ return ANDROID_LOG_UNKNOWN;
57+ }
58+ }
59+
60+ void flush () override {}
61+
62+ [[nodiscard]] bool will_log (odr::LogLevel level) const override {
63+ return true ;
64+ }
65+
66+ protected:
67+ void log_impl (Time time, odr::LogLevel level, const std::string &message,
68+ const std::source_location &location) override {
69+ __android_log_print (to_android_log_level (level), " smn" , " %s" , message.c_str ());
70+ }
71+
72+ private:
73+
74+ };
75+
3876}
3977
4078std::optional<odr::Document> s_document;
@@ -60,6 +98,8 @@ Java_at_tomtasche_reader_background_CoreWrapper_setGlobalParams(JNIEnv *env, jcl
6098JNIEXPORT jobject JNICALL
6199Java_at_tomtasche_reader_background_CoreWrapper_parseNative (JNIEnv *env, jclass clazz,
62100 jobject options) {
101+ auto logger = std::make_shared<AndroidLogger>();
102+
63103 jclass resultClass = env->FindClass (" at/tomtasche/reader/background/CoreWrapper$CoreResult" );
64104 jmethodID resultConstructor = env->GetMethodID (resultClass, " <init>" , " ()V" );
65105 jobject result = env->NewObject (resultClass, resultConstructor);
@@ -106,7 +146,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
106146 try {
107147 odr::FileType fileType;
108148 try {
109- const auto types = odr::list_file_types (inputPathCpp);
149+ const auto types = odr::list_file_types (inputPathCpp, *logger );
110150 if (types.empty ()) {
111151 env->SetIntField (result, errorField, -5 );
112152 return result;
@@ -125,7 +165,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
125165
126166 __android_log_print (ANDROID_LOG_VERBOSE, " smn" , " Open %s" , inputPathCpp.c_str ());
127167
128- auto file = odr::open (inputPathCpp);
168+ auto file = odr::open (inputPathCpp, *logger );
129169
130170 if (file.password_encrypted ()) {
131171 if (!passwordCpp.has_value ()) {
@@ -149,15 +189,15 @@ Java_at_tomtasche_reader_background_CoreWrapper_parseNative(JNIEnv *env, jclass
149189 extension = env->NewStringUTF (extensionCpp.c_str ());
150190 env->SetObjectField (result, extensionField, extension);
151191
152- odr::HtmlConfig config ;
153- config .editable = editable;
154- config .text_document_margin = paging;
192+ odr::HtmlConfig htmlConfig ;
193+ htmlConfig .editable = editable;
194+ htmlConfig .text_document_margin = paging;
155195
156196 __android_log_print (ANDROID_LOG_VERBOSE, " smn" , " Translate to HTML" );
157197
158198 std::string output_tmp = outputPathCpp + " /tmp" ;
159199 std::filesystem::create_directories (output_tmp);
160- odr::HtmlService service = odr::html::translate (file, output_tmp, config );
200+ odr::HtmlService service = odr::html::translate (file, output_tmp, htmlConfig, logger );
161201 odr::Html html = service.bring_offline (outputPathCpp);
162202 std::filesystem::remove_all (output_tmp);
163203
@@ -259,7 +299,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_closeNative(JNIEnv *env, jclass
259299std::optional<odr::HttpServer> s_server;
260300
261301JNIEXPORT void JNICALL
262- Java_at_tomtasche_reader_background_CoreWrapper_createServer (JNIEnv *env, jclass clazz,
302+ Java_at_tomtasche_reader_background_CoreWrapper_createServerNative (JNIEnv *env, jclass clazz,
263303 jstring cachePath) {
264304 __android_log_print (ANDROID_LOG_INFO, " smn" , " create server" );
265305
@@ -273,10 +313,12 @@ Java_at_tomtasche_reader_background_CoreWrapper_createServer(JNIEnv *env, jclass
273313}
274314
275315JNIEXPORT jobject JNICALL
276- Java_at_tomtasche_reader_background_CoreWrapper_hostFile (JNIEnv *env, jclass clazz, jstring prefix,
316+ Java_at_tomtasche_reader_background_CoreWrapper_hostFileNative (JNIEnv *env, jclass clazz, jstring prefix,
277317 jobject options) {
278318 __android_log_print (ANDROID_LOG_INFO, " smn" , " host file" );
279319
320+ auto logger = std::make_shared<AndroidLogger>();
321+
280322 jclass resultClass = env->FindClass (" at/tomtasche/reader/background/CoreWrapper$CoreResult" );
281323 jmethodID resultConstructor = env->GetMethodID (resultClass, " <init>" , " ()V" );
282324 jobject result = env->NewObject (resultClass, resultConstructor);
@@ -305,6 +347,8 @@ Java_at_tomtasche_reader_background_CoreWrapper_hostFile(JNIEnv *env, jclass cla
305347 jfieldID editableField = env->GetFieldID (optionsClass, " editable" , " Z" );
306348 jboolean editable = env->GetBooleanField (options, editableField);
307349
350+ std::string outputPathCpp = getStringField (env, optionsClass, options, " outputPath" );
351+
308352 jclass listClass = env->FindClass (" java/util/List" );
309353 jmethodID addMethod = env->GetMethodID (listClass, " add" , " (Ljava/lang/Object;)Z" );
310354
@@ -320,7 +364,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_hostFile(JNIEnv *env, jclass cla
320364 odr::DecodePreference decodePreference;
321365 decodePreference.engine_priority = {odr::DecoderEngine::poppler, odr::DecoderEngine::wvware,
322366 odr::DecoderEngine::odr};
323- odr::DecodedFile file = odr::open (inputPathCpp, decodePreference);
367+ odr::DecodedFile file = odr::open (inputPathCpp, decodePreference, *logger );
324368
325369 if (file.password_encrypted ()) {
326370 if (!passwordCpp.has_value ()) {
@@ -348,7 +392,11 @@ Java_at_tomtasche_reader_background_CoreWrapper_hostFile(JNIEnv *env, jclass cla
348392 htmlConfig.editable = editable;
349393
350394 try {
351- odr::HtmlViews htmlViews = s_server->serve_file (file, prefixCpp, htmlConfig);
395+ std::string output_tmp = outputPathCpp + " /tmp" ;
396+ std::filesystem::create_directories (output_tmp);
397+ odr::HtmlService service = odr::html::translate (file, output_tmp, htmlConfig, logger);
398+ s_server->connect_service (service, prefixCpp);
399+ odr::HtmlViews htmlViews = service.list_views ();
352400
353401 for (const auto &view: htmlViews) {
354402 __android_log_print (ANDROID_LOG_INFO, " smn" , " view name=%s path=%s" , view.name ().c_str (), view.path ().c_str ());
@@ -392,7 +440,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_hostFile(JNIEnv *env, jclass cla
392440}
393441
394442JNIEXPORT void JNICALL
395- Java_at_tomtasche_reader_background_CoreWrapper_listenServer (JNIEnv *env, jclass clazz, jint port) {
443+ Java_at_tomtasche_reader_background_CoreWrapper_listenServerNative (JNIEnv *env, jclass clazz, jint port) {
396444 __android_log_print (ANDROID_LOG_INFO, " smn" , " listen ..." );
397445
398446 s_server->listen (" 127.0.0.1" , port);
@@ -401,7 +449,7 @@ Java_at_tomtasche_reader_background_CoreWrapper_listenServer(JNIEnv *env, jclass
401449}
402450
403451JNIEXPORT void JNICALL
404- Java_at_tomtasche_reader_background_CoreWrapper_stopServer (JNIEnv *env, jclass clazz) {
452+ Java_at_tomtasche_reader_background_CoreWrapper_stopServerNative (JNIEnv *env, jclass clazz) {
405453 __android_log_print (ANDROID_LOG_INFO, " smn" , " stop server" );
406454
407455 s_server->stop ();
0 commit comments