OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / archive / cab / CabCfFolder.java
1 package jp.sfjp.armadillo.archive.cab;
2
3 import java.io.*;
4 import java.util.*;
5
6 public final class CabCfFolder extends CabEntry {
7
8     final List<CabCfFile> files;
9     ByteArrayOutputStream bos;
10     CabCfData currentCabCfData;
11     short method;
12     int checksum;
13     int offset;
14     final List<CabCfData> arrayOfCfData;
15
16     public CabCfFolder() {
17         super();
18         this.files = new ArrayList<CabCfFile>();
19         this.arrayOfCfData = new ArrayList<CabCfData>();
20     }
21
22     public CabCfFolder(String name) {
23         this();
24         if (name == null)
25             throw new IllegalArgumentException("name is null");
26         setName(name);
27         this.bos = new ByteArrayOutputStream();
28     }
29
30     public void writeCfDataInto(OutputStream os, CabHeader header) throws IOException {
31         for (CabCfData data : arrayOfCfData) {
32             header.writeCfDataHeader(os, data);
33             data.writeInto(os);
34         }
35     }
36
37     @Override
38     public long getSize() {
39         return 0;
40     }
41
42     @Override
43     public void setSize(long size) {
44         // ignore
45     }
46
47     @Override
48     public long getCompressedSize() {
49         return 0;
50     }
51
52     @Override
53     public void setCompressedSize(long size) {
54         // ignore
55     }
56
57     @Override
58     public void setLastModified(long time) {
59         // ignore
60     }
61
62     public boolean add(CabCfFile f) {
63         return files.add(f);
64     }
65
66     public int getCompressedDataSize() {
67         int size = 0;
68         for (CabCfData data : arrayOfCfData)
69             size += data.bos.size();
70         return size;
71     }
72
73     public void close() throws IOException {
74         final int size = bos.size();
75         byte[] bytes = bos.toByteArray();
76         final int cfDataSize = 32768;
77         int len = size;
78         final int count;
79         if (size == 0)
80             count = 0;
81         else if (size < cfDataSize)
82             count = 1;
83         else
84             count = size / cfDataSize + 1;
85         int p = 0;
86         method = 1;
87         for (int i = 0; i < count; i++) {
88             CabCfData data = new CabCfData(CabCompressionType.of(method));
89             try {
90                 final int writeLen = len > cfDataSize ? cfDataSize : len;
91                 data.write(bytes, p, writeLen);
92                 p += cfDataSize;
93                 len -= cfDataSize;
94             }
95             finally {
96                 data.close();
97             }
98             arrayOfCfData.add(data);
99         }
100         bos = null;
101     }
102
103 }