19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a remotable object, the core part of a lightweight
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remote procedure call mechanism defined by {@link IBinder}.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is an implementation of IBinder that provides
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard support creating a local implementation of such an object.
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most developers will not implement this class directly, instead using the
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface, having it generate the appropriate Binder subclass.  You can,
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * however, derive directly from Binder to implement your own custom RPC
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol or simply instantiate a raw Binder object directly to use as a
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * token that can be shared across processes.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Binder implements IBinder {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this flag to true to detect anonymous, local or member classes
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that extend this Binder class and that are not static. These kind
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of classes can potentially create leaks.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean FIND_POTENTIAL_LEAKS = false;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Binder";
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IInterface mOwner;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mDescriptor;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the ID of the process that sent you the current transaction
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is being processed.  This pid can be used with higher-level
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system services to determine its identity and check permissions.
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the current thread is not currently executing an incoming transaction,
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then its own pid is returned.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingPid();
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the ID of the user assigned to the process that sent you the
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current transaction that is being processed.  This uid can be used with
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * higher-level system services to determine its identity and check
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * permissions.  If the current thread is not currently executing an
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * incoming transaction, then its own uid is returned.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingUid();
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Reset the identity of the incoming IPC on the current thread.  This can
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be useful if, while handling an incoming call, you will be calling
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on interfaces of other objects that may be local to your process and
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * need to do permission checks on the calls coming into them (so they
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will check the permission of your own local process, and not whatever
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process originally called you).
81a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an opaque token that can be used to restore the
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original calling identity by passing it to
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreCallingIdentity(long)}.
85a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingPid()
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingUid()
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreCallingIdentity(long)
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long clearCallingIdentity();
91a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
93a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Restore the identity of the incoming IPC on the current thread
94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * back to a previously identity that was returned by {@link
95a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * #clearCallingIdentity}.
96a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token The opaque token that was previously returned by
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #clearCallingIdentity}.
99a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #clearCallingIdentity
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void restoreCallingIdentity(long token);
103727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
104727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
105727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Sets the native thread-local StrictMode policy mask.
106727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
107727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * <p>The StrictMode settings are kept in two places: a Java-level
108727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * threadlocal for libcore/Dalvik, and a native threadlocal (set
109727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * here) for propagation via Binder calls.  This is a little
110727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * unfortunate, but necessary to break otherwise more unfortunate
111727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * dependencies either of Dalvik on Android, or Android
112727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * native-only code on Dalvik.
113727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
114727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see StrictMode
115727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native void setThreadStrictModePolicy(int policyMask);
118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Gets the current native thread-local StrictMode policy mask.
121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see #setThreadStrictModePolicy
123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native int getThreadStrictModePolicy();
126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flush any Binder commands pending in the current thread to the kernel
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * driver.  This can be
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * useful to call before performing an operation that may block for a long
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time, to ensure that any pending object references have been released
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to prevent the process from holding on to objects longer than
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it needs to.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void flushPendingCommands();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add the calling thread to the IPC thread pool.  This function does
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not return until the current process is exiting.
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void joinThreadPool();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default constructor initializes the object.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Binder() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (FIND_POTENTIAL_LEAKS) {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Class<? extends Binder> klass = getClass();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (klass.getModifiers() & Modifier.STATIC) == 0) {
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    klass.getCanonicalName());
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method for associating a specific interface with the Binder.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * After calling, queryLocalInterface() will be implemented for you
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to return the given owner IInterface when the corresponding
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor is requested.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void attachInterface(IInterface owner, String descriptor) {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOwner = owner;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDescriptor = descriptor;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation returns an empty interface name.
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getInterfaceDescriptor() {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDescriptor;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation always returns true -- if you got here,
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the object is alive.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean pingBinder() {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that if you're calling on a local binder, this always returns true
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because your process is alive if you're calling it.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isBinderAlive() {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use information supplied to attachInterface() to return the
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated IInterface if it matches the requested
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDescriptor.equals(descriptor)) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mOwner;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation is a stub that returns false.  You will want
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to override this to do the appropriate unmarshalling of transactions.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you want to call this, call transact().
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onTransact(int code, Parcel data, Parcel reply,
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (code == INTERFACE_TRANSACTION) {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeString(getInterfaceDescriptor());
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (code == DUMP_TRANSACTION) {
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor fd = data.readFileDescriptor();
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] args = data.readStringArray();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd != null) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dump(fd.getFileDescriptor(), args);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fd.close();
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
228eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                        // swallowed, not propagated back to the caller
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
232eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            // Write the StrictMode header.
233eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            if (reply != null) {
234eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                reply.writeNoException();
235eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            } else {
236eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                StrictMode.clearGatheredViolations();
237eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implemented to call the more convenient version
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #dump(FileDescriptor, PrintWriter, String[])}.
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fout = new FileOutputStream(fd);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriter pw = new PrintWriter(fout);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dump(fd, pw, args);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.flush();
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
258e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     * Like {@link #dump(FileDescriptor, String[])}, but ensures the target
259e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     * executes asynchronously.
260e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn     */
261e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    public void dumpAsync(final FileDescriptor fd, final String[] args) {
262e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        final FileOutputStream fout = new FileOutputStream(fd);
263e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        final PrintWriter pw = new PrintWriter(fout);
264e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Thread thr = new Thread("Binder.dumpAsync") {
265e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            public void run() {
266e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                try {
267e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                    dump(fd, pw, args);
268e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                } finally {
269e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                    pw.flush();
270e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn                }
271e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            }
272e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        };
273e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        thr.start();
274e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    }
275e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn
276e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    /**
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Print the object's state into the given stream.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The raw file descriptor that the dump is being sent to.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fout The file to which you should dump your state.  This will be
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed for you after you return.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args additional arguments to the dump request.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation rewinds the parcels and calls onTransact.  On
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the remote side, transact calls into the binder to do the IPC.
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean transact(int code, Parcel data, Parcel reply,
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
29343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v("Binder", "Transact: " + code + " to " + this);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data != null) {
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.setDataPosition(0);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean r = onTransact(code, data, reply, flags);
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply != null) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.setDataPosition(0);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void linkToDeath(DeathRecipient recipient, int flags) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void init();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
3275b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
3285b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick    // Entry point from android_util_Binder.cpp's onTransact
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean execTransact(int code, int dataObj, int replyObj,
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain(dataObj);
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain(replyObj);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // theoretically, we should call transact, which will call onTransact,
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // but all that does is rewind it, and we just got these from an IPC,
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // so we'll just call it directly.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean res;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = onTransact(code, data, reply, flags);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
34519f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson        } catch (OutOfMemoryError e) {
34619f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            RuntimeException re = new RuntimeException("Out of memory", e);
34719f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            reply.writeException(re);
34819f22745aa0fa2344850bac3234460add9d94c4eMattias Petersson            res = true;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reply.recycle();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.recycle();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean pingBinder();
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean isBinderAlive();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String getInterfaceDescriptor() throws RemoteException;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean transact(int code, Parcel data, Parcel reply,
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void linkToDeath(DeathRecipient recipient, int flags)
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) throws RemoteException {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
373eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick        Parcel reply = Parcel.obtain();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFileDescriptor(fd);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStringArray(args);
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
377eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            transact(DUMP_TRANSACTION, data, reply, 0);
378eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.readException();
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.recycle();
381eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.recycle();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
385e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    public void dumpAsync(FileDescriptor fd, String[] args) throws RemoteException {
386e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Parcel data = Parcel.obtain();
387e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        Parcel reply = Parcel.obtain();
388e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        data.writeFileDescriptor(fd);
389e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        data.writeStringArray(args);
390e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        try {
391e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            transact(DUMP_TRANSACTION, data, reply, FLAG_ONEWAY);
392e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            reply.readException();
393e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        } finally {
394e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            data.recycle();
395e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn            reply.recycle();
396e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn        }
397e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn    }
398e17aeb31030cfeed339a39a107912ad5e9178390Dianne Hackborn
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BinderProxy() {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSelf = new WeakReference(this);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void sendDeathNotice(DeathRecipient recipient) {
41543a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato        if (false) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recipient.binderDied();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RuntimeException exc) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BinderNative", "Uncaught exception from death notification",
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    exc);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final private WeakReference mSelf;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
427bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate    private int mOrgue;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
429