IMountService.cpp revision 4a99ed897796bec95039496a66ed1be066b6294c
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,
50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root};
51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootclass BpMountService: public BpInterface<IMountService>
53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root{
54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic:
55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    BpMountService(const sp<IBinder>& impl)
56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        : BpInterface<IMountService>(impl)
57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    virtual void registerListener(const sp<IMountServiceListener>& listener)
61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeStrongBinder(listener->asBinder());
65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_registerListener, data, &reply) != NO_ERROR) {
66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("registerListener could not contact remote\n");
67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("registerListener caught exception %d\n", err);
72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    virtual void unregisterListener(const sp<IMountServiceListener>& listener)
77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeStrongBinder(listener->asBinder());
81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_unregisterListener, data, &reply) != NO_ERROR) {
82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unregisterListener could not contact remote\n");
83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unregisterListener caught exception %d\n", err);
88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    virtual bool isUsbMassStorageConnected()
93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_isUsbMassStorageConnected, data, &reply) != NO_ERROR) {
97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isUsbMassStorageConnected could not contact remote\n");
98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isUsbMassStorageConnected caught exception %d\n", err);
103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32() != 0;
106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    virtual void setUsbMassStorageEnabled(const bool enable)
109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(enable != 0);
113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_setUsbMassStorageEnabled, data, &reply) != NO_ERROR) {
114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("setUsbMassStorageEnabled could not contact remote\n");
115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("setUsbMassStorageEnabled caught exception %d\n", err);
120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    virtual bool isUsbMassStorageEnabled()
125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_isUsbMassStorageEnabled, data, &reply) != NO_ERROR) {
129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isUsbMassStorageEnabled could not contact remote\n");
130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isUsbMassStorageEnabled caught exception %d\n", err);
135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32() != 0;
138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t mountVolume(const String16& mountPoint)
141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(mountPoint);
145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_mountVolume, data, &reply) != NO_ERROR) {
146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountVolume could not contact remote\n");
147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountVolume caught exception %d\n", err);
152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t unmountVolume(const String16& mountPoint, const bool force)
158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(mountPoint);
162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(force ? 1 : 0);
163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_unmountVolume, data, &reply) != NO_ERROR) {
164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountVolume could not contact remote\n");
165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountVolume caught exception %d\n", err);
170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t formatVolume(const String16& mountPoint)
176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(mountPoint);
180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_formatVolume, data, &reply) != NO_ERROR) {
181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("formatVolume could not contact remote\n");
182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("formatVolume caught exception %d\n", err);
187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t getStorageUsers(const String16& mountPoint, int32_t** users)
193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(mountPoint);
197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getStorageUsers, data, &reply) != NO_ERROR) {
198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getStorageUsers could not contact remote\n");
199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getStorageUsers caught exception %d\n", err);
204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        const int32_t numUsers = reply.readInt32();
207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        *users = (int32_t*)malloc(sizeof(int32_t)*numUsers);
208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        for (int i = 0; i < numUsers; i++) {
209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            **users++ = reply.readInt32();
210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return numUsers;
212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t getVolumeState(const String16& mountPoint)
215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(mountPoint);
219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getVolumeState, data, &reply) != NO_ERROR) {
220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getVolumeState could not contact remote\n");
221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getVolumeState caught exception %d\n", err);
226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t createSecureContainer(const String16& id, const int32_t sizeMb, const String16& fstype,
232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            const String16& key, const int32_t ownerUid)
233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(sizeMb);
238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(fstype);
239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(key);
240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(ownerUid);
241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_createSecureContainer, data, &reply) != NO_ERROR) {
242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("createSecureContainer could not contact remote\n");
243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("createSecureContainer caught exception %d\n", err);
248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t finalizeSecureContainer(const String16& id)
254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_finalizeSecureContainer, data, &reply) != NO_ERROR) {
259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("finalizeSecureContainer couldn't call remote\n");
260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("finalizeSecureContainer caught exception %d\n", err);
265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
266be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t destroySecureContainer(const String16& id)
271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_destroySecureContainer, data, &reply) != NO_ERROR) {
276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("destroySecureContainer couldn't call remote");
277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("destroySecureContainer caught exception %d\n", err);
282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t mountSecureContainer(const String16& id, const String16& key, const int32_t ownerUid)
288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(key);
293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(ownerUid);
294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_mountSecureContainer, data, &reply) != NO_ERROR) {
295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountSecureContainer couldn't call remote");
296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode(); // What to do...
299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountSecureContainer caught exception %d\n", err);
301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
304be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
305be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
306be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t unmountSecureContainer(const String16& id, const bool force)
307be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
308be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
310be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(force ? 1 : 0);
312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) {
313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountSecureContainer couldn't call remote");
314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode(); // What to do...
317be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
318be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountSecureContainer caught exception %d\n", err);
319be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
320be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
321be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
322be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
323be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
324be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    bool isSecureContainerMounted(const String16& id)
325be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
326be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
327be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
328be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
329be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_isSecureContainerMounted, data, &reply) != NO_ERROR) {
330be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isSecureContainerMounted couldn't call remote");
331be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
332be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
333be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode(); // What to do...
334be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
335be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isSecureContainerMounted caught exception %d\n", err);
336be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
337be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
338be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32() != 0;
339be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
340be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
341be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t renameSecureContainer(const String16& oldId, const String16& newId)
342be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
343be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
344be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
345be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(oldId);
346be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(newId);
347be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_renameSecureContainer, data, &reply) != NO_ERROR) {
348be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("renameSecureContainer couldn't call remote");
349be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
350be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
351be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode(); // What to do...
352be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
353be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("renameSecureContainer caught exception %d\n", err);
354be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
355be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
356be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32();
357be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
358be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
359be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    bool getSecureContainerPath(const String16& id, String16& path)
360be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
361be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
362be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
363be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
364be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getSecureContainerPath, data, &reply) != NO_ERROR) {
365be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getSecureContainerPath couldn't call remote");
366be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
367be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
368be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode(); // What to do...
369be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
370be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getSecureContainerPath caught exception %d\n", err);
371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
372be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
373be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        path = reply.readString16();
374be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return true;
375be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
376be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
377be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    int32_t getSecureContainerList(const String16& id, String16*& containers)
378be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
380be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
381be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(id);
382be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getSecureContainerList, data, &reply) != NO_ERROR) {
383be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getSecureContainerList couldn't call remote");
384be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return -1;
385be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
386be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
387be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
388be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getSecureContainerList caught exception %d\n", err);
389be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return err;
390be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
391be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        const int32_t numStrings = reply.readInt32();
392be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        containers = new String16[numStrings];
393be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        for (int i = 0; i < numStrings; i++) {
394be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            containers[i] = reply.readString16();
395be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
396be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return numStrings;
397be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
398be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    void shutdown(const sp<IMountShutdownObserver>& observer)
400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
401be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeStrongBinder(observer->asBinder());
404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_shutdown, data, &reply) != NO_ERROR) {
405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("shutdown could not contact remote\n");
406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
408be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
409be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("shutdown caught exception %d\n", err);
411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        reply.readExceptionCode();
414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
416be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    void finishMediaUpdate()
417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
418be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_finishMediaUpdate, data, &reply) != NO_ERROR) {
421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("finishMediaUpdate could not contact remote\n");
422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
423be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("finishMediaUpdate caught exception %d\n", err);
427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        reply.readExceptionCode();
430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
43205105f7abe02b2dff91d6260b3628c8b97816babKenny Root    void mountObb(const String16& filename, const String16& key,
433af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root            const sp<IObbActionListener>& token, int32_t nonce)
434be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(filename);
438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(key);
439be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeStrongBinder(token->asBinder());
440af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root        data.writeInt32(nonce);
441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_mountObb, data, &reply) != NO_ERROR) {
442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountObb could not contact remote\n");
443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
445be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
446be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("mountObb caught exception %d\n", err);
448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
450be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
451be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
4524a99ed897796bec95039496a66ed1be066b6294cKenny Root    void unmountObb(const String16& filename, const bool force,
4534a99ed897796bec95039496a66ed1be066b6294cKenny Root            const sp<IObbActionListener>& token, const int32_t nonce)
454be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
456be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(filename);
458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInt32(force ? 1 : 0);
4594a99ed897796bec95039496a66ed1be066b6294cKenny Root        data.writeStrongBinder(token->asBinder());
4604a99ed897796bec95039496a66ed1be066b6294cKenny Root        data.writeInt32(nonce);
461be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_unmountObb, data, &reply) != NO_ERROR) {
462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountObb could not contact remote\n");
463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
466be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
467be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("unmountObb caught exception %d\n", err);
468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return;
469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    bool isObbMounted(const String16& filename)
473be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
474be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
476be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(filename);
477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_isObbMounted, data, &reply) != NO_ERROR) {
478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isObbMounted could not contact remote\n");
479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
481be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("isObbMounted caught exception %d\n", err);
484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return reply.readInt32() != 0;
487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
489be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    bool getMountedObbPath(const String16& filename, String16& path)
490be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    {
491be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        Parcel data, reply;
492be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeInterfaceToken(IMountService::getInterfaceDescriptor());
493be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        data.writeString16(filename);
494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (remote()->transact(TRANSACTION_getMountedObbPath, data, &reply) != NO_ERROR) {
495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getMountedObbPath could not contact remote\n");
496be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
497be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
498be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        int32_t err = reply.readExceptionCode();
499be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        if (err < 0) {
500be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            LOGD("getMountedObbPath caught exception %d\n", err);
501be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return false;
502be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
503be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        path = reply.readString16();
504be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        return true;
505be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
506be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root};
507be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
508be857d42849eaaa554d4772dbba7755f8a0f3547Kenny RootIMPLEMENT_META_INTERFACE(MountService, "IMountService");
509be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
510be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root// ----------------------------------------------------------------------
511be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
512be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root};
513