1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #define LOG_TAG "IMountService" 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker #include <storage/IMountService.h> 20*d57664e9SAndroid Build Coastguard Worker #include <binder/Parcel.h> 21*d57664e9SAndroid Build Coastguard Worker 22*d57664e9SAndroid Build Coastguard Worker namespace android { 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker enum { 25*d57664e9SAndroid Build Coastguard Worker TRANSACTION_registerListener = IBinder::FIRST_CALL_TRANSACTION, 26*d57664e9SAndroid Build Coastguard Worker TRANSACTION_unregisterListener, 27*d57664e9SAndroid Build Coastguard Worker TRANSACTION_isUsbMassStorageConnected, 28*d57664e9SAndroid Build Coastguard Worker TRANSACTION_setUsbMassStorageEnabled, 29*d57664e9SAndroid Build Coastguard Worker TRANSACTION_isUsbMassStorageEnabled, 30*d57664e9SAndroid Build Coastguard Worker TRANSACTION_mountVolume, 31*d57664e9SAndroid Build Coastguard Worker TRANSACTION_unmountVolume, 32*d57664e9SAndroid Build Coastguard Worker TRANSACTION_formatVolume, 33*d57664e9SAndroid Build Coastguard Worker TRANSACTION_getStorageUsers, 34*d57664e9SAndroid Build Coastguard Worker TRANSACTION_getVolumeState, 35*d57664e9SAndroid Build Coastguard Worker TRANSACTION_createSecureContainer, 36*d57664e9SAndroid Build Coastguard Worker TRANSACTION_finalizeSecureContainer, 37*d57664e9SAndroid Build Coastguard Worker TRANSACTION_destroySecureContainer, 38*d57664e9SAndroid Build Coastguard Worker TRANSACTION_mountSecureContainer, 39*d57664e9SAndroid Build Coastguard Worker TRANSACTION_unmountSecureContainer, 40*d57664e9SAndroid Build Coastguard Worker TRANSACTION_isSecureContainerMounted, 41*d57664e9SAndroid Build Coastguard Worker TRANSACTION_renameSecureContainer, 42*d57664e9SAndroid Build Coastguard Worker TRANSACTION_getSecureContainerPath, 43*d57664e9SAndroid Build Coastguard Worker TRANSACTION_getSecureContainerList, 44*d57664e9SAndroid Build Coastguard Worker TRANSACTION_shutdown, 45*d57664e9SAndroid Build Coastguard Worker TRANSACTION_finishMediaUpdate, 46*d57664e9SAndroid Build Coastguard Worker TRANSACTION_mountObb, 47*d57664e9SAndroid Build Coastguard Worker TRANSACTION_unmountObb, 48*d57664e9SAndroid Build Coastguard Worker TRANSACTION_isObbMounted, 49*d57664e9SAndroid Build Coastguard Worker TRANSACTION_getMountedObbPath, 50*d57664e9SAndroid Build Coastguard Worker TRANSACTION_isExternalStorageEmulated, 51*d57664e9SAndroid Build Coastguard Worker }; 52*d57664e9SAndroid Build Coastguard Worker 53*d57664e9SAndroid Build Coastguard Worker class BpMountService: public BpInterface<IMountService> 54*d57664e9SAndroid Build Coastguard Worker { 55*d57664e9SAndroid Build Coastguard Worker public: BpMountService(const sp<IBinder> & impl)56*d57664e9SAndroid Build Coastguard Worker explicit BpMountService(const sp<IBinder>& impl) 57*d57664e9SAndroid Build Coastguard Worker : BpInterface<IMountService>(impl) 58*d57664e9SAndroid Build Coastguard Worker { 59*d57664e9SAndroid Build Coastguard Worker } 60*d57664e9SAndroid Build Coastguard Worker registerListener(const sp<IMountServiceListener> & listener)61*d57664e9SAndroid Build Coastguard Worker virtual void registerListener(const sp<IMountServiceListener>& listener) 62*d57664e9SAndroid Build Coastguard Worker { 63*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 64*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 65*d57664e9SAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(listener)); 66*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_registerListener, data, &reply) != NO_ERROR) { 67*d57664e9SAndroid Build Coastguard Worker ALOGD("registerListener could not contact remote\n"); 68*d57664e9SAndroid Build Coastguard Worker return; 69*d57664e9SAndroid Build Coastguard Worker } 70*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 71*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 72*d57664e9SAndroid Build Coastguard Worker ALOGD("registerListener caught exception %d\n", err); 73*d57664e9SAndroid Build Coastguard Worker return; 74*d57664e9SAndroid Build Coastguard Worker } 75*d57664e9SAndroid Build Coastguard Worker } 76*d57664e9SAndroid Build Coastguard Worker unregisterListener(const sp<IMountServiceListener> & listener)77*d57664e9SAndroid Build Coastguard Worker virtual void unregisterListener(const sp<IMountServiceListener>& listener) 78*d57664e9SAndroid Build Coastguard Worker { 79*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 80*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 81*d57664e9SAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(listener)); 82*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_unregisterListener, data, &reply) != NO_ERROR) { 83*d57664e9SAndroid Build Coastguard Worker ALOGD("unregisterListener could not contact remote\n"); 84*d57664e9SAndroid Build Coastguard Worker return; 85*d57664e9SAndroid Build Coastguard Worker } 86*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 87*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 88*d57664e9SAndroid Build Coastguard Worker ALOGD("unregisterListener caught exception %d\n", err); 89*d57664e9SAndroid Build Coastguard Worker return; 90*d57664e9SAndroid Build Coastguard Worker } 91*d57664e9SAndroid Build Coastguard Worker } 92*d57664e9SAndroid Build Coastguard Worker isUsbMassStorageConnected()93*d57664e9SAndroid Build Coastguard Worker virtual bool isUsbMassStorageConnected() 94*d57664e9SAndroid Build Coastguard Worker { 95*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 96*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 97*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_isUsbMassStorageConnected, data, &reply) != NO_ERROR) { 98*d57664e9SAndroid Build Coastguard Worker ALOGD("isUsbMassStorageConnected could not contact remote\n"); 99*d57664e9SAndroid Build Coastguard Worker return false; 100*d57664e9SAndroid Build Coastguard Worker } 101*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 102*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 103*d57664e9SAndroid Build Coastguard Worker ALOGD("isUsbMassStorageConnected caught exception %d\n", err); 104*d57664e9SAndroid Build Coastguard Worker return false; 105*d57664e9SAndroid Build Coastguard Worker } 106*d57664e9SAndroid Build Coastguard Worker return reply.readInt32() != 0; 107*d57664e9SAndroid Build Coastguard Worker } 108*d57664e9SAndroid Build Coastguard Worker setUsbMassStorageEnabled(const bool enable)109*d57664e9SAndroid Build Coastguard Worker virtual void setUsbMassStorageEnabled(const bool enable) 110*d57664e9SAndroid Build Coastguard Worker { 111*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 112*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 113*d57664e9SAndroid Build Coastguard Worker data.writeInt32(enable != 0); 114*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_setUsbMassStorageEnabled, data, &reply) != NO_ERROR) { 115*d57664e9SAndroid Build Coastguard Worker ALOGD("setUsbMassStorageEnabled could not contact remote\n"); 116*d57664e9SAndroid Build Coastguard Worker return; 117*d57664e9SAndroid Build Coastguard Worker } 118*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 119*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 120*d57664e9SAndroid Build Coastguard Worker ALOGD("setUsbMassStorageEnabled caught exception %d\n", err); 121*d57664e9SAndroid Build Coastguard Worker return; 122*d57664e9SAndroid Build Coastguard Worker } 123*d57664e9SAndroid Build Coastguard Worker } 124*d57664e9SAndroid Build Coastguard Worker isUsbMassStorageEnabled()125*d57664e9SAndroid Build Coastguard Worker virtual bool isUsbMassStorageEnabled() 126*d57664e9SAndroid Build Coastguard Worker { 127*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 128*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 129*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_isUsbMassStorageEnabled, data, &reply) != NO_ERROR) { 130*d57664e9SAndroid Build Coastguard Worker ALOGD("isUsbMassStorageEnabled could not contact remote\n"); 131*d57664e9SAndroid Build Coastguard Worker return false; 132*d57664e9SAndroid Build Coastguard Worker } 133*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 134*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 135*d57664e9SAndroid Build Coastguard Worker ALOGD("isUsbMassStorageEnabled caught exception %d\n", err); 136*d57664e9SAndroid Build Coastguard Worker return false; 137*d57664e9SAndroid Build Coastguard Worker } 138*d57664e9SAndroid Build Coastguard Worker return reply.readInt32() != 0; 139*d57664e9SAndroid Build Coastguard Worker } 140*d57664e9SAndroid Build Coastguard Worker mountVolume(const String16 & mountPoint)141*d57664e9SAndroid Build Coastguard Worker int32_t mountVolume(const String16& mountPoint) 142*d57664e9SAndroid Build Coastguard Worker { 143*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 144*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 145*d57664e9SAndroid Build Coastguard Worker data.writeString16(mountPoint); 146*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_mountVolume, data, &reply) != NO_ERROR) { 147*d57664e9SAndroid Build Coastguard Worker ALOGD("mountVolume could not contact remote\n"); 148*d57664e9SAndroid Build Coastguard Worker return -1; 149*d57664e9SAndroid Build Coastguard Worker } 150*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 151*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 152*d57664e9SAndroid Build Coastguard Worker ALOGD("mountVolume caught exception %d\n", err); 153*d57664e9SAndroid Build Coastguard Worker return err; 154*d57664e9SAndroid Build Coastguard Worker } 155*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 156*d57664e9SAndroid Build Coastguard Worker } 157*d57664e9SAndroid Build Coastguard Worker unmountVolume(const String16 & mountPoint,const bool force,const bool removeEncryption)158*d57664e9SAndroid Build Coastguard Worker int32_t unmountVolume(const String16& mountPoint, const bool force, const bool removeEncryption) 159*d57664e9SAndroid Build Coastguard Worker { 160*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 161*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 162*d57664e9SAndroid Build Coastguard Worker data.writeString16(mountPoint); 163*d57664e9SAndroid Build Coastguard Worker data.writeInt32(force ? 1 : 0); 164*d57664e9SAndroid Build Coastguard Worker data.writeInt32(removeEncryption ? 1 : 0); 165*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_unmountVolume, data, &reply) != NO_ERROR) { 166*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountVolume could not contact remote\n"); 167*d57664e9SAndroid Build Coastguard Worker return -1; 168*d57664e9SAndroid Build Coastguard Worker } 169*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 170*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 171*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountVolume caught exception %d\n", err); 172*d57664e9SAndroid Build Coastguard Worker return err; 173*d57664e9SAndroid Build Coastguard Worker } 174*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 175*d57664e9SAndroid Build Coastguard Worker } 176*d57664e9SAndroid Build Coastguard Worker formatVolume(const String16 & mountPoint)177*d57664e9SAndroid Build Coastguard Worker int32_t formatVolume(const String16& mountPoint) 178*d57664e9SAndroid Build Coastguard Worker { 179*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 180*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 181*d57664e9SAndroid Build Coastguard Worker data.writeString16(mountPoint); 182*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_formatVolume, data, &reply) != NO_ERROR) { 183*d57664e9SAndroid Build Coastguard Worker ALOGD("formatVolume could not contact remote\n"); 184*d57664e9SAndroid Build Coastguard Worker return -1; 185*d57664e9SAndroid Build Coastguard Worker } 186*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 187*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 188*d57664e9SAndroid Build Coastguard Worker ALOGD("formatVolume caught exception %d\n", err); 189*d57664e9SAndroid Build Coastguard Worker return err; 190*d57664e9SAndroid Build Coastguard Worker } 191*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 192*d57664e9SAndroid Build Coastguard Worker } 193*d57664e9SAndroid Build Coastguard Worker getStorageUsers(const String16 & mountPoint,int32_t ** users)194*d57664e9SAndroid Build Coastguard Worker int32_t getStorageUsers(const String16& mountPoint, int32_t** users) 195*d57664e9SAndroid Build Coastguard Worker { 196*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 197*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 198*d57664e9SAndroid Build Coastguard Worker data.writeString16(mountPoint); 199*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getStorageUsers, data, &reply) != NO_ERROR) { 200*d57664e9SAndroid Build Coastguard Worker ALOGD("getStorageUsers could not contact remote\n"); 201*d57664e9SAndroid Build Coastguard Worker return -1; 202*d57664e9SAndroid Build Coastguard Worker } 203*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 204*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 205*d57664e9SAndroid Build Coastguard Worker ALOGD("getStorageUsers caught exception %d\n", err); 206*d57664e9SAndroid Build Coastguard Worker return err; 207*d57664e9SAndroid Build Coastguard Worker } 208*d57664e9SAndroid Build Coastguard Worker int32_t numUsersI = reply.readInt32(); 209*d57664e9SAndroid Build Coastguard Worker uint32_t numUsers; 210*d57664e9SAndroid Build Coastguard Worker if (numUsersI < 0) { 211*d57664e9SAndroid Build Coastguard Worker ALOGW("Number of users is negative: %d\n", numUsersI); 212*d57664e9SAndroid Build Coastguard Worker numUsers = 0; 213*d57664e9SAndroid Build Coastguard Worker } else { 214*d57664e9SAndroid Build Coastguard Worker numUsers = static_cast<uint32_t>(numUsersI); 215*d57664e9SAndroid Build Coastguard Worker } 216*d57664e9SAndroid Build Coastguard Worker *users = (int32_t*)malloc(sizeof(int32_t)*numUsers); 217*d57664e9SAndroid Build Coastguard Worker for (size_t i = 0; i < numUsers; i++) { 218*d57664e9SAndroid Build Coastguard Worker **users++ = reply.readInt32(); 219*d57664e9SAndroid Build Coastguard Worker } 220*d57664e9SAndroid Build Coastguard Worker return static_cast<int32_t>(numUsers); 221*d57664e9SAndroid Build Coastguard Worker } 222*d57664e9SAndroid Build Coastguard Worker getVolumeState(const String16 & mountPoint)223*d57664e9SAndroid Build Coastguard Worker int32_t getVolumeState(const String16& mountPoint) 224*d57664e9SAndroid Build Coastguard Worker { 225*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 226*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 227*d57664e9SAndroid Build Coastguard Worker data.writeString16(mountPoint); 228*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getVolumeState, data, &reply) != NO_ERROR) { 229*d57664e9SAndroid Build Coastguard Worker ALOGD("getVolumeState could not contact remote\n"); 230*d57664e9SAndroid Build Coastguard Worker return -1; 231*d57664e9SAndroid Build Coastguard Worker } 232*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 233*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 234*d57664e9SAndroid Build Coastguard Worker ALOGD("getVolumeState caught exception %d\n", err); 235*d57664e9SAndroid Build Coastguard Worker return err; 236*d57664e9SAndroid Build Coastguard Worker } 237*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 238*d57664e9SAndroid Build Coastguard Worker } 239*d57664e9SAndroid Build Coastguard Worker createSecureContainer(const String16 & id,const int32_t sizeMb,const String16 & fstype,const String16 & key,const int32_t ownerUid)240*d57664e9SAndroid Build Coastguard Worker int32_t createSecureContainer(const String16& id, const int32_t sizeMb, const String16& fstype, 241*d57664e9SAndroid Build Coastguard Worker const String16& key, const int32_t ownerUid) 242*d57664e9SAndroid Build Coastguard Worker { 243*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 244*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 245*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 246*d57664e9SAndroid Build Coastguard Worker data.writeInt32(sizeMb); 247*d57664e9SAndroid Build Coastguard Worker data.writeString16(fstype); 248*d57664e9SAndroid Build Coastguard Worker data.writeString16(key); 249*d57664e9SAndroid Build Coastguard Worker data.writeInt32(ownerUid); 250*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_createSecureContainer, data, &reply) != NO_ERROR) { 251*d57664e9SAndroid Build Coastguard Worker ALOGD("createSecureContainer could not contact remote\n"); 252*d57664e9SAndroid Build Coastguard Worker return -1; 253*d57664e9SAndroid Build Coastguard Worker } 254*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 255*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 256*d57664e9SAndroid Build Coastguard Worker ALOGD("createSecureContainer caught exception %d\n", err); 257*d57664e9SAndroid Build Coastguard Worker return err; 258*d57664e9SAndroid Build Coastguard Worker } 259*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 260*d57664e9SAndroid Build Coastguard Worker } 261*d57664e9SAndroid Build Coastguard Worker finalizeSecureContainer(const String16 & id)262*d57664e9SAndroid Build Coastguard Worker int32_t finalizeSecureContainer(const String16& id) 263*d57664e9SAndroid Build Coastguard Worker { 264*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 265*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 266*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 267*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_finalizeSecureContainer, data, &reply) != NO_ERROR) { 268*d57664e9SAndroid Build Coastguard Worker ALOGD("finalizeSecureContainer couldn't call remote\n"); 269*d57664e9SAndroid Build Coastguard Worker return -1; 270*d57664e9SAndroid Build Coastguard Worker } 271*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 272*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 273*d57664e9SAndroid Build Coastguard Worker ALOGD("finalizeSecureContainer caught exception %d\n", err); 274*d57664e9SAndroid Build Coastguard Worker return err; 275*d57664e9SAndroid Build Coastguard Worker } 276*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 277*d57664e9SAndroid Build Coastguard Worker } 278*d57664e9SAndroid Build Coastguard Worker destroySecureContainer(const String16 & id)279*d57664e9SAndroid Build Coastguard Worker int32_t destroySecureContainer(const String16& id) 280*d57664e9SAndroid Build Coastguard Worker { 281*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 282*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 283*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 284*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_destroySecureContainer, data, &reply) != NO_ERROR) { 285*d57664e9SAndroid Build Coastguard Worker ALOGD("destroySecureContainer couldn't call remote"); 286*d57664e9SAndroid Build Coastguard Worker return -1; 287*d57664e9SAndroid Build Coastguard Worker } 288*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 289*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 290*d57664e9SAndroid Build Coastguard Worker ALOGD("destroySecureContainer caught exception %d\n", err); 291*d57664e9SAndroid Build Coastguard Worker return err; 292*d57664e9SAndroid Build Coastguard Worker } 293*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 294*d57664e9SAndroid Build Coastguard Worker } 295*d57664e9SAndroid Build Coastguard Worker mountSecureContainer(const String16 & id,const String16 & key,const int32_t ownerUid)296*d57664e9SAndroid Build Coastguard Worker int32_t mountSecureContainer(const String16& id, const String16& key, const int32_t ownerUid) 297*d57664e9SAndroid Build Coastguard Worker { 298*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 299*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 300*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 301*d57664e9SAndroid Build Coastguard Worker data.writeString16(key); 302*d57664e9SAndroid Build Coastguard Worker data.writeInt32(ownerUid); 303*d57664e9SAndroid Build Coastguard Worker // Assume read-only 304*d57664e9SAndroid Build Coastguard Worker data.writeInt32(1); 305*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_mountSecureContainer, data, &reply) != NO_ERROR) { 306*d57664e9SAndroid Build Coastguard Worker ALOGD("mountSecureContainer couldn't call remote"); 307*d57664e9SAndroid Build Coastguard Worker return -1; 308*d57664e9SAndroid Build Coastguard Worker } 309*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); // What to do... 310*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 311*d57664e9SAndroid Build Coastguard Worker ALOGD("mountSecureContainer caught exception %d\n", err); 312*d57664e9SAndroid Build Coastguard Worker return err; 313*d57664e9SAndroid Build Coastguard Worker } 314*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 315*d57664e9SAndroid Build Coastguard Worker } 316*d57664e9SAndroid Build Coastguard Worker unmountSecureContainer(const String16 & id,const bool force)317*d57664e9SAndroid Build Coastguard Worker int32_t unmountSecureContainer(const String16& id, const bool force) 318*d57664e9SAndroid Build Coastguard Worker { 319*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 320*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 321*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 322*d57664e9SAndroid Build Coastguard Worker data.writeInt32(force ? 1 : 0); 323*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) { 324*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountSecureContainer couldn't call remote"); 325*d57664e9SAndroid Build Coastguard Worker return -1; 326*d57664e9SAndroid Build Coastguard Worker } 327*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); // What to do... 328*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 329*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountSecureContainer caught exception %d\n", err); 330*d57664e9SAndroid Build Coastguard Worker return err; 331*d57664e9SAndroid Build Coastguard Worker } 332*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 333*d57664e9SAndroid Build Coastguard Worker } 334*d57664e9SAndroid Build Coastguard Worker isSecureContainerMounted(const String16 & id)335*d57664e9SAndroid Build Coastguard Worker bool isSecureContainerMounted(const String16& id) 336*d57664e9SAndroid Build Coastguard Worker { 337*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 338*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 339*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 340*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_isSecureContainerMounted, data, &reply) != NO_ERROR) { 341*d57664e9SAndroid Build Coastguard Worker ALOGD("isSecureContainerMounted couldn't call remote"); 342*d57664e9SAndroid Build Coastguard Worker return false; 343*d57664e9SAndroid Build Coastguard Worker } 344*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); // What to do... 345*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 346*d57664e9SAndroid Build Coastguard Worker ALOGD("isSecureContainerMounted caught exception %d\n", err); 347*d57664e9SAndroid Build Coastguard Worker return false; 348*d57664e9SAndroid Build Coastguard Worker } 349*d57664e9SAndroid Build Coastguard Worker return reply.readInt32() != 0; 350*d57664e9SAndroid Build Coastguard Worker } 351*d57664e9SAndroid Build Coastguard Worker renameSecureContainer(const String16 & oldId,const String16 & newId)352*d57664e9SAndroid Build Coastguard Worker int32_t renameSecureContainer(const String16& oldId, const String16& newId) 353*d57664e9SAndroid Build Coastguard Worker { 354*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 355*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 356*d57664e9SAndroid Build Coastguard Worker data.writeString16(oldId); 357*d57664e9SAndroid Build Coastguard Worker data.writeString16(newId); 358*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_renameSecureContainer, data, &reply) != NO_ERROR) { 359*d57664e9SAndroid Build Coastguard Worker ALOGD("renameSecureContainer couldn't call remote"); 360*d57664e9SAndroid Build Coastguard Worker return -1; 361*d57664e9SAndroid Build Coastguard Worker } 362*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); // What to do... 363*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 364*d57664e9SAndroid Build Coastguard Worker ALOGD("renameSecureContainer caught exception %d\n", err); 365*d57664e9SAndroid Build Coastguard Worker return err; 366*d57664e9SAndroid Build Coastguard Worker } 367*d57664e9SAndroid Build Coastguard Worker return reply.readInt32(); 368*d57664e9SAndroid Build Coastguard Worker } 369*d57664e9SAndroid Build Coastguard Worker getSecureContainerPath(const String16 & id,String16 & path)370*d57664e9SAndroid Build Coastguard Worker bool getSecureContainerPath(const String16& id, String16& path) 371*d57664e9SAndroid Build Coastguard Worker { 372*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 373*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 374*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 375*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) { 376*d57664e9SAndroid Build Coastguard Worker ALOGD("getSecureContainerPath couldn't call remote"); 377*d57664e9SAndroid Build Coastguard Worker return false; 378*d57664e9SAndroid Build Coastguard Worker } 379*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); // What to do... 380*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 381*d57664e9SAndroid Build Coastguard Worker ALOGD("getSecureContainerPath caught exception %d\n", err); 382*d57664e9SAndroid Build Coastguard Worker return false; 383*d57664e9SAndroid Build Coastguard Worker } 384*d57664e9SAndroid Build Coastguard Worker path = reply.readString16(); 385*d57664e9SAndroid Build Coastguard Worker return true; 386*d57664e9SAndroid Build Coastguard Worker } 387*d57664e9SAndroid Build Coastguard Worker getSecureContainerList(const String16 & id,String16 * & containers)388*d57664e9SAndroid Build Coastguard Worker int32_t getSecureContainerList(const String16& id, String16*& containers) 389*d57664e9SAndroid Build Coastguard Worker { 390*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 391*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 392*d57664e9SAndroid Build Coastguard Worker data.writeString16(id); 393*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getSecureContainerList, data, &reply) != NO_ERROR) { 394*d57664e9SAndroid Build Coastguard Worker ALOGD("getSecureContainerList couldn't call remote"); 395*d57664e9SAndroid Build Coastguard Worker return -1; 396*d57664e9SAndroid Build Coastguard Worker } 397*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 398*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 399*d57664e9SAndroid Build Coastguard Worker ALOGD("getSecureContainerList caught exception %d\n", err); 400*d57664e9SAndroid Build Coastguard Worker return err; 401*d57664e9SAndroid Build Coastguard Worker } 402*d57664e9SAndroid Build Coastguard Worker const int32_t numStrings = reply.readInt32(); 403*d57664e9SAndroid Build Coastguard Worker containers = new String16[numStrings]; 404*d57664e9SAndroid Build Coastguard Worker for (int i = 0; i < numStrings; i++) { 405*d57664e9SAndroid Build Coastguard Worker containers[i] = reply.readString16(); 406*d57664e9SAndroid Build Coastguard Worker } 407*d57664e9SAndroid Build Coastguard Worker return numStrings; 408*d57664e9SAndroid Build Coastguard Worker } 409*d57664e9SAndroid Build Coastguard Worker shutdown(const sp<IMountShutdownObserver> & observer)410*d57664e9SAndroid Build Coastguard Worker void shutdown(const sp<IMountShutdownObserver>& observer) 411*d57664e9SAndroid Build Coastguard Worker { 412*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 413*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 414*d57664e9SAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(observer)); 415*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_shutdown, data, &reply) != NO_ERROR) { 416*d57664e9SAndroid Build Coastguard Worker ALOGD("shutdown could not contact remote\n"); 417*d57664e9SAndroid Build Coastguard Worker return; 418*d57664e9SAndroid Build Coastguard Worker } 419*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 420*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 421*d57664e9SAndroid Build Coastguard Worker ALOGD("shutdown caught exception %d\n", err); 422*d57664e9SAndroid Build Coastguard Worker return; 423*d57664e9SAndroid Build Coastguard Worker } 424*d57664e9SAndroid Build Coastguard Worker reply.readExceptionCode(); 425*d57664e9SAndroid Build Coastguard Worker } 426*d57664e9SAndroid Build Coastguard Worker finishMediaUpdate()427*d57664e9SAndroid Build Coastguard Worker void finishMediaUpdate() 428*d57664e9SAndroid Build Coastguard Worker { 429*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 430*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 431*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_finishMediaUpdate, data, &reply) != NO_ERROR) { 432*d57664e9SAndroid Build Coastguard Worker ALOGD("finishMediaUpdate could not contact remote\n"); 433*d57664e9SAndroid Build Coastguard Worker return; 434*d57664e9SAndroid Build Coastguard Worker } 435*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 436*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 437*d57664e9SAndroid Build Coastguard Worker ALOGD("finishMediaUpdate caught exception %d\n", err); 438*d57664e9SAndroid Build Coastguard Worker return; 439*d57664e9SAndroid Build Coastguard Worker } 440*d57664e9SAndroid Build Coastguard Worker reply.readExceptionCode(); 441*d57664e9SAndroid Build Coastguard Worker } 442*d57664e9SAndroid Build Coastguard Worker mountObb(const String16 & rawPath,const String16 & canonicalPath,const sp<IObbActionListener> & token,int32_t nonce,const sp<ObbInfo> & obbInfo)443*d57664e9SAndroid Build Coastguard Worker void mountObb(const String16& rawPath, const String16& canonicalPath, 444*d57664e9SAndroid Build Coastguard Worker const sp<IObbActionListener>& token, int32_t nonce, const sp<ObbInfo>& obbInfo) 445*d57664e9SAndroid Build Coastguard Worker { 446*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 447*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 448*d57664e9SAndroid Build Coastguard Worker data.writeString16(rawPath); 449*d57664e9SAndroid Build Coastguard Worker data.writeString16(canonicalPath); 450*d57664e9SAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(token)); 451*d57664e9SAndroid Build Coastguard Worker data.writeInt32(nonce); 452*d57664e9SAndroid Build Coastguard Worker obbInfo->writeToParcel(&data); 453*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_mountObb, data, &reply) != NO_ERROR) { 454*d57664e9SAndroid Build Coastguard Worker ALOGD("mountObb could not contact remote\n"); 455*d57664e9SAndroid Build Coastguard Worker return; 456*d57664e9SAndroid Build Coastguard Worker } 457*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 458*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 459*d57664e9SAndroid Build Coastguard Worker ALOGD("mountObb caught exception %d\n", err); 460*d57664e9SAndroid Build Coastguard Worker return; 461*d57664e9SAndroid Build Coastguard Worker } 462*d57664e9SAndroid Build Coastguard Worker } 463*d57664e9SAndroid Build Coastguard Worker unmountObb(const String16 & filename,const bool force,const sp<IObbActionListener> & token,const int32_t nonce)464*d57664e9SAndroid Build Coastguard Worker void unmountObb(const String16& filename, const bool force, 465*d57664e9SAndroid Build Coastguard Worker const sp<IObbActionListener>& token, const int32_t nonce) 466*d57664e9SAndroid Build Coastguard Worker { 467*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 468*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 469*d57664e9SAndroid Build Coastguard Worker data.writeString16(filename); 470*d57664e9SAndroid Build Coastguard Worker data.writeInt32(force ? 1 : 0); 471*d57664e9SAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(token)); 472*d57664e9SAndroid Build Coastguard Worker data.writeInt32(nonce); 473*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_unmountObb, data, &reply) != NO_ERROR) { 474*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountObb could not contact remote\n"); 475*d57664e9SAndroid Build Coastguard Worker return; 476*d57664e9SAndroid Build Coastguard Worker } 477*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 478*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 479*d57664e9SAndroid Build Coastguard Worker ALOGD("unmountObb caught exception %d\n", err); 480*d57664e9SAndroid Build Coastguard Worker return; 481*d57664e9SAndroid Build Coastguard Worker } 482*d57664e9SAndroid Build Coastguard Worker } 483*d57664e9SAndroid Build Coastguard Worker isObbMounted(const String16 & filename)484*d57664e9SAndroid Build Coastguard Worker bool isObbMounted(const String16& filename) 485*d57664e9SAndroid Build Coastguard Worker { 486*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 487*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 488*d57664e9SAndroid Build Coastguard Worker data.writeString16(filename); 489*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_isObbMounted, data, &reply) != NO_ERROR) { 490*d57664e9SAndroid Build Coastguard Worker ALOGD("isObbMounted could not contact remote\n"); 491*d57664e9SAndroid Build Coastguard Worker return false; 492*d57664e9SAndroid Build Coastguard Worker } 493*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 494*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 495*d57664e9SAndroid Build Coastguard Worker ALOGD("isObbMounted caught exception %d\n", err); 496*d57664e9SAndroid Build Coastguard Worker return false; 497*d57664e9SAndroid Build Coastguard Worker } 498*d57664e9SAndroid Build Coastguard Worker return reply.readInt32() != 0; 499*d57664e9SAndroid Build Coastguard Worker } 500*d57664e9SAndroid Build Coastguard Worker getMountedObbPath(const String16 & filename,String16 & path)501*d57664e9SAndroid Build Coastguard Worker bool getMountedObbPath(const String16& filename, String16& path) 502*d57664e9SAndroid Build Coastguard Worker { 503*d57664e9SAndroid Build Coastguard Worker Parcel data, reply; 504*d57664e9SAndroid Build Coastguard Worker data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 505*d57664e9SAndroid Build Coastguard Worker data.writeString16(filename); 506*d57664e9SAndroid Build Coastguard Worker if (remote()->transact(TRANSACTION_getMountedObbPath, data, &reply) != NO_ERROR) { 507*d57664e9SAndroid Build Coastguard Worker ALOGD("getMountedObbPath could not contact remote\n"); 508*d57664e9SAndroid Build Coastguard Worker return false; 509*d57664e9SAndroid Build Coastguard Worker } 510*d57664e9SAndroid Build Coastguard Worker int32_t err = reply.readExceptionCode(); 511*d57664e9SAndroid Build Coastguard Worker if (err < 0) { 512*d57664e9SAndroid Build Coastguard Worker ALOGD("getMountedObbPath caught exception %d\n", err); 513*d57664e9SAndroid Build Coastguard Worker return false; 514*d57664e9SAndroid Build Coastguard Worker } 515*d57664e9SAndroid Build Coastguard Worker path = reply.readString16(); 516*d57664e9SAndroid Build Coastguard Worker return true; 517*d57664e9SAndroid Build Coastguard Worker } 518*d57664e9SAndroid Build Coastguard Worker }; 519*d57664e9SAndroid Build Coastguard Worker 520*d57664e9SAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(MountService, "android.os.storage.IStorageManager") 521*d57664e9SAndroid Build Coastguard Worker 522*d57664e9SAndroid Build Coastguard Worker // ---------------------------------------------------------------------- 523*d57664e9SAndroid Build Coastguard Worker 524*d57664e9SAndroid Build Coastguard Worker } 525