19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 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 Project#define LOG_TAG "ServiceManager" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 190795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Debug.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 23151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian#include <binder/IPCThreadState.h> 240795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String8.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/SystemClock.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2825ba5b6564224dceefa086b5c439ef28dad530caMathias Agopian#include <private/binder/Static.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IServiceManager> defaultServiceManager() 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gDefaultServiceManager != NULL) return gDefaultServiceManager; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(gDefaultServiceManagerLock); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gDefaultServiceManager == NULL) { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManager = interface_cast<IServiceManager>( 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProcessState::self()->getContextObject(NULL)); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gDefaultServiceManager; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool checkCallingPermission(const String16& permission) 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return checkCallingPermission(permission, NULL, NULL); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic String16 _permission("permission"); 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 56151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid) 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState* ipcState = IPCThreadState::self(); 60151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian pid_t pid = ipcState->getCallingPid(); 61151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian uid_t uid = ipcState->getCallingUid(); 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outPid) *outPid = pid; 63151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian if (outUid) *outUid = uid; 64151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian return checkPermission(permission, pid, uid); 65151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian} 66151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian 67151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopianbool checkPermission(const String16& permission, pid_t pid, uid_t uid) 68151e859e0fc3a930bdf6d270d275e69e9eba0cbfMathias Agopian{ 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IPermissionController> pc; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.lock(); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pc = gPermissionController; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.unlock(); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t startTime = 0; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pc != NULL) { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool res = pc->checkPermission(permission, pid, uid); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0) { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Check passed after %d seconds for %s from uid=%d pid=%d", 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (int)((uptimeMillis()-startTime)/1000), 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(permission).string(), uid, pid); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Is this a permission failure, or did the controller go away? 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pc->asBinder()->isBinderAlive()) { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGW("Permission failure: %s from uid=%d pid=%d", 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(permission).string(), uid, pid); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object is dead! 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.lock(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (gPermissionController == pc) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPermissionController = NULL; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.unlock(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Need to retrieve the permission controller. 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> binder = defaultServiceManager()->checkService(_permission); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (binder == NULL) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Wait for the permission controller to come back... 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime == 0) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime = uptimeMillis(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGI("Waiting to check permission %s from uid=%d pid=%d", 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8(permission).string(), uid, pid); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sleep(1); 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pc = interface_cast<IPermissionController>(binder); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Install the new permission controller, and try again. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.lock(); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gPermissionController = pc; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gDefaultServiceManagerLock.unlock(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass BpServiceManager : public BpInterface<IServiceManager> 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BpServiceManager(const sp<IBinder>& impl) 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : BpInterface<IServiceManager>(impl) 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13227b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IBinder> getService(const String16& name) const 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unsigned n; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (n = 0; n < 5; n++){ 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> svc = checkService(name); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (svc != NULL) return svc; 13927b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick LOGI("Waiting for service %s...\n", String8(name).string()); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sleep(1); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14427b3a7a75960d026655f3acd1de8a672e80a5776Brad Fitzpatrick 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual sp<IBinder> checkService( const String16& name) const 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString16(name); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return reply.readStrongBinder(); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t addService(const String16& name, const sp<IBinder>& service) 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeString16(name); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeStrongBinder(service); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply); 161c0a7e690bfd32dd897ceccd04dd0fa6bf6e9cee6Brad Fitzpatrick return err == NO_ERROR ? reply.readExceptionCode() : err; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual Vector<String16> listServices() 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<String16> res; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n = 0; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (;;) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel data, reply; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.writeInt32(n++); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.add(reply.readString16()); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager"); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------- 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BnServiceManager::onTransact( 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("ServiceManager received: "); data.print(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch(code) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case GET_SERVICE_TRANSACTION: { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IServiceManager, data, reply); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 which = data.readString16(); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = const_cast<BnServiceManager*>(this)->getService(which); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(b); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case CHECK_SERVICE_TRANSACTION: { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IServiceManager, data, reply); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 which = data.readString16(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = const_cast<BnServiceManager*>(this)->checkService(which); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeStrongBinder(b); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ADD_SERVICE_TRANSACTION: { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IServiceManager, data, reply); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 which = data.readString16(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = data.readStrongBinder(); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = addService(which, b); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(err); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LIST_SERVICES_TRANSACTION: { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK_INTERFACE(IServiceManager, data, reply); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<String16> list = listServices(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const size_t N = list.size(); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeInt32(N); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reply->writeString16(list[i]); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } break; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BBinder::onTransact(code, data, reply, flags); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 229