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 Rootpackage android.os.storage;
18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Binder;
20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IBinder;
21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IInterface;
22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Parcel;
232f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.Parcelable;
24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.RemoteException;
252f6a3885533a52758c2cd4f81f6123a712be8ae6Mike Lockwoodimport android.os.storage.StorageVolume;
26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/**
28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WARNING! Update IMountService.h and IMountService.cpp if you change this
29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * file. In particular, the ordering of the methods below must match the
30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * _TRANSACTION enum in IMountService.cpp
31f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks *
32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - Applications should use android.os.storage.StorageManager to access
33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root *       storage functions.
34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */
35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IMountService extends IInterface {
36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /** Local-side IPC implementation stub class. */
37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public static abstract class Stub extends Binder implements IMountService {
38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static class Proxy implements IMountService {
39444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            private final IBinder mRemote;
40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            Proxy(IBinder remote) {
42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                mRemote = remote;
43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public IBinder asBinder() {
46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return mRemote;
47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getInterfaceDescriptor() {
50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return DESCRIPTOR;
51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Registers an IMountServiceListener for receiving async
55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * notifications.
56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void registerListener(IMountServiceListener listener) throws RemoteException {
58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unregisters an IMountServiceListener
73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void unregisterListener(IMountServiceListener listener) throws RemoteException {
75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0);
81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is connected
90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageConnected() throws RemoteException {
92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0);
98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Enables / disables USB mass storage. The caller should check
109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * actual status of enabling/disabling USB mass storage via
110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener.
111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((enable ? 1 : 0));
118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0);
119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if a USB mass storage host is enabled (media is
128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * shared)
129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isUsbMassStorageEnabled() throws RemoteException {
131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
132be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
133be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
135be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0);
137be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
138be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
139be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
140be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
141be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
142be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
143be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
144be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
145be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
146be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
147be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount external storage at given mount point. Returns an int
148be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
149be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
150be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int mountVolume(String mountPoint) throws RemoteException {
151be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
152be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
153be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
154be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
155be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
156be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0);
158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
166be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
167be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Safely unmount external storage at given mount point. The unmount
169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * is an asynchronous operation. Applications should register
170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * StorageEventListener for storage related status changes.
171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
17213c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
17313c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    throws RemoteException {
174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
18013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    _data.writeInt((removeEncryption ? 1 : 0));
181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Format external storage given a mount point. Returns an int
191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int formatVolume(String mountPoint) throws RemoteException {
194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
198be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an array of pids with open files on the specified path.
212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int[] getStorageUsers(String path) throws RemoteException {
214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int[] _result;
217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(path);
220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0);
221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createIntArray();
223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
224be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the state of a volume via its mountpoint.
232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getVolumeState(String mountPoint) throws RemoteException {
234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(mountPoint);
240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0);
241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
247be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
248be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Creates a secure container with the specified parameters. Returns
252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * an int consistent with MountServiceResultCode
253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int createSecureContainer(String id, int sizeMb, String fstype, String key,
2556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int ownerUid, boolean external) throws RemoteException {
256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(sizeMb);
263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(fstype);
264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
2666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(external ? 1 : 0);
267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0);
268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Destroy a secure container, and free up all resources associated
279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with it. NOTE: Ensure all references are released prior to
280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * deleting. Returns an int consistent with MountServiceResultCode
281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int destroySecureContainer(String id, boolean force) throws RemoteException {
283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0);
291be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Finalize a container which has just been created and populated.
302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * After finalization, the container is immutable. Returns an int
303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * consistent with MountServiceResultCode
304be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
305be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int finalizeSecureContainer(String id) throws RemoteException {
306be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
307be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
308be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
310be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
311be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0);
313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
317be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
318be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
319be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
320be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
321be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
322be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
323be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mount a secure container with the specified key and owner UID.
324be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns an int consistent with MountServiceResultCode
325be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
326be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int mountSecureContainer(String id, String key, int ownerUid)
327be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
328be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
329be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
330be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
331be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
332be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
333be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
334be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
335be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt(ownerUid);
336be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0);
337be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
338be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
339be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
340be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
341be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
342be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
343be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
344be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
345be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
346be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
347be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unount a secure container. Returns an int consistent with
348be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * MountServiceResultCode
349be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
350be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int unmountSecureContainer(String id, boolean force) throws RemoteException {
351be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
352be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
353be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
354be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
355be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
356be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
357be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
358be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0);
359be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
360be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
361be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
362be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
363be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
364be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
365be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
366be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
367be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
368be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
369be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns true if the specified container is mounted
370be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
371be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public boolean isSecureContainerMounted(String id) throws RemoteException {
372be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
373be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
374be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
375be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
376be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
377be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
378be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0);
379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
380be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
381be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
382be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
383be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
384be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
385be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
386be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
387be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
388be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
389be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Rename an unmounted secure container. Returns an int consistent
390be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * with MountServiceResultCode
391be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
392be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public int renameSecureContainer(String oldId, String newId) throws RemoteException {
393be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
394be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
395be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int _result;
396be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
397be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
398be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(oldId);
399be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(newId);
400be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0);
401be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
402be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readInt();
403be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
404be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
405be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
406be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
407be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
408be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
409be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
410be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /*
411be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Returns the filesystem path of a mounted secure container.
412be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
413be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String getSecureContainerPath(String id) throws RemoteException {
414be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
415be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
416be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
417be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
418be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
419be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(id);
420be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0);
421be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
422be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
423be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
424be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
425be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
426be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
427be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
428be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
429be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
430be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
431be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets an Array of currently known secure container IDs
432be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
433be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public String[] getSecureContainerList() throws RemoteException {
434be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
435be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
436be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String[] _result;
437be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
438be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
439be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0);
440be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
441be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.createStringArray();
442be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
443be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
444be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
445be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
446be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
447be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
448be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
449be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
450be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Shuts down the MountService and gracefully unmounts all external
451be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * media. Invokes call back once the shutdown is complete.
452be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
453be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void shutdown(IMountShutdownObserver observer)
454be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    throws RemoteException {
455be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
456be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
457be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
458be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
459be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((observer != null ? observer.asBinder() : null));
460be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0);
461be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
462be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
463be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
464be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
465be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
466be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
467be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
468be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
469be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Call into MountService by PackageManager to notify that its done
470be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * processing the media status update request.
471be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
472be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            public void finishMediaUpdate() throws RemoteException {
473be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
474be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
475be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
476be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
477be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0);
478be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
479be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
480be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
481be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
482be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
483be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
484be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
485be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
486be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Mounts an Opaque Binary Blob (OBB) with the specified decryption
487be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * key and only allows the calling process's UID access to the
488be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * contents. MountService will call back to the supplied
489be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * IObbActionListener to inform it of the terminal state of the
490be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * call.
491be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
4924fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public void mountObb(String rawPath, String canonicalPath, String key,
4934fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    IObbActionListener token, int nonce) throws RemoteException {
494be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
495be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
496be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
497be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
4984fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
4994fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(canonicalPath);
500be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeString(key);
501be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
502af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    _data.writeInt(nonce);
503be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_mountObb, _data, _reply, 0);
504be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
505be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
506be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
507be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
508be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
509be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
510be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
511be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
512be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Unmounts an Opaque Binary Blob (OBB). When the force flag is
513be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * specified, any program using it will be forcibly killed to
514be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * unmount the image. MountService will call back to the supplied
515be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * IObbActionListener to inform it of the terminal state of the
516be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * call.
517be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5184fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public void unmountObb(
5194fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    String rawPath, boolean force, IObbActionListener token, int nonce)
5204fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    throws RemoteException {
521be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
522be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
523be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
524be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5254fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
526be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInt((force ? 1 : 0));
527be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
528af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    _data.writeInt(nonce);
529be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0);
530be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
531be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
532be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
533be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
534be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
535be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
536be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
537be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
538be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Checks whether the specified Opaque Binary Blob (OBB) is mounted
539be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * somewhere.
540be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5414fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public boolean isObbMounted(String rawPath) throws RemoteException {
542be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
543be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
544be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                boolean _result;
545be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
546be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5474fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
548be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0);
549be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
550be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = 0 != _reply.readInt();
551be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
552be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
553be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
554be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
555be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
556be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
557be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
558be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            /**
559be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             * Gets the path to the mounted Opaque Binary Blob (OBB).
560be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root             */
5614fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            public String getMountedObbPath(String rawPath) throws RemoteException {
562be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _data = Parcel.obtain();
563be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                Parcel _reply = Parcel.obtain();
564be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                String _result;
565be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                try {
566be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
5674fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    _data.writeString(rawPath);
568be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0);
569be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.readException();
570be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _result = _reply.readString();
571be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                } finally {
572be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _reply.recycle();
573be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    _data.recycle();
574be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
575be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return _result;
576be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
577e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
578e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            /**
579e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             * Returns whether the external storage is emulated.
580e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root             */
581e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            public boolean isExternalStorageEmulated() throws RemoteException {
582e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _data = Parcel.obtain();
583e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                Parcel _reply = Parcel.obtain();
584e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                boolean _result;
585e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                try {
586e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
587e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0);
588e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.readException();
589e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _result = 0 != _reply.readInt();
590e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                } finally {
591e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _reply.recycle();
592e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    _data.recycle();
593e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
594e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                return _result;
595e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root            }
5965af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
597444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            public int getEncryptionState() throws RemoteException {
598444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _data = Parcel.obtain();
599444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                Parcel _reply = Parcel.obtain();
600444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                int _result;
601444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                try {
602444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.writeInterfaceToken(DESCRIPTOR);
603444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0);
604444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.readException();
605444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _result = _reply.readInt();
606444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                } finally {
607444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _reply.recycle();
608444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    _data.recycle();
609444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
610444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                return _result;
611444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo            }
612444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
6135af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            public int decryptStorage(String password) throws RemoteException {
6145af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _data = Parcel.obtain();
6155af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                Parcel _reply = Parcel.obtain();
6165af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                int _result;
6175af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                try {
6185af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeInterfaceToken(DESCRIPTOR);
6195af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.writeString(password);
6205af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0);
6215af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.readException();
6225af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _result = _reply.readInt();
6235af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                } finally {
6245af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _reply.recycle();
6255af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    _data.recycle();
6265af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
6275af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                return _result;
6285af0b916f850486cff4797355bf9e7dc3352fe00Jason parks            }
62956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
63056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks            public int encryptStorage(String password) throws RemoteException {
63156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _data = Parcel.obtain();
63256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                Parcel _reply = Parcel.obtain();
63356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                int _result;
63456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                try {
63556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
63656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.writeString(password);
63756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
63856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.readException();
63956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _result = _reply.readInt();
64056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                } finally {
64156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _reply.recycle();
64256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    _data.recycle();
64356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
64456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                return _result;
64556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks            }
646f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
647f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks            public int changeEncryptionPassword(String password) throws RemoteException {
648f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _data = Parcel.obtain();
649f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                Parcel _reply = Parcel.obtain();
650f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                int _result;
651f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                try {
652f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeInterfaceToken(DESCRIPTOR);
653f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.writeString(password);
654f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0);
655f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.readException();
656f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _result = _reply.readInt();
657f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                } finally {
658f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _reply.recycle();
659f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    _data.recycle();
660f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
661f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                return _result;
662f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks            }
663d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
66432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            @Override
66532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            public int verifyEncryptionPassword(String password) throws RemoteException {
66632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _data = Parcel.obtain();
66732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                Parcel _reply = Parcel.obtain();
66832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                int _result;
66932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                try {
67032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeInterfaceToken(DESCRIPTOR);
67132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.writeString(password);
67232418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0);
67332418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.readException();
67432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _result = _reply.readInt();
67532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                } finally {
67632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _reply.recycle();
67732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                    _data.recycle();
67832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                }
67932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate                return _result;
68032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate            }
68132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
682b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey            public StorageVolume[] getVolumeList() throws RemoteException {
683d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _data = Parcel.obtain();
684d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                Parcel _reply = Parcel.obtain();
685b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                StorageVolume[] _result;
686d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                try {
687d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.writeInterfaceToken(DESCRIPTOR);
688d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
689d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.readException();
690b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    _result = _reply.createTypedArray(StorageVolume.CREATOR);
691d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                } finally {
692d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _reply.recycle();
693d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    _data.recycle();
694d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
695d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                return _result;
696d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood            }
697292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
698292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            /*
699292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             * Returns the filesystem path of a mounted secure container.
700292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn             */
701292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            public String getSecureContainerFilesystemPath(String id) throws RemoteException {
702292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _data = Parcel.obtain();
703292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                Parcel _reply = Parcel.obtain();
704292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                String _result;
705292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                try {
706292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeInterfaceToken(DESCRIPTOR);
707292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.writeString(id);
708292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0);
709292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.readException();
710292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _result = _reply.readString();
711292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                } finally {
712292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _reply.recycle();
713292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    _data.recycle();
714292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
715292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                return _result;
716292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn            }
7176dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7186dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            /**
7196dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * Fix permissions in a container which has just been created and
7206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             * populated. Returns an int consistent with MountServiceResultCode
7216dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root             */
7226dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            public int fixPermissionsSecureContainer(String id, int gid, String filename)
7236dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    throws RemoteException {
7246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _data = Parcel.obtain();
7256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                Parcel _reply = Parcel.obtain();
7266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                int _result;
7276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                try {
7286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInterfaceToken(DESCRIPTOR);
7296dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(id);
7306dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeInt(gid);
7316dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.writeString(filename);
7326dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0);
7336dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.readException();
7346dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _result = _reply.readInt();
7356dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                } finally {
7366dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _reply.recycle();
7376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    _data.recycle();
7386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
7396dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                return _result;
7406dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
7416dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            }
742be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
743be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
744be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        private static final String DESCRIPTOR = "IMountService";
745be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
746be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0;
747be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
748be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1;
749be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
750be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2;
751be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
752be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3;
753be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
754be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4;
755be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
756be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5;
757be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
758be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6;
759be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
760be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7;
761be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
762be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8;
763be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
764be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9;
765be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
766be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10;
767be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
768be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11;
769be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
770be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12;
771be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
772be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13;
773be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
774be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14;
775be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
776be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15;
777be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
778be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16;
779be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
780be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17;
781be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
782be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18;
783be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
784be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19;
785be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
786be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20;
787be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
788be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21;
789be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
790be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22;
791be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
792be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23;
793be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
794be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24;
795be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
796e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root        static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25;
797e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
7985af0b916f850486cff4797355bf9e7dc3352fe00Jason parks        static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26;
7995af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
80056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks        static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27;
80156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
802f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks        static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28;
803f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
804d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood        static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29;
805d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood
806292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn        static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30;
807292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
808444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo        static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31;
809444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
81032418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate        static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32;
81132418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
8126dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root        static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33;
8136dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
814be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /**
815be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * Cast an IBinder object into an IMountService interface, generating a
816be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         * proxy if needed.
817be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root         */
818be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public static IMountService asInterface(IBinder obj) {
819be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (obj == null) {
820be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return null;
821be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
822be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
823be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            if (iin != null && iin instanceof IMountService) {
824be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                return (IMountService) iin;
825be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
826be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return new IMountService.Stub.Proxy(obj);
827be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
828be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
829be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        /** Construct the stub at attach it to the interface. */
830be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public Stub() {
831be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            attachInterface(this, DESCRIPTOR);
832be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
833be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
834be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public IBinder asBinder() {
835be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return this;
836be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
837be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
838be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        @Override
839be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        public boolean onTransact(int code, Parcel data, Parcel reply,
840be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                int flags) throws RemoteException {
841be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            switch (code) {
842be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case INTERFACE_TRANSACTION: {
843be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(DESCRIPTOR);
844be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
845be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
846be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_registerListener: {
847be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
848be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
849be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
850be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    registerListener(listener);
851be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
852be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
853be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
854be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unregisterListener: {
855be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
856be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountServiceListener listener;
857be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
858be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    unregisterListener(listener);
859be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
860be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
861be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
862be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageConnected: {
863be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
864be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageConnected();
865be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
866be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
867be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
868be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
869be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_setUsbMassStorageEnabled: {
870be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
871be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean enable;
872be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    enable = 0 != data.readInt();
873be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    setUsbMassStorageEnabled(enable);
874be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
875be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
876be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
877be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isUsbMassStorageEnabled: {
878be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
879be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean result = isUsbMassStorageEnabled();
880be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
881be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((result ? 1 : 0));
882be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
883be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
884be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountVolume: {
885be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
886be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
887be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
888be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = mountVolume(mountPoint);
889be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
890be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
891be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
892be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
893be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountVolume: {
894be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
895be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
896be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
89713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean force = 0 != data.readInt();
89813c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    boolean removeEncrypt = 0 != data.readInt();
89913c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo                    unmountVolume(mountPoint, force, removeEncrypt);
900be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
901be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
902be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
903be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_formatVolume: {
904be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
905be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
906be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
907be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int result = formatVolume(mountPoint);
908be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
909be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(result);
910be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
911be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
912be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getStorageUsers: {
913be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
914be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path;
915be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    path = data.readString();
916be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int[] pids = getStorageUsers(path);
917be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
918be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeIntArray(pids);
919be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
920be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
921be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getVolumeState: {
922be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
923be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountPoint;
924be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    mountPoint = data.readString();
925be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String state = getVolumeState(mountPoint);
926be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
927be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(state);
928be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
929be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
930be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_createSecureContainer: {
931be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
932be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
933be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
934be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int sizeMb;
935be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    sizeMb = data.readInt();
936be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String fstype;
937be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    fstype = data.readString();
938be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
939be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
940be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
941be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
9426dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    boolean external;
9436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    external = 0 != data.readInt();
9446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid,
9456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                            external);
946be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
947be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
948be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
949be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
950be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finalizeSecureContainer: {
951be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
952be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
953be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
954be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = finalizeSecureContainer(id);
955be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
956be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
957be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
958be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
959be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_destroySecureContainer: {
960be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
961be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
962be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
963be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
964be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
965be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = destroySecureContainer(id, force);
966be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
967be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
968be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
969be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
970be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountSecureContainer: {
971be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
972be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
973be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
974be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String key;
975be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    key = data.readString();
976be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int ownerUid;
977be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    ownerUid = data.readInt();
978be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = mountSecureContainer(id, key, ownerUid);
979be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
980be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
981be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
982be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
983be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountSecureContainer: {
984be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
985be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
986be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
987be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
988be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
989be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = unmountSecureContainer(id, force);
990be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
991be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
992be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
993be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
994be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isSecureContainerMounted: {
995be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
996be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
997be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
998be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isSecureContainerMounted(id);
999be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1000be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
1001be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1002be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1003be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_renameSecureContainer: {
1004be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1005be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String oldId;
1006be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    oldId = data.readString();
1007be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String newId;
1008be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    newId = data.readString();
1009be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    int resultCode = renameSecureContainer(oldId, newId);
1010be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1011be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt(resultCode);
1012be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1013be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1014be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerPath: {
1015be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1016be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String id;
1017be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    id = data.readString();
1018be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String path = getSecureContainerPath(id);
1019be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1020be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(path);
1021be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1022be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1023be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getSecureContainerList: {
1024be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1025be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String[] ids = getSecureContainerList();
1026be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1027be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeStringArray(ids);
1028be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1029be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1030be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_shutdown: {
1031be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1032be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IMountShutdownObserver observer;
1033be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IMountShutdownObserver.Stub.asInterface(data
1034be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                            .readStrongBinder());
1035be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    shutdown(observer);
1036be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1037be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1038be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1039be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_finishMediaUpdate: {
1040be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1041be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    finishMediaUpdate();
1042be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1043be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1044be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1045be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_mountObb: {
1046be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
10474fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String rawPath = data.readString();
10484fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String canonicalPath = data.readString();
10494fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    final String key = data.readString();
1050be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1051be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1052af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1053af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
10544fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey                    mountObb(rawPath, canonicalPath, key, observer, nonce);
1055be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1056be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1057be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1058be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_unmountObb: {
1059be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1060be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1061be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1062be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean force;
1063be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    force = 0 != data.readInt();
1064be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    IObbActionListener observer;
1065be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1066af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    int nonce;
1067af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    nonce = data.readInt();
1068af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root                    unmountObb(filename, force, observer, nonce);
1069be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1070be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1071be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1072be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_isObbMounted: {
1073be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1074be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1075be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1076be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    boolean status = isObbMounted(filename);
1077be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1078be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeInt((status ? 1 : 0));
1079be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1080be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1081be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                case TRANSACTION_getMountedObbPath: {
1082be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    data.enforceInterface(DESCRIPTOR);
1083be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String filename;
1084be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    filename = data.readString();
1085be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    String mountedPath = getMountedObbPath(filename);
1086be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeNoException();
1087be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    reply.writeString(mountedPath);
1088be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                    return true;
1089be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root                }
1090e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                case TRANSACTION_isExternalStorageEmulated: {
1091e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    data.enforceInterface(DESCRIPTOR);
1092e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    boolean emulated = isExternalStorageEmulated();
1093e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeNoException();
1094e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    reply.writeInt(emulated ? 1 : 0);
1095e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                    return true;
1096e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root                }
10975af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                case TRANSACTION_decryptStorage: {
10985af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    data.enforceInterface(DESCRIPTOR);
10995af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    String password = data.readString();
11005af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    int result = decryptStorage(password);
11015af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeNoException();
11025af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    reply.writeInt(result);
11035af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                    return true;
11045af0b916f850486cff4797355bf9e7dc3352fe00Jason parks                }
110556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                case TRANSACTION_encryptStorage: {
110656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    data.enforceInterface(DESCRIPTOR);
110756aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    String password = data.readString();
110856aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    int result = encryptStorage(password);
110956aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeNoException();
111056aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    reply.writeInt(result);
111156aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                    return true;
111256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks                }
1113f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                case TRANSACTION_changeEncryptionPassword: {
1114f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    data.enforceInterface(DESCRIPTOR);
1115f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    String password = data.readString();
1116f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    int result = changeEncryptionPassword(password);
1117f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeNoException();
1118f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    reply.writeInt(result);
1119f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                    return true;
1120f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks                }
1121d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                case TRANSACTION_getVolumeList: {
1122d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    data.enforceInterface(DESCRIPTOR);
1123b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    StorageVolume[] result = getVolumeList();
1124d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    reply.writeNoException();
1125b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey                    reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1126d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                    return true;
1127d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood                }
1128292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                case TRANSACTION_getSecureContainerFilesystemPath: {
1129292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    data.enforceInterface(DESCRIPTOR);
1130292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String id;
1131292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    id = data.readString();
1132292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    String path = getSecureContainerFilesystemPath(id);
1133292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeNoException();
1134292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    reply.writeString(path);
1135292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                    return true;
1136292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn                }
1137444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                case TRANSACTION_getEncryptionState: {
1138444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    data.enforceInterface(DESCRIPTOR);
1139444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    int result = getEncryptionState();
1140444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeNoException();
1141444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    reply.writeInt(result);
1142444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                    return true;
1143444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo                }
11446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                case TRANSACTION_fixPermissionsSecureContainer: {
11456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    data.enforceInterface(DESCRIPTOR);
11466dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String id;
11476dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    id = data.readString();
11486dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int gid;
11496dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    gid = data.readInt();
11506dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    String filename;
11516dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    filename = data.readString();
11526dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    int resultCode = fixPermissionsSecureContainer(id, gid, filename);
11536dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeNoException();
11546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    reply.writeInt(resultCode);
11556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                    return true;
11566dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root                }
1157be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            }
1158be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            return super.onTransact(code, data, reply, flags);
1159be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root        }
1160be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    }
1161be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1162be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1163be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Creates a secure container with the specified parameters. Returns an int
1164be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * consistent with MountServiceResultCode
1165be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
11666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int createSecureContainer(String id, int sizeMb, String fstype, String key,
11676dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            int ownerUid, boolean external) throws RemoteException;
1168be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1169be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1170be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Destroy a secure container, and free up all resources associated with it.
1171be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * NOTE: Ensure all references are released prior to deleting. Returns an
1172be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1173be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1174be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int destroySecureContainer(String id, boolean force) throws RemoteException;
1175be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1176be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1177be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Finalize a container which has just been created and populated. After
1178be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * finalization, the container is immutable. Returns an int consistent with
1179be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1180be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1181be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int finalizeSecureContainer(String id) throws RemoteException;
1182be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1183be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1184be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Call into MountService by PackageManager to notify that its done
1185be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * processing the media status update request.
1186be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1187be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void finishMediaUpdate() throws RemoteException;
1188be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1189be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1190be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Format external storage given a mount point. Returns an int consistent
1191be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1192be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1193be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int formatVolume(String mountPoint) throws RemoteException;
1194be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1195be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1196be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the path to the mounted Opaque Binary Blob (OBB).
1197be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
11984fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public String getMountedObbPath(String rawPath) throws RemoteException;
1199be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1200be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1201be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets an Array of currently known secure container IDs
1202be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1203be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String[] getSecureContainerList() throws RemoteException;
1204be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1205be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1206be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns the filesystem path of a mounted secure container.
1207be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1208be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getSecureContainerPath(String id) throws RemoteException;
1209be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1210be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1211be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns an array of pids with open files on the specified path.
1212be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1213be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int[] getStorageUsers(String path) throws RemoteException;
1214be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1215be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1216be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Gets the state of a volume via its mountpoint.
1217be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1218be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public String getVolumeState(String mountPoint) throws RemoteException;
1219be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1220be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1221be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Checks whether the specified Opaque Binary Blob (OBB) is mounted
1222be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * somewhere.
1223be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
12244fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public boolean isObbMounted(String rawPath) throws RemoteException;
1225be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1226be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1227be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if the specified container is mounted
1228be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1229be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isSecureContainerMounted(String id) throws RemoteException;
1230be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1231be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1232be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is connected
1233be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1234be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageConnected() throws RemoteException;
1235be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1236be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1237be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Returns true if a USB mass storage host is enabled (media is shared)
1238be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1239be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public boolean isUsbMassStorageEnabled() throws RemoteException;
1240be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1241be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1242be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and
1243be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * only allows the calling process's UID access to the contents.
1244be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1245be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1246be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
12474fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public void mountObb(String rawPath, String canonicalPath, String key,
12484fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey            IObbActionListener token, int nonce) throws RemoteException;
1249be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1250be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1251be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount a secure container with the specified key and owner UID. Returns an
1252be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * int consistent with MountServiceResultCode
1253be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1254be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int mountSecureContainer(String id, String key, int ownerUid) throws RemoteException;
1255be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1256be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1257be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Mount external storage at given mount point. Returns an int consistent
1258be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * with MountServiceResultCode
1259be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1260be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int mountVolume(String mountPoint) throws RemoteException;
1261be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1262be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1263be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Registers an IMountServiceListener for receiving async notifications.
1264be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1265be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void registerListener(IMountServiceListener listener) throws RemoteException;
1266be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1267be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1268be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Rename an unmounted secure container. Returns an int consistent with
1269be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1270be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1271be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int renameSecureContainer(String oldId, String newId) throws RemoteException;
1272be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1273be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1274be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Enables / disables USB mass storage. The caller should check actual
1275be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * status of enabling/disabling USB mass storage via StorageEventListener.
1276be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1277be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void setUsbMassStorageEnabled(boolean enable) throws RemoteException;
1278be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1279be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1280be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Shuts down the MountService and gracefully unmounts all external media.
1281be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Invokes call back once the shutdown is complete.
1282be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1283be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void shutdown(IMountShutdownObserver observer) throws RemoteException;
1284be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1285be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1286be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified,
1287be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * any program using it will be forcibly killed to unmount the image.
1288be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountService will call back to the supplied IObbActionListener to inform
1289be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * it of the terminal state of the call.
1290be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
12914fbbda4cecb078bd3867f416b02cc75f5455284fJeff Sharkey    public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce)
1292be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root            throws RemoteException;
1293be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1294be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /*
1295be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unount a secure container. Returns an int consistent with
1296be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * MountServiceResultCode
1297be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1298be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public int unmountSecureContainer(String id, boolean force) throws RemoteException;
1299be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1300be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1301be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Safely unmount external storage at given mount point. The unmount is an
1302be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * asynchronous operation. Applications should register StorageEventListener
1303be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * for storage related status changes.
130413c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param mountPoint the mount point
130513c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
130613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     data currently)
130713c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     * @param removeEncryption whether or not encryption mapping should be removed from the volume.
130813c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo     *     This value implies {@code force}.
1309be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
131013c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo    public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
131113c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo            throws RemoteException;
1312be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root
1313be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    /**
1314be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     * Unregisters an IMountServiceListener
1315be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root     */
1316be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root    public void unregisterListener(IMountServiceListener listener) throws RemoteException;
1317e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root
1318e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    /**
1319e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     * Returns whether or not the external storage is emulated.
1320e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root     */
1321e1ff214e32ed5c546a7603b07b054908c4d93312Kenny Root    public boolean isExternalStorageEmulated() throws RemoteException;
13225af0b916f850486cff4797355bf9e7dc3352fe00Jason parks
1323444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is not encrypted. */
1324444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_NONE = 1;
1325444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume has been encrypted succesfully. */
1326444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_OK = 0;
1327444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is in a bad state. */
1328444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
1329444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /** The volume is in a bad state - partially encrypted. Data is likely irrecoverable. */
1330444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
1331444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
1332444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    /**
1333444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * Determines the encryption state of the volume.
1334444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible values.
1335444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo     */
1336444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo    public int getEncryptionState() throws RemoteException;
1337444eca232964dbf27d0c4d01447c1493f89186e0Ben Komalo
13385af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    /**
13395af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     * Decrypts any encrypted volumes.
13405af0b916f850486cff4797355bf9e7dc3352fe00Jason parks     */
13415af0b916f850486cff4797355bf9e7dc3352fe00Jason parks    public int decryptStorage(String password) throws RemoteException;
134256aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks
134356aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks    /**
134456aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     * Encrypts storage.
134556aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks     */
134656aa5321fe6f00fa3662e6f46a4b2559aa34f63eJason parks    public int encryptStorage(String password) throws RemoteException;
1347f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1348f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks    /**
1349f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     * Changes the encryption password.
1350f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks     */
1351f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks    public int changeEncryptionPassword(String password) throws RemoteException;
1352f7b3cd4efd40b7631f36ea014407a850f7dc637eJason parks
1353d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood    /**
135432418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * Verify the encryption password against the stored volume.  This method
135532418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     * may only be called by the system process.
135632418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate     */
135732418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    public int verifyEncryptionPassword(String password) throws RemoteException;
135832418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate
135932418be49e5b61c2e9281528cb8fb67939e301e8Christopher Tate    /**
1360d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     * Returns list of all mountable volumes.
1361d967f4664f40f9a4c5262a44b19df9bbdf457d8aMike Lockwood     */
1362b049e212ab7fe8967893c202efcb30fecfdb82fbJeff Sharkey    public StorageVolume[] getVolumeList() throws RemoteException;
1363292f8bc9d1b790ab975a87a842c7fabc908b97e0Dianne Hackborn
136451a573c76737733638c475f52e441c814e6645ccKenny Root    /**
136551a573c76737733638c475f52e441c814e6645ccKenny Root     * Gets the path on the filesystem for the ASEC container itself.
136651a573c76737733638c475f52e441c814e6645ccKenny Root     *
136751a573c76737733638c475f52e441c814e6645ccKenny Root     * @param cid ASEC container ID
136851a573c76737733638c475f52e441c814e6645ccKenny Root     * @return path to filesystem or {@code null} if it's not found
136951a573c76737733638c475f52e441c814e6645ccKenny Root     * @throws RemoteException
137051a573c76737733638c475f52e441c814e6645ccKenny Root     */
137151a573c76737733638c475f52e441c814e6645ccKenny Root    public String getSecureContainerFilesystemPath(String cid) throws RemoteException;
13726dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root
13736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    /*
13746dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Fix permissions in a container which has just been created and populated.
13756dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     * Returns an int consistent with MountServiceResultCode
13766dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root     */
13776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root    public int fixPermissionsSecureContainer(String id, int gid, String filename)
13786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root            throws RemoteException;
1379be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root}
1380