/* * Copyright (c) 2007 innoSysTec (R) GmbH, Germany. All rights reserved. * Original author: Edmund Wagner * Creation date: 22.05.2007 * * Source: $HeadURL$ * Last changed: $LastChangedDate$ * * * the unrar licence applies to all junrar source and binary distributions * you are not allowed to use this source to re-create the RAR compression algorithm * * Here some html entities which can be used for escaping javadoc tags: * "&": "&" or "&" * "<": "<" or "<" * ">": ">" or ">" * "@": "@" */ package com.github.junrar.rarfile; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.github.junrar.io.Raw; /** * Base class of all rar headers * * @author $LastChangedBy$ * @version $LastChangedRevision$ */ public class BaseBlock{ Log logger = LogFactory.getLog(BaseBlock.class.getName()); public static final short BaseBlockSize = 7; //TODO move somewhere else public static final short MHD_VOLUME = 0x0001; public static final short MHD_COMMENT = 0x0002; public static final short MHD_LOCK = 0x0004; public static final short MHD_SOLID = 0x0008; public static final short MHD_PACK_COMMENT = 0x0010; public static final short MHD_NEWNUMBERING = 0x0010; public static final short MHD_AV = 0x0020; public static final short MHD_PROTECT = 0x0040; public static final short MHD_PASSWORD = 0x0080; public static final short MHD_FIRSTVOLUME = 0x0100; public static final short MHD_ENCRYPTVER = 0x0200; public static final short LHD_SPLIT_BEFORE = 0x0001; public static final short LHD_SPLIT_AFTER = 0x0002; public static final short LHD_PASSWORD = 0x0004; public static final short LHD_COMMENT = 0x0008; public static final short LHD_SOLID = 0x0010; public static final short LHD_WINDOWMASK = 0x00e0; public static final short LHD_WINDOW64 = 0x0000; public static final short LHD_WINDOW128 = 0x0020; public static final short LHD_WINDOW256 = 0x0040; public static final short LHD_WINDOW512 = 0x0060; public static final short LHD_WINDOW1024 = 0x0080; public static final short LHD_WINDOW2048 = 0x00a0; public static final short LHD_WINDOW4096 = 0x00c0; public static final short LHD_DIRECTORY = 0x00e0; public static final short LHD_LARGE = 0x0100; public static final short LHD_UNICODE = 0x0200; public static final short LHD_SALT = 0x0400; public static final short LHD_VERSION = 0x0800; public static final short LHD_EXTTIME = 0x1000; public static final short LHD_EXTFLAGS = 0x2000; public static final short SKIP_IF_UNKNOWN = 0x4000; public static final short LONG_BLOCK = -0x8000; public static final short EARC_NEXT_VOLUME = 0x0001; public static final short EARC_DATACRC = 0x0002; public static final short EARC_REVSPACE = 0x0004; public static final short EARC_VOLNUMBER = 0x0008; protected long positionInFile; protected short headCRC = 0; protected byte headerType = 0; protected short flags = 0; protected short headerSize = 0 ; /** * */ public BaseBlock(){ } public BaseBlock(BaseBlock bb){ this.flags = bb.getFlags(); this.headCRC = bb.getHeadCRC(); this.headerType = bb.getHeaderType().getHeaderByte(); this.headerSize = bb.getHeaderSize(); this.positionInFile = bb.getPositionInFile(); } public BaseBlock(byte[] baseBlockHeader){ int pos = 0; this.headCRC = Raw.readShortLittleEndian(baseBlockHeader, pos); pos+=2; this.headerType |= baseBlockHeader[pos]&0xff; pos++; this.flags = Raw.readShortLittleEndian(baseBlockHeader, pos); pos+=2; this.headerSize = Raw.readShortLittleEndian(baseBlockHeader, pos); } public boolean hasArchiveDataCRC(){ return (this.flags & EARC_DATACRC)!=0; } public boolean hasVolumeNumber(){ return (this.flags & EARC_VOLNUMBER)!=0; } public boolean hasEncryptVersion(){ return (flags & MHD_ENCRYPTVER)!=0; } /** * @return is it a sub block */ public boolean isSubBlock() { if (UnrarHeadertype.SubHeader.equals(headerType)){ return(true); } if (UnrarHeadertype.NewSubHeader.equals(headerType) && (flags & LHD_SOLID)!=0) { return(true); } return(false); } public long getPositionInFile() { return positionInFile; } public short getFlags() { return flags; } public short getHeadCRC() { return headCRC; } public short getHeaderSize() { return headerSize; } public UnrarHeadertype getHeaderType() { return UnrarHeadertype.findType(headerType); } public void setPositionInFile(long positionInFile) { this.positionInFile = positionInFile; } public void print(){ StringBuilder str =new StringBuilder(); str.append("HeaderType: " + getHeaderType()); str.append("\nHeadCRC: "+Integer.toHexString(getHeadCRC())); str.append("\nFlags: "+Integer.toHexString(getFlags())); str.append("\nHeaderSize: "+getHeaderSize()); str.append("\nPosition in file: "+getPositionInFile()); logger.info(str.toString()); } }