xref: /aosp_15_r20/frameworks/base/libs/storage/IMountService.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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