Binder.java revision eb75888e6479317151c2ed44d47bd28ef567a4c7
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.Config;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a remotable object, the core part of a lightweight
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * remote procedure call mechanism defined by {@link IBinder}.
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class is an implementation of IBinder that provides
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the standard support creating a local implementation of such an object.
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Most developers will not implement this class directly, instead using the
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a href="{@docRoot}guide/developing/tools/aidl.html">aidl</a> tool to describe the desired
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interface, having it generate the appropriate Binder subclass.  You can,
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * however, derive directly from Binder to implement your own custom RPC
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol or simply instantiate a raw Binder object directly to use as a
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * token that can be shared across processes.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see IBinder
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Binder implements IBinder {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set this flag to true to detect anonymous, local or member classes
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that extend this Binder class and that are not static. These kind
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of classes can potentially create leaks.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean FIND_POTENTIAL_LEAKS = false;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "Binder";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private IInterface mOwner;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mDescriptor;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the ID of the process that sent you the current transaction
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is being processed.  This pid can be used with higher-level
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system services to determine its identity and check permissions.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the current thread is not currently executing an incoming transaction,
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then its own pid is returned.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingPid();
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the ID of the user assigned to the process that sent you the
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current transaction that is being processed.  This uid can be used with
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * higher-level system services to determine its identity and check
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * permissions.  If the current thread is not currently executing an
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * incoming transaction, then its own uid is returned.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native int getCallingUid();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Reset the identity of the incoming IPC on the current thread.  This can
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be useful if, while handling an incoming call, you will be calling
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on interfaces of other objects that may be local to your process and
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * need to do permission checks on the calls coming into them (so they
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will check the permission of your own local process, and not whatever
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * process originally called you).
82a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an opaque token that can be used to restore the
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * original calling identity by passing it to
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #restoreCallingIdentity(long)}.
86a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingPid()
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getCallingUid()
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreCallingIdentity(long)
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native long clearCallingIdentity();
92a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
94a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * Restore the identity of the incoming IPC on the current thread
95a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * back to a previously identity that was returned by {@link
96a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     * #clearCallingIdentity}.
97a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param token The opaque token that was previously returned by
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #clearCallingIdentity}.
100a0527f207bf4af313e9f4fa9c39afe1bbee51e16Brad Fitzpatrick     *
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #clearCallingIdentity
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void restoreCallingIdentity(long token);
104727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
105727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
106727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Sets the native thread-local StrictMode policy mask.
107727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
108727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * <p>The StrictMode settings are kept in two places: a Java-level
109727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * threadlocal for libcore/Dalvik, and a native threadlocal (set
110727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * here) for propagation via Binder calls.  This is a little
111727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * unfortunate, but necessary to break otherwise more unfortunate
112727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * dependencies either of Dalvik on Android, or Android
113727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * native-only code on Dalvik.
114727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
115727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see StrictMode
116727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
117727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
118727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native void setThreadStrictModePolicy(int policyMask);
119727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
120727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    /**
121727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * Gets the current native thread-local StrictMode policy mask.
122727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     *
123727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @see #setThreadStrictModePolicy
124727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     * @hide
125727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick     */
126727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick    public static final native int getThreadStrictModePolicy();
127727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flush any Binder commands pending in the current thread to the kernel
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * driver.  This can be
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * useful to call before performing an operation that may block for a long
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * time, to ensure that any pending object references have been released
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in order to prevent the process from holding on to objects longer than
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it needs to.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void flushPendingCommands();
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add the calling thread to the IPC thread pool.  This function does
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not return until the current process is exiting.
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final native void joinThreadPool();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default constructor initializes the object.
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Binder() {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        init();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (FIND_POTENTIAL_LEAKS) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Class<? extends Binder> klass = getClass();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (klass.getModifiers() & Modifier.STATIC) == 0) {
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.w(TAG, "The following Binder class should be static or leaks might occur: " +
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    klass.getCanonicalName());
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    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Convenience method for associating a specific interface with the Binder.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * After calling, queryLocalInterface() will be implemented for you
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to return the given owner IInterface when the corresponding
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor is requested.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void attachInterface(IInterface owner, String descriptor) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOwner = owner;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDescriptor = descriptor;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation returns an empty interface name.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getInterfaceDescriptor() {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDescriptor;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation always returns true -- if you got here,
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the object is alive.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean pingBinder() {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@inheritDoc}
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that if you're calling on a local binder, this always returns true
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * because your process is alive if you're calling it.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isBinderAlive() {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use information supplied to attachInterface() to return the
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated IInterface if it matches the requested
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descriptor.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDescriptor.equals(descriptor)) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mOwner;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation is a stub that returns false.  You will want
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to override this to do the appropriate unmarshalling of transactions.
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you want to call this, call transact().
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onTransact(int code, Parcel data, Parcel reply,
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (code == INTERFACE_TRANSACTION) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeString(getInterfaceDescriptor());
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (code == DUMP_TRANSACTION) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ParcelFileDescriptor fd = data.readFileDescriptor();
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String[] args = data.readStringArray();
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (fd != null) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dump(fd.getFileDescriptor(), args);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        fd.close();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
229eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                        // swallowed, not propagated back to the caller
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
233eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            // Write the StrictMode header.
234eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            if (reply != null) {
235eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                reply.writeNoException();
236eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            } else {
237eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick                StrictMode.clearGatheredViolations();
238eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implemented to call the more convenient version
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #dump(FileDescriptor, PrintWriter, String[])}.
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileOutputStream fout = new FileOutputStream(fd);
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PrintWriter pw = new PrintWriter(fout);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dump(fd, pw, args);
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pw.flush();
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Print the object's state into the given stream.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fd The raw file descriptor that the dump is being sent to.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param fout The file to which you should dump your state.  This will be
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * closed for you after you return.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param args additional arguments to the dump request.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation rewinds the parcels and calls onTransact.  On
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the remote side, transact calls into the binder to do the IPC.
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean transact(int code, Parcel data, Parcel reply,
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) Log.v("Binder", "Transact: " + code + " to " + this);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (data != null) {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.setDataPosition(0);
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean r = onTransact(code, data, reply, flags);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply != null) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.setDataPosition(0);
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return r;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void linkToDeath(DeathRecipient recipient, int flags) {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Local implementation is a no-op.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean unlinkToDeath(DeathRecipient recipient, int flags) {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void init();
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
3095b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick
3105b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick    // Entry point from android_util_Binder.cpp's onTransact
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean execTransact(int code, int dataObj, int replyObj,
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain(dataObj);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel reply = Parcel.obtain(replyObj);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // theoretically, we should call transact, which will call onTransact,
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // but all that does is rewind it, and we just got these from an IPC,
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // so we'll just call it directly.
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean res;
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = onTransact(code, data, reply, flags);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException e) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            reply.writeException(e);
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = true;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        reply.recycle();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.recycle();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return res;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinal class BinderProxy implements IBinder {
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean pingBinder();
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean isBinderAlive();
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IInterface queryLocalInterface(String descriptor) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native String getInterfaceDescriptor() throws RemoteException;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean transact(int code, Parcel data, Parcel reply,
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int flags) throws RemoteException;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native void linkToDeath(DeathRecipient recipient, int flags)
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native boolean unlinkToDeath(DeathRecipient recipient, int flags);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dump(FileDescriptor fd, String[] args) throws RemoteException {
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel data = Parcel.obtain();
351eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick        Parcel reply = Parcel.obtain();
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeFileDescriptor(fd);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        data.writeStringArray(args);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
355eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            transact(DUMP_TRANSACTION, data, reply, 0);
356eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.readException();
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            data.recycle();
359eb75888e6479317151c2ed44d47bd28ef567a4c7Brad Fitzpatrick            reply.recycle();
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BinderProxy() {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSelf = new WeakReference(this);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroy();
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.finalize();
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private native final void destroy();
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final void sendDeathNotice(DeathRecipient recipient) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Config.LOGV) Log.v("JavaBinder", "sendDeathNotice to " + recipient);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recipient.binderDied();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        catch (RuntimeException exc) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BinderNative", "Uncaught exception from death notification",
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    exc);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final private WeakReference mSelf;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mObject;
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
392