package camera;
import java.io.*;
import org.apache.sanselan.ImageReadException;
import org.apache.sanselan.ImageWriteException;
import org.apache.sanselan.formats.jpeg.exifRewrite.ExifRewriter;
import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
import org.osgi.framework.BundleContext;
import org.osgi.service.log.LogService;
public class Store {
private final static String JPEG_EXTENSION = ".jpg";
private final LogService log;
private final File dir;
private File [] imageFiles;
private int imageIndex;
private final ExifRewriter exifRewriter = new ExifRewriter();
// TODO: Shouldn't need this...
private static final boolean VIRTUAL_BUG = false;
public Store(final BundleContext bundleContext, final LogService log) {
this.log = log;
final File dummy;
// TODO: use bundleContext once the always-init issue has been addressed
if (VIRTUAL_BUG) {
dummy = new File("/Users/dave/Pictures/temppics/dummy");
}
else {
// TODO: go back to bundle context when UAM stuff is sorted out
dummy = bundleContext.getDataFile("dummy");
//dummy = new File("/home/root/dummy");
}
// TODO: why doesn't passing a blank name work, like the javadoc says it should?
this.dir = dummy.getParentFile();
if (!dir.isDirectory()) {
log.log(LogService.LOG_ERROR, dir + " is not a directory");
throw new RuntimeException("storage dir is not a dir");
}
}
public boolean saveImage(final byte [] imageData,
final String name,
TiffOutputSet exifData) {
final File imageFile = new File(dir, name + JPEG_EXTENSION);
log.log(LogService.LOG_INFO, "Saving image to " + imageFile);
try {
final FileOutputStream fos = new FileOutputStream(imageFile);
exifRewriter.updateExifMetadataLossy(imageData, fos, exifData);
fos.close();
return true;
}
catch (ImageReadException e) {
e.printStackTrace();
return false;
}
catch (ImageWriteException e) {
e.printStackTrace();
return false;
}
catch (IOException e) {
e.printStackTrace();
return false;
}
}
public boolean deleteImage(final File imageFile) {
log.log(LogService.LOG_INFO, "Deleting image " + imageFile);
return imageFile.delete();
}
public void refresh() {
imageFiles = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
// TODO: use some set of valid extensions, not just one
return name.endsWith(JPEG_EXTENSION);
}
});
imageIndex = imageFiles.length - 1;
}
public int getImageCount() {
log.log(LogService.LOG_DEBUG, "Store has " + imageFiles.length + " images");
return imageFiles.length;
}
public void nextImage() {
imageIndex++;
if (imageIndex >= imageFiles.length) {
imageIndex = 0;
}
log.log(LogService.LOG_DEBUG, "image index now " + imageIndex);
}
public void prevImage() {
imageIndex--;
if (imageIndex < 0) {
imageIndex = imageFiles.length - 1;
}
log.log(LogService.LOG_DEBUG, "image index now " + imageIndex);
}
public int getImageIndex() {
return imageIndex;
}
public File getImageFile() {
if (imageFiles.length == 0) {
return null;
}
return imageFiles[imageIndex];
}
}