Skip to content

Commit 9e81047

Browse files
committed
move read apk into impl
1 parent 4b64a24 commit 9e81047

File tree

2 files changed

+48
-43
lines changed

2 files changed

+48
-43
lines changed

asm_server/src/impls/server.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
use crate::ui::AppContainer;
2-
use crate::AsmServer;
2+
use crate::{AccessorEnum, AccessorMut, AsmServer, ServerMut};
33
use log::info;
4+
use std::io::{Read, Seek};
45
use std::ops::DerefMut;
56
use std::time::Instant;
7+
use tokio::runtime::Runtime;
8+
use tokio::sync::mpsc;
9+
use tokio::sync::mpsc::Sender;
10+
use zip::ZipArchive;
11+
use crate::impls::apk_load::read_apk;
12+
use crate::server::OpenFileError;
613

714
pub enum ServerMessage {
815
Progress(ProgressMessage),
@@ -21,6 +28,43 @@ pub struct FileOpenContext {
2128

2229

2330
impl AsmServer {
31+
pub fn create_message_handler(
32+
server: &ServerMut, runtime: &Runtime, render_target: &AppContainer,
33+
) -> Sender<ServerMessage> {
34+
let server = server.clone();
35+
let render_target = render_target.clone();
36+
let (sender, receiver) = mpsc::channel::<ServerMessage>(5);
37+
runtime.spawn(async move {
38+
let mut receiver = receiver;
39+
while let Some(msg) = receiver.recv().await {
40+
let mut server = server.lock();
41+
let server_ref = server.deref_mut();
42+
let Some(server_ref) = server_ref else { continue };
43+
match msg {
44+
ServerMessage::Progress(progress) => {
45+
server_ref.loading_state.loading_progress = progress.progress;
46+
server_ref.loading_state.in_loading = progress.in_loading;
47+
server_ref.on_progress_update(&render_target);
48+
}
49+
}
50+
}
51+
});
52+
sender
53+
}
54+
55+
pub async fn from_apk(
56+
apk_content: impl Read + Seek,
57+
sender: Sender<ServerMessage>,
58+
accessor: AccessorMut,
59+
) -> Result<(), OpenFileError> {
60+
let zip = ZipArchive::new(apk_content)
61+
.map_err(OpenFileError::LoadZip)?;
62+
let apk_accessor = read_apk(zip, sender).await?;
63+
// safe unwrap, no other places in current thread will access it.
64+
*accessor.lock() = Some(AccessorEnum::Apk(apk_accessor));
65+
Ok(())
66+
}
67+
2468
pub fn on_file_opened(
2569
&self,
2670
context: &FileOpenContext,

asm_server/src/server.rs

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,8 @@ use std::ops::{Deref, DerefMut};
1212
use std::sync::Arc;
1313
use std::time::Instant;
1414
use tokio::sync::mpsc;
15-
use tokio::sync::mpsc::Sender;
1615
use zip::result::ZipError;
17-
use zip::ZipArchive;
1816

19-
/// Builders of [AsmServer]
2017
impl AsmServer {
2118
pub fn new() -> Self {
2219
Self {
@@ -32,31 +29,12 @@ impl AsmServer {
3229
pub fn smart_open(server: ServerMut, path: &str, render_target: AppContainer) {
3330
let context = FileOpenContext { path: path.to_string(), start_time: Instant::now() };
3431
new_tokio_thread(|runtime| async move {
35-
let (sender, receiver) = mpsc::channel::<ServerMessage>(5);
36-
3732
let new_server = AsmServer::new();
3833
*server.lock() = Some(new_server.clone());
3934

40-
let server_for_receiver = server.clone();
41-
let render_target_for_receiver = render_target.clone();
42-
runtime.spawn(async move {
43-
let server = &server_for_receiver;
44-
let render_target = &render_target_for_receiver;
45-
46-
let mut receiver = receiver;
47-
while let Some(msg) = receiver.recv().await {
48-
let mut server = server.lock();
49-
let server_ref = server.deref_mut();
50-
let Some(server_ref) = server_ref else { continue };
51-
match msg {
52-
ServerMessage::Progress(progress) => {
53-
server_ref.loading_state.loading_progress = progress.progress;
54-
server_ref.loading_state.in_loading = progress.in_loading;
55-
server_ref.on_progress_update(&render_target);
56-
}
57-
}
58-
}
59-
});
35+
let sender = Self::create_message_handler(
36+
&server, &runtime, &render_target,
37+
);
6038

6139
let path = &context.path;
6240
let accessor = new_server.accessor.clone();
@@ -80,23 +58,6 @@ impl AsmServer {
8058
new_server.on_file_opened(&context, render_target);
8159
});
8260
}
83-
84-
pub async fn from_apk(
85-
apk_content: impl Read + Seek,
86-
sender: Sender<ServerMessage>,
87-
accessor: AccessorMut,
88-
) -> Result<(), OpenFileError> {
89-
let zip = ZipArchive::new(apk_content)
90-
.map_err(OpenFileError::LoadZip)?;
91-
let apk_accessor = read_apk(zip, sender).await?;
92-
// safe unwrap, no other places in current thread will access it.
93-
*accessor.lock() = Some(AccessorEnum::Apk(apk_accessor));
94-
Ok(())
95-
}
96-
97-
pub fn from_dex(dex_path: &str) -> Self {
98-
unimplemented!()
99-
}
10061
}
10162

10263

0 commit comments

Comments
 (0)