From 34ea9ac5745a05b8078c542a2169fd322bee219c Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 15 Jun 2015 16:46:43 +0800 Subject: [PATCH] add datastorage module to handle data directory on various platform On kindle, kobo and pocketbook the data directory is the current running directory but on Android the app is installed in system defined location and users may have no access to that location. The same circumstances should be true for the upcoming Koreader for Ubuntu touch, so the data directory (in which tessdata, dictionaries, global settings, persistant defaults and probably history data are stored) could be stored in another place. --- Makefile | 2 +- datastorage.lua | 14 +++++++++++ .../filemanager/filemanagersetdefaults.lua | 25 +++++++++++-------- frontend/docsettings.lua | 3 ++- frontend/document/koptinterface.lua | 3 ++- platform/android/llapp_main.lua | 9 +++++++ reader.lua | 3 ++- 7 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 datastorage.lua diff --git a/Makefile b/Makefile index 115fa9766..3d401a191 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ ANDROID_LAUNCHER_DIR:=$(ANDROID_DIR)/luajit-launcher WIN32_DIR=$(PLATFORM_DIR)/win32 # files to link from main directory -INSTALL_FILES=reader.lua frontend resources defaults.lua l10n \ +INSTALL_FILES=reader.lua frontend resources defaults.lua datastorage.lua l10n \ git-rev README.md COPYING # for gettext diff --git a/datastorage.lua b/datastorage.lua new file mode 100644 index 000000000..8cf2bd24a --- /dev/null +++ b/datastorage.lua @@ -0,0 +1,14 @@ +-- need low-level mechnism to detect android to avoid recursive dependency +local isAndroid = pcall(require, "android") + +local DataStorage = {} + +function DataStorage:getDataDir() + if isAndroid then + return "/sdcard/koreader/" + else + return "./" + end +end + +return DataStorage diff --git a/frontend/apps/filemanager/filemanagersetdefaults.lua b/frontend/apps/filemanager/filemanagersetdefaults.lua index 4979a00b9..e31036101 100644 --- a/frontend/apps/filemanager/filemanagersetdefaults.lua +++ b/frontend/apps/filemanager/filemanagersetdefaults.lua @@ -1,10 +1,11 @@ local InfoMessage = require("ui/widget/infomessage") -local UIManager = require("ui/uimanager") local InputContainer = require("ui/widget/container/inputcontainer") local InputDialog = require("ui/widget/inputdialog") local MultiInputDialog = require("ui/widget/multiinputdialog") local ConfirmBox = require("ui/widget/confirmbox") local CenterContainer = require("ui/widget/container/centercontainer") +local DataStorage = require("datastorage") +local UIManager = require("ui/uimanager") local Screen = require("device").screen local Menu = require("ui/widget/menu") local Font = require("ui/font") @@ -319,16 +320,16 @@ function SetDefaults:SaveSettings() file:close() end - local filename = "defaults.persistent.lua" + local persistent_filename = DataStorage:getDataDir() .. "/defaults.persistent.lua" local file - if io.open(filename,"r") == nil then - file = io.open(filename, "w") + if io.open(persistent_filename,"r") == nil then + file = io.open(persistent_filename, "w") file:write("-- For configuration changes that persists between (nightly) releases\n") file:close() end local dpl = {} - fileread("defaults.persistent.lua",dpl) + fileread(persistent_filename, dpl) local dl = {} fileread("defaults.lua",dl) self.results = {} @@ -355,12 +356,16 @@ function SetDefaults:SaveSettings() end end - file = io.open("defaults.persistent.lua", "w") - for i = 1,#dpl do - file:write(dpl[i] .. "\n") + file = io.open(persistent_filename, "w") + if file then + for i = 1,#dpl do + file:write(dpl[i] .. "\n") + end + file:close() + UIManager:show(InfoMessage:new{ + text = _("Default settings were saved successfully!"), + }) end - file:close() - UIManager:show(InfoMessage:new{text = _("Default settings were saved successfully!")}) settings_changed = false end return SetDefaults diff --git a/frontend/docsettings.lua b/frontend/docsettings.lua index 4005a4db5..2b167a8a8 100644 --- a/frontend/docsettings.lua +++ b/frontend/docsettings.lua @@ -1,6 +1,7 @@ local lfs = require("libs/libkoreader-lfs") local DocSettings = {} local dump = require("dump") +local DataStorage = require("datastorage") function DocSettings:getHistoryPath(fullpath) return "./history/[" .. fullpath:gsub("(.*/)([^/]+)","%1] %2"):gsub("/","#") .. ".lua" @@ -26,7 +27,7 @@ function DocSettings:open(docfile) local sidecar_path = nil if docfile == ".reader" then -- we handle reader setting as special case - history_path = "settings.reader.lua" + history_path = DataStorage:getDataDir() .. "/settings.reader.lua" else if lfs.attributes("./history", "mode") ~= "directory" then lfs.mkdir("history") diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index c6f1ba0b7..316d08e4d 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -1,6 +1,7 @@ local TileCacheItem = require("document/tilecacheitem") local KOPTContext = require("ffi/koptcontext") local Document = require("document/document") +local DataStorage = require("datastorage") local CacheItem = require("cacheitem") local Screen = require("device").screen local Geom = require("ui/geometry") @@ -11,7 +12,7 @@ local util = require("ffi/util") local KoptInterface = { ocrengine = "ocrengine", - tessocr_data = "data", + tessocr_data = DataStorage:getDataDir() .. "/data", ocr_lang = "eng", ocr_type = 3, -- default 0, for more accuracy use 3 last_context_size = nil, diff --git a/platform/android/llapp_main.lua b/platform/android/llapp_main.lua index 03297cf8a..3eab5d099 100644 --- a/platform/android/llapp_main.lua +++ b/platform/android/llapp_main.lua @@ -1,6 +1,12 @@ local A = require("android") A.dl.library_path = A.dl.library_path .. ":" .. A.dir .. "/libs" +local ffi = require("ffi") +ffi.cdef[[ + char *getenv(const char *name); + int putenv(const char *envvar); +]] + -- check uri of the intent that starts this application local file = A.jni:context(A.app.activity.vm, function(JNI) local uri = JNI:callObjectMethod( @@ -29,6 +35,9 @@ pcall(function() dofile("/sdcard/koreader/patch.lua") end) -- set proper permission for sdcv A.execute("chmod", "755", "./sdcv") +-- set TESSDATA_PREFIX env var +ffi.C.putenv("TESSDATA_PREFIX=/sdcard/koreader/data") + -- create fake command-line arguments arg = {"-d", file or "/sdcard"} dofile(A.dir.."/reader.lua") diff --git a/reader.lua b/reader.lua index 326f4dae0..c4a990c0f 100755 --- a/reader.lua +++ b/reader.lua @@ -2,7 +2,8 @@ -- load default settings require "defaults" -pcall(dofile, "defaults.persistent.lua") +local DataStorage = require("datastorage") +pcall(dofile, DataStorage:getDataDir() .. "/defaults.persistent.lua") -- set search path for 'require()' package.path = "common/?.lua;rocks/share/lua/5.1/?.lua;frontend/?.lua;" .. package.path