summaryrefslogtreecommitdiff
path: root/org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java
blob: 4238051d81b1153a0d079f9c3ba198de5bfc74c7 (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
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');
	}
}