mirror of
https://github.com/koreader/koreader
synced 2024-11-10 01:10:34 +00:00
8500fdd519
This commit adds cross-device sync ability for two plugins: reading statistics and vocabulary builder. It relies on user setting up a Cloud server (DropBox and WebDAV but not FTP though) and designating a path. Behind the curtains sqlite databases are being passed around and updated. UI-wise, for the statistics plugin, two new menu items Synchronize now and Cloud sync to set it up (might not be the best wording) are added. As for vocabulary builder, a similar Cloud sync button is added to the menu and a shortcut icon button to Synchronize now is pinned at the bottom corner. CloudStorage new features: WebDAV creating folders and uploading files. And a new widget-like sync server chooser. In the end I decided not to add automatic sync, as the SQL commands part seem a bit much.
200 lines
7.0 KiB
Lua
200 lines
7.0 KiB
Lua
local BD = require("ui/bidi")
|
|
local ConfirmBox = require("ui/widget/confirmbox")
|
|
local DocumentRegistry = require("document/documentregistry")
|
|
local InfoMessage = require("ui/widget/infomessage")
|
|
local MultiInputDialog = require("ui/widget/multiinputdialog")
|
|
local UIManager = require("ui/uimanager")
|
|
local ReaderUI = require("apps/reader/readerui")
|
|
local WebDavApi = require("apps/cloudstorage/webdavapi")
|
|
local util = require("util")
|
|
local ffiutil = require("ffi/util")
|
|
local _ = require("gettext")
|
|
local T = require("ffi/util").template
|
|
|
|
local WebDav = {}
|
|
|
|
function WebDav:run(address, user, pass, path, folder_mode)
|
|
return WebDavApi:listFolder(address, user, pass, path, folder_mode)
|
|
end
|
|
|
|
function WebDav:downloadFile(item, address, username, password, local_path, callback_close)
|
|
local code_response = WebDavApi:downloadFile(WebDavApi:getJoinedPath(address, item.url), username, password, local_path)
|
|
if code_response == 200 then
|
|
local __, filename = util.splitFilePathName(local_path)
|
|
if G_reader_settings:isTrue("show_unsupported") and not DocumentRegistry:hasProvider(filename) then
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("File saved to:\n%1"), BD.filepath(local_path)),
|
|
})
|
|
else
|
|
UIManager:show(ConfirmBox:new{
|
|
text = T(_("File saved to:\n%1\nWould you like to read the downloaded book now?"),
|
|
BD.filepath(local_path)),
|
|
ok_callback = function()
|
|
local Event = require("ui/event")
|
|
UIManager:broadcastEvent(Event:new("SetupShowReader"))
|
|
|
|
if callback_close then
|
|
callback_close()
|
|
end
|
|
|
|
ReaderUI:showReader(local_path)
|
|
end
|
|
})
|
|
end
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Could not save file to:\n%1"), BD.filepath(local_path)),
|
|
timeout = 3,
|
|
})
|
|
end
|
|
end
|
|
|
|
function WebDav:uploadFile(url, address, username, password, local_path, callback_close)
|
|
local path = WebDavApi:getJoinedPath(address, url)
|
|
path = WebDavApi:getJoinedPath(path, ffiutil.basename(local_path))
|
|
local code_response = WebDavApi:uploadFile(path, username, password, local_path)
|
|
if code_response >= 200 and code_response < 300 then
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("File uploaded:\n%1"), BD.filepath(address)),
|
|
})
|
|
if callback_close then callback_close() end
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Could not upload file:\n%1"), BD.filepath(address)),
|
|
timeout = 3,
|
|
})
|
|
end
|
|
end
|
|
|
|
function WebDav:createFolder(url, address, username, password, folder_name, callback_close)
|
|
local code_response = WebDavApi:createFolder(address .. WebDavApi:urlEncode(url .. "/" .. folder_name), username, password, folder_name)
|
|
if code_response == 201 then
|
|
if callback_close then
|
|
callback_close()
|
|
end
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = T(_("Could not create folder:\n%1"), folder_name),
|
|
})
|
|
end
|
|
end
|
|
|
|
function WebDav:config(item, callback)
|
|
local text_info = _([[Server address must be of the form http(s)://domain.name/path
|
|
This can point to a sub-directory of the WebDAV server.
|
|
The start folder is appended to the server path.]])
|
|
|
|
local hint_name = _("Server display name")
|
|
local text_name = ""
|
|
local hint_address = _("WebDAV address, for example https://example.com/dav")
|
|
local text_address = ""
|
|
local hint_username = _("Username")
|
|
local text_username = ""
|
|
local hint_password = _("Password")
|
|
local text_password = ""
|
|
local hint_folder = _("Start folder")
|
|
local text_folder = ""
|
|
local title
|
|
local text_button_ok = _("Add")
|
|
if item then
|
|
title = _("Edit WebDAV account")
|
|
text_button_ok = _("Apply")
|
|
text_name = item.text
|
|
text_address = item.address
|
|
text_username = item.username
|
|
text_password = item.password
|
|
text_folder = item.url
|
|
else
|
|
title = _("Add WebDAV account")
|
|
end
|
|
self.settings_dialog = MultiInputDialog:new {
|
|
title = title,
|
|
fields = {
|
|
{
|
|
text = text_name,
|
|
input_type = "string",
|
|
hint = hint_name ,
|
|
},
|
|
{
|
|
text = text_address,
|
|
input_type = "string",
|
|
hint = hint_address ,
|
|
},
|
|
{
|
|
text = text_username,
|
|
input_type = "string",
|
|
hint = hint_username,
|
|
},
|
|
{
|
|
text = text_password,
|
|
input_type = "string",
|
|
text_type = "password",
|
|
hint = hint_password,
|
|
},
|
|
{
|
|
text = text_folder,
|
|
input_type = "string",
|
|
hint = hint_folder,
|
|
},
|
|
},
|
|
buttons = {
|
|
{
|
|
{
|
|
text = _("Cancel"),
|
|
id = "close",
|
|
callback = function()
|
|
self.settings_dialog:onClose()
|
|
UIManager:close(self.settings_dialog)
|
|
end
|
|
},
|
|
{
|
|
text = _("Info"),
|
|
callback = function()
|
|
UIManager:show(InfoMessage:new{ text = text_info })
|
|
end
|
|
},
|
|
{
|
|
text = text_button_ok,
|
|
callback = function()
|
|
local fields = self.settings_dialog:getFields()
|
|
|
|
-- make sure the URL is a valid path
|
|
if fields[5] ~= "" then
|
|
if string.sub(fields[5], 1, 1) ~= '/' then
|
|
fields[5] = '/' .. fields[5]
|
|
end
|
|
end
|
|
|
|
if fields[1] ~= "" and fields[2] ~= "" then
|
|
if item then
|
|
-- edit
|
|
callback(item, fields)
|
|
else
|
|
-- add new
|
|
callback(fields)
|
|
end
|
|
self.settings_dialog:onClose()
|
|
UIManager:close(self.settings_dialog)
|
|
else
|
|
UIManager:show(InfoMessage:new{
|
|
text = _("Please fill in all fields.")
|
|
})
|
|
end
|
|
end
|
|
},
|
|
},
|
|
},
|
|
input_type = "text",
|
|
}
|
|
UIManager:show(self.settings_dialog)
|
|
self.settings_dialog:onShowKeyboard()
|
|
|
|
end
|
|
|
|
function WebDav:info(item)
|
|
local info_text = T(_"Type: %1\nName: %2\nAddress: %3", "WebDAV", item.text, item.address)
|
|
UIManager:show(InfoMessage:new{text = info_text})
|
|
end
|
|
|
|
return WebDav
|