Files
markbase/markbase-webdav/src/webdav/dav_file.rs
Warren 1300a4e223
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled
MarkBase架构升级:Multi-Volume Virtual Tree + Dual-View Management + Git Remote修正
核心功能:
-  Categories/Series双视图管理(category_view.rs + import_markdown.rs)
-  FUSE Multi-Volume支持(tree_type参数)
-  SSH/SFTP/SCP/rsync协议完整实现(4042行)
-  NFS/SMB Module Phase 1-3完成
-  Archive Module Phase 1-4完成(2916行)
-  Download Center API完整实现
-  S3兼容API实现(560行)

Git配置修正:
-  删除错误origin(gitea.momentry.ddns.net)
-  删除m5max128(指向机器名)
-  设置origin = m5max128gitea.momentry.ddns.net/admin/markbase
-  设置m4minigitea = m4minigitea.momentry.ddns.net/warren/markbase

数据清理:
-  删除38个临时SQLite(保留accusys.sqlite、demo.sqlite)
-  删除.bak、test_*.bin、调试脚本等临时文件
-  删除临时目录(build/、download files/、raid_test/等)
-  更新.gitignore排除临时文件

架构优化:
- 52个文件修改,2434行新增,4739行删除
- Workspace成员整合(16个crate)
- 数据库状态:accusys.sqlite保留(主demo测试)

远程同步:
-  准备推送到m5max128gitea(远程Gitea)
-  准备推送到m4minigitea(本地Gitea)
2026-06-12 12:59:54 +08:00

80 lines
2.4 KiB
Rust

use crate::webdav::dav_metadata::MarkBaseDavMetaData;
use bytes::{Buf, Bytes};
use dav_server::fs::{DavFile, DavMetaData, FsError, FsFuture};
use std::sync::Mutex;
#[derive(Debug)]
pub struct MarkBaseDavFile {
content: Mutex<FileContent>,
}
#[derive(Debug)]
struct FileContent {
data: Vec<u8>,
position: u64,
}
impl MarkBaseDavFile {
pub fn new(data: Vec<u8>) -> Self {
Self {
content: Mutex::new(FileContent { data, position: 0 }),
}
}
}
impl DavFile for MarkBaseDavFile {
fn metadata(&'_ mut self) -> FsFuture<'_, Box<dyn DavMetaData>> {
let content = self.content.lock().unwrap();
let len = content.data.len() as u64;
Box::pin(std::future::ready(Ok(
Box::new(MarkBaseDavMetaData::new(len, false)) as Box<dyn DavMetaData>,
)))
}
fn write_buf(&'_ mut self, _buf: Box<dyn Buf + Send>) -> FsFuture<'_, ()> {
Box::pin(std::future::ready(Err(FsError::NotImplemented)))
}
fn write_bytes(&'_ mut self, _buf: Bytes) -> FsFuture<'_, ()> {
Box::pin(std::future::ready(Err(FsError::NotImplemented)))
}
fn read_bytes(&'_ mut self, count: usize) -> FsFuture<'_, Bytes> {
let mut content = self.content.lock().unwrap();
let start = content.position as usize;
let end = std::cmp::min(start + count, content.data.len());
if start >= content.data.len() {
Box::pin(std::future::ready(Ok(Bytes::new())))
} else {
let bytes = Bytes::copy_from_slice(&content.data[start..end]);
content.position = end as u64;
Box::pin(std::future::ready(Ok(bytes)))
}
}
fn seek(&'_ mut self, pos: std::io::SeekFrom) -> FsFuture<'_, u64> {
let mut content = self.content.lock().unwrap();
let new_pos = match pos {
std::io::SeekFrom::Start(offset) => offset,
std::io::SeekFrom::Current(offset) => {
let current = content.position as i64;
(current + offset) as u64
}
std::io::SeekFrom::End(offset) => {
let end = content.data.len() as i64;
(end + offset) as u64
}
};
content.position = new_pos;
Box::pin(std::future::ready(Ok(new_pos)))
}
fn flush(&'_ mut self) -> FsFuture<'_, ()> {
Box::pin(std::future::ready(Ok(())))
}
}