00001 00004 package org.openmobileis.common.util.file; 00005 00006 import java.io.ByteArrayInputStream; 00007 import java.io.ByteArrayOutputStream; 00008 import java.io.DataInputStream; 00009 import java.io.DataOutputStream; 00010 import java.io.IOException; 00011 00012 import org.openmobileis.common.util.collection.Array; 00013 00018 public class OpenMisArchive { 00019 private Array entryList; 00023 public OpenMisArchive() { 00024 entryList = new Array(); 00025 } 00026 00027 public void addEntry(OpenMisArchiveEntry entry) { 00028 entryList.add(entry); 00029 } 00030 00031 public void addEntry(String name, byte[] data) { 00032 entryList.add(new OpenMisArchiveEntry(name, data)); 00033 } 00034 00035 public OpenMisArchiveEntry getEntry(int index){ 00036 if (index < this.entryList.size()){ 00037 return (OpenMisArchiveEntry)this.entryList.get(index); 00038 } 00039 return null; 00040 } 00041 00042 public int getEntryCount() { 00043 return entryList.size(); 00044 } 00045 00046 public byte[] encodeArchive() throws IOException { 00047 ByteArrayOutputStream bout = new ByteArrayOutputStream(); 00048 DataOutputStream dout = new DataOutputStream(bout); 00049 dout.writeInt(entryList.size()); 00050 int size = this.entryList.size(); 00051 for (int i=0; i<size; i++) { 00052 OpenMisArchiveEntry entry = (OpenMisArchiveEntry)this.entryList.get(i); 00053 dout.writeUTF(entry.getName()); 00054 dout.writeInt(entry.getData().length); 00055 dout.write(entry.getData()); 00056 } 00057 dout.flush(); 00058 dout.close(); 00059 return bout.toByteArray(); 00060 } 00061 00062 public static OpenMisArchive decodeArchive(byte[] archive) throws IOException { 00063 ByteArrayInputStream bin = new ByteArrayInputStream(archive); 00064 DataInputStream din = new DataInputStream(bin); 00065 OpenMisArchive newarchive = new OpenMisArchive(); 00066 int nbEntry = din.readInt(); 00067 for (int i=0; i<nbEntry; i++){ 00068 String name = din.readUTF(); 00069 int length = din.readInt(); 00070 byte[] entry = new byte[length]; 00071 din.read(entry, 0, length); 00072 newarchive.addEntry(name, entry); 00073 } 00074 return newarchive; 00075 } 00076 00077 }