zipstream.monkey2 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. Namespace std.stream
  2. #Import "<miniz.monkey2>"
  3. Using libc
  4. Using miniz
  5. #rem monkeydoc @hidden ZipStream class.
  6. #end
  7. Class ZipStream Extends DataStream
  8. Method New( buf:DataBuffer )
  9. Super.New( buf )
  10. End
  11. Function Open:ZipStream( path:String,mode:String )
  12. If mode<>"r" Return Null
  13. Local i:=path.FindLast( "//" )
  14. If i=-1 Return Null
  15. Local stream:ZipStream
  16. Local src:=DataBuffer.Load( path.Slice( 0,i ) )
  17. If src
  18. Local zip:mz_zip_archive
  19. memset( Varptr zip,0,sizeof( zip ) )
  20. If mz_zip_reader_init_mem( Varptr zip,src.Data,src.Length,0 )
  21. Local index:=mz_zip_reader_locate_file( Varptr zip,path.Slice( i+2 ),"",0 )
  22. If index>=0
  23. Local stat:mz_zip_archive_file_stat
  24. memset( Varptr stat,0,sizeof( stat ) )
  25. If mz_zip_reader_file_stat( Varptr zip,index,Varptr stat )
  26. Local buf:=New DataBuffer( stat.m_uncomp_size )
  27. If mz_zip_reader_extract_to_mem( Varptr zip,index,buf.Data,buf.Length,0 )
  28. stream=New ZipStream( buf )
  29. Else
  30. buf.Discard()
  31. Endif
  32. End
  33. End
  34. mz_zip_reader_end( Varptr zip )
  35. End
  36. src.Discard()
  37. Endif
  38. Return stream
  39. End
  40. End