/*
* CoderException.java
* Transform
*
* Copyright (c) 2009-2010 Flagstone Software Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of Flagstone Software Ltd. nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package com.flagstone.transform.coder;
import java.io.IOException;
/**
* CoderException is thrown when errors occur while encoding or decoding
* objects. Errors are reported as either underflow or overflow errors
* indicating that the class used to encode/decode a particular data structure
* did not encode or decode the expected number of bytes. This allows the
* majority of software errors and errors due to improperly encoded flash files
* to be detected.
*/
public final class CoderException extends IOException {
/** Serial number identifying the version of the object. */
private static final long serialVersionUID = 1;
/** Format string used in toString() method. */
private static final String FORMAT = "CoderException: { "
+ "location=%s; length=%d; delta=%d; message=%s}";
/**
* The location of the start of the object being encoded/decoded
* when the error occurred.
*/
private final transient int start;
/** The expected length of the encoded object. */
private final transient int length;
/**
* The difference between the expected and actual number of bytes encoded
* or decoded.
*/
private final transient int delta;
/**
* Creates a CoderException to report where a problem occurred when encoding
* or decoding a Flash (.swf) file.
*
* @param location
* the address in the file where the data structure being
* encoded/decoded is located. This is only valid for files being
* decoded since the encoded file will not be written if an
* exception occurs.
*
* @param message
* a short description of the error.
*/
public CoderException(final int location, final String message) {
super(message);
start = location;
length = 0;
delta = 0;
}
/**
* Creates a CoderException to report where a problem occurred when encoding
* or decoding a Flash (.swf) file.
*
* @param location
* the address in the file where the data structure being
* encoded/decoded is located. This is only valid for files being
* decoded since the encoded file will not be written if an
* exception occurs.
*
* @param size
* the number of bytes that were expected to be encoded or
* decoded.
*
* @param difference
* the difference between the expected number of bytes and the
* actual number encoded or decoded.
*/
public CoderException(final int location, final int size,
final int difference) {
super();
start = location;
length = size;
delta = difference;
}
/**
* Get the byte address of the start of the object that caused the
* error.
*
* @return the location of the start of the encoded object when the error
* occurred.
*/
public int getStart() {
return start;
}
/**
* Get number of bytes the object was expected to occupy when encoded.
*
* @return get the number of bytes expected to be encoded or decoded.
*/
public int getLength() {
return length;
}
/**
* Get the difference between the expected number of bytes and the
* actual number of bytes encoded or decoded.
*
* @return the difference from the expected number of bytes.
*/
public int getDelta() {
return delta;
}
/**
* Get a string representation of the error.
*
* @return the string describing the error.
*/
@Override
public String toString() {
return String.format(FORMAT, Integer.toHexString(start),
length, delta, getMessage());
}
}