package de.innosystec.unrar;
import de.innosystec.unrar.rarfile.FileHeader;
import de.innosystec.unrar.unpack.*;
import java.io.File;
import java.io.IOException;
/**
*
* @author alban
*/
public class Volume {
private Volume() {
}
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');
}
}