Mercurial Hosting > luan
changeset 706:30c87c859277
add Io.zip
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 17 May 2016 19:00:25 -0600 |
parents | 52ecb629a634 |
children | 1ed9e55f0be8 |
files | core/src/luan/modules/Io.luan core/src/luan/modules/IoLuan.java |
diffstat | 2 files changed, 34 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
diff -r 52ecb629a634 -r 30c87c859277 core/src/luan/modules/Io.luan --- a/core/src/luan/modules/Io.luan Tue May 17 16:42:47 2016 -0600 +++ b/core/src/luan/modules/Io.luan Tue May 17 19:00:25 2016 -0600 @@ -8,6 +8,7 @@ M.read_console_line = IoLuan.read_console_line M.schemes = IoLuan.newSchemes() M.uri = IoLuan.uri +M.zip = IoLuan.zip M.stdin = IoLuan.defaultStdin.table() M.socket_server = IoLuan.socket_server M.stdout = IoLuan.textWriter(System.out)
diff -r 52ecb629a634 -r 30c87c859277 core/src/luan/modules/IoLuan.java --- a/core/src/luan/modules/IoLuan.java Tue May 17 16:42:47 2016 -0600 +++ b/core/src/luan/modules/IoLuan.java Tue May 17 19:00:25 2016 -0600 @@ -29,6 +29,9 @@ import java.net.UnknownHostException; import java.util.List; import java.util.ArrayList; +import java.util.Map; +import java.util.zip.ZipOutputStream; +import java.util.zip.ZipEntry; import luan.Luan; import luan.LuanState; import luan.LuanTable; @@ -712,6 +715,36 @@ } + // files maps zip name to uri + public static void zip(LuanState luan,String zipUri,LuanTable files) throws LuanException, IOException { + Object obj = uri(luan,zipUri).rawGet("java"); + if( !(obj instanceof LuanIO) ) + throw new LuanException("invalid uri for zip"); + LuanIO zipIo = (LuanIO)obj; + ZipOutputStream out = new ZipOutputStream(zipIo.outputStream()); + for( Map.Entry<Object,Object> entry : files.iterable(luan) ) { + obj = entry.getKey(); + if( !(obj instanceof String) ) + throw new LuanException("zip file table keys must be strings"); + String fileName = (String)obj; + obj = entry.getValue(); + if( !(obj instanceof String) ) + throw new LuanException("zip file table values must be strings"); + String uriStr = (String)obj; + out.putNextEntry(new ZipEntry(fileName)); + obj = uri(luan,uriStr).rawGet("java"); + if( !(obj instanceof LuanIn) ) + throw new LuanException("invalid uri for zip"); + LuanIn zipIn = (LuanIn)obj; + InputStream in = zipIn.inputStream(); + Utils.copyAll(in,out); + in.close(); + out.closeEntry(); + } + out.close(); + } + + // security public interface Security {