/*- * Copyright (C) 2008-2014 Erik Larsson * * 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 3 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, see <http://www.gnu.org/licenses/>. */ package org.catacombae.storage.fs.hfscommon; import java.util.List; import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogFile; import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogFileRecord; import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogLeafRecord; import org.catacombae.hfs.types.hfscommon.CommonHFSCatalogNodeID; import org.catacombae.io.ReadableRandomAccessStream; import org.catacombae.storage.fs.FSAttributes; import org.catacombae.storage.fs.FSFork; import org.catacombae.storage.fs.FSForkType; /** * @author <a href="http://www.catacombae.org/" target="_top">Erik Larsson</a> */ public abstract class HFSCommonAbstractFile extends HFSCommonFSEntry { /** * The record from which this file was referenced. In the case of a * non-hardlinked file, this variable is equal to <code>fileRecord</code>. * The key record supplies the name/location of the file, but all other data * is taken from <code>fileRecord</code>. */ private final CommonHFSCatalogLeafRecord keyRecord; /** * The file record, from which file data and attributes are retrieved. Could * be called the 'inode' although it's not really proper in regard to the * structure of HFS. */ protected final CommonHFSCatalogFileRecord fileRecord; private final HFSCommonFSAttributes attributes; private final FSFork rawDataFork; private final FSFork resourceFork; protected HFSCommonAbstractFile(HFSCommonFileSystemHandler iParent, CommonHFSCatalogFileRecord iFileRecord) { this(iParent, null, iFileRecord); } protected HFSCommonAbstractFile(HFSCommonFileSystemHandler iParent, CommonHFSCatalogLeafRecord iHardLinkRecord, CommonHFSCatalogFileRecord iFileRecord) { super(iParent, iFileRecord.getData()); // Input check if(iParent == null) throw new IllegalArgumentException("iParent must not be null!"); if(iFileRecord == null) throw new IllegalArgumentException("iFileRecord must not be null!"); this.fileRecord = iFileRecord; if(iHardLinkRecord != null) this.keyRecord = iHardLinkRecord; else this.keyRecord = iFileRecord; CommonHFSCatalogFile catalogFile = fileRecord.getData(); this.attributes = new HFSCommonFSAttributes(this, catalogFile); this.rawDataFork = new HFSCommonFSFork(this, FSForkType.DATA, catalogFile.getDataFork()); this.resourceFork = new HFSCommonFSFork(this, FSForkType.MACOS_RESOURCE, catalogFile.getResourceFork()); } /* @Override */ public FSAttributes getAttributes() { return attributes; } /* @Override */ public String getName() { return fsHandler.getProperNodeName(keyRecord); } /* @Override public FSFolder getParent() { return parent.lookupParentFolder(keyRecord); } * */ /* @Override */ public boolean isCompressed() { return getDataFork().isCompressed(); } /* @Override */ public FSFork getMainFork() { return getForkByType(FSForkType.DATA); } @Override protected void fillForks(List<FSFork> forkList) { forkList.add(getDataFork()); super.fillForks(forkList); /* * TODO: Remove duplicates, in case we are overriding a fork. * (...which we are not, so this is unneccessary at this point.) */ } @Override public FSFork getForkByType(FSForkType type) { switch (type) { case DATA: return getDataFork(); case MACOS_RESOURCE: return getResourceFork(); default: return super.getForkByType(type); } } @Override public long getCombinedLength() { final FSFork resFork = getResourceFork(); return super.getCombinedLength() + getDataFork().getLength() + (resFork != null ? resFork.getLength() : 0); } /* @Override */ protected CommonHFSCatalogNodeID getCatalogNodeID() { return fileRecord.getData().getFileID(); } protected FSFork getDataFork() { return rawDataFork; } /* @Override */ protected FSFork getResourceFork() { return resourceFork.getLength() > 0 ? resourceFork : null; } ReadableRandomAccessStream getReadableDataForkStream() { return fsHandler.getReadableDataForkStream(fileRecord); } ReadableRandomAccessStream getReadableResourceForkStream() { return fsHandler.getReadableResourceForkStream(fileRecord); } public CommonHFSCatalogFile getInternalCatalogFile() { return fileRecord.getData(); } }