1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os.storage;
18
19import android.os.Binder;
20import android.os.IBinder;
21import android.os.IInterface;
22import android.os.Parcel;
23import android.os.RemoteException;
24
25/**
26 * WARNING! Update IMountService.h and IMountService.cpp if you change this
27 * file. In particular, the ordering of the methods below must match the
28 * _TRANSACTION enum in IMountService.cpp
29 *
30 * @hide - Applications should use android.os.storage.StorageManager to access
31 *       storage functions.
32 */
33public interface IMountService extends IInterface {
34    /** Local-side IPC implementation stub class. */
35    public static abstract class Stub extends Binder implements IMountService {
36        private static class Proxy implements IMountService {
37            private final IBinder mRemote;
38
39            Proxy(IBinder remote) {
40                mRemote = remote;
41            }
42
43            public IBinder asBinder() {
44                return mRemote;
45            }
46
47            public String getInterfaceDescriptor() {
48                return DESCRIPTOR;
49            }
50
51            /**
52             * Registers an IMountServiceListener for receiving async
53             * notifications.
54             */
55            public void registerListener(IMountServiceListener listener) throws RemoteException {
56                Parcel _data = Parcel.obtain();
57                Parcel _reply = Parcel.obtain();
58                try {
59                    _data.writeInterfaceToken(DESCRIPTOR);
60                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
61                    mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0);
62                    _reply.readException();
63                } finally {
64                    _reply.recycle();
65                    _data.recycle();
66                }
67            }
68
69            /**
70             * Unregisters an IMountServiceListener
71             */
72            public void unregisterListener(IMountServiceListener listener) throws RemoteException {
73                Parcel _data = Parcel.obtain();
74                Parcel _reply = Parcel.obtain();
75                try {
76                    _data.writeInterfaceToken(DESCRIPTOR);
77                    _data.writeStrongBinder((listener != null ? listener.asBinder() : null));
78                    mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0);
79                    _reply.readException();
80                } finally {
81                    _reply.recycle();
82                    _data.recycle();
83                }
84            }
85
86            /**
87             * Returns true if a USB mass storage host is connected
88             */
89            public boolean isUsbMassStorageConnected() throws RemoteException {
90                Parcel _data = Parcel.obtain();
91                Parcel _reply = Parcel.obtain();
92                boolean _result;
93                try {
94                    _data.writeInterfaceToken(DESCRIPTOR);
95                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0);
96                    _reply.readException();
97                    _result = 0 != _reply.readInt();
98                } finally {
99                    _reply.recycle();
100                    _data.recycle();
101                }
102                return _result;
103            }
104
105            /**
106             * Enables / disables USB mass storage. The caller should check
107             * actual status of enabling/disabling USB mass storage via
108             * StorageEventListener.
109             */
110            public void setUsbMassStorageEnabled(boolean enable) throws RemoteException {
111                Parcel _data = Parcel.obtain();
112                Parcel _reply = Parcel.obtain();
113                try {
114                    _data.writeInterfaceToken(DESCRIPTOR);
115                    _data.writeInt((enable ? 1 : 0));
116                    mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0);
117                    _reply.readException();
118                } finally {
119                    _reply.recycle();
120                    _data.recycle();
121                }
122            }
123
124            /**
125             * Returns true if a USB mass storage host is enabled (media is
126             * shared)
127             */
128            public boolean isUsbMassStorageEnabled() throws RemoteException {
129                Parcel _data = Parcel.obtain();
130                Parcel _reply = Parcel.obtain();
131                boolean _result;
132                try {
133                    _data.writeInterfaceToken(DESCRIPTOR);
134                    mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0);
135                    _reply.readException();
136                    _result = 0 != _reply.readInt();
137                } finally {
138                    _reply.recycle();
139                    _data.recycle();
140                }
141                return _result;
142            }
143
144            /**
145             * Mount external storage at given mount point. Returns an int
146             * consistent with MountServiceResultCode
147             */
148            public int mountVolume(String mountPoint) throws RemoteException {
149                Parcel _data = Parcel.obtain();
150                Parcel _reply = Parcel.obtain();
151                int _result;
152                try {
153                    _data.writeInterfaceToken(DESCRIPTOR);
154                    _data.writeString(mountPoint);
155                    mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0);
156                    _reply.readException();
157                    _result = _reply.readInt();
158                } finally {
159                    _reply.recycle();
160                    _data.recycle();
161                }
162                return _result;
163            }
164
165            /**
166             * Safely unmount external storage at given mount point. The unmount
167             * is an asynchronous operation. Applications should register
168             * StorageEventListener for storage related status changes.
169             */
170            public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
171                    throws RemoteException {
172                Parcel _data = Parcel.obtain();
173                Parcel _reply = Parcel.obtain();
174                try {
175                    _data.writeInterfaceToken(DESCRIPTOR);
176                    _data.writeString(mountPoint);
177                    _data.writeInt((force ? 1 : 0));
178                    _data.writeInt((removeEncryption ? 1 : 0));
179                    mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0);
180                    _reply.readException();
181                } finally {
182                    _reply.recycle();
183                    _data.recycle();
184                }
185            }
186
187            /**
188             * Format external storage given a mount point. Returns an int
189             * consistent with MountServiceResultCode
190             */
191            public int formatVolume(String mountPoint) throws RemoteException {
192                Parcel _data = Parcel.obtain();
193                Parcel _reply = Parcel.obtain();
194                int _result;
195                try {
196                    _data.writeInterfaceToken(DESCRIPTOR);
197                    _data.writeString(mountPoint);
198                    mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0);
199                    _reply.readException();
200                    _result = _reply.readInt();
201                } finally {
202                    _reply.recycle();
203                    _data.recycle();
204                }
205                return _result;
206            }
207
208            /**
209             * Returns an array of pids with open files on the specified path.
210             */
211            public int[] getStorageUsers(String path) throws RemoteException {
212                Parcel _data = Parcel.obtain();
213                Parcel _reply = Parcel.obtain();
214                int[] _result;
215                try {
216                    _data.writeInterfaceToken(DESCRIPTOR);
217                    _data.writeString(path);
218                    mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0);
219                    _reply.readException();
220                    _result = _reply.createIntArray();
221                } finally {
222                    _reply.recycle();
223                    _data.recycle();
224                }
225                return _result;
226            }
227
228            /**
229             * Gets the state of a volume via its mountpoint.
230             */
231            public String getVolumeState(String mountPoint) throws RemoteException {
232                Parcel _data = Parcel.obtain();
233                Parcel _reply = Parcel.obtain();
234                String _result;
235                try {
236                    _data.writeInterfaceToken(DESCRIPTOR);
237                    _data.writeString(mountPoint);
238                    mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0);
239                    _reply.readException();
240                    _result = _reply.readString();
241                } finally {
242                    _reply.recycle();
243                    _data.recycle();
244                }
245                return _result;
246            }
247
248            /*
249             * Creates a secure container with the specified parameters. Returns
250             * an int consistent with MountServiceResultCode
251             */
252            public int createSecureContainer(String id, int sizeMb, String fstype, String key,
253                    int ownerUid, boolean external) throws RemoteException {
254                Parcel _data = Parcel.obtain();
255                Parcel _reply = Parcel.obtain();
256                int _result;
257                try {
258                    _data.writeInterfaceToken(DESCRIPTOR);
259                    _data.writeString(id);
260                    _data.writeInt(sizeMb);
261                    _data.writeString(fstype);
262                    _data.writeString(key);
263                    _data.writeInt(ownerUid);
264                    _data.writeInt(external ? 1 : 0);
265                    mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0);
266                    _reply.readException();
267                    _result = _reply.readInt();
268                } finally {
269                    _reply.recycle();
270                    _data.recycle();
271                }
272                return _result;
273            }
274
275            /*
276             * Destroy a secure container, and free up all resources associated
277             * with it. NOTE: Ensure all references are released prior to
278             * deleting. Returns an int consistent with MountServiceResultCode
279             */
280            public int destroySecureContainer(String id, boolean force) throws RemoteException {
281                Parcel _data = Parcel.obtain();
282                Parcel _reply = Parcel.obtain();
283                int _result;
284                try {
285                    _data.writeInterfaceToken(DESCRIPTOR);
286                    _data.writeString(id);
287                    _data.writeInt((force ? 1 : 0));
288                    mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0);
289                    _reply.readException();
290                    _result = _reply.readInt();
291                } finally {
292                    _reply.recycle();
293                    _data.recycle();
294                }
295                return _result;
296            }
297
298            /*
299             * Finalize a container which has just been created and populated.
300             * After finalization, the container is immutable. Returns an int
301             * consistent with MountServiceResultCode
302             */
303            public int finalizeSecureContainer(String id) throws RemoteException {
304                Parcel _data = Parcel.obtain();
305                Parcel _reply = Parcel.obtain();
306                int _result;
307                try {
308                    _data.writeInterfaceToken(DESCRIPTOR);
309                    _data.writeString(id);
310                    mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0);
311                    _reply.readException();
312                    _result = _reply.readInt();
313                } finally {
314                    _reply.recycle();
315                    _data.recycle();
316                }
317                return _result;
318            }
319
320            /*
321             * Mount a secure container with the specified key and owner UID.
322             * Returns an int consistent with MountServiceResultCode
323             */
324            public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
325                    throws RemoteException {
326                Parcel _data = Parcel.obtain();
327                Parcel _reply = Parcel.obtain();
328                int _result;
329                try {
330                    _data.writeInterfaceToken(DESCRIPTOR);
331                    _data.writeString(id);
332                    _data.writeString(key);
333                    _data.writeInt(ownerUid);
334                    _data.writeInt(readOnly ? 1 : 0);
335                    mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0);
336                    _reply.readException();
337                    _result = _reply.readInt();
338                } finally {
339                    _reply.recycle();
340                    _data.recycle();
341                }
342                return _result;
343            }
344
345            /*
346             * Unount a secure container. Returns an int consistent with
347             * MountServiceResultCode
348             */
349            public int unmountSecureContainer(String id, boolean force) throws RemoteException {
350                Parcel _data = Parcel.obtain();
351                Parcel _reply = Parcel.obtain();
352                int _result;
353                try {
354                    _data.writeInterfaceToken(DESCRIPTOR);
355                    _data.writeString(id);
356                    _data.writeInt((force ? 1 : 0));
357                    mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0);
358                    _reply.readException();
359                    _result = _reply.readInt();
360                } finally {
361                    _reply.recycle();
362                    _data.recycle();
363                }
364                return _result;
365            }
366
367            /*
368             * Returns true if the specified container is mounted
369             */
370            public boolean isSecureContainerMounted(String id) throws RemoteException {
371                Parcel _data = Parcel.obtain();
372                Parcel _reply = Parcel.obtain();
373                boolean _result;
374                try {
375                    _data.writeInterfaceToken(DESCRIPTOR);
376                    _data.writeString(id);
377                    mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0);
378                    _reply.readException();
379                    _result = 0 != _reply.readInt();
380                } finally {
381                    _reply.recycle();
382                    _data.recycle();
383                }
384                return _result;
385            }
386
387            /*
388             * Rename an unmounted secure container. Returns an int consistent
389             * with MountServiceResultCode
390             */
391            public int renameSecureContainer(String oldId, String newId) throws RemoteException {
392                Parcel _data = Parcel.obtain();
393                Parcel _reply = Parcel.obtain();
394                int _result;
395                try {
396                    _data.writeInterfaceToken(DESCRIPTOR);
397                    _data.writeString(oldId);
398                    _data.writeString(newId);
399                    mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0);
400                    _reply.readException();
401                    _result = _reply.readInt();
402                } finally {
403                    _reply.recycle();
404                    _data.recycle();
405                }
406                return _result;
407            }
408
409            /*
410             * Returns the filesystem path of a mounted secure container.
411             */
412            public String getSecureContainerPath(String id) throws RemoteException {
413                Parcel _data = Parcel.obtain();
414                Parcel _reply = Parcel.obtain();
415                String _result;
416                try {
417                    _data.writeInterfaceToken(DESCRIPTOR);
418                    _data.writeString(id);
419                    mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0);
420                    _reply.readException();
421                    _result = _reply.readString();
422                } finally {
423                    _reply.recycle();
424                    _data.recycle();
425                }
426                return _result;
427            }
428
429            /**
430             * Gets an Array of currently known secure container IDs
431             */
432            public String[] getSecureContainerList() throws RemoteException {
433                Parcel _data = Parcel.obtain();
434                Parcel _reply = Parcel.obtain();
435                String[] _result;
436                try {
437                    _data.writeInterfaceToken(DESCRIPTOR);
438                    mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0);
439                    _reply.readException();
440                    _result = _reply.createStringArray();
441                } finally {
442                    _reply.recycle();
443                    _data.recycle();
444                }
445                return _result;
446            }
447
448            /**
449             * Shuts down the MountService and gracefully unmounts all external
450             * media. Invokes call back once the shutdown is complete.
451             */
452            public void shutdown(IMountShutdownObserver observer)
453                    throws RemoteException {
454                Parcel _data = Parcel.obtain();
455                Parcel _reply = Parcel.obtain();
456                try {
457                    _data.writeInterfaceToken(DESCRIPTOR);
458                    _data.writeStrongBinder((observer != null ? observer.asBinder() : null));
459                    mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0);
460                    _reply.readException();
461                } finally {
462                    _reply.recycle();
463                    _data.recycle();
464                }
465            }
466
467            /**
468             * Call into MountService by PackageManager to notify that its done
469             * processing the media status update request.
470             */
471            public void finishMediaUpdate() throws RemoteException {
472                Parcel _data = Parcel.obtain();
473                Parcel _reply = Parcel.obtain();
474                try {
475                    _data.writeInterfaceToken(DESCRIPTOR);
476                    mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0);
477                    _reply.readException();
478                } finally {
479                    _reply.recycle();
480                    _data.recycle();
481                }
482            }
483
484            /**
485             * Mounts an Opaque Binary Blob (OBB) with the specified decryption
486             * key and only allows the calling process's UID access to the
487             * contents. MountService will call back to the supplied
488             * IObbActionListener to inform it of the terminal state of the
489             * call.
490             */
491            public void mountObb(String rawPath, String canonicalPath, String key,
492                    IObbActionListener token, int nonce) throws RemoteException {
493                Parcel _data = Parcel.obtain();
494                Parcel _reply = Parcel.obtain();
495                try {
496                    _data.writeInterfaceToken(DESCRIPTOR);
497                    _data.writeString(rawPath);
498                    _data.writeString(canonicalPath);
499                    _data.writeString(key);
500                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
501                    _data.writeInt(nonce);
502                    mRemote.transact(Stub.TRANSACTION_mountObb, _data, _reply, 0);
503                    _reply.readException();
504                } finally {
505                    _reply.recycle();
506                    _data.recycle();
507                }
508            }
509
510            /**
511             * Unmounts an Opaque Binary Blob (OBB). When the force flag is
512             * specified, any program using it will be forcibly killed to
513             * unmount the image. MountService will call back to the supplied
514             * IObbActionListener to inform it of the terminal state of the
515             * call.
516             */
517            public void unmountObb(
518                    String rawPath, boolean force, IObbActionListener token, int nonce)
519                    throws RemoteException {
520                Parcel _data = Parcel.obtain();
521                Parcel _reply = Parcel.obtain();
522                try {
523                    _data.writeInterfaceToken(DESCRIPTOR);
524                    _data.writeString(rawPath);
525                    _data.writeInt((force ? 1 : 0));
526                    _data.writeStrongBinder((token != null ? token.asBinder() : null));
527                    _data.writeInt(nonce);
528                    mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0);
529                    _reply.readException();
530                } finally {
531                    _reply.recycle();
532                    _data.recycle();
533                }
534            }
535
536            /**
537             * Checks whether the specified Opaque Binary Blob (OBB) is mounted
538             * somewhere.
539             */
540            public boolean isObbMounted(String rawPath) throws RemoteException {
541                Parcel _data = Parcel.obtain();
542                Parcel _reply = Parcel.obtain();
543                boolean _result;
544                try {
545                    _data.writeInterfaceToken(DESCRIPTOR);
546                    _data.writeString(rawPath);
547                    mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0);
548                    _reply.readException();
549                    _result = 0 != _reply.readInt();
550                } finally {
551                    _reply.recycle();
552                    _data.recycle();
553                }
554                return _result;
555            }
556
557            /**
558             * Gets the path to the mounted Opaque Binary Blob (OBB).
559             */
560            public String getMountedObbPath(String rawPath) throws RemoteException {
561                Parcel _data = Parcel.obtain();
562                Parcel _reply = Parcel.obtain();
563                String _result;
564                try {
565                    _data.writeInterfaceToken(DESCRIPTOR);
566                    _data.writeString(rawPath);
567                    mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0);
568                    _reply.readException();
569                    _result = _reply.readString();
570                } finally {
571                    _reply.recycle();
572                    _data.recycle();
573                }
574                return _result;
575            }
576
577            /**
578             * Returns whether the external storage is emulated.
579             */
580            public boolean isExternalStorageEmulated() throws RemoteException {
581                Parcel _data = Parcel.obtain();
582                Parcel _reply = Parcel.obtain();
583                boolean _result;
584                try {
585                    _data.writeInterfaceToken(DESCRIPTOR);
586                    mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0);
587                    _reply.readException();
588                    _result = 0 != _reply.readInt();
589                } finally {
590                    _reply.recycle();
591                    _data.recycle();
592                }
593                return _result;
594            }
595
596            public int getEncryptionState() throws RemoteException {
597                Parcel _data = Parcel.obtain();
598                Parcel _reply = Parcel.obtain();
599                int _result;
600                try {
601                    _data.writeInterfaceToken(DESCRIPTOR);
602                    mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0);
603                    _reply.readException();
604                    _result = _reply.readInt();
605                } finally {
606                    _reply.recycle();
607                    _data.recycle();
608                }
609                return _result;
610            }
611
612            public int decryptStorage(String password) throws RemoteException {
613                Parcel _data = Parcel.obtain();
614                Parcel _reply = Parcel.obtain();
615                int _result;
616                try {
617                    _data.writeInterfaceToken(DESCRIPTOR);
618                    _data.writeString(password);
619                    mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0);
620                    _reply.readException();
621                    _result = _reply.readInt();
622                } finally {
623                    _reply.recycle();
624                    _data.recycle();
625                }
626                return _result;
627            }
628
629            public int encryptStorage(int type, String password) throws RemoteException {
630                Parcel _data = Parcel.obtain();
631                Parcel _reply = Parcel.obtain();
632                int _result;
633                try {
634                    _data.writeInterfaceToken(DESCRIPTOR);
635                    _data.writeInt(type);
636                    _data.writeString(password);
637                    mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
638                    _reply.readException();
639                    _result = _reply.readInt();
640                } finally {
641                    _reply.recycle();
642                    _data.recycle();
643                }
644                return _result;
645            }
646
647            public int changeEncryptionPassword(int type, String password) throws RemoteException {
648                Parcel _data = Parcel.obtain();
649                Parcel _reply = Parcel.obtain();
650                int _result;
651                try {
652                    _data.writeInterfaceToken(DESCRIPTOR);
653                    _data.writeInt(type);
654                    _data.writeString(password);
655                    mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0);
656                    _reply.readException();
657                    _result = _reply.readInt();
658                } finally {
659                    _reply.recycle();
660                    _data.recycle();
661                }
662                return _result;
663            }
664
665            @Override
666            public int verifyEncryptionPassword(String password) throws RemoteException {
667                Parcel _data = Parcel.obtain();
668                Parcel _reply = Parcel.obtain();
669                int _result;
670                try {
671                    _data.writeInterfaceToken(DESCRIPTOR);
672                    _data.writeString(password);
673                    mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0);
674                    _reply.readException();
675                    _result = _reply.readInt();
676                } finally {
677                    _reply.recycle();
678                    _data.recycle();
679                }
680                return _result;
681            }
682
683            public int getPasswordType() throws RemoteException {
684                Parcel _data = Parcel.obtain();
685                Parcel _reply = Parcel.obtain();
686                int _result;
687                try {
688                    _data.writeInterfaceToken(DESCRIPTOR);
689                    mRemote.transact(Stub.TRANSACTION_getPasswordType, _data, _reply, 0);
690                    _reply.readException();
691                    _result = _reply.readInt();
692                } finally {
693                    _reply.recycle();
694                    _data.recycle();
695                }
696                return _result;
697            }
698
699            public String getPassword() throws RemoteException {
700                Parcel _data = Parcel.obtain();
701                Parcel _reply = Parcel.obtain();
702                String _result;
703                try {
704                    _data.writeInterfaceToken(DESCRIPTOR);
705                    mRemote.transact(Stub.TRANSACTION_getPassword, _data, _reply, 0);
706                    _reply.readException();
707                    _result = _reply.readString();
708                } finally {
709                    _reply.recycle();
710                    _data.recycle();
711                }
712                return _result;
713            }
714
715            public void clearPassword() throws RemoteException {
716                Parcel _data = Parcel.obtain();
717                Parcel _reply = Parcel.obtain();
718                try {
719                    _data.writeInterfaceToken(DESCRIPTOR);
720                    mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, IBinder.FLAG_ONEWAY);
721                    _reply.readException();
722                } finally {
723                    _reply.recycle();
724                    _data.recycle();
725                }
726            }
727
728            public void setField(String field, String data) throws RemoteException {
729                Parcel _data = Parcel.obtain();
730                Parcel _reply = Parcel.obtain();
731                try {
732                    _data.writeInterfaceToken(DESCRIPTOR);
733                    _data.writeString(field);
734                    _data.writeString(data);
735                    mRemote.transact(Stub.TRANSACTION_setField, _data, _reply, IBinder.FLAG_ONEWAY);
736                    _reply.readException();
737                } finally {
738                    _reply.recycle();
739                    _data.recycle();
740                }
741            }
742
743            public String getField(String field) throws RemoteException {
744                Parcel _data = Parcel.obtain();
745                Parcel _reply = Parcel.obtain();
746                String _result;
747                try {
748                    _data.writeInterfaceToken(DESCRIPTOR);
749                    _data.writeString(field);
750                    mRemote.transact(Stub.TRANSACTION_getField, _data, _reply, 0);
751                    _reply.readException();
752                    _result = _reply.readString();
753                } finally {
754                    _reply.recycle();
755                    _data.recycle();
756                }
757                return _result;
758            }
759
760            public StorageVolume[] getVolumeList() throws RemoteException {
761                Parcel _data = Parcel.obtain();
762                Parcel _reply = Parcel.obtain();
763                StorageVolume[] _result;
764                try {
765                    _data.writeInterfaceToken(DESCRIPTOR);
766                    mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0);
767                    _reply.readException();
768                    _result = _reply.createTypedArray(StorageVolume.CREATOR);
769                } finally {
770                    _reply.recycle();
771                    _data.recycle();
772                }
773                return _result;
774            }
775
776            /*
777             * Returns the filesystem path of a mounted secure container.
778             */
779            public String getSecureContainerFilesystemPath(String id) throws RemoteException {
780                Parcel _data = Parcel.obtain();
781                Parcel _reply = Parcel.obtain();
782                String _result;
783                try {
784                    _data.writeInterfaceToken(DESCRIPTOR);
785                    _data.writeString(id);
786                    mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0);
787                    _reply.readException();
788                    _result = _reply.readString();
789                } finally {
790                    _reply.recycle();
791                    _data.recycle();
792                }
793                return _result;
794            }
795
796            /**
797             * Fix permissions in a container which has just been created and
798             * populated. Returns an int consistent with MountServiceResultCode
799             */
800            public int fixPermissionsSecureContainer(String id, int gid, String filename)
801                    throws RemoteException {
802                Parcel _data = Parcel.obtain();
803                Parcel _reply = Parcel.obtain();
804                int _result;
805                try {
806                    _data.writeInterfaceToken(DESCRIPTOR);
807                    _data.writeString(id);
808                    _data.writeInt(gid);
809                    _data.writeString(filename);
810                    mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0);
811                    _reply.readException();
812                    _result = _reply.readInt();
813                } finally {
814                    _reply.recycle();
815                    _data.recycle();
816                }
817                return _result;
818            }
819
820            @Override
821            public int mkdirs(String callingPkg, String path) throws RemoteException {
822                Parcel _data = Parcel.obtain();
823                Parcel _reply = Parcel.obtain();
824                int _result;
825                try {
826                    _data.writeInterfaceToken(DESCRIPTOR);
827                    _data.writeString(callingPkg);
828                    _data.writeString(path);
829                    mRemote.transact(Stub.TRANSACTION_mkdirs, _data, _reply, 0);
830                    _reply.readException();
831                    _result = _reply.readInt();
832                } finally {
833                    _reply.recycle();
834                    _data.recycle();
835                }
836                return _result;
837            }
838
839            @Override
840            public int resizeSecureContainer(String id, int sizeMb, String key)
841                    throws RemoteException {
842                Parcel _data = Parcel.obtain();
843                Parcel _reply = Parcel.obtain();
844                int _result;
845                try {
846                    _data.writeInterfaceToken(DESCRIPTOR);
847                    _data.writeString(id);
848                    _data.writeInt(sizeMb);
849                    _data.writeString(key);
850                    mRemote.transact(Stub.TRANSACTION_resizeSecureContainer, _data, _reply, 0);
851                    _reply.readException();
852                    _result = _reply.readInt();
853                } finally {
854                    _reply.recycle();
855                    _data.recycle();
856                }
857                return _result;
858            }
859
860            @Override
861            public long lastMaintenance() throws RemoteException {
862                Parcel _data = Parcel.obtain();
863                Parcel _reply = Parcel.obtain();
864                long _result;
865                try {
866                    _data.writeInterfaceToken(DESCRIPTOR);
867                    mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0);
868                    _reply.readException();
869                    _result = _reply.readLong();
870                } finally {
871                    _reply.recycle();
872                    _data.recycle();
873                }
874                return _result;
875            }
876
877            @Override
878            public void runMaintenance() throws RemoteException {
879                Parcel _data = Parcel.obtain();
880                Parcel _reply = Parcel.obtain();
881                try {
882                    _data.writeInterfaceToken(DESCRIPTOR);
883                    mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0);
884                    _reply.readException();
885                } finally {
886                    _reply.recycle();
887                    _data.recycle();
888                }
889                return;
890            }
891        }
892
893        private static final String DESCRIPTOR = "IMountService";
894
895        static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0;
896
897        static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1;
898
899        static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2;
900
901        static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3;
902
903        static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4;
904
905        static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5;
906
907        static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6;
908
909        static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7;
910
911        static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8;
912
913        static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9;
914
915        static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10;
916
917        static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11;
918
919        static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12;
920
921        static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13;
922
923        static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14;
924
925        static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15;
926
927        static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16;
928
929        static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17;
930
931        static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18;
932
933        static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19;
934
935        static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20;
936
937        static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21;
938
939        static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22;
940
941        static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23;
942
943        static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24;
944
945        static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25;
946
947        static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26;
948
949        static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27;
950
951        static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28;
952
953        static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29;
954
955        static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30;
956
957        static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31;
958
959        static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32;
960
961        static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33;
962
963        static final int TRANSACTION_mkdirs = IBinder.FIRST_CALL_TRANSACTION + 34;
964
965        static final int TRANSACTION_getPasswordType = IBinder.FIRST_CALL_TRANSACTION + 35;
966
967        static final int TRANSACTION_getPassword = IBinder.FIRST_CALL_TRANSACTION + 36;
968
969        static final int TRANSACTION_clearPassword = IBinder.FIRST_CALL_TRANSACTION + 37;
970
971        static final int TRANSACTION_setField = IBinder.FIRST_CALL_TRANSACTION + 38;
972
973        static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39;
974
975        static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40;
976
977        static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41;
978
979        static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42;
980
981        /**
982         * Cast an IBinder object into an IMountService interface, generating a
983         * proxy if needed.
984         */
985        public static IMountService asInterface(IBinder obj) {
986            if (obj == null) {
987                return null;
988            }
989            IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
990            if (iin != null && iin instanceof IMountService) {
991                return (IMountService) iin;
992            }
993            return new IMountService.Stub.Proxy(obj);
994        }
995
996        /** Construct the stub at attach it to the interface. */
997        public Stub() {
998            attachInterface(this, DESCRIPTOR);
999        }
1000
1001        public IBinder asBinder() {
1002            return this;
1003        }
1004
1005        @Override
1006        public boolean onTransact(int code, Parcel data, Parcel reply,
1007                int flags) throws RemoteException {
1008            switch (code) {
1009                case INTERFACE_TRANSACTION: {
1010                    reply.writeString(DESCRIPTOR);
1011                    return true;
1012                }
1013                case TRANSACTION_registerListener: {
1014                    data.enforceInterface(DESCRIPTOR);
1015                    IMountServiceListener listener;
1016                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
1017                    registerListener(listener);
1018                    reply.writeNoException();
1019                    return true;
1020                }
1021                case TRANSACTION_unregisterListener: {
1022                    data.enforceInterface(DESCRIPTOR);
1023                    IMountServiceListener listener;
1024                    listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder());
1025                    unregisterListener(listener);
1026                    reply.writeNoException();
1027                    return true;
1028                }
1029                case TRANSACTION_isUsbMassStorageConnected: {
1030                    data.enforceInterface(DESCRIPTOR);
1031                    boolean result = isUsbMassStorageConnected();
1032                    reply.writeNoException();
1033                    reply.writeInt((result ? 1 : 0));
1034                    return true;
1035                }
1036                case TRANSACTION_setUsbMassStorageEnabled: {
1037                    data.enforceInterface(DESCRIPTOR);
1038                    boolean enable;
1039                    enable = 0 != data.readInt();
1040                    setUsbMassStorageEnabled(enable);
1041                    reply.writeNoException();
1042                    return true;
1043                }
1044                case TRANSACTION_isUsbMassStorageEnabled: {
1045                    data.enforceInterface(DESCRIPTOR);
1046                    boolean result = isUsbMassStorageEnabled();
1047                    reply.writeNoException();
1048                    reply.writeInt((result ? 1 : 0));
1049                    return true;
1050                }
1051                case TRANSACTION_mountVolume: {
1052                    data.enforceInterface(DESCRIPTOR);
1053                    String mountPoint;
1054                    mountPoint = data.readString();
1055                    int resultCode = mountVolume(mountPoint);
1056                    reply.writeNoException();
1057                    reply.writeInt(resultCode);
1058                    return true;
1059                }
1060                case TRANSACTION_unmountVolume: {
1061                    data.enforceInterface(DESCRIPTOR);
1062                    String mountPoint;
1063                    mountPoint = data.readString();
1064                    boolean force = 0 != data.readInt();
1065                    boolean removeEncrypt = 0 != data.readInt();
1066                    unmountVolume(mountPoint, force, removeEncrypt);
1067                    reply.writeNoException();
1068                    return true;
1069                }
1070                case TRANSACTION_formatVolume: {
1071                    data.enforceInterface(DESCRIPTOR);
1072                    String mountPoint;
1073                    mountPoint = data.readString();
1074                    int result = formatVolume(mountPoint);
1075                    reply.writeNoException();
1076                    reply.writeInt(result);
1077                    return true;
1078                }
1079                case TRANSACTION_getStorageUsers: {
1080                    data.enforceInterface(DESCRIPTOR);
1081                    String path;
1082                    path = data.readString();
1083                    int[] pids = getStorageUsers(path);
1084                    reply.writeNoException();
1085                    reply.writeIntArray(pids);
1086                    return true;
1087                }
1088                case TRANSACTION_getVolumeState: {
1089                    data.enforceInterface(DESCRIPTOR);
1090                    String mountPoint;
1091                    mountPoint = data.readString();
1092                    String state = getVolumeState(mountPoint);
1093                    reply.writeNoException();
1094                    reply.writeString(state);
1095                    return true;
1096                }
1097                case TRANSACTION_createSecureContainer: {
1098                    data.enforceInterface(DESCRIPTOR);
1099                    String id;
1100                    id = data.readString();
1101                    int sizeMb;
1102                    sizeMb = data.readInt();
1103                    String fstype;
1104                    fstype = data.readString();
1105                    String key;
1106                    key = data.readString();
1107                    int ownerUid;
1108                    ownerUid = data.readInt();
1109                    boolean external;
1110                    external = 0 != data.readInt();
1111                    int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid,
1112                            external);
1113                    reply.writeNoException();
1114                    reply.writeInt(resultCode);
1115                    return true;
1116                }
1117                case TRANSACTION_finalizeSecureContainer: {
1118                    data.enforceInterface(DESCRIPTOR);
1119                    String id;
1120                    id = data.readString();
1121                    int resultCode = finalizeSecureContainer(id);
1122                    reply.writeNoException();
1123                    reply.writeInt(resultCode);
1124                    return true;
1125                }
1126                case TRANSACTION_destroySecureContainer: {
1127                    data.enforceInterface(DESCRIPTOR);
1128                    String id;
1129                    id = data.readString();
1130                    boolean force;
1131                    force = 0 != data.readInt();
1132                    int resultCode = destroySecureContainer(id, force);
1133                    reply.writeNoException();
1134                    reply.writeInt(resultCode);
1135                    return true;
1136                }
1137                case TRANSACTION_mountSecureContainer: {
1138                    data.enforceInterface(DESCRIPTOR);
1139                    String id;
1140                    id = data.readString();
1141                    String key;
1142                    key = data.readString();
1143                    int ownerUid;
1144                    ownerUid = data.readInt();
1145                    boolean readOnly;
1146                    readOnly = data.readInt() != 0;
1147                    int resultCode = mountSecureContainer(id, key, ownerUid, readOnly);
1148                    reply.writeNoException();
1149                    reply.writeInt(resultCode);
1150                    return true;
1151                }
1152                case TRANSACTION_unmountSecureContainer: {
1153                    data.enforceInterface(DESCRIPTOR);
1154                    String id;
1155                    id = data.readString();
1156                    boolean force;
1157                    force = 0 != data.readInt();
1158                    int resultCode = unmountSecureContainer(id, force);
1159                    reply.writeNoException();
1160                    reply.writeInt(resultCode);
1161                    return true;
1162                }
1163                case TRANSACTION_isSecureContainerMounted: {
1164                    data.enforceInterface(DESCRIPTOR);
1165                    String id;
1166                    id = data.readString();
1167                    boolean status = isSecureContainerMounted(id);
1168                    reply.writeNoException();
1169                    reply.writeInt((status ? 1 : 0));
1170                    return true;
1171                }
1172                case TRANSACTION_renameSecureContainer: {
1173                    data.enforceInterface(DESCRIPTOR);
1174                    String oldId;
1175                    oldId = data.readString();
1176                    String newId;
1177                    newId = data.readString();
1178                    int resultCode = renameSecureContainer(oldId, newId);
1179                    reply.writeNoException();
1180                    reply.writeInt(resultCode);
1181                    return true;
1182                }
1183                case TRANSACTION_getSecureContainerPath: {
1184                    data.enforceInterface(DESCRIPTOR);
1185                    String id;
1186                    id = data.readString();
1187                    String path = getSecureContainerPath(id);
1188                    reply.writeNoException();
1189                    reply.writeString(path);
1190                    return true;
1191                }
1192                case TRANSACTION_getSecureContainerList: {
1193                    data.enforceInterface(DESCRIPTOR);
1194                    String[] ids = getSecureContainerList();
1195                    reply.writeNoException();
1196                    reply.writeStringArray(ids);
1197                    return true;
1198                }
1199                case TRANSACTION_shutdown: {
1200                    data.enforceInterface(DESCRIPTOR);
1201                    IMountShutdownObserver observer;
1202                    observer = IMountShutdownObserver.Stub.asInterface(data
1203                            .readStrongBinder());
1204                    shutdown(observer);
1205                    reply.writeNoException();
1206                    return true;
1207                }
1208                case TRANSACTION_finishMediaUpdate: {
1209                    data.enforceInterface(DESCRIPTOR);
1210                    finishMediaUpdate();
1211                    reply.writeNoException();
1212                    return true;
1213                }
1214                case TRANSACTION_mountObb: {
1215                    data.enforceInterface(DESCRIPTOR);
1216                    final String rawPath = data.readString();
1217                    final String canonicalPath = data.readString();
1218                    final String key = data.readString();
1219                    IObbActionListener observer;
1220                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1221                    int nonce;
1222                    nonce = data.readInt();
1223                    mountObb(rawPath, canonicalPath, key, observer, nonce);
1224                    reply.writeNoException();
1225                    return true;
1226                }
1227                case TRANSACTION_unmountObb: {
1228                    data.enforceInterface(DESCRIPTOR);
1229                    String filename;
1230                    filename = data.readString();
1231                    boolean force;
1232                    force = 0 != data.readInt();
1233                    IObbActionListener observer;
1234                    observer = IObbActionListener.Stub.asInterface(data.readStrongBinder());
1235                    int nonce;
1236                    nonce = data.readInt();
1237                    unmountObb(filename, force, observer, nonce);
1238                    reply.writeNoException();
1239                    return true;
1240                }
1241                case TRANSACTION_isObbMounted: {
1242                    data.enforceInterface(DESCRIPTOR);
1243                    String filename;
1244                    filename = data.readString();
1245                    boolean status = isObbMounted(filename);
1246                    reply.writeNoException();
1247                    reply.writeInt((status ? 1 : 0));
1248                    return true;
1249                }
1250                case TRANSACTION_getMountedObbPath: {
1251                    data.enforceInterface(DESCRIPTOR);
1252                    String filename;
1253                    filename = data.readString();
1254                    String mountedPath = getMountedObbPath(filename);
1255                    reply.writeNoException();
1256                    reply.writeString(mountedPath);
1257                    return true;
1258                }
1259                case TRANSACTION_isExternalStorageEmulated: {
1260                    data.enforceInterface(DESCRIPTOR);
1261                    boolean emulated = isExternalStorageEmulated();
1262                    reply.writeNoException();
1263                    reply.writeInt(emulated ? 1 : 0);
1264                    return true;
1265                }
1266                case TRANSACTION_decryptStorage: {
1267                    data.enforceInterface(DESCRIPTOR);
1268                    String password = data.readString();
1269                    int result = decryptStorage(password);
1270                    reply.writeNoException();
1271                    reply.writeInt(result);
1272                    return true;
1273                }
1274                case TRANSACTION_encryptStorage: {
1275                    data.enforceInterface(DESCRIPTOR);
1276                    int type = data.readInt();
1277                    String password = data.readString();
1278                    int result = encryptStorage(type, password);
1279                    reply.writeNoException();
1280                    reply.writeInt(result);
1281                    return true;
1282                }
1283                case TRANSACTION_changeEncryptionPassword: {
1284                    data.enforceInterface(DESCRIPTOR);
1285                    int type = data.readInt();
1286                    String password = data.readString();
1287                    int result = changeEncryptionPassword(type, password);
1288                    reply.writeNoException();
1289                    reply.writeInt(result);
1290                    return true;
1291                }
1292                case TRANSACTION_getVolumeList: {
1293                    data.enforceInterface(DESCRIPTOR);
1294                    StorageVolume[] result = getVolumeList();
1295                    reply.writeNoException();
1296                    reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
1297                    return true;
1298                }
1299                case TRANSACTION_getSecureContainerFilesystemPath: {
1300                    data.enforceInterface(DESCRIPTOR);
1301                    String id;
1302                    id = data.readString();
1303                    String path = getSecureContainerFilesystemPath(id);
1304                    reply.writeNoException();
1305                    reply.writeString(path);
1306                    return true;
1307                }
1308                case TRANSACTION_getEncryptionState: {
1309                    data.enforceInterface(DESCRIPTOR);
1310                    int result = getEncryptionState();
1311                    reply.writeNoException();
1312                    reply.writeInt(result);
1313                    return true;
1314                }
1315                case TRANSACTION_fixPermissionsSecureContainer: {
1316                    data.enforceInterface(DESCRIPTOR);
1317                    String id;
1318                    id = data.readString();
1319                    int gid;
1320                    gid = data.readInt();
1321                    String filename;
1322                    filename = data.readString();
1323                    int resultCode = fixPermissionsSecureContainer(id, gid, filename);
1324                    reply.writeNoException();
1325                    reply.writeInt(resultCode);
1326                    return true;
1327                }
1328                case TRANSACTION_mkdirs: {
1329                    data.enforceInterface(DESCRIPTOR);
1330                    String callingPkg = data.readString();
1331                    String path = data.readString();
1332                    int result = mkdirs(callingPkg, path);
1333                    reply.writeNoException();
1334                    reply.writeInt(result);
1335                    return true;
1336                }
1337                case TRANSACTION_getPasswordType: {
1338                    data.enforceInterface(DESCRIPTOR);
1339                    int result = getPasswordType();
1340                    reply.writeNoException();
1341                    reply.writeInt(result);
1342                    return true;
1343                }
1344                case TRANSACTION_getPassword: {
1345                    data.enforceInterface(DESCRIPTOR);
1346                    String result = getPassword();
1347                    reply.writeNoException();
1348                    reply.writeString(result);
1349                    return true;
1350                }
1351                case TRANSACTION_clearPassword: {
1352                    data.enforceInterface(DESCRIPTOR);
1353                    clearPassword();
1354                    reply.writeNoException();
1355                    return true;
1356                }
1357                case TRANSACTION_setField: {
1358                    data.enforceInterface(DESCRIPTOR);
1359                    String field = data.readString();
1360                    String contents = data.readString();
1361                    setField(field, contents);
1362                    reply.writeNoException();
1363                    return true;
1364                }
1365                case TRANSACTION_getField: {
1366                    data.enforceInterface(DESCRIPTOR);
1367                    String field = data.readString();
1368                    String contents = getField(field);
1369                    reply.writeNoException();
1370                    reply.writeString(contents);
1371                    return true;
1372                }
1373                case TRANSACTION_resizeSecureContainer: {
1374                    data.enforceInterface(DESCRIPTOR);
1375                    String id;
1376                    id = data.readString();
1377                    int sizeMb;
1378                    sizeMb = data.readInt();
1379                    String key;
1380                    key = data.readString();
1381                    int resultCode = resizeSecureContainer(id, sizeMb, key);
1382                    reply.writeNoException();
1383                    reply.writeInt(resultCode);
1384                    return true;
1385                }
1386                case TRANSACTION_lastMaintenance: {
1387                    data.enforceInterface(DESCRIPTOR);
1388                    long lastMaintenance = lastMaintenance();
1389                    reply.writeNoException();
1390                    reply.writeLong(lastMaintenance);
1391                    return true;
1392                }
1393                case TRANSACTION_runMaintenance: {
1394                    data.enforceInterface(DESCRIPTOR);
1395                    runMaintenance();
1396                    reply.writeNoException();
1397                    return true;
1398                }
1399            }
1400            return super.onTransact(code, data, reply, flags);
1401        }
1402    }
1403
1404    /*
1405     * Creates a secure container with the specified parameters. Returns an int
1406     * consistent with MountServiceResultCode
1407     */
1408    public int createSecureContainer(String id, int sizeMb, String fstype, String key,
1409            int ownerUid, boolean external) throws RemoteException;
1410
1411    /*
1412     * Destroy a secure container, and free up all resources associated with it.
1413     * NOTE: Ensure all references are released prior to deleting. Returns an
1414     * int consistent with MountServiceResultCode
1415     */
1416    public int destroySecureContainer(String id, boolean force) throws RemoteException;
1417
1418    /*
1419     * Finalize a container which has just been created and populated. After
1420     * finalization, the container is immutable. Returns an int consistent with
1421     * MountServiceResultCode
1422     */
1423    public int finalizeSecureContainer(String id) throws RemoteException;
1424
1425    /**
1426     * Call into MountService by PackageManager to notify that its done
1427     * processing the media status update request.
1428     */
1429    public void finishMediaUpdate() throws RemoteException;
1430
1431    /**
1432     * Format external storage given a mount point. Returns an int consistent
1433     * with MountServiceResultCode
1434     */
1435    public int formatVolume(String mountPoint) throws RemoteException;
1436
1437    /**
1438     * Gets the path to the mounted Opaque Binary Blob (OBB).
1439     */
1440    public String getMountedObbPath(String rawPath) throws RemoteException;
1441
1442    /**
1443     * Gets an Array of currently known secure container IDs
1444     */
1445    public String[] getSecureContainerList() throws RemoteException;
1446
1447    /*
1448     * Returns the filesystem path of a mounted secure container.
1449     */
1450    public String getSecureContainerPath(String id) throws RemoteException;
1451
1452    /**
1453     * Returns an array of pids with open files on the specified path.
1454     */
1455    public int[] getStorageUsers(String path) throws RemoteException;
1456
1457    /**
1458     * Gets the state of a volume via its mountpoint.
1459     */
1460    public String getVolumeState(String mountPoint) throws RemoteException;
1461
1462    /**
1463     * Checks whether the specified Opaque Binary Blob (OBB) is mounted
1464     * somewhere.
1465     */
1466    public boolean isObbMounted(String rawPath) throws RemoteException;
1467
1468    /*
1469     * Returns true if the specified container is mounted
1470     */
1471    public boolean isSecureContainerMounted(String id) throws RemoteException;
1472
1473    /**
1474     * Returns true if a USB mass storage host is connected
1475     */
1476    public boolean isUsbMassStorageConnected() throws RemoteException;
1477
1478    /**
1479     * Returns true if a USB mass storage host is enabled (media is shared)
1480     */
1481    public boolean isUsbMassStorageEnabled() throws RemoteException;
1482
1483    /**
1484     * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and
1485     * only allows the calling process's UID access to the contents.
1486     * MountService will call back to the supplied IObbActionListener to inform
1487     * it of the terminal state of the call.
1488     */
1489    public void mountObb(String rawPath, String canonicalPath, String key,
1490            IObbActionListener token, int nonce) throws RemoteException;
1491
1492    /*
1493     * Mount a secure container with the specified key and owner UID. Returns an
1494     * int consistent with MountServiceResultCode
1495     */
1496    public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly)
1497            throws RemoteException;
1498
1499    /**
1500     * Mount external storage at given mount point. Returns an int consistent
1501     * with MountServiceResultCode
1502     */
1503    public int mountVolume(String mountPoint) throws RemoteException;
1504
1505    /**
1506     * Registers an IMountServiceListener for receiving async notifications.
1507     */
1508    public void registerListener(IMountServiceListener listener) throws RemoteException;
1509
1510    /*
1511     * Rename an unmounted secure container. Returns an int consistent with
1512     * MountServiceResultCode
1513     */
1514    public int renameSecureContainer(String oldId, String newId) throws RemoteException;
1515
1516    /**
1517     * Enables / disables USB mass storage. The caller should check actual
1518     * status of enabling/disabling USB mass storage via StorageEventListener.
1519     */
1520    public void setUsbMassStorageEnabled(boolean enable) throws RemoteException;
1521
1522    /**
1523     * Shuts down the MountService and gracefully unmounts all external media.
1524     * Invokes call back once the shutdown is complete.
1525     */
1526    public void shutdown(IMountShutdownObserver observer) throws RemoteException;
1527
1528    /**
1529     * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified,
1530     * any program using it will be forcibly killed to unmount the image.
1531     * MountService will call back to the supplied IObbActionListener to inform
1532     * it of the terminal state of the call.
1533     */
1534    public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce)
1535            throws RemoteException;
1536
1537    /*
1538     * Unount a secure container. Returns an int consistent with
1539     * MountServiceResultCode
1540     */
1541    public int unmountSecureContainer(String id, boolean force) throws RemoteException;
1542
1543    /**
1544     * Safely unmount external storage at given mount point. The unmount is an
1545     * asynchronous operation. Applications should register StorageEventListener
1546     * for storage related status changes.
1547     * @param mountPoint the mount point
1548     * @param force whether or not to forcefully unmount it (e.g. even if programs are using this
1549     *     data currently)
1550     * @param removeEncryption whether or not encryption mapping should be removed from the volume.
1551     *     This value implies {@code force}.
1552     */
1553    public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption)
1554            throws RemoteException;
1555
1556    /**
1557     * Unregisters an IMountServiceListener
1558     */
1559    public void unregisterListener(IMountServiceListener listener) throws RemoteException;
1560
1561    /**
1562     * Returns whether or not the external storage is emulated.
1563     */
1564    public boolean isExternalStorageEmulated() throws RemoteException;
1565
1566    /** The volume is not encrypted. */
1567    static final int ENCRYPTION_STATE_NONE = 1;
1568    /** The volume has been encrypted succesfully. */
1569    static final int ENCRYPTION_STATE_OK = 0;
1570    /** The volume is in a bad state.*/
1571    static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
1572    /** Encryption is incomplete */
1573    static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
1574    /** Encryption is incomplete and irrecoverable */
1575    static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;
1576    /** Underlying data is corrupt */
1577    static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4;
1578
1579    /**
1580     * Determines the encryption state of the volume.
1581     * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible values.
1582     */
1583    public int getEncryptionState() throws RemoteException;
1584
1585    /**
1586     * Decrypts any encrypted volumes.
1587     */
1588    public int decryptStorage(String password) throws RemoteException;
1589
1590    /**
1591     * Encrypts storage.
1592     */
1593    public int encryptStorage(int type, String password) throws RemoteException;
1594
1595    /**
1596     * Changes the encryption password.
1597     */
1598    public int changeEncryptionPassword(int type, String password)
1599        throws RemoteException;
1600
1601    /**
1602     * Verify the encryption password against the stored volume.  This method
1603     * may only be called by the system process.
1604     */
1605    public int verifyEncryptionPassword(String password) throws RemoteException;
1606
1607    /**
1608     * Returns list of all mountable volumes.
1609     */
1610    public StorageVolume[] getVolumeList() throws RemoteException;
1611
1612    /**
1613     * Gets the path on the filesystem for the ASEC container itself.
1614     *
1615     * @param cid ASEC container ID
1616     * @return path to filesystem or {@code null} if it's not found
1617     * @throws RemoteException
1618     */
1619    public String getSecureContainerFilesystemPath(String cid) throws RemoteException;
1620
1621    /*
1622     * Fix permissions in a container which has just been created and populated.
1623     * Returns an int consistent with MountServiceResultCode
1624     */
1625    public int fixPermissionsSecureContainer(String id, int gid, String filename)
1626            throws RemoteException;
1627
1628    /**
1629     * Ensure that all directories along given path exist, creating parent
1630     * directories as needed. Validates that given path is absolute and that it
1631     * contains no relative "." or ".." paths or symlinks. Also ensures that
1632     * path belongs to a volume managed by vold, and that path is either
1633     * external storage data or OBB directory belonging to calling app.
1634     */
1635    public int mkdirs(String callingPkg, String path) throws RemoteException;
1636
1637    /**
1638     * Determines the type of the encryption password
1639     * @return PasswordType
1640     */
1641    public int getPasswordType() throws RemoteException;
1642
1643    /**
1644     * Get password from vold
1645     * @return password or empty string
1646     */
1647    public String getPassword() throws RemoteException;
1648
1649    /**
1650     * Securely clear password from vold
1651     */
1652    public void clearPassword() throws RemoteException;
1653
1654    /**
1655     * Set a field in the crypto header.
1656     * @param field field to set
1657     * @param contents contents to set in field
1658     */
1659    public void setField(String field, String contents) throws RemoteException;
1660
1661    /**
1662     * Gets a field from the crypto header.
1663     * @param field field to get
1664     * @return contents of field
1665     */
1666    public String getField(String field) throws RemoteException;
1667
1668    public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException;
1669
1670    /**
1671     * Report the time of the last maintenance operation such as fstrim.
1672     * @return Timestamp of the last maintenance operation, in the
1673     *     System.currentTimeMillis() time base
1674     * @throws RemoteException
1675     */
1676    public long lastMaintenance() throws RemoteException;
1677
1678    /**
1679     * Kick off an immediate maintenance operation
1680     * @throws RemoteException
1681     */
1682    public void runMaintenance() throws RemoteException;
1683}
1684