package org.kvj.vimtouch.ext.manager.impl;
import org.kvj.bravo7.ipc.RemoteServiceConnector;
import org.kvj.vimtouch.BasePlugin;
import org.kvj.vimtouch.IntegrationProvider;
import org.kvj.vimtouch.TransferableData;
import org.kvj.vimtouch.ext.FieldReaderException;
import org.kvj.vimtouch.ext.IncomingTransfer;
import org.kvj.vimtouch.ext.OutgoingTransfer;
import org.kvj.vimtouch.ext.Transferable;
import org.kvj.vimtouch.ext.manager.IntegrationExtension;
import org.kvj.vimtouch.ext.manager.IntegrationExtensionException;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public abstract class SimplePlugin<I extends Transferable, O extends Transferable>
extends BasePlugin.Stub implements IntegrationExtension<I, O> {
protected static String TAG = "SimplePlugin";
private RemoteServiceConnector<IntegrationProvider> serviceConnector = null;
public SimplePlugin(Context ctx) {
serviceConnector = new RemoteServiceConnector<IntegrationProvider>(ctx,
IntegrationExtension.PROVIDER_ACTION, null) {
@Override
public IntegrationProvider castAIDL(IBinder binder) {
return IntegrationProvider.Stub.asInterface(binder);
}
};
}
protected IntegrationProvider getProvider() {
return serviceConnector.getRemote();
}
@Override
public final TransferableData process(TransferableData data)
throws RemoteException {
try {
I inp = newInput();
IncomingTransfer it = new IncomingTransfer(data.getData());
inp.readFrom(it);
try {
it.read();
} catch (FieldReaderException e) {
throw new IntegrationExtensionException(String.format(
"Parsing failed: %s", e.getMessage()));
}
O output = process(inp);
OutgoingTransfer ot = new OutgoingTransfer();
ot.beginWrite();
output.writeTo(ot);
ot.endWrite();
return new TransferableData(ot.getBuffer().toString());
} catch (IntegrationExtensionException e) {
Log.w(TAG, "Error processing input:", e);
throw new RemoteException();
}
}
@Override
public final String getName() throws RemoteException {
return getType();
}
protected boolean sendEvent(int subscription, Transferable data) {
IntegrationProvider provider = getProvider();
if (null == provider) {
Log.w(TAG, "Provider is not available now");
return false;
}
OutgoingTransfer ot = new OutgoingTransfer();
ot.beginWrite();
data.writeTo(ot);
ot.endWrite();
try {
provider.sendEvent(subscription, new TransferableData(ot
.getBuffer().toString()));
return true;
} catch (RemoteException e) {
Log.e(TAG, "Error sending event:", e);
}
return false;
}
public void stop() {
serviceConnector.stop();
}
}