OSDN Git Service

Add new source files
[armadillo/armadillo1.git] / src / jp / sfjp / armadillo / archive / lzh / LzhArchiveCreator.java
1 package jp.sfjp.armadillo.archive.lzh;
2
3 import static jp.sfjp.armadillo.archive.lzh.LzhHeader.HEADER_LEVEL_2;
4 import java.io.*;
5 import jp.sfjp.armadillo.archive.*;
6 import jp.sfjp.armadillo.io.*;
7
8 public final class LzhArchiveCreator implements ArchiveCreator {
9
10     private LzhOutputStream os;
11
12     public LzhArchiveCreator(OutputStream os) {
13         this.os = new LzhOutputStream(os);
14     }
15
16     @Override
17     public ArchiveEntry newEntry(String name) {
18         LzhEntry entry = newLzhEntry();
19         entry.setName(name);
20         return entry;
21     }
22
23     @Override
24     public void addEntry(ArchiveEntry entry, File file) throws IOException {
25         if (file.isDirectory()) {
26             final LzhEntry en = toLzhEntry(entry);
27             en.setMethod(LzhMethod.LHD);
28             os.putNextEntry(en);
29             os.closeEntry();
30         }
31         else {
32             InputStream is = new FileInputStream(file);
33             try {
34                 addEntry(entry, is, file.length());
35             }
36             finally {
37                 is.close();
38             }
39         }
40         entry.setAdded(true);
41     }
42
43     @Override
44     public void addEntry(ArchiveEntry entry, InputStream is, long length) throws IOException {
45         LzhEntry fileEntry = toLzhEntry(entry);
46         fileEntry.setSize(length);
47         os.putNextEntry(fileEntry);
48         final long size = IOUtilities.transferAll(is, os);
49         os.closeEntry();
50         assert size == fileEntry.getSize() : "file size";
51         assert size == length : "file size";
52         entry.setSize(size);
53         entry.setAdded(true);
54     }
55
56     static LzhEntry toLzhEntry(ArchiveEntry entry) {
57         if (entry instanceof LzhEntry)
58             return (LzhEntry)entry;
59         LzhEntry newEntry = newLzhEntry();
60         entry.copyTo(newEntry);
61         return newEntry;
62     }
63
64     private static LzhEntry newLzhEntry() {
65         return new LzhEntry(HEADER_LEVEL_2);
66     }
67
68     @Override
69     public void close() throws IOException {
70         os.close();
71     }
72
73 }