diff options
| -rw-r--r-- | core/java/android/os/IServiceManager.java | 87 | ||||
| -rw-r--r-- | core/java/android/os/ServiceManagerNative.java | 84 |
2 files changed, 20 insertions, 151 deletions
diff --git a/core/java/android/os/IServiceManager.java b/core/java/android/os/IServiceManager.java deleted file mode 100644 index 053c5ede7224..000000000000 --- a/core/java/android/os/IServiceManager.java +++ /dev/null @@ -1,87 +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.annotation.UnsupportedAppUsage; - -/** - * Basic interface for finding and publishing system services. - * - * An implementation of this interface is usually published as the - * global context object, which can be retrieved via - * BinderNative.getContextObject(). An easy way to retrieve this - * is with the static method BnServiceManager.getDefault(). - * - * @hide - */ -public interface IServiceManager extends IInterface -{ - /** - * Retrieve an existing service called @a name from the - * service manager. Blocks for a few seconds waiting for it to be - * published if it does not already exist. - */ - @UnsupportedAppUsage - IBinder getService(String name) throws RemoteException; - - /** - * Retrieve an existing service called @a name from the - * service manager. Non-blocking. - */ - @UnsupportedAppUsage - IBinder checkService(String name) throws RemoteException; - - /** - * Place a new @a service called @a name into the service - * manager. - */ - void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags) - throws RemoteException; - - /** - * Return a list of all currently running services. - */ - String[] listServices(int dumpFlags) throws RemoteException; - - static final String descriptor = "android.os.IServiceManager"; - - int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION; - int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1; - int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2; - int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3; - int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4; - int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5; - - /* - * Must update values in IServiceManager.h - */ - /* Allows services to dump sections according to priorities. */ - int DUMP_FLAG_PRIORITY_CRITICAL = 1 << 0; - int DUMP_FLAG_PRIORITY_HIGH = 1 << 1; - int DUMP_FLAG_PRIORITY_NORMAL = 1 << 2; - /** - * Services are by default registered with a DEFAULT dump priority. DEFAULT priority has the - * same priority as NORMAL priority but the services are not called with dump priority - * arguments. - */ - int DUMP_FLAG_PRIORITY_DEFAULT = 1 << 3; - int DUMP_FLAG_PRIORITY_ALL = DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH - | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PRIORITY_DEFAULT; - /* Allows services to dump sections in protobuf format. */ - int DUMP_FLAG_PROTO = 1 << 4; - -} diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java index 011dfa03c70a..7991cd46b65c 100644 --- a/core/java/android/os/ServiceManagerNative.java +++ b/core/java/android/os/ServiceManagerNative.java @@ -18,8 +18,6 @@ package android.os; import android.annotation.UnsupportedAppUsage; -import java.util.ArrayList; - /** * Native implementation of the service manager. Most clients will only * care about asInterface(). @@ -32,26 +30,27 @@ public final class ServiceManagerNative { /** * Cast a Binder object into a service manager interface, generating * a proxy if needed. + * + * TODO: delete this method and have clients use + * IServiceManager.Stub.asInterface instead */ @UnsupportedAppUsage - static public IServiceManager asInterface(IBinder obj) - { + public static IServiceManager asInterface(IBinder obj) { if (obj == null) { return null; } - IServiceManager in = - (IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor); - if (in != null) { - return in; - } + // ServiceManager is never local return new ServiceManagerProxy(obj); } } +// This class should be deleted and replaced with IServiceManager.Stub whenever +// mRemote is no longer used class ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote) { mRemote = remote; + mServiceManager = IServiceManager.Stub.asInterface(remote); } public IBinder asBinder() { @@ -60,73 +59,30 @@ class ServiceManagerProxy implements IServiceManager { @UnsupportedAppUsage public IBinder getService(String name) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0); - IBinder binder = reply.readStrongBinder(); - reply.recycle(); - data.recycle(); - return binder; + // Same as checkService (old versions of servicemanager had both methods). + return mServiceManager.checkService(name); } public IBinder checkService(String name) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - mRemote.transact(CHECK_SERVICE_TRANSACTION, data, reply, 0); - IBinder binder = reply.readStrongBinder(); - reply.recycle(); - data.recycle(); - return binder; + return mServiceManager.checkService(name); } public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) throws RemoteException { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeString(name); - data.writeStrongBinder(service); - data.writeInt(allowIsolated ? 1 : 0); - data.writeInt(dumpPriority); - mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0); - reply.recycle(); - data.recycle(); + mServiceManager.addService(name, service, allowIsolated, dumpPriority); } public String[] listServices(int dumpPriority) throws RemoteException { - ArrayList<String> services = new ArrayList<String>(); - int n = 0; - while (true) { - Parcel data = Parcel.obtain(); - Parcel reply = Parcel.obtain(); - data.writeInterfaceToken(IServiceManager.descriptor); - data.writeInt(n); - data.writeInt(dumpPriority); - n++; - try { - boolean res = mRemote.transact(LIST_SERVICES_TRANSACTION, data, reply, 0); - if (!res) { - break; - } - } catch (RuntimeException e) { - // The result code that is returned by the C++ code can - // cause the call to throw an exception back instead of - // returning a nice result... so eat it here and go on. - break; - } - services.add(reply.readString()); - reply.recycle(); - data.recycle(); - } - String[] array = new String[services.size()]; - services.toArray(array); - return array; + return mServiceManager.listServices(dumpPriority); } + /** + * Same as mServiceManager but used by apps. + * + * Once this can be removed, ServiceManagerProxy should be removed entirely. + */ @UnsupportedAppUsage private IBinder mRemote; + + private IServiceManager mServiceManager; } |