Add connection helper for other projects

This eases using the AIDL-Interface and is the recommended way for other
project to implement the connection.
This commit is contained in:
Markus Doits 2011-01-04 23:08:08 +00:00
parent 2660c561a1
commit 6477f60764
3 changed files with 165 additions and 14 deletions

View File

@ -4,6 +4,10 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Intent; import android.content.Intent;
import android.os.IBinder; import android.os.IBinder;
@ -20,7 +24,10 @@ public class ApgService extends Service {
private final IApgService.Stub mBinder = new IApgService.Stub() { private final IApgService.Stub mBinder = new IApgService.Stub() {
public String encrypt_with_passphrase(String msg, String passphrase) { public String encrypt_with_passphrase(List<String> args) {
String msg = args.remove(0);
String passphrase = args.remove(0);
Preferences mPreferences = Preferences.getPreferences(getBaseContext(), true); Preferences mPreferences = Preferences.getPreferences(getBaseContext(), true);
InputStream inStream = new ByteArrayInputStream(msg.getBytes()); InputStream inStream = new ByteArrayInputStream(msg.getBytes());
InputData in = new InputData(inStream, 9999); InputData in = new InputData(inStream, 9999);
@ -29,17 +36,16 @@ public class ApgService extends Service {
Apg.initialize(getApplicationContext()); Apg.initialize(getApplicationContext());
try { try {
Apg.encrypt( Apg.encrypt(getApplicationContext(), // context
getApplicationContext(), in, // input stream
in, out, // output stream
out,
true, // armored true, // armored
enc_keys, // encryption keys enc_keys, // encryption keys
0, // signature key 0, // signature key
null, // signature passphrase null, // signature passphrase
null, // progress null, // progress
mPreferences.getDefaultEncryptionAlgorithm(), mPreferences.getDefaultEncryptionAlgorithm(), // encryption
mPreferences.getDefaultHashAlgorithm(), mPreferences.getDefaultHashAlgorithm(), // hash
Id.choice.compression.none, // compression Id.choice.compression.none, // compression
false, // mPreferences.getForceV3Signatures(), false, // mPreferences.getForceV3Signatures(),
passphrase // passPhrase passphrase // passPhrase
@ -53,12 +59,13 @@ public class ApgService extends Service {
return out.toString(); return out.toString();
} }
public String decrypt_with_passphrase(String encrypted_msg, public String decrypt_with_passphrase(List<String> args) {
String passphrase) { String encrypted_msg = args.remove(0);
InputStream inStream = new ByteArrayInputStream(encrypted_msg String passphrase = args.remove(0);
.getBytes());
InputStream inStream = new ByteArrayInputStream(encrypted_msg.getBytes());
InputData in = new InputData(inStream, 9999); // XXX what size in InputData in = new InputData(inStream, 9999); // XXX what size in
// second parameter? // second parameter?
OutputStream out = new ByteArrayOutputStream(); OutputStream out = new ByteArrayOutputStream();
try { try {
Apg.decrypt(getApplicationContext(), in, out, passphrase, null, // progress Apg.decrypt(getApplicationContext(), in, out, passphrase, null, // progress

View File

@ -1,6 +1,6 @@
package org.thialfihar.android.apg; package org.thialfihar.android.apg;
interface IApgService { interface IApgService {
String encrypt_with_passphrase(String msg, String passphrase); String encrypt_with_passphrase(in List<String> params);
String decrypt_with_passphrase(String encrypted_msg, String passphrase); String decrypt_with_passphrase(in List<String> params);
} }

View File

@ -0,0 +1,144 @@
package org.thialfihar.android.apg.utils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import org.thialfihar.android.apg.IApgService;
/**
* This class can be used by other projects to simplify connecting to the
* APG-Service. Kind of wrapper of for AIDL.
*
* It is not used in this project.
*/
public class ApgCon {
private String TAG = "ApgCon";
private final Context mContext;
/** Remote service for decrypting and encrypting data */
private IApgService apgService = null;
/** Set apgService accordingly to connection status */
private ServiceConnection apgConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
Log.d(TAG, "IApgService bound to apgService");
apgService = IApgService.Stub.asInterface(service);
}
public void onServiceDisconnected(ComponentName className) {
Log.d(TAG, "IApgService disconnected");
apgService = null;
}
};
/** Possible fields which are returned to the application */
public static enum retKey {
ERROR, // error enum, see below
ERROR_DESC, // human readable description
RESULT, // if everything went fine, result
}
public static enum error {
GENERIC, // no special type
CANNOT_BIND_TO_APG, // connection to apg service not possible
CALL_MISSING, // function to call not provided
CALL_NOT_KNOWN, // apg service does not know what to do
}
public ApgCon(Context ctx) {
Log.d(TAG, "EncryptionService created");
mContext = ctx;
}
/** try to connect to the apg service */
private boolean connect() {
Log.d(TAG, "trying to bind the apgService to context");
if (apgService != null) {
Log.d(TAG, "allready connected");
return true;
}
try {
mContext.bindService(new Intent(IApgService.class.getName()), apgConnection, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.d(TAG, "could not bind APG service");
return false;
}
int wait_count = 0;
while (apgService == null && wait_count++ < 15) {
Log.d(TAG, "sleeping 1 second to wait for apg");
android.os.SystemClock.sleep(1000);
}
;
if (wait_count >= 15) {
Log.d(TAG, "slept waiting for nothing!");
return false;
}
return true;
}
private boolean initialize() {
if (apgService == null) {
if (!connect()) {
Log.d(TAG, "connection to apg service failed");
return false;
}
}
return true;
}
public boolean call(String function, Map<retKey, Object> return_map, String... function_params) {
return_map.put(retKey.ERROR, null);
if (!initialize()) {
return_map.put(retKey.ERROR, error.CANNOT_BIND_TO_APG);
return false;
}
if (function == null || function.length() == 0) {
return_map.put(retKey.ERROR, error.CALL_MISSING);
return false;
}
try {
List<String> params_list = Arrays.asList(function_params);
return_map.put(retKey.RESULT, IApgService.class.getMethod(function, List.class).invoke(apgService, params_list));
} catch (NoSuchMethodException e) {
Log.d(TAG, e.getMessage());
return_map.put(retKey.ERROR, error.CALL_NOT_KNOWN);
return_map.put(retKey.ERROR_DESC, e.getMessage());
return false;
} catch (Exception e) {
Log.d(TAG, e.getMessage());
return_map.put(retKey.ERROR, error.GENERIC);
return_map.put(retKey.ERROR_DESC, e.getMessage());
return false;
}
return true;
}
private void disconnect() {
Log.d(TAG, "disconnecting apgService");
if (apgService != null) {
mContext.unbindService(apgConnection);
apgService = null;
}
}
}