package tim.prune.jpeg;
import java.util.ArrayList;
/**
* Class to hold the GPS data extracted from a Jpeg including position and time
*/
public class JpegData
{
private boolean _exifDataPresent = false;
private char _latitudeRef = '\0';
private char _longitudeRef = '\0';
private byte _altitudeRef = 0;
private double[] _latitude = null;
private double[] _longitude = null;
private int _altitude = -1;
private boolean _altitudePresent = false;
private int[] _gpsTimestamp = null;
private int[] _gpsDatestamp = null;
private String _originalTimestamp = null;
private String _digitizedTimestamp = null;
private int _orientationCode = -1;
private byte[] _thumbnail = null;
private double _bearing = -1.0;
private ArrayList<String> _errors = null;
/**
* Set the exif data present flag
*/
public void setExifDataPresent()
{
_exifDataPresent = true;
}
/**
* @return true if exif data found
*/
public boolean getExifDataPresent()
{
return _exifDataPresent;
}
/**
* Set the latitude reference (N/S)
* @param inString string containing reference
*/
public void setLatitudeRef(String inString)
{
if (inString != null && inString.length() == 1)
_latitudeRef = inString.charAt(0);
}
/**
* Set the latitude
* @param inValues array of three doubles for deg-min-sec
*/
public void setLatitude(double[] inValues)
{
if (inValues != null && inValues.length == 3)
_latitude = inValues;
}
/**
* Set the longitude reference (E/W)
* @param inString string containing reference
*/
public void setLongitudeRef(String inString)
{
if (inString != null && inString.length() == 1)
_longitudeRef = inString.charAt(0);
}
/**
* Set the longitude
* @param inValues array of three doubles for deg-min-sec
*/
public void setLongitude(double[] inValues)
{
if (inValues != null && inValues.length == 3)
_longitude = inValues;
}
/**
* Set the altitude reference (sea level / not)
* @param inByte byte representing reference
*/
public void setAltitudeRef(byte inByte)
{
_altitudeRef = inByte;
}
/**
* Set the altitude
* @param inValue integer representing altitude
*/
public void setAltitude(int inValue)
{
_altitude = inValue;
_altitudePresent = true;
}
/**
* Set the Gps timestamp
* @param inValues array of ints holding timestamp
*/
public void setGpsTimestamp(int[] inValues)
{
_gpsTimestamp = inValues;
}
/**
* Set the Gps datestamp
* @param inValues array of ints holding datestamp
*/
public void setGpsDatestamp(int[] inValues)
{
_gpsDatestamp = inValues;
}
/**
* Set the original timestamp
* @param inStamp original timestamp of photo
*/
public void setOriginalTimestamp(String inStamp)
{
_originalTimestamp = inStamp;
}
/**
* Set the digitized timestamp
* @param inStamp digitized (creation) timestamp of photo
*/
public void setDigitizedTimestamp(String inStamp)
{
_digitizedTimestamp = inStamp;
}
/**
* Set the orientation code
* @param inCode code from exif (1 to 8)
*/
public void setOrientationCode(int inCode)
{
if (inCode >= 1 && inCode <= 8) {
_orientationCode = inCode;
}
}
/**
* Set the bearing (0 - 360)
* @param inBearing bearing in degrees
*/
public void setBearing(double inBearing)
{
_bearing = inBearing;
}
/** @return latitude ref as char */
public char getLatitudeRef() { return _latitudeRef; }
/** @return latitude as array of 3 Rationals */
public double[] getLatitude() { return _latitude; }
/** @return longitude ref as char */
public char getLongitudeRef() { return _longitudeRef; }
/** @return longitude as array of 3 doubles */
public double[] getLongitude() { return _longitude; }
/** @return altitude ref as byte (should be 0) */
public byte getAltitudeRef() { return _altitudeRef; }
/** @return true if altitude present */
public boolean hasAltitude() { return _altitudePresent; }
/** @return altitude as int */
public int getAltitude() { return _altitude; }
/** @return Gps timestamp as array of 3 ints */
public int[] getGpsTimestamp() { return _gpsTimestamp; }
/** @return Gps datestamp as array of 3 ints */
public int[] getGpsDatestamp() { return _gpsDatestamp; }
/** @return orientation code (1 to 8) */
public int getOrientationCode() { return _orientationCode; }
/** @return original timestamp as string */
public String getOriginalTimestamp() { return _originalTimestamp; }
/** @return digitized timestamp as string */
public String getDigitizedTimestamp() { return _digitizedTimestamp; }
/** @return bearing in degrees or -1 */
public double getBearing() { return _bearing; }
/**
* Set the thumbnail
* @param inBytes byte array containing thumbnail
*/
public void setThumbnailImage(byte[] inBytes) {
_thumbnail = inBytes;
}
/** @return thumbnail as byte array */
public byte[] getThumbnailImage() {
return _thumbnail;
}
/**
* @return rotation required to display photo properly (0 to 3)
*/
public int getRequiredRotation()
{
if (_orientationCode <= 2) { return 0; } // no rotation required
if (_orientationCode <= 4) { return 2; } // 180 degrees
if (_orientationCode <= 6) { return 1; } // 270 degrees, so need to rotate by 90
return 3; // 90 degrees, so need to rotate by 270
}
/**
* @return true if data looks valid, ie has at least lat and long
* (altitude and timestamp optional).
*/
public boolean isGpsValid()
{
return (_latitudeRef == 'N' || _latitudeRef == 'n' || _latitudeRef == 'S' || _latitudeRef == 's')
&& _latitude != null
&& (_longitudeRef == 'E' || _longitudeRef == 'e' || _longitudeRef == 'W' || _longitudeRef == 'w')
&& _longitude != null;
}
/**
* Add the given error message to the list of errors
* @param inError String containing error message
*/
public void addError(String inError)
{
if (_errors == null) _errors = new ArrayList<String>();
_errors.add(inError);
}
/**
* @return the number of errors, if any
*/
public int getNumErrors()
{
if (_errors == null) return 0;
return _errors.size();
}
/**
* @return true if errors occurred
*/
public boolean hasErrors()
{
return getNumErrors() > 0;
}
/**
* @return all errors as a list
*/
public ArrayList<String> getErrors()
{
return _errors;
}
}