|
|
|
@ -95,19 +95,12 @@ object RemoteBookWebDav : RemoteBookManager() { |
|
|
|
|
* 下载指定的远程书籍到本地 |
|
|
|
|
*/ |
|
|
|
|
override suspend fun getRemoteBook(remoteBook: RemoteBook): Uri? { |
|
|
|
|
return kotlin.runCatching { |
|
|
|
|
AppWebDav.authorization?.let { |
|
|
|
|
val webdav = WebDav( |
|
|
|
|
remoteBook.urlName, |
|
|
|
|
it |
|
|
|
|
) |
|
|
|
|
webdav.download().let { bytes -> |
|
|
|
|
LocalBook.saveBookFile(bytes, remoteBook.filename) |
|
|
|
|
} |
|
|
|
|
return AppWebDav.authorization?.let { |
|
|
|
|
val webdav = WebDav(remoteBook.urlName, it) |
|
|
|
|
webdav.download().let { bytes -> |
|
|
|
|
LocalBook.saveBookFile(bytes, remoteBook.filename) |
|
|
|
|
} |
|
|
|
|
}.onFailure { |
|
|
|
|
throw it |
|
|
|
|
}.getOrNull() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -118,19 +111,15 @@ object RemoteBookWebDav : RemoteBookManager() { |
|
|
|
|
|
|
|
|
|
val localBookName = localBookUri.path?.substringAfterLast(File.separator) |
|
|
|
|
val putUrl = "${remoteBookUrl}${File.separator}${localBookName}" |
|
|
|
|
kotlin.runCatching { |
|
|
|
|
AppWebDav.authorization?.let { |
|
|
|
|
if (localBookUri.isContentScheme()) { |
|
|
|
|
WebDav(putUrl, it).upload( |
|
|
|
|
byteArray = localBookUri.readBytes(appCtx), |
|
|
|
|
contentType = "application/octet-stream" |
|
|
|
|
) |
|
|
|
|
} else { |
|
|
|
|
WebDav(putUrl, it).upload(localBookUri.path!!) |
|
|
|
|
} |
|
|
|
|
AppWebDav.authorization?.let { |
|
|
|
|
if (localBookUri.isContentScheme()) { |
|
|
|
|
WebDav(putUrl, it).upload( |
|
|
|
|
byteArray = localBookUri.readBytes(appCtx), |
|
|
|
|
contentType = "application/octet-stream" |
|
|
|
|
) |
|
|
|
|
} else { |
|
|
|
|
WebDav(putUrl, it).upload(localBookUri.path!!) |
|
|
|
|
} |
|
|
|
|
}.onFailure { |
|
|
|
|
throw it |
|
|
|
|
} |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
@ -139,149 +128,4 @@ object RemoteBookWebDav : RemoteBookManager() { |
|
|
|
|
TODO("Not yet implemented") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// suspend fun showRestoreDialog(context: Context) { |
|
|
|
|
// val names = withContext(Dispatchers.IO) { getBackupNames() } |
|
|
|
|
// if (names.isNotEmpty()) { |
|
|
|
|
// withContext(Dispatchers.Main) { |
|
|
|
|
// context.selector( |
|
|
|
|
// title = context.getString(R.string.select_restore_file), |
|
|
|
|
// items = names |
|
|
|
|
// ) { _, index -> |
|
|
|
|
// if (index in 0 until names.size) { |
|
|
|
|
// Coroutine.async { |
|
|
|
|
// restoreWebDav(names[index]) |
|
|
|
|
// }.onError { |
|
|
|
|
// appCtx.toastOnUi("WebDav恢复出错\n${it.localizedMessage}") |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } else { |
|
|
|
|
// throw NoStackTraceException("Web dav no back up file") |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// @Throws(WebDavException::class) |
|
|
|
|
// suspend fun restoreWebDav(name: String) { |
|
|
|
|
// authorization?.let { |
|
|
|
|
// val webDav = WebDav(rootWebDavUrl + name, it) |
|
|
|
|
// webDav.downloadTo(zipFilePath, true) |
|
|
|
|
// @Suppress("BlockingMethodInNonBlockingContext") |
|
|
|
|
// ZipUtils.unzipFile(zipFilePath, Backup.backupPath) |
|
|
|
|
// Restore.restoreDatabase() |
|
|
|
|
// Restore.restoreConfig() |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// suspend fun hasBackUp(): Boolean { |
|
|
|
|
// authorization?.let { |
|
|
|
|
// val url = "${rootWebDavUrl}${backupFileName}" |
|
|
|
|
// return WebDav(url, it).exists() |
|
|
|
|
// } |
|
|
|
|
// return false |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// suspend fun lastBackUp(): Result<WebDavFile?> { |
|
|
|
|
// return kotlin.runCatching { |
|
|
|
|
// authorization?.let { |
|
|
|
|
// var lastBackupFile: WebDavFile? = null |
|
|
|
|
// WebDav(rootWebDavUrl, it).listFiles().reversed().forEach { webDavFile -> |
|
|
|
|
// if (webDavFile.displayName.startsWith("backup")) { |
|
|
|
|
// if (lastBackupFile == null |
|
|
|
|
// || webDavFile.lastModify > lastBackupFile!!.lastModify |
|
|
|
|
// ) { |
|
|
|
|
// lastBackupFile = webDavFile |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// lastBackupFile |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// @Throws(Exception::class) |
|
|
|
|
// suspend fun backUpWebDav(path: String) { |
|
|
|
|
// if (!NetworkUtils.isAvailable()) return |
|
|
|
|
// authorization?.let { |
|
|
|
|
// val paths = arrayListOf(*Backup.backupFileNames) |
|
|
|
|
// for (i in 0 until paths.size) { |
|
|
|
|
// paths[i] = path + File.separator + paths[i] |
|
|
|
|
// } |
|
|
|
|
// FileUtils.delete(zipFilePath) |
|
|
|
|
// if (ZipUtils.zipFiles(paths, zipFilePath)) { |
|
|
|
|
// val putUrl = "${rootWebDavUrl}${backupFileName}" |
|
|
|
|
// WebDav(putUrl, it).upload(zipFilePath) |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// suspend fun exportWebDav(byteArray: ByteArray, fileName: String) { |
|
|
|
|
// if (!NetworkUtils.isAvailable()) return |
|
|
|
|
// try { |
|
|
|
|
// authorization?.let { |
|
|
|
|
// // 如果导出的本地文件存在,开始上传 |
|
|
|
|
// val putUrl = exportsWebDavUrl + fileName |
|
|
|
|
// WebDav(putUrl, it).upload(byteArray, "text/plain") |
|
|
|
|
// } |
|
|
|
|
// } catch (e: Exception) { |
|
|
|
|
// val msg = "WebDav导出\n${e.localizedMessage}" |
|
|
|
|
// AppLog.put(msg) |
|
|
|
|
// appCtx.toastOnUi(msg) |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// fun uploadBookProgress(book: Book) { |
|
|
|
|
// val authorization = authorization ?: return |
|
|
|
|
// if (!syncBookProgress) return |
|
|
|
|
// if (!NetworkUtils.isAvailable()) return |
|
|
|
|
// Coroutine.async { |
|
|
|
|
// val bookProgress = BookProgress(book) |
|
|
|
|
// val json = GSON.toJson(bookProgress) |
|
|
|
|
// val url = getProgressUrl(book) |
|
|
|
|
// WebDav(url, authorization).upload(json.toByteArray(), "application/json") |
|
|
|
|
// }.onError { |
|
|
|
|
// AppLog.put("上传进度失败\n${it.localizedMessage}") |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// private fun getProgressUrl(book: Book): String { |
|
|
|
|
// return bookProgressUrl + book.name + "_" + book.author + ".json" |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// /** |
|
|
|
|
// * 获取书籍进度 |
|
|
|
|
// */ |
|
|
|
|
// suspend fun getBookProgress(book: Book): BookProgress? { |
|
|
|
|
// authorization?.let { |
|
|
|
|
// val url = getProgressUrl(book) |
|
|
|
|
// kotlin.runCatching { |
|
|
|
|
// WebDav(url, it).download().let { byteArray -> |
|
|
|
|
// val json = String(byteArray) |
|
|
|
|
// if (json.isJson()) { |
|
|
|
|
// return GSON.fromJsonObject<BookProgress>(json).getOrNull() |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// return null |
|
|
|
|
// } |
|
|
|
|
// |
|
|
|
|
// suspend fun downloadAllBookProgress() { |
|
|
|
|
// authorization ?: return |
|
|
|
|
// if (!NetworkUtils.isAvailable()) return |
|
|
|
|
// appDb.bookDao.all.forEach { book -> |
|
|
|
|
// getBookProgress(book)?.let { bookProgress -> |
|
|
|
|
// if (bookProgress.durChapterIndex > book.durChapterIndex |
|
|
|
|
// || (bookProgress.durChapterIndex == book.durChapterIndex |
|
|
|
|
// && bookProgress.durChapterPos > book.durChapterPos) |
|
|
|
|
// ) { |
|
|
|
|
// book.durChapterIndex = bookProgress.durChapterIndex |
|
|
|
|
// book.durChapterPos = bookProgress.durChapterPos |
|
|
|
|
// book.durChapterTitle = bookProgress.durChapterTitle |
|
|
|
|
// book.durChapterTime = bookProgress.durChapterTime |
|
|
|
|
// appDb.bookDao.update(book) |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
// } |
|
|
|
|
} |