diff --git a/LifeBlogger.iws b/LifeBlogger.iws
index d304de5..3a57429 100644
--- a/LifeBlogger.iws
+++ b/LifeBlogger.iws
@@ -51,9 +51,9 @@
@@ -71,7 +71,7 @@
-
+
@@ -112,10 +112,19 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
@@ -124,7 +133,44 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -133,14 +179,14 @@
-
+
-
+
@@ -163,14 +209,14 @@
-
-
-
+
+
+
-
+
@@ -211,20 +257,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -239,6 +271,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -255,14 +301,14 @@
-
-
+
+
@@ -318,14 +364,14 @@
-
+
-
+
@@ -433,34 +479,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -489,34 +507,53 @@
-
+
-
-
-
-
+
+
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
@@ -525,23 +562,32 @@
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/net/thauvin/lifeblogger/LifeBlogger.java b/src/net/thauvin/lifeblogger/LifeBlogger.java
index e5e3459..aa74906 100644
--- a/src/net/thauvin/lifeblogger/LifeBlogger.java
+++ b/src/net/thauvin/lifeblogger/LifeBlogger.java
@@ -40,18 +40,19 @@ import thinlet.FrameLauncher;
import thinlet.Thinlet;
import java.awt.*;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
import java.io.*;
-import java.sql.Connection;
-import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.Statement;
+import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Properties;
+import javax.imageio.ImageIO;
+
import javax.swing.*;
@@ -225,66 +226,74 @@ public class LifeBlogger extends Thinlet
}
}
- final Connection con = DriverManager.getConnection(JDBC_PREFIX + _homeDir.getAbsolutePath() + DATABASE);
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
- final Statement st = con.createStatement();
- final ResultSet rs =
- st.executeQuery("SELECT * FROM HooverObject WHERE MobileFavourite = 'true' ORDER BY TimeStamp DESC");
-
- Object row;
- Object cell;
- String ts;
- String name;
-
- boolean first = true;
- int found = 0;
-
- while (rs.next())
+ try
{
- ts = rs.getString("TimeStamp");
- name = rs.getString("name");
+ con = DriverManager.getConnection(JDBC_PREFIX + _homeDir.getAbsolutePath() + DATABASE);
- row = Thinlet.create("row");
+ st = con.createStatement();
+ rs = st.executeQuery("SELECT * FROM HooverObject WHERE MobileFavourite = 'true' ORDER BY TimeStamp DESC");
- cell = Thinlet.create("cell");
- thinlet.setString(cell, "text", name);
+ Object row;
+ Object cell;
+ String ts;
+ String name;
- if (name.toLowerCase().endsWith("jpg"))
+ boolean first = true;
+ int found = 0;
+
+ while (rs.next())
{
- thinlet.setIcon(cell, "icon", getIcon("/icon/image.gif"));
- }
- else if (name.toLowerCase().endsWith("3gp"))
- {
- thinlet.setIcon(cell, "icon", getIcon("/icon/movie.gif"));
- }
- else
- {
- thinlet.setIcon(cell, "icon", getIcon("/icon/text.gif"));
+ ts = rs.getString("TimeStamp");
+ name = rs.getString("name");
+
+ row = Thinlet.create("row");
+
+ cell = Thinlet.create("cell");
+ thinlet.setString(cell, "text", name);
+
+ if (name.toLowerCase().endsWith("jpg"))
+ {
+ thinlet.setIcon(cell, "icon", getIcon("/icon/image.gif"));
+ }
+ else if (name.toLowerCase().endsWith("3gp"))
+ {
+ thinlet.setIcon(cell, "icon", getIcon("/icon/movie.gif"));
+ }
+ else
+ {
+ thinlet.setIcon(cell, "icon", getIcon("/icon/text.gif"));
+ }
+
+ thinlet.putProperty(cell, "oid", rs.getString("HooverObjectID"));
+ thinlet.add(row, cell);
+
+ cell = Thinlet.create("cell");
+ thinlet.setString(cell, "text", ts.substring(0, ts.lastIndexOf(':')));
+ thinlet.add(row, cell);
+
+ if (first)
+ {
+ thinlet.setBoolean(row, "selected", true);
+ first = false;
+ }
+
+ thinlet.add(table, row);
+
+ found++;
}
- thinlet.putProperty(cell, "oid", rs.getString("HooverObjectID"));
- thinlet.add(row, cell);
-
- cell = Thinlet.create("cell");
- thinlet.setString(cell, "text", ts.substring(0, ts.lastIndexOf(':')));
- thinlet.add(row, cell);
-
- if (first)
- {
- thinlet.setBoolean(row, "selected", true);
- first = false;
- }
-
- thinlet.add(table, row);
-
- found++;
+ thinlet.setString(find(buttonsPanel, "favslbl"), "text", "Favorites: " + found);
+ }
+ finally
+ {
+ st.close();
+ rs.close();
+ con.close();
}
-
- thinlet.setString(find(buttonsPanel, "favslbl"), "text", "Favorites: " + found);
-
- st.close();
- rs.close();
- con.close();
toggleButton(table, find(buttonsPanel, "blogbtn"));
}
@@ -304,30 +313,21 @@ public class LifeBlogger extends Thinlet
if (selected != -1)
{
final Object row = getItem(table, selected);
- final String name = String.valueOf(getProperty(getItem(row, 0), "oid"));
+ final String oid = String.valueOf(getProperty(getItem(row, 0), "oid"));
- final Connection con = DriverManager.getConnection(JDBC_PREFIX + _homeDir.getAbsolutePath() + DATABASE);
+ final String[] info = fileInfo(oid);
- final Statement st = con.createStatement();
- final ResultSet rs = st.executeQuery("SELECT * FROM BinaryItem WHERE HooverObjectID = " + name);
-
- if (rs.next())
+ if (info[0].length() > 0)
{
if ("ftp".equals(_action))
{
- ftpDialog(_homeDir.getAbsolutePath() + "\\DataStore" + rs.getString("Pathname") +
- rs.getString("Filename"));
+ ftpDialog(info[1]);
}
else
{
- mwDialog(_homeDir.getAbsolutePath() + "\\DataStore" + rs.getString("Pathname") +
- rs.getString("Filename"), rs.getString("ObjectMimeType"));
+ mwDialog(info[1], info[2]);
}
}
-
- st.close();
- rs.close();
- con.close();
}
}
@@ -484,6 +484,76 @@ public class LifeBlogger extends Thinlet
}
}
+ /**
+ * Previews a JPEG image.
+ *
+ * @param table The data table.
+ *
+ * @throws Exception If an error occurs while previewing the image.
+ */
+ public final void preview(Object table)
+ throws Exception
+ {
+ final int selected = getSelectedIndex(table);
+
+ if (selected != -1)
+ {
+ final Object row = getItem(table, selected);
+ final String oid = String.valueOf(getProperty(getItem(row, 0), "oid"));
+
+ final String[] info = fileInfo(oid);
+
+ if (info[0].length() > 0)
+ {
+ if ((info[2].length() > 0) && info[2].endsWith("jpeg"))
+ {
+ // Retrieve the jpg image
+ final BufferedImage in = ImageIO.read(new File(info[1]));
+
+ final int maxDim = 200;
+
+ final int height = in.getHeight();
+ final int width = in.getWidth();
+
+ // Determine the scale.
+ double scale = (double) maxDim / (double) height;
+
+ if (in.getWidth() > in.getHeight())
+ {
+ scale = (double) maxDim / (double) width;
+ }
+
+ int scaledW = (int) (scale * (double) width);
+ int scaledH = (int) (scale * (double) height);
+
+ // Set the scale.
+ final AffineTransform tx = new AffineTransform();
+
+ if (scale <= 1.0d)
+ {
+ tx.scale(scale, scale);
+ }
+ else
+ {
+ scaledW = width;
+ scaledH = height;
+ }
+
+ final BufferedImage out = new BufferedImage(scaledW, scaledH, BufferedImage.TYPE_INT_RGB);
+
+ final Graphics2D g2d = out.createGraphics();
+ g2d.drawImage(in, tx, null);
+ g2d.dispose();
+
+ final Object preview = parse("preview.xml");
+ setString(preview, "text", info[0]);
+ setIcon(find(preview, "image"), "icon", out);
+ add(preview);
+ }
+ }
+ }
+ }
+
/**
* Displays an exception stacktrace.
*
@@ -534,6 +604,50 @@ public class LifeBlogger extends Thinlet
}
}
+ // Returns an array containg the file name, location and mime type.
+ private String[] fileInfo(String objectID)
+ throws SQLException
+ {
+ final String[] info = new String[] { "", "", "" };
+ Connection con = null;
+ Statement st = null;
+ ResultSet rs = null;
+
+ try
+ {
+ con = DriverManager.getConnection(JDBC_PREFIX + _homeDir.getAbsolutePath() + DATABASE);
+
+ st = con.createStatement();
+ rs = st.executeQuery("SELECT * FROM BinaryItem WHERE HooverObjectID = " + objectID);
+
+ if (rs.next())
+ {
+ info[0] = rs.getString("Filename");
+ info[1] = _homeDir.getAbsolutePath() + "\\DataStore" + rs.getString("Pathname") + info[0];
+ info[2] = rs.getString("ObjectMimeType");
+ }
+ }
+ finally
+ {
+ if (st != null)
+ {
+ st.close();
+ }
+
+ if (rs != null)
+ {
+ rs.close();
+ }
+
+ if (con != null)
+ {
+ con.close();
+ }
+ }
+
+ return info;
+ }
+
// Display the FTP dialog.
private void ftpDialog(String file)
{
diff --git a/src/net/thauvin/lifeblogger/LifeMediaObject.java b/src/net/thauvin/lifeblogger/LifeMediaObject.java
index b3b8292..cb10b94 100644
--- a/src/net/thauvin/lifeblogger/LifeMediaObject.java
+++ b/src/net/thauvin/lifeblogger/LifeMediaObject.java
@@ -91,7 +91,9 @@ public class LifeMediaObject extends LifeBlog
public final void run()
{
FileInputStream fis = null;
- final BufferedReader input = null;
+ FileOutputStream fos = null;
+ BufferedOutputStream bos = null;
+ Base64.OutputStream out = null;
try
{
@@ -104,31 +106,23 @@ public class LifeMediaObject extends LifeBlog
throw new IOException("Unsupported URL protocol: " + url.getProtocol());
}
- // The following is a little hackish.
- // A better way would be to generate the request to a temporary file.
- final long len = getFile().length();
-
- if (len > Integer.MAX_VALUE)
- {
- throw new IOException("Sorry. The file is too large.");
- }
+ final File tmpFile = File.createTempFile(ReleaseInfo.getProject(), ".b64");
+ tmpFile.deleteOnExit();
fis = new FileInputStream(getFile());
+ fos = new FileOutputStream(tmpFile);
+ bos = new BufferedOutputStream(fos);
+ out = new Base64.OutputStream(bos, Base64.ENCODE | Base64.DONT_BREAK_LINES);
- final byte[] bytes = new byte[(int) getFile().length()];
+ final byte[] buf = new byte[1024];
+ int len;
- int offset = 0;
- int numRead = 0;
-
- while ((offset < bytes.length) && ((numRead = fis.read(bytes, offset, bytes.length - offset)) >= 0))
+ while ((len = fis.read(buf)) > 0)
{
- offset += numRead;
+ out.write(buf, 0, len);
}
- if (offset < bytes.length)
- {
- throw new IOException("Could not completely read file: " + getFile().getName());
- }
+ fis.close();
final StringBuffer start =
new StringBuffer("metaWeblog.newMediaObject").append(_blogID)
@@ -137,7 +131,6 @@ public class LifeMediaObject extends LifeBlog
.append("")
.append(getPassword())
.append("bits");
- final String bits = Base64.encodeBytes(bytes);
final StringBuffer end =
new StringBuffer("name").append(getFilename())
@@ -149,18 +142,28 @@ public class LifeMediaObject extends LifeBlog
urlConn.setDoInput(true);
urlConn.setDoOutput(true);
urlConn.setUseCaches(false);
- urlConn.setRequestProperty("Content-Length", String.valueOf(start.length() + bits.length() + end.length()));
+ urlConn.setRequestProperty("Content-Length",
+ String.valueOf(start.length() + tmpFile.length() + end.length()));
urlConn.setRequestProperty("Content-Type", "text/xml");
- final DataOutputStream output = new DataOutputStream(urlConn.getOutputStream());
- output.write(start.toString().getBytes());
- output.flush();
- output.write(bits.getBytes());
- output.flush();
- output.write(end.toString().getBytes());
- output.flush();
+ final DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
+ dos.write(start.toString().getBytes());
+ dos.flush();
- output.close();
+ fis = new FileInputStream(tmpFile);
+
+ while ((len = fis.read(buf)) > 0)
+ {
+ dos.write(buf, 0, len);
+ dos.flush();
+ }
+
+ fis.close();
+
+ dos.write(end.toString().getBytes());
+ dos.flush();
+
+ dos.close();
final LifeMediaObjResponse xmlrpc = new LifeMediaObjResponse(urlConn.getInputStream());
@@ -188,18 +191,6 @@ public class LifeMediaObject extends LifeBlog
}
finally
{
- if (input != null)
- {
- try
- {
- input.close();
- }
- catch (IOException e)
- {
- ; // Do nothing
- }
- }
-
if (fis != null)
{
try
@@ -211,6 +202,42 @@ public class LifeMediaObject extends LifeBlog
; // Do nothing
}
}
+
+ if (bos != null)
+ {
+ try
+ {
+ bos.close();
+ }
+ catch (IOException ignore)
+ {
+ ; // Do nothing
+ }
+ }
+
+ if (fos != null)
+ {
+ try
+ {
+ fos.close();
+ }
+ catch (IOException ignore)
+ {
+ ; // Do nothing
+ }
+ }
+
+ if (out != null)
+ {
+ try
+ {
+ out.close();
+ }
+ catch (IOException ignore)
+ {
+ ; // Do nothing
+ }
+ }
}
}
}
diff --git a/src/net/thauvin/lifeblogger/ReleaseInfo.java b/src/net/thauvin/lifeblogger/ReleaseInfo.java
index 6939bb8..7c86385 100644
--- a/src/net/thauvin/lifeblogger/ReleaseInfo.java
+++ b/src/net/thauvin/lifeblogger/ReleaseInfo.java
@@ -1,5 +1,5 @@
/* Created by JReleaseInfo AntTask from Open Source Competence Group */
-/* Creation date Thu Jul 22 16:15:30 PDT 2004 */
+/* Creation date Thu Jul 22 22:36:26 PDT 2004 */
package net.thauvin.lifeblogger;
import java.util.Date;
@@ -12,21 +12,21 @@ import java.util.Date;
public class ReleaseInfo {
- /** buildDate (set during build process to 1090538130250L). */
- private static Date buildDate = new Date(1090538130250L);
+ /** buildDate (set during build process to 1090560986937L). */
+ private static Date buildDate = new Date(1090560986937L);
/**
- * Get buildDate (set during build process to Thu Jul 22 16:15:30 PDT 2004).
+ * Get buildDate (set during build process to Thu Jul 22 22:36:26 PDT 2004).
* @return Date buildDate
*/
public static final Date getBuildDate() { return buildDate; }
/**
- * Get buildNumber (set during build process to 95).
+ * Get buildNumber (set during build process to 97).
* @return int buildNumber
*/
- public static final int getBuildNumber() { return 95; }
+ public static final int getBuildNumber() { return 97; }
/** version (set during build process to "0.1.0"). */
diff --git a/src/net/thauvin/lifeblogger/main.xml b/src/net/thauvin/lifeblogger/main.xml
index 3a34a98..9a7aac7 100644
--- a/src/net/thauvin/lifeblogger/main.xml
+++ b/src/net/thauvin/lifeblogger/main.xml
@@ -14,7 +14,7 @@
-