package com.github.xsavikx.androidscreencast.api.recording.atom; import com.github.xsavikx.androidscreencast.exception.IORuntimeException; import javax.imageio.stream.ImageOutputStream; import java.io.IOException; import static com.google.common.base.Preconditions.checkNotNull; /** * Atom base class. */ public abstract class Atom { protected static final long MAXIMUM_ATOM_SIZE = 0xffffffffL; /** * The type of the atom. A String with the length of 4 characters. */ protected final AtomType type; protected final ImageOutputStream out; /** * The offset of the atom relative to the start of the ImageOutputStream. */ protected long offset; /** * Shows whether current atom processing is finished or not */ protected boolean finished; /** * Creates a new Atom at the current position of the ImageOutputStream. * * @param type The type of the atom. A string with a length of 4 characters. */ public Atom(AtomType type, ImageOutputStream imageOutputStream) { checkNotNull(type, "Type should not be null"); checkNotNull(imageOutputStream, "ImageOutputStream should not be null"); this.out = imageOutputStream; this.type = type; try { offset = out.getStreamPosition(); } catch (IOException e) { throw new IORuntimeException(e); } } /** * Writes the atom to the ImageOutputStream and disposes it. */ public abstract void finish(); /** * Returns the size of the atom including the size of the atom header. * * @return The size of the atom. */ public abstract long size(); }