//package org.emdev.common.archives.rar;
//
//
//import java.io.BufferedInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.File;
//import java.io.IOException;
//import java.util.Collections;
//import java.util.Enumeration;
//import java.util.HashSet;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.Set;
//
//import org.emdev.common.archives.ArchiveFile;
//import org.emdev.common.log.LogContext;
//import org.emdev.common.log.LogManager;
//import org.emdev.utils.FileUtils;
//import org.emdev.utils.bytes.ByteString;
//
//public class RarArchive implements ArchiveFile<RarArchiveEntry> {
//
// private static final LogContext LCTX = LogManager.root().lctx("Unrar");
//
// final File rarfile;
// final List<RarArchiveEntry> entries = new LinkedList<RarArchiveEntry>();
// final boolean decodeInFile;
//
// /**
// * Constructor.
// *
// * @param file
// * archive file
// * @throws IOException
// * thrown on error
// */
// public RarArchive(final File file, boolean decodeInFile) throws IOException {
// this.rarfile = file;
// this.decodeInFile = decodeInFile;
//
// final Set<ByteString> dirs = new HashSet<ByteString>();
//
// final Process process = UnrarBridge.exec("vb", rarfile.getAbsolutePath());
//
// final ByteArrayOutputStream buf = new ByteArrayOutputStream();
//
// FileUtils.copy(new BufferedInputStream(process.getInputStream(), 8 * 1024), buf);
//
// final ByteString bs = new ByteString(buf.toByteArray());
// final List<ByteString> entries = bs.split('\n');
//
// LCTX.i("List archive entries for: " + rarfile.getAbsolutePath());
//
// for (final ByteString s : entries) {
// if (dirs.contains(s)) {
// LCTX.i("Dir: " + s);
// continue;
// }
// LCTX.i("Entry: " + s);
//
// final LinkedList<ByteString> segments = s.split('/');
// final ByteString name = segments.getLast();
// this.entries.add(new RarArchiveEntry(this, s, name));
//
// if (segments.size() > 1) {
// int count = 0;
// int length = 0;
// final int nameIndex = segments.size() - 1;
// for (final ByteString b : segments) {
// if (count++ >= nameIndex) {
// break;
// }
// final int newlength = length + b.length();
// final ByteString dir = new ByteString(s, 0, newlength);
// dirs.add(dir);
// length = newlength + 1;
// }
// }
// }
// try {
// process.waitFor();
// } catch (final InterruptedException ex) {
// Thread.interrupted();
// throw new IOException(ex.getMessage());
// }
// }
//
// @Override
// protected void finalize() throws Throwable {
// super.finalize();
// }
//
// /**
// * {@inheritDoc}
// *
// * @see org.emdev.common.archives.ArchiveFile#randomAccessAllowed()
// */
// @Override
// public boolean randomAccessAllowed() {
// return true;
// }
//
// /**
// * {@inheritDoc}
// *
// * @see org.emdev.common.archives.ArchiveFile#entries()
// */
// @Override
// public Enumeration<RarArchiveEntry> entries() {
// return Collections.enumeration(entries);
// }
//
// @Override
// public void close() throws IOException {
// }
//}