summaryrefslogtreecommitdiff
path: root/org.fox.ttcomics/src/main/java/org/fox/ttcomics2/junrar/util/VolumeHelper.java
blob: a22ccffa2d7f65c164f57e3bce1d754c90e5560d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package org.fox.ttcomics2.junrar.util;

public class VolumeHelper {
    private VolumeHelper() {
    }

    // public static boolean mergeArchive(Archive archive, ComprDataIO dataIO)
    // throws IOException {
    // FileHeader hd = dataIO.getSubHeader();
    // if (hd.getUnpVersion() >= 20 && hd.getFileCRC() != 0xffffffff
    // && dataIO.getPackedCRC() != ~hd.getFileCRC()) {
    // System.err.println("Data Bad CRC");
    // }
    //
    // boolean oldNumbering = !archive.getMainHeader().isNewNumbering()
    // || archive.isOldFormat();
    // String nextName = nextVolumeName(archive.getFile().getAbsolutePath(),
    // oldNumbering);
    // File nextVolume = new File(nextName);
    // UnrarCallback callback = archive.getUnrarCallback();
    // if ((callback != null) && !callback.isNextVolumeReady(nextVolume)) {
    // return false;
    // }
    // if (!nextVolume.exists()) {
    // return false;
    // }
    // archive.setFile(nextVolume);
    // hd = archive.nextFileHeader();
    // if (hd == null) {
    // return false;
    // }
    // dataIO.init(hd);
    // return true;
    // }

    public static String nextVolumeName(String arcName, boolean oldNumbering) {
        if (!oldNumbering) {
            // part1.rar, part2.rar, ...
            int len = arcName.length();
            int indexR = len - 1;
            while ((indexR >= 0) && !isDigit(arcName.charAt(indexR))) {
                indexR--;
            }
            int index = indexR + 1;
            int indexL = indexR - 1;
            while ((indexL >= 0) && isDigit(arcName.charAt(indexL))) {
                indexL--;
            }
            if (indexL < 0) {
                return null;
            }
            indexL++;
            StringBuilder buffer = new StringBuilder(len);
            buffer.append(arcName, 0, indexL);
            char[] digits = new char[indexR - indexL + 1];
            arcName.getChars(indexL, indexR + 1, digits, 0);
            indexR = digits.length - 1;
            while ((indexR >= 0) && (++digits[indexR]) == '9' + 1) {
                digits[indexR] = '0';
                indexR--;
            }
            if (indexR < 0) {
                buffer.append('1');
            }
            buffer.append(digits);
            buffer.append(arcName, index, len);
            return buffer.toString();
        } else {
            // .rar, .r00, .r01, ...
            int len = arcName.length();
            if ((len <= 4) || (arcName.charAt(len - 4) != '.')) {
                return null;
            }
            StringBuilder buffer = new StringBuilder();
            int off = len - 3;
            buffer.append(arcName, 0, off);
            if (!isDigit(arcName.charAt(off + 1))
                    || !isDigit(arcName.charAt(off + 2))) {
                buffer.append("r00");
            } else {
                char[] ext = new char[3];
                arcName.getChars(off, len, ext, 0);
                int i = ext.length - 1;
                while ((++ext[i]) == '9' + 1) {
                    ext[i] = '0';
                    i--;
                }
                buffer.append(ext);
            }
            return buffer.toString();
        }
    }

    private static boolean isDigit(char c) {
        return (c >= '0') && (c <= '9');
    }
}