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