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