1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/* 2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright (C) 2010 The Android Open Source Project 3be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 4be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * you may not use this file except in compliance with the License. 6be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * You may obtain a copy of the License at 7be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 8be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 9be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 10be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Unless required by applicable law or agreed to in writing, software 11be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * See the License for the specific language governing permissions and 14be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * limitations under the License. 15be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 16be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 17be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#define LOG_TAG "IMountService" 18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <storage/IMountService.h> 20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root#include <binder/Parcel.h> 21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootnamespace android { 23be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootenum { 25be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_registerListener = IBinder::FIRST_CALL_TRANSACTION, 26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_unregisterListener, 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_isUsbMassStorageConnected, 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_setUsbMassStorageEnabled, 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_isUsbMassStorageEnabled, 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_mountVolume, 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_unmountVolume, 32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_formatVolume, 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_getStorageUsers, 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_getVolumeState, 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_createSecureContainer, 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_finalizeSecureContainer, 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_destroySecureContainer, 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_mountSecureContainer, 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_unmountSecureContainer, 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_isSecureContainerMounted, 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_renameSecureContainer, 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_getSecureContainerPath, 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_getSecureContainerList, 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_shutdown, 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_finishMediaUpdate, 46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_mountObb, 47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_unmountObb, 48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_isObbMounted, 49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root TRANSACTION_getMountedObbPath, 50e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root TRANSACTION_isExternalStorageEmulated, 515af0b916f850486cff4797355bf9e7dc3352fe00Jason parks TRANSACTION_decryptStorage, 52d6332552761fcce700adb465ff540d30a671403cJason parks TRANSACTION_encryptStorage, 53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root}; 54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootclass BpMountService: public BpInterface<IMountService> 56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root{ 57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic: 58c6baf563ba6aa207a48317c177b29f1d2b70cf3dChih-Hung Hsieh explicit BpMountService(const sp<IBinder>& impl) 59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root : BpInterface<IMountService>(impl) 60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root virtual void registerListener(const sp<IMountServiceListener>& listener) 64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 67dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_registerListener, data, &reply) != NO_ERROR) { 695baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("registerListener could not contact remote\n"); 70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 745baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("registerListener caught exception %d\n", err); 75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root virtual void unregisterListener(const sp<IMountServiceListener>& listener) 80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 83dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen data.writeStrongBinder(IInterface::asBinder(listener)); 84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_unregisterListener, data, &reply) != NO_ERROR) { 855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unregisterListener could not contact remote\n"); 86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unregisterListener caught exception %d\n", err); 91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root virtual bool isUsbMassStorageConnected() 96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_isUsbMassStorageConnected, data, &reply) != NO_ERROR) { 1005baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isUsbMassStorageConnected could not contact remote\n"); 101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1055baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isUsbMassStorageConnected caught exception %d\n", err); 106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32() != 0; 109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root virtual void setUsbMassStorageEnabled(const bool enable) 112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(enable != 0); 116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_setUsbMassStorageEnabled, data, &reply) != NO_ERROR) { 1175baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("setUsbMassStorageEnabled could not contact remote\n"); 118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1225baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("setUsbMassStorageEnabled caught exception %d\n", err); 123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root virtual bool isUsbMassStorageEnabled() 128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_isUsbMassStorageEnabled, data, &reply) != NO_ERROR) { 1325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isUsbMassStorageEnabled could not contact remote\n"); 133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1375baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isUsbMassStorageEnabled caught exception %d\n", err); 138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32() != 0; 141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t mountVolume(const String16& mountPoint) 144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(mountPoint); 148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_mountVolume, data, &reply) != NO_ERROR) { 1495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountVolume could not contact remote\n"); 150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1545baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountVolume caught exception %d\n", err); 155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 16013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo int32_t unmountVolume(const String16& mountPoint, const bool force, const bool removeEncryption) 161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(mountPoint); 165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(force ? 1 : 0); 16613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo data.writeInt32(removeEncryption ? 1 : 0); 167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_unmountVolume, data, &reply) != NO_ERROR) { 1685baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountVolume could not contact remote\n"); 169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1735baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountVolume caught exception %d\n", err); 174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t formatVolume(const String16& mountPoint) 180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(mountPoint); 184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_formatVolume, data, &reply) != NO_ERROR) { 1855baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("formatVolume could not contact remote\n"); 186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 1905baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("formatVolume caught exception %d\n", err); 191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t getStorageUsers(const String16& mountPoint, int32_t** users) 197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(mountPoint); 201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getStorageUsers, data, &reply) != NO_ERROR) { 2025baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getStorageUsers could not contact remote\n"); 203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 2075baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getStorageUsers caught exception %d\n", err); 208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 2102b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe int32_t numUsersI = reply.readInt32(); 2112b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe uint32_t numUsers; 2122b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe if (numUsersI < 0) { 2132b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe ALOGW("Number of users is negative: %d\n", numUsersI); 2142b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe numUsers = 0; 2152b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe } else { 2162b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe numUsers = static_cast<uint32_t>(numUsersI); 2172b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe } 218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *users = (int32_t*)malloc(sizeof(int32_t)*numUsers); 2192b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe for (size_t i = 0; i < numUsers; i++) { 220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root **users++ = reply.readInt32(); 221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 2222b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe return static_cast<int32_t>(numUsers); 223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t getVolumeState(const String16& mountPoint) 226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(mountPoint); 230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getVolumeState, data, &reply) != NO_ERROR) { 2315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getVolumeState could not contact remote\n"); 232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 2365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getVolumeState caught exception %d\n", err); 237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t createSecureContainer(const String16& id, const int32_t sizeMb, const String16& fstype, 243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root const String16& key, const int32_t ownerUid) 244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(sizeMb); 249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(fstype); 250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(key); 251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(ownerUid); 252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_createSecureContainer, data, &reply) != NO_ERROR) { 2535baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("createSecureContainer could not contact remote\n"); 254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 2585baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("createSecureContainer caught exception %d\n", err); 259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t finalizeSecureContainer(const String16& id) 265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 266be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_finalizeSecureContainer, data, &reply) != NO_ERROR) { 2705baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("finalizeSecureContainer couldn't call remote\n"); 271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 2755baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("finalizeSecureContainer caught exception %d\n", err); 276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t destroySecureContainer(const String16& id) 282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_destroySecureContainer, data, &reply) != NO_ERROR) { 2875baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("destroySecureContainer couldn't call remote"); 288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 2925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("destroySecureContainer caught exception %d\n", err); 293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t mountSecureContainer(const String16& id, const String16& key, const int32_t ownerUid) 299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(key); 304be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(ownerUid); 305941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey // Assume read-only 306941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey data.writeInt32(1); 307be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_mountSecureContainer, data, &reply) != NO_ERROR) { 3085baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountSecureContainer couldn't call remote"); 309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 310be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); // What to do... 312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 3135baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountSecureContainer caught exception %d\n", err); 314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 317be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 318be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 319be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t unmountSecureContainer(const String16& id, const bool force) 320be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 321be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 322be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 323be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 324be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(force ? 1 : 0); 325be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) { 3265baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountSecureContainer couldn't call remote"); 327be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 328be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 329be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); // What to do... 330be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 3315baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountSecureContainer caught exception %d\n", err); 332be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 333be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 334be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 335be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 336be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 337be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root bool isSecureContainerMounted(const String16& id) 338be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 339be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 340be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 341be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 342be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_isSecureContainerMounted, data, &reply) != NO_ERROR) { 3435baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isSecureContainerMounted couldn't call remote"); 344be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 345be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 346be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); // What to do... 347be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 3485baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isSecureContainerMounted caught exception %d\n", err); 349be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 350be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 351be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32() != 0; 352be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 353be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 354be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t renameSecureContainer(const String16& oldId, const String16& newId) 355be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 356be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 357be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 358be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(oldId); 359be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(newId); 360be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_renameSecureContainer, data, &reply) != NO_ERROR) { 3615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("renameSecureContainer couldn't call remote"); 362be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 363be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 364be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); // What to do... 365be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 3665baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("renameSecureContainer caught exception %d\n", err); 367be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 368be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 369be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32(); 370be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 372be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root bool getSecureContainerPath(const String16& id, String16& path) 373be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 374be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 375be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 376be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 377be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) { 3785baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getSecureContainerPath couldn't call remote"); 379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 380be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 381be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); // What to do... 382be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 3835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getSecureContainerPath caught exception %d\n", err); 384be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 385be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 386be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root path = reply.readString16(); 387be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 388be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 389be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 390be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t getSecureContainerList(const String16& id, String16*& containers) 391be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 392be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 393be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 394be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(id); 395be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getSecureContainerList, data, &reply) != NO_ERROR) { 3965baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getSecureContainerList couldn't call remote"); 397be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return -1; 398be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4015baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getSecureContainerList caught exception %d\n", err); 402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return err; 403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root const int32_t numStrings = reply.readInt32(); 405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root containers = new String16[numStrings]; 406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root for (int i = 0; i < numStrings; i++) { 407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root containers[i] = reply.readString16(); 408be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 409be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return numStrings; 410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root void shutdown(const sp<IMountShutdownObserver>& observer) 413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 416dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen data.writeStrongBinder(IInterface::asBinder(observer)); 417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_shutdown, data, &reply) != NO_ERROR) { 4185baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("shutdown could not contact remote\n"); 419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4235baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("shutdown caught exception %d\n", err); 424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.readExceptionCode(); 427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root void finishMediaUpdate() 430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 432be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 433be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_finishMediaUpdate, data, &reply) != NO_ERROR) { 4345baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("finishMediaUpdate could not contact remote\n"); 435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4395baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("finishMediaUpdate caught exception %d\n", err); 440be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.readExceptionCode(); 443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 4454fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey void mountObb(const String16& rawPath, const String16& canonicalPath, const String16& key, 446af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root const sp<IObbActionListener>& token, int32_t nonce) 447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 4504fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey data.writeString16(rawPath); 4514fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey data.writeString16(canonicalPath); 452be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(key); 453dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen data.writeStrongBinder(IInterface::asBinder(token)); 454af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root data.writeInt32(nonce); 455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_mountObb, data, &reply) != NO_ERROR) { 4565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountObb could not contact remote\n"); 457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 459be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 460be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4615baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("mountObb caught exception %d\n", err); 462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 4664a99ed897796bec95039496a66ed1be066b6294cKenny Root void unmountObb(const String16& filename, const bool force, 4674a99ed897796bec95039496a66ed1be066b6294cKenny Root const sp<IObbActionListener>& token, const int32_t nonce) 468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(filename); 472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInt32(force ? 1 : 0); 473dce97407dcf54ae9725c2d29224f6ed8dfd994b8Marco Nelissen data.writeStrongBinder(IInterface::asBinder(token)); 4744a99ed897796bec95039496a66ed1be066b6294cKenny Root data.writeInt32(nonce); 475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_unmountObb, data, &reply) != NO_ERROR) { 4765baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountObb could not contact remote\n"); 477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4815baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("unmountObb caught exception %d\n", err); 482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return; 483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root bool isObbMounted(const String16& filename) 487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 489be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 490be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(filename); 491be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_isObbMounted, data, &reply) != NO_ERROR) { 4925baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isObbMounted could not contact remote\n"); 493be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 496be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 4975baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("isObbMounted caught exception %d\n", err); 498be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 499be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 500be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return reply.readInt32() != 0; 501be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 502be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 503be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root bool getMountedObbPath(const String16& filename, String16& path) 504be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root { 505be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel data, reply; 506be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 507be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.writeString16(filename); 508be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (remote()->transact(TRANSACTION_getMountedObbPath, data, &reply) != NO_ERROR) { 5095baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getMountedObbPath could not contact remote\n"); 510be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 511be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 512be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int32_t err = reply.readExceptionCode(); 513be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (err < 0) { 5145baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("getMountedObbPath caught exception %d\n", err); 515be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return false; 516be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 517be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root path = reply.readString16(); 518be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 519be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 520d6332552761fcce700adb465ff540d30a671403cJason parks 5215af0b916f850486cff4797355bf9e7dc3352fe00Jason parks int32_t decryptStorage(const String16& password) 5225af0b916f850486cff4797355bf9e7dc3352fe00Jason parks { 5235af0b916f850486cff4797355bf9e7dc3352fe00Jason parks Parcel data, reply; 5245af0b916f850486cff4797355bf9e7dc3352fe00Jason parks data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 5255af0b916f850486cff4797355bf9e7dc3352fe00Jason parks data.writeString16(password); 5265af0b916f850486cff4797355bf9e7dc3352fe00Jason parks if (remote()->transact(TRANSACTION_decryptStorage, data, &reply) != NO_ERROR) { 5275baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("decryptStorage could not contact remote\n"); 5285af0b916f850486cff4797355bf9e7dc3352fe00Jason parks return -1; 5295af0b916f850486cff4797355bf9e7dc3352fe00Jason parks } 5305af0b916f850486cff4797355bf9e7dc3352fe00Jason parks int32_t err = reply.readExceptionCode(); 5315af0b916f850486cff4797355bf9e7dc3352fe00Jason parks if (err < 0) { 5325baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("decryptStorage caught exception %d\n", err); 5335af0b916f850486cff4797355bf9e7dc3352fe00Jason parks return err; 5345af0b916f850486cff4797355bf9e7dc3352fe00Jason parks } 5355af0b916f850486cff4797355bf9e7dc3352fe00Jason parks return reply.readInt32(); 5365af0b916f850486cff4797355bf9e7dc3352fe00Jason parks } 537d6332552761fcce700adb465ff540d30a671403cJason parks 538d6332552761fcce700adb465ff540d30a671403cJason parks int32_t encryptStorage(const String16& password) 539d6332552761fcce700adb465ff540d30a671403cJason parks { 540d6332552761fcce700adb465ff540d30a671403cJason parks Parcel data, reply; 541d6332552761fcce700adb465ff540d30a671403cJason parks data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); 542d6332552761fcce700adb465ff540d30a671403cJason parks data.writeString16(password); 543d6332552761fcce700adb465ff540d30a671403cJason parks if (remote()->transact(TRANSACTION_encryptStorage, data, &reply) != NO_ERROR) { 5445baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("encryptStorage could not contact remote\n"); 545d6332552761fcce700adb465ff540d30a671403cJason parks return -1; 546d6332552761fcce700adb465ff540d30a671403cJason parks } 547d6332552761fcce700adb465ff540d30a671403cJason parks int32_t err = reply.readExceptionCode(); 548d6332552761fcce700adb465ff540d30a671403cJason parks if (err < 0) { 5495baa3a62a97544669fba6d65a11c07f252e654ddSteve Block ALOGD("encryptStorage caught exception %d\n", err); 550d6332552761fcce700adb465ff540d30a671403cJason parks return err; 551d6332552761fcce700adb465ff540d30a671403cJason parks } 552d6332552761fcce700adb465ff540d30a671403cJason parks return reply.readInt32(); 553d6332552761fcce700adb465ff540d30a671403cJason parks } 554be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root}; 555be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 5562250d56a0b47b93016018340c8f4040325aa5611Sudheer ShankaIMPLEMENT_META_INTERFACE(MountService, "android.os.storage.IStorageManager") 557be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 558be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root// ---------------------------------------------------------------------- 559be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 5602b3a8cd808a4013f43c881eca64a870ff0ea735bAndreas Gampe} 561