summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/handlers.rs58
-rw-r--r--src/msg.fbs12
2 files changed, 70 insertions, 0 deletions
diff --git a/src/handlers.rs b/src/handlers.rs
index c7e7ab7c5..80eb2871e 100644
--- a/src/handlers.rs
+++ b/src/handlers.rs
@@ -76,6 +76,7 @@ pub fn msg_from_js(
msg::Any::Write => handle_write,
msg::Any::Remove => handle_remove,
msg::Any::ReadFile => handle_read_file,
+ msg::Any::ReadDir => handle_read_dir,
msg::Any::Rename => handle_rename,
msg::Any::Readlink => handle_read_link,
msg::Any::Symlink => handle_symlink,
@@ -816,6 +817,63 @@ fn handle_stat(
})
}
+fn handle_read_dir(
+ _state: Arc<IsolateState>,
+ base: &msg::Base,
+ data: &'static mut [u8],
+) -> Box<Op> {
+ assert_eq!(data.len(), 0);
+ let msg = base.msg_as_read_dir().unwrap();
+ let cmd_id = base.cmd_id();
+ let path = String::from(msg.path().unwrap());
+
+ blocking!(base.sync(), || -> OpResult {
+ debug!("handle_read_dir {}", path);
+ let builder = &mut FlatBufferBuilder::new();
+ let entries: Vec<_> = fs::read_dir(Path::new(&path))?
+ .map(|entry| {
+ let entry = entry.unwrap();
+ let metadata = entry.metadata().unwrap();
+ let file_type = metadata.file_type();
+ let name = builder.create_string(entry.file_name().to_str().unwrap());
+ let path = builder.create_string(entry.path().to_str().unwrap());
+
+ msg::StatRes::create(
+ builder,
+ &msg::StatResArgs {
+ is_file: file_type.is_file(),
+ is_symlink: file_type.is_symlink(),
+ len: metadata.len(),
+ modified: to_seconds!(metadata.modified()),
+ accessed: to_seconds!(metadata.accessed()),
+ created: to_seconds!(metadata.created()),
+ name: Some(name),
+ path: Some(path),
+ ..Default::default()
+ },
+ )
+ }).collect();
+
+ let entries = builder.create_vector(&entries);
+ let msg = msg::ReadDirRes::create(
+ builder,
+ &msg::ReadDirResArgs {
+ entries: Some(entries),
+ ..Default::default()
+ },
+ );
+ Ok(serialize_response(
+ cmd_id,
+ builder,
+ msg::BaseArgs {
+ msg: Some(msg.as_union_value()),
+ msg_type: msg::Any::ReadDirRes,
+ ..Default::default()
+ },
+ ))
+ })
+}
+
fn handle_write_file(
state: Arc<IsolateState>,
base: &msg::Base,
diff --git a/src/msg.fbs b/src/msg.fbs
index e4886b6a9..83dca11e6 100644
--- a/src/msg.fbs
+++ b/src/msg.fbs
@@ -16,6 +16,8 @@ union Any {
Remove,
ReadFile,
ReadFileRes,
+ ReadDir,
+ ReadDirRes,
WriteFile,
CopyFile,
Rename,
@@ -191,6 +193,14 @@ table ReadFileRes {
data: [ubyte];
}
+table ReadDir {
+ path: string;
+}
+
+table ReadDirRes {
+ entries: [StatRes];
+}
+
table WriteFile {
filename: string;
data: [ubyte];
@@ -235,6 +245,8 @@ table StatRes {
created:ulong;
mode: uint;
has_mode: bool; // false on windows
+ name: string;
+ path: string;
}
table Truncate {