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
98
99
100
101
|
package com.github.junrar.util;
/**
*
* @author alban
*/
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');
}
}
|