From 124f869faae3a0f75a3825e6a8e195c17f3c626a Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Thu, 16 Oct 2014 23:34:20 +0400 Subject: initial for idea --- .../java/com/github/junrar/util/VolumeHelper.java | 101 +++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java (limited to 'org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java') diff --git a/org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java b/org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java new file mode 100644 index 0000000..4238051 --- /dev/null +++ b/org.fox.ttcomics/src/main/java/com/github/junrar/util/VolumeHelper.java @@ -0,0 +1,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'); + } +} -- cgit v1.2.3