/*
* @(#)StripMedion
*
* Copyright (c) 2007 by dvb.matt, All rights reserved.
*
* This file is part of ProjectX, a free Java based demux utility.
* By the authors, ProjectX is intended for educational purposes only,
* as a non-commercial test project.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package net.sourceforge.dvb.projectx.parser;
import java.io.PushbackInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Enumeration;
import net.sourceforge.dvb.projectx.xinput.XInputFile;
import net.sourceforge.dvb.projectx.common.Common;
import net.sourceforge.dvb.projectx.common.Keys;
import net.sourceforge.dvb.projectx.parser.CommonParsing;
public class StripMedion extends Object {
private boolean debug = false;
private int aux_number = 1;
private String stripped = "[stripped]";
private String parent = "";
private Hashtable out_streams;
private BufferedOutputStream out;
private MedionStreamObject mso;
/**
*
*/
public StripMedion()
{
debug = Common.getSettings().getBooleanProperty(Keys.KEY_DebugLog);
out_streams = new Hashtable();
}
/**
*
*/
public XInputFile[] process(XInputFile xInputFile, String output)
{
if (output.startsWith("[res]"))
output = xInputFile.getParent();
parent = output + System.getProperty("file.separator") + xInputFile.getName();
try {
PushbackInputStream in = new PushbackInputStream(xInputFile.getInputStream());
int count = 0;
int buffersize = 0x10000;
int chunksize = 0x2000;
int chunknum = 7; //buffersize / chunksize;
long pos = 0;
long len = xInputFile.length();
byte[] array = new byte[buffersize];
int ret;
while (pos < len)
{
ret = in.read(array);
if (ret < array.length)
in.read(array, ret, array.length - ret);
for (int i = 0, j = chunksize; i < chunknum; i++, j += chunksize)
{
if (debug)
System.out.println("med pos + " + pos + " /i " + i + " /v " + array[i]);
mso = getOutput(0xFF & array[i]);
mso.write(array, j, chunksize);
}
count++;
pos += buffersize;
}
closeOutput();
in.close();
} catch (Exception e) {
Common.setExceptionMessage(e);
return null;
}
int num = 0;
for (Enumeration n = out_streams.keys(); n.hasMoreElements() ; )
{
mso = getOutput(n.nextElement().toString());
if (!mso.isEmpty())
num++;
}
XInputFile[] xif = new XInputFile[num];
String str;
for (int i = 0, j = 0; i < 256; i++)
{
str = String.valueOf(i);
if (out_streams.containsKey(str))
{
mso = (MedionStreamObject) out_streams.get(str);
xif[j++] = new XInputFile(mso.getFile());
}
}
return xif;
}
/**
*
*/
private void closeOutput()
{
for (Enumeration n = out_streams.keys(); n.hasMoreElements() ; )
{
mso = getOutput(n.nextElement().toString());
mso.closeStream();
}
}
/**
*
*/
private MedionStreamObject getOutput(int index)
{
return getOutput(String.valueOf(index));
}
/**
*
*/
private MedionStreamObject getOutput(String str)
{
if (!out_streams.containsKey(str))
addNewOutput(str);
return ((MedionStreamObject) out_streams.get(str));
}
/**
*
*/
private void addNewOutput(int index)
{
addNewOutput(String.valueOf(index));
}
/**
*
*/
private void addNewOutput(String str)
{
if (out_streams.containsKey(str))
return;
String newname = parent;
if (str.equals("0"))
newname = parent + stripped + ".vpes";
else if (str.equals("1"))
newname = parent + stripped + ".apes";
else
newname = parent + stripped + ".aux" + String.valueOf(aux_number++);
out_streams.put(str, new MedionStreamObject(newname));
}
/**
*
*/
private class MedionStreamObject extends Object {
private boolean isEmpty = true;
private String name = "";
private BufferedOutputStream stream;
private File file;
public MedionStreamObject(String str)
{
name = str;
setStream();
}
private void setStream()
{
try {
stream = new BufferedOutputStream( new FileOutputStream(name), 2048000);
} catch (Exception e) {
Common.setExceptionMessage(e);
}
}
public String getName()
{
return name;
}
public void write(byte[] array, int index, int length)
{
try {
stream.write(array, index, length);
} catch (Exception e) {
Common.setExceptionMessage(e);
}
}
public void closeStream()
{
try {
stream.flush();
stream.close();
file = new File(name);
if (debug)
System.out.println("rl file '" + name + "' /l " + file.length());
if (isEmpty = file.length() < 100)
file.delete();
} catch (Exception e) {
Common.setExceptionMessage(e);
}
}
public File getFile()
{
return file;
}
public boolean isEmpty()
{
return isEmpty;
}
}
}