aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThialfihar <thialfihar@gmail.com>2010-05-17 14:19:36 +0000
committerThialfihar <thialfihar@gmail.com>2010-05-17 14:19:36 +0000
commit51866bb2b237033ee6f2ed8a61dcded4b1a51935 (patch)
treeeb9a28f264b73fd0c99a04377d7c92ca701472a5 /src
parenteb636fce47752ccc8d0da1d5cb2c2478ccd86368 (diff)
downloadopen-keychain-51866bb2b237033ee6f2ed8a61dcded4b1a51935.tar.gz
open-keychain-51866bb2b237033ee6f2ed8a61dcded4b1a51935.tar.bz2
open-keychain-51866bb2b237033ee6f2ed8a61dcded4b1a51935.zip
keep track of the position the input stream for decryption, makes it possible to give accurate progress information
Diffstat (limited to 'src')
-rw-r--r--src/org/thialfihar/android/apg/Apg.java10
-rw-r--r--src/org/thialfihar/android/apg/DecryptActivity.java13
-rw-r--r--src/org/thialfihar/android/apg/PositionAwareInputStream.java67
3 files changed, 85 insertions, 5 deletions
diff --git a/src/org/thialfihar/android/apg/Apg.java b/src/org/thialfihar/android/apg/Apg.java
index bc21487fa..e290a501e 100644
--- a/src/org/thialfihar/android/apg/Apg.java
+++ b/src/org/thialfihar/android/apg/Apg.java
@@ -1527,7 +1527,8 @@ public class Apg {
}
public static Bundle decrypt(Context context,
- InputStream inStream, OutputStream outStream,
+ PositionAwareInputStream inStream, OutputStream outStream,
+ long dataLength,
String passPhrase, ProgressDialogUpdater progress,
boolean assumeSymmetric)
throws IOException, GeneralException, PGPException, SignatureException {
@@ -1685,6 +1686,7 @@ public class Apg {
}
int n = 0;
int done = 0;
+ long startPos = inStream.position();
while ((n = dataIn.read(buffer)) > 0) {
out.write(buffer, 0, n);
done += n;
@@ -1698,6 +1700,12 @@ public class Apg {
}
// unknown size, but try to at least have a moving, slowing down progress bar
currentProgress = startProgress + (endProgress - startProgress) * done / (done + 100000);
+ if (dataLength - startPos == 0) {
+ currentProgress = endProgress;
+ } else {
+ currentProgress = (int)(startProgress + (endProgress - startProgress) *
+ (inStream.position() - startPos) / (dataLength - startPos));
+ }
progress.setProgress(currentProgress, 100);
}
diff --git a/src/org/thialfihar/android/apg/DecryptActivity.java b/src/org/thialfihar/android/apg/DecryptActivity.java
index b34bbba49..7e31e5f90 100644
--- a/src/org/thialfihar/android/apg/DecryptActivity.java
+++ b/src/org/thialfihar/android/apg/DecryptActivity.java
@@ -436,21 +436,26 @@ public class DecryptActivity extends BaseActivity {
Message msg = new Message();
try {
- InputStream in = null;
+ PositionAwareInputStream in = null;
OutputStream out = null;
+ long size = 0;
+
if (mDecryptTarget == Id.target.message) {
String messageData = mMessage.getText().toString();
- in = new ByteArrayInputStream(messageData.getBytes());
+ in = new PositionAwareInputStream(new ByteArrayInputStream(messageData.getBytes()));
out = new ByteArrayOutputStream();
+ size = messageData.getBytes().length;
} else {
- in = new FileInputStream(mInputFilename);
+ in = new PositionAwareInputStream(new FileInputStream(mInputFilename));
out = new FileOutputStream(mOutputFilename);
+ File file = new File(mInputFilename);
+ size = file.length();
}
if (mSignedOnly) {
data = Apg.verifyText(this, in, out, this);
} else {
- data = Apg.decrypt(this, in, out, Apg.getCachedPassPhrase(getSecretKeyId()),
+ data = Apg.decrypt(this, in, out, size, Apg.getCachedPassPhrase(getSecretKeyId()),
this, mAssumeSymmetricEncryption);
}
diff --git a/src/org/thialfihar/android/apg/PositionAwareInputStream.java b/src/org/thialfihar/android/apg/PositionAwareInputStream.java
new file mode 100644
index 000000000..661e053f2
--- /dev/null
+++ b/src/org/thialfihar/android/apg/PositionAwareInputStream.java
@@ -0,0 +1,67 @@
+package org.thialfihar.android.apg;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class PositionAwareInputStream extends InputStream {
+ private InputStream mStream;
+ private long mPosition;
+
+ public PositionAwareInputStream(InputStream in) {
+ mStream = in;
+ mPosition = 0;
+ }
+
+ @Override
+ public int read() throws IOException {
+ int ch = mStream.read();
+ ++mPosition;
+ return ch;
+ }
+
+ @Override
+ public int available() throws IOException {
+ return mStream.available();
+ }
+
+ @Override
+ public void close() throws IOException {
+ mStream.close();
+ }
+
+ @Override
+ public boolean markSupported() {
+ return false;
+ }
+
+ @Override
+ public int read(byte[] b) throws IOException {
+ int result = mStream.read(b);
+ mPosition += result;
+ return result;
+ }
+
+ @Override
+ public int read(byte[] b, int offset, int length) throws IOException {
+ int result = mStream.read(b, offset, length);
+ mPosition += result;
+ return result;
+ }
+
+ @Override
+ public synchronized void reset() throws IOException {
+ mStream.reset();
+ mPosition = 0;
+ }
+
+ @Override
+ public long skip(long n) throws IOException {
+ long result = mStream.skip(n);
+ mPosition += result;
+ return result;
+ }
+
+ public long position() {
+ return mPosition;
+ }
+}