• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * BCJDecoder
3  *
4  * Author: Lasse Collin <lasse.collin@tukaani.org>
5  *
6  * This file has been put into the public domain.
7  * You can do whatever you want with this file.
8  */
9 
10 package org.tukaani.xz;
11 
12 import java.io.InputStream;
13 import org.tukaani.xz.simple.*;
14 
15 class BCJDecoder extends BCJCoder implements FilterDecoder {
16     private final long filterID;
17     private final int startOffset;
18 
BCJDecoder(long filterID, byte[] props)19     BCJDecoder(long filterID, byte[] props)
20             throws UnsupportedOptionsException {
21         assert isBCJFilterID(filterID);
22         this.filterID = filterID;
23 
24         if (props.length == 0) {
25             startOffset = 0;
26         } else if (props.length == 4) {
27             int n = 0;
28             for (int i = 0; i < 4; ++i)
29                 n |= (props[i] & 0xFF) << (i * 8);
30 
31             startOffset = n;
32         } else {
33             throw new UnsupportedOptionsException(
34                     "Unsupported BCJ filter properties");
35         }
36     }
37 
getMemoryUsage()38     public int getMemoryUsage() {
39         return SimpleInputStream.getMemoryUsage();
40     }
41 
getInputStream(InputStream in)42     public InputStream getInputStream(InputStream in) {
43         SimpleFilter simpleFilter = null;
44 
45         if (filterID == X86_FILTER_ID)
46             simpleFilter = new X86(false, startOffset);
47         else if (filterID == POWERPC_FILTER_ID)
48             simpleFilter = new PowerPC(false, startOffset);
49         else if (filterID == IA64_FILTER_ID)
50             simpleFilter = new IA64(false, startOffset);
51         else if (filterID == ARM_FILTER_ID)
52             simpleFilter = new ARM(false, startOffset);
53         else if (filterID == ARMTHUMB_FILTER_ID)
54             simpleFilter = new ARMThumb(false, startOffset);
55         else if (filterID == SPARC_FILTER_ID)
56             simpleFilter = new SPARC(false, startOffset);
57         else
58             assert false;
59 
60         return new SimpleInputStream(in, simpleFilter);
61     }
62 }
63