| /********************************************************************************
|
| * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
|
| *
|
| * See the NOTICE file(s) distributed with this work for additional
|
| * information regarding copyright ownership.
|
| *
|
| * This program and the accompanying materials are made available under the
|
| * terms of the Eclipse Public License v. 2.0 which is available at
|
| * http://www.eclipse.org/legal/epl-2.0.
|
| *
|
| * SPDX-License-Identifier: EPL-2.0
|
| *
|
| ********************************************************************************/
|
| |
| |
| package org.eclipse.mdm.openatfx.mdf.mdf4; |
| |
| import java.io.IOException; |
| import java.nio.ByteBuffer; |
| import java.nio.ByteOrder; |
| import java.nio.channels.SeekableByteChannel; |
| |
| /** |
| * Base class for all blocks. |
| * |
| * @author Christian Rechner |
| */ |
| abstract class BLOCK { |
| |
| // the position of the block within the MDF file |
| private final long pos; |
| |
| /** Header section */ |
| |
| // Block type identifier, always "##HD" |
| // CHAR 4 |
| private String id; |
| |
| // Length of block |
| // UINT64 |
| private long length; |
| |
| // Number of links |
| // UINT64 |
| private long linkCount; |
| |
| protected final SeekableByteChannel sbc; |
| |
| /** |
| * Constructor. |
| * |
| * @param sbc |
| * The byte channel pointing to the MDF file. |
| * @param pos |
| * The position of the block within the MDF file. |
| */ |
| protected BLOCK(SeekableByteChannel sbc, long pos) { |
| this.sbc = sbc; |
| this.pos = pos; |
| } |
| |
| public long getPos() { |
| return pos; |
| } |
| |
| public String getId() { |
| return id; |
| } |
| |
| protected void setId(String id) { |
| this.id = id; |
| } |
| |
| public long getLength() { |
| return length; |
| } |
| |
| protected void setLength(long length) { |
| this.length = length; |
| } |
| |
| public long getLinkCount() { |
| return linkCount; |
| } |
| |
| protected void setLinkCount(long linkCount) { |
| this.linkCount = linkCount; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see java.lang.Object#toString() |
| */ |
| @Override |
| public String toString() { |
| return "BLOCK [pos=" + pos + ", id=" + id + ", length=" + length + ", linkCount=" + linkCount + "]"; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see java.lang.Object#hashCode() |
| */ |
| @Override |
| public int hashCode() { |
| final int prime = 31; |
| int result = 1; |
| result = prime * result + (int) (pos ^ pos >>> 32); |
| return result; |
| } |
| |
| /** |
| * {@inheritDoc} |
| * |
| * @see java.lang.Object#equals(java.lang.Object) |
| */ |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (obj == null) { |
| return false; |
| } |
| if (getClass() != obj.getClass()) { |
| return false; |
| } |
| BLOCK other = (BLOCK) obj; |
| if (pos != other.pos) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * Returns the block type string at given position. |
| * |
| * @param channel |
| * The channel to read from. |
| * @param pos |
| * The position within the channel. |
| * @return The block type as string. |
| * @throws IOException |
| * Error reading block type. |
| */ |
| protected static String getBlockType(SeekableByteChannel channel, long pos) throws IOException { |
| // read block header |
| ByteBuffer bb = ByteBuffer.allocate(4); |
| bb.order(ByteOrder.LITTLE_ENDIAN); |
| channel.position(pos); |
| channel.read(bb); |
| bb.rewind(); |
| return MDF4Util.readCharsISO8859(bb, 4); |
| } |
| |
| } |