diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:45 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-03-03 18:28:45 -0800 |
commit | d83a98f4ce9cfa908f5c54bbd70f03eec07e7553 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /core/java/android/os/Binder.java | |
parent | 076357b8567458d4b6dfdcf839ef751634cd2bfb (diff) | |
download | frameworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.zip frameworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.tar.gz frameworks_base-d83a98f4ce9cfa908f5c54bbd70f03eec07e7553.tar.bz2 |
auto import from //depot/cupcake/@135843
Diffstat (limited to 'core/java/android/os/Binder.java')
-rw-r--r-- | core/java/android/os/Binder.java | 355 |
1 files changed, 0 insertions, 355 deletions
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java deleted file mode 100644 index df10c6a..0000000 --- a/core/java/android/os/Binder.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.os; - -import android.util.Config; -import android.util.Log; - -import java.io.FileDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.lang.ref.WeakReference; -import java.lang.reflect.Modifier; - -/** - * Base class for a remotable object, the core part of a lightweight - * remote procedure call mechanism defined by {@link IBinder}. - * This class is an implementation of IBinder that provides - * the standard support creating a local implementation of such an object. - * - * <p>Most developers will not implement this class directly, instead using the - * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired - * interface, having it generate the appropriate Binder subclass. You can, - * however, derive directly from Binder to implement your own custom RPC - * protocol or simply instantiate a raw Binder object directly to use as a - * token that can be shared across processes. - * - * @see IBinder - */ -public class Binder implements IBinder { - /* - * Set this flag to true to detect anonymous, local or member classes - * that extend this Binder class and that are not static. These kind - * of classes can potentially create leaks. - */ - private static final boolean FIND_POTENTIAL_LEAKS = false; - private static final String TAG = "Binder"; - - private int mObject; - private IInterface mOwner; - private String mDescriptor; - - /** - * Return the ID of the process that sent you the current transaction - * that is being processed. This pid can be used with higher-level - * system services to determine its identity and check permissions. - * If the current thread is not currently executing an incoming transaction, - * then its own pid is returned. - */ - public static final native int getCallingPid(); - - /** - * Return the ID of the user assigned to the process that sent you the - * current transaction that is being processed. This uid can be used with - * higher-level system services to determine its identity and check - * permissions. If the current thread is not currently executing an - * incoming transaction, then its own uid is returned. - */ - public static final native int getCallingUid(); - - /** - * Reset the identity of the incoming IPC to the local process. This can - * be useful if, while handling an incoming call, you will be calling - * on interfaces of other objects that may be local to your process and - * need to do permission checks on the calls coming into them (so they - * will check the permission of your own local process, and not whatever - * process originally called you). - * - * @return Returns an opaque token that can be used to restore the - * original calling identity by passing it to - * {@link #restoreCallingIdentity(long)}. - * - * @see #getCallingPid() - * @see #getCallingUid() - * @see #restoreCallingIdentity(long) - */ - public static final native long clearCallingIdentity(); - - /** - * Restore the identity of the incoming IPC back to a previously identity - * that was returned by {@link #clearCallingIdentity}. - * - * @param token The opaque token that was previously returned by - * {@link #clearCallingIdentity}. - * - * @see #clearCallingIdentity - */ - public static final native void restoreCallingIdentity(long token); - - /** - * Flush any Binder commands pending in the current thread to the kernel - * driver. This can be - * useful to call before performing an operation that may block for a long - * time, to ensure that any pending object references have been released - * in order to prevent the process from holding on to objects longer than - * it needs to. - */ - public static final native void flushPendingCommands(); - - /** - * Add the calling thread to the IPC thread pool. This function does - * not return until the current process is exiting. - */ - public static final native void joinThreadPool(); - - /** - * Default constructor initializes the object. - */ - public Binder() { - init(); - - if (FIND_POTENTIAL_LEAKS) { - final Class<? extends Binder> klass = getClass(); - if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && - (klass.getModifiers() & Modifier.STATIC) == 0) { - Log.w(TAG, "The following Binder class should be static or leaks might occur: " + - klass.getCanonicalName()); - } - } - } - - /** - * Convenience method for associating a specific interface with the Binder. - * After calling, queryLocalInterface() will be implemented for you - * to return the given owner IInterface when the corresponding - * descriptor is requested. - */ - public void attachInterface(IInterface owner, String descriptor) { - mOwner = owner; - mDescriptor = descriptor; - } - - /** - * Default implementation returns an empty interface name. - */ - public String getInterfaceDescriptor() { - return mDescriptor; - } - - /** - * Default implementation always returns true -- if you got here, - * the object is alive. - */ - public boolean pingBinder() { - return true; - } - - /** - * {@inheritDoc} - * - * Note that if you're calling on a local binder, this always returns true - * because your process is alive if you're calling it. - */ - public boolean isBinderAlive() { - return true; - } - - /** - * Use information supplied to attachInterface() to return the - * associated IInterface if it matches the requested - * descriptor. - */ - public IInterface queryLocalInterface(String descriptor) { - if (mDescriptor.equals(descriptor)) { - return mOwner; - } - return null; - } - - /** - * Default implementation is a stub that returns false. You will want - * to override this to do the appropriate unmarshalling of transactions. - * - * <p>If you want to call this, call transact(). - */ - protected boolean onTransact(int code, Parcel data, Parcel reply, - int flags) throws RemoteException { - if (code == INTERFACE_TRANSACTION) { - reply.writeString(getInterfaceDescriptor()); - return true; - } else if (code == DUMP_TRANSACTION) { - ParcelFileDescriptor fd = data.readFileDescriptor(); - String[] args = data.readStringArray(); - if (fd != null) { - try { - dump(fd.getFileDescriptor(), args); - } finally { - try { - fd.close(); - } catch (IOException e) { - } - } - } - return true; - } - return false; - } - - /** - * Implemented to call the more convenient version - * {@link #dump(FileDescriptor, PrintWriter, String[])}. - */ - public void dump(FileDescriptor fd, String[] args) { - FileOutputStream fout = new FileOutputStream(fd); - PrintWriter pw = new PrintWriter(fout); - try { - dump(fd, pw, args); - } finally { - pw.flush(); - } - } - - /** - * Print the object's state into the given stream. - * - * @param fd The raw file descriptor that the dump is being sent to. - * @param fout The file to which you should dump your state. This will be - * closed for you after you return. - * @param args additional arguments to the dump request. - */ - protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { - } - - /** - * Default implementation rewinds the parcels and calls onTransact. On - * the remote side, transact calls into the binder to do the IPC. - */ - public final boolean transact(int code, Parcel data, Parcel reply, - int flags) throws RemoteException { - if (Config.LOGV) Log.v("Binder", "Transact: " + code + " to " + this); - if (data != null) { - data.setDataPosition(0); - } - boolean r = onTransact(code, data, reply, flags); - if (reply != null) { - reply.setDataPosition(0); - } - return r; - } - - /** - * Local implementation is a no-op. - */ - public void linkToDeath(DeathRecipient recipient, int flags) { - } - - /** - * Local implementation is a no-op. - */ - public boolean unlinkToDeath(DeathRecipient recipient, int flags) { - return true; - } - - protected void finalize() throws Throwable { - try { - destroy(); - } finally { - super.finalize(); - } - } - - private native final void init(); - private native final void destroy(); - private boolean execTransact(int code, int dataObj, int replyObj, - int flags) { - Parcel data = Parcel.obtain(dataObj); - Parcel reply = Parcel.obtain(replyObj); - // theoretically, we should call transact, which will call onTransact, - // but all that does is rewind it, and we just got these from an IPC, - // so we'll just call it directly. - boolean res; - try { - res = onTransact(code, data, reply, flags); - } catch (RemoteException e) { - reply.writeException(e); - res = true; - } catch (RuntimeException e) { - reply.writeException(e); - res = true; - } - reply.recycle(); - data.recycle(); - return res; - } -} - -final class BinderProxy implements IBinder { - public native boolean pingBinder(); - public native boolean isBinderAlive(); - - public IInterface queryLocalInterface(String descriptor) { - return null; - } - - public native String getInterfaceDescriptor() throws RemoteException; - public native boolean transact(int code, Parcel data, Parcel reply, - int flags) throws RemoteException; - public native void linkToDeath(DeathRecipient recipient, int flags) - throws RemoteException; - public native boolean unlinkToDeath(DeathRecipient recipient, int flags); - - public void dump(FileDescriptor fd, String[] args) throws RemoteException { - Parcel data = Parcel.obtain(); - data.writeFileDescriptor(fd); - data.writeStringArray(args); - try { - transact(DUMP_TRANSACTION, data, null, 0); - } finally { - data.recycle(); - } - } - - BinderProxy() { - mSelf = new WeakReference(this); - } - - @Override - protected void finalize() throws Throwable { - try { - destroy(); - } finally { - super.finalize(); - } - } - - private native final void destroy(); - - private static final void sendDeathNotice(DeathRecipient recipient) { - if (Config.LOGV) Log.v("JavaBinder", "sendDeathNotice to " + recipient); - try { - recipient.binderDied(); - } - catch (RuntimeException exc) { - Log.w("BinderNative", "Uncaught exception from death notification", - exc); - } - } - - final private WeakReference mSelf; - private int mObject; -} |