1- use alloc:: { string:: ToString , sync :: Arc , vec, vec:: Vec } ;
1+ use alloc:: { string:: ToString , vec, vec:: Vec } ;
22use core:: iter;
33
44// XXX for zip..
55extern crate std;
66use std:: io:: { Cursor , Read } ;
77
8- use parking_lot:: Mutex ;
98use zip:: ZipArchive ;
109
1110use java_class_proto:: { JavaFieldProto , JavaMethodProto } ;
12- use jvm:: { ClassInstanceRef , Jvm , Result , runtime:: JavaLangString } ;
11+ use jvm:: { Array , ClassInstanceRef , Jvm , Result , runtime:: JavaLangString } ;
1312
1413use crate :: {
1514 RuntimeClassProto , RuntimeContext ,
@@ -20,8 +19,6 @@ use crate::{
2019 } ,
2120} ;
2221
23- type JavaZipArchive = Arc < Mutex < ZipArchive < Cursor < Vec < u8 > > > > > ;
24-
2522// class java.util.zip.ZipFile
2623pub struct ZipFile ;
2724
@@ -47,11 +44,19 @@ impl ZipFile {
4744 ) ,
4845 JavaMethodProto :: new( "entries" , "()Ljava/util/Enumeration;" , Self :: entries, Default :: default ( ) ) ,
4946 ] ,
50- fields : vec ! [ JavaFieldProto :: new( "zip " , "[B" , Default :: default ( ) ) ] ,
47+ fields : vec ! [ JavaFieldProto :: new( "zipData " , "[B" , Default :: default ( ) ) ] ,
5148 access_flags : Default :: default ( ) ,
5249 }
5350 }
5451
52+ async fn get_zip_archive ( jvm : & Jvm , this : & ClassInstanceRef < Self > ) -> Result < ZipArchive < Cursor < Vec < u8 > > > > {
53+ let zip_data: ClassInstanceRef < Array < i8 > > = jvm. get_field ( this, "zipData" , "[B" ) . await ?;
54+ let length = jvm. array_length ( & zip_data) . await ?;
55+ let mut buf = vec ! [ 0u8 ; length] ;
56+ jvm. array_raw_buffer ( & zip_data) . await ?. read ( 0 , & mut buf) . unwrap ( ) ;
57+ Ok ( ZipArchive :: new ( Cursor :: new ( buf) ) . unwrap ( ) )
58+ }
59+
5560 async fn init ( jvm : & Jvm , _: & mut RuntimeContext , mut this : ClassInstanceRef < Self > , file : ClassInstanceRef < File > ) -> Result < ( ) > {
5661 tracing:: debug!( "java.util.zip.ZipFile::<init>({:?}, {:?})" , & this, & file, ) ;
5762
@@ -63,10 +68,7 @@ impl ZipFile {
6368 let buf = jvm. instantiate_array ( "B" , length as _ ) . await ?;
6469 let _: i32 = jvm. invoke_virtual ( & is, "read" , "([B)I" , ( buf. clone ( ) , ) ) . await ?;
6570
66- let mut rust_buf = vec ! [ 0 ; length as _] ;
67- jvm. array_raw_buffer ( & buf) . await ?. read ( 0 , & mut rust_buf) . unwrap ( ) ;
68- let zip = Arc :: new ( Mutex :: new ( ZipArchive :: new ( Cursor :: new ( rust_buf) ) . unwrap ( ) ) ) ;
69- jvm. put_rust_object_field ( & mut this, "zip" , zip) . await ?;
71+ jvm. put_field ( & mut this, "zipData" , "[B" , buf) . await ?;
7072
7173 Ok ( ( ) )
7274 }
@@ -82,8 +84,8 @@ impl ZipFile {
8284 let entry = jvm. new_class ( "java/util/zip/ZipEntry" , "(Ljava/lang/String;)V" , ( name. clone ( ) , ) ) . await ?;
8385 let name = JavaLangString :: to_rust_string ( jvm, & name) . await ?;
8486
85- let zip: JavaZipArchive = jvm . get_rust_object_field ( & this , "zip" ) . await ?;
86- let file_size = zip. lock ( ) . by_name ( & name) . map ( |x| x. size ( ) ) ;
87+ let mut zip = Self :: get_zip_archive ( jvm , & this ) . await ?;
88+ let file_size = zip. by_name ( & name) . map ( |x| x. size ( ) ) ;
8789
8890 if let Ok ( x) = file_size {
8991 let _: ( ) = jvm. invoke_virtual ( & entry, "setSize" , "(J)V" , ( x as i64 , ) ) . await ?;
@@ -97,8 +99,8 @@ impl ZipFile {
9799 async fn entries ( jvm : & Jvm , _: & mut RuntimeContext , this : ClassInstanceRef < Self > ) -> Result < ClassInstanceRef < Enumeration > > {
98100 tracing:: debug!( "java.util.zip.ZipFile::entries({:?})" , & this) ;
99101
100- let zip: JavaZipArchive = jvm . get_rust_object_field ( & this , "zip" ) . await ?;
101- let names = zip. lock ( ) . file_names ( ) . map ( |x| x. to_string ( ) ) . collect :: < Vec < _ > > ( ) ;
102+ let zip = Self :: get_zip_archive ( jvm , & this ) . await ?;
103+ let names = zip. file_names ( ) . map ( |x| x. to_string ( ) ) . collect :: < Vec < _ > > ( ) ;
102104
103105 let mut name_array = jvm. instantiate_array ( "Ljava/lang/String;" , names. len ( ) as _ ) . await ?;
104106 for ( i, name) in names. iter ( ) . enumerate ( ) {
@@ -129,9 +131,7 @@ impl ZipFile {
129131 let entry_name = JavaLangString :: to_rust_string ( jvm, & entry_name) . await ?;
130132
131133 let data = {
132- let zip: JavaZipArchive = jvm. get_rust_object_field ( & this, "zip" ) . await ?;
133-
134- let mut zip = zip. lock ( ) ;
134+ let mut zip = Self :: get_zip_archive ( jvm, & this) . await ?;
135135 let mut file = zip. by_name ( & entry_name) . unwrap ( ) ;
136136
137137 let mut buf = Vec :: new ( ) ;
0 commit comments