/* * 21.04.2004 Original verion. davagin@udm.ru. *----------------------------------------------------------------------- * 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., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------- */ package davaguine.jmac.info; import davaguine.jmac.tools.File; import davaguine.jmac.tools.JMACException; import davaguine.jmac.tools.RandomAccessFile; import java.io.IOException; /** * Author: Dmitry Vaguine * Date: 04.03.2004 * Time: 14:51:31 */ public class APELink { private final static String APE_LINK_HEADER = "[Monkey's Audio Image Link File]"; private final static String APE_LINK_IMAGE_FILE_TAG = "Image File="; private final static String APE_LINK_START_BLOCK_TAG = "Start Block="; private final static String APE_LINK_FINISH_BLOCK_TAG = "Finish Block="; public APELink(String pFilename) throws IOException { // empty m_bIsLinkFile = false; m_nStartBlock = 0; m_nFinishBlock = 0; m_cImageFilename = ""; // open the file File ioLinkFile = new RandomAccessFile(new java.io.File(pFilename), "r"); // create a buffer byte[] spBuffer = new byte[1024]; // fill the buffer from the file and null terminate it int numRead = ioLinkFile.read(spBuffer); byte[] buffer = new byte[numRead]; System.arraycopy(spBuffer, 0, buffer, 0, numRead); // call the other constructor (uses a buffer instead of opening the file) ParseData(buffer, pFilename); } public APELink(byte[] pData, String pFilename) { ParseData(pData, pFilename); } public boolean GetIsLinkFile() { return m_bIsLinkFile; } public int GetStartBlock() { return m_nStartBlock; } public int GetFinishBlock() { return m_nFinishBlock; } public String GetImageFilename() { return m_cImageFilename; } protected boolean m_bIsLinkFile; protected int m_nStartBlock; protected int m_nFinishBlock; protected String m_cImageFilename; protected void ParseData(byte[] pData, String pFilename) { // empty m_bIsLinkFile = false; m_nStartBlock = 0; m_nFinishBlock = 0; m_cImageFilename = ""; if (pData != null) { String data = null; try { // parse out the information data = new String(pData, "US-ASCII"); } catch (java.io.UnsupportedEncodingException e) { throw new JMACException("Unsupported encoding", e); } int pHeader = data.indexOf(APE_LINK_HEADER); int pImageFile = data.indexOf(APE_LINK_IMAGE_FILE_TAG); int pStartBlock = data.indexOf(APE_LINK_START_BLOCK_TAG); int pFinishBlock = data.indexOf(APE_LINK_FINISH_BLOCK_TAG); if (pHeader >= 0 && pImageFile >= 0 && pStartBlock >= 0 && pFinishBlock >= 0) { // get the start and finish blocks int i1 = data.indexOf('\r', pStartBlock); int i2 = data.indexOf('\n', pStartBlock); int ii = i1 > 0 && i2 > 0 ? Math.min(i1, i2) : Math.max(i1, i2); try { m_nStartBlock = Integer.parseInt(data.substring(pStartBlock + APE_LINK_START_BLOCK_TAG.length(), ii >= 0 ? ii : data.length())); } catch (Exception e) { m_nStartBlock = -1; } i1 = data.indexOf('\r', pFinishBlock); i2 = data.indexOf('\n', pFinishBlock); ii = i1 > 0 && i2 > 0 ? Math.min(i1, i2) : Math.max(i1, i2); try { m_nFinishBlock = Integer.parseInt(data.substring(pFinishBlock + APE_LINK_FINISH_BLOCK_TAG.length(), ii >= 0 ? ii : data.length())); } catch (Exception e) { m_nFinishBlock = -1; } // get the path i1 = data.indexOf('\r', pImageFile); i2 = data.indexOf('\n', pImageFile); ii = i1 > 0 && i2 > 0 ? Math.min(i1, i2) : Math.max(i1, i2); String cImageFile = data.substring(pImageFile + APE_LINK_IMAGE_FILE_TAG.length(), ii >= 0 ? ii : data.length()); // process the path if (cImageFile.lastIndexOf('\\') < 0) { int ij = pFilename.lastIndexOf('\\'); m_cImageFilename = ij >= 0 ? pFilename.substring(0, ij) + cImageFile : cImageFile; } else { m_cImageFilename = cImageFile; } // this is a valid link file m_bIsLinkFile = true; } } } }