package com.lody.virtual.server.secondary;
import android.os.Binder;
import android.os.IInterface;
import android.os.Parcel;
import android.os.Process;
import android.os.RemoteException;
/**
* @author Lody
*/
public class FakeIdentityBinder extends Binder {
private Binder mBase;
public FakeIdentityBinder(Binder binder) {
this.mBase = binder;
}
public final void attachInterface(IInterface owner, String descriptor) {
mBase.attachInterface(owner, descriptor);
}
public final String getInterfaceDescriptor() {
return mBase.getInterfaceDescriptor();
}
public final boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
long clearCallingIdentity = Binder.clearCallingIdentity();
try {
Binder.restoreCallingIdentity(getFakeIdentity());
return mBase.transact(code, data, reply, flags);
} finally {
Binder.restoreCallingIdentity(clearCallingIdentity);
}
}
/**
* See: http://androidxref.com/6.0.1_r10/xref/frameworks/native/libs/binder/IPCThreadState.cpp#356
*/
protected long getFakeIdentity() {
return (long) getFakeUid() << 32 | (long) getFakePid();
}
protected int getFakeUid() {
return Process.myUid();
}
protected int getFakePid() {
return Process.myPid();
}
public final IInterface queryLocalInterface(String descriptor) {
return mBase.queryLocalInterface(descriptor);
}
}