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 17 package android.os.storage; 18 19 import android.content.pm.IPackageMoveObserver; 20 import android.os.Binder; 21 import android.os.IBinder; 22 import android.os.IInterface; 23 import android.os.Parcel; 24 import android.os.RemoteException; 25 26 /** 27 * WARNING! Update IMountService.h and IMountService.cpp if you change this 28 * file. In particular, the ordering of the methods below must match the 29 * _TRANSACTION enum in IMountService.cpp 30 * 31 * @hide - Applications should use android.os.storage.StorageManager to access 32 * storage functions. 33 */ 34 public interface IMountService extends IInterface { 35 /** Local-side IPC implementation stub class. */ 36 public static abstract class Stub extends Binder implements IMountService { 37 private static class Proxy implements IMountService { 38 private final IBinder mRemote; 39 40 Proxy(IBinder remote) { 41 mRemote = remote; 42 } 43 44 public IBinder asBinder() { 45 return mRemote; 46 } 47 48 public String getInterfaceDescriptor() { 49 return DESCRIPTOR; 50 } 51 52 /** 53 * Registers an IMountServiceListener for receiving async 54 * notifications. 55 */ 56 public void registerListener(IMountServiceListener listener) throws RemoteException { 57 Parcel _data = Parcel.obtain(); 58 Parcel _reply = Parcel.obtain(); 59 try { 60 _data.writeInterfaceToken(DESCRIPTOR); 61 _data.writeStrongBinder((listener != null ? listener.asBinder() : null)); 62 mRemote.transact(Stub.TRANSACTION_registerListener, _data, _reply, 0); 63 _reply.readException(); 64 } finally { 65 _reply.recycle(); 66 _data.recycle(); 67 } 68 } 69 70 /** 71 * Unregisters an IMountServiceListener 72 */ 73 public void unregisterListener(IMountServiceListener listener) throws RemoteException { 74 Parcel _data = Parcel.obtain(); 75 Parcel _reply = Parcel.obtain(); 76 try { 77 _data.writeInterfaceToken(DESCRIPTOR); 78 _data.writeStrongBinder((listener != null ? listener.asBinder() : null)); 79 mRemote.transact(Stub.TRANSACTION_unregisterListener, _data, _reply, 0); 80 _reply.readException(); 81 } finally { 82 _reply.recycle(); 83 _data.recycle(); 84 } 85 } 86 87 /** 88 * Returns true if a USB mass storage host is connected 89 */ 90 public boolean isUsbMassStorageConnected() throws RemoteException { 91 Parcel _data = Parcel.obtain(); 92 Parcel _reply = Parcel.obtain(); 93 boolean _result; 94 try { 95 _data.writeInterfaceToken(DESCRIPTOR); 96 mRemote.transact(Stub.TRANSACTION_isUsbMassStorageConnected, _data, _reply, 0); 97 _reply.readException(); 98 _result = 0 != _reply.readInt(); 99 } finally { 100 _reply.recycle(); 101 _data.recycle(); 102 } 103 return _result; 104 } 105 106 /** 107 * Enables / disables USB mass storage. The caller should check 108 * actual status of enabling/disabling USB mass storage via 109 * StorageEventListener. 110 */ 111 public void setUsbMassStorageEnabled(boolean enable) throws RemoteException { 112 Parcel _data = Parcel.obtain(); 113 Parcel _reply = Parcel.obtain(); 114 try { 115 _data.writeInterfaceToken(DESCRIPTOR); 116 _data.writeInt((enable ? 1 : 0)); 117 mRemote.transact(Stub.TRANSACTION_setUsbMassStorageEnabled, _data, _reply, 0); 118 _reply.readException(); 119 } finally { 120 _reply.recycle(); 121 _data.recycle(); 122 } 123 } 124 125 /** 126 * Returns true if a USB mass storage host is enabled (media is 127 * shared) 128 */ 129 public boolean isUsbMassStorageEnabled() throws RemoteException { 130 Parcel _data = Parcel.obtain(); 131 Parcel _reply = Parcel.obtain(); 132 boolean _result; 133 try { 134 _data.writeInterfaceToken(DESCRIPTOR); 135 mRemote.transact(Stub.TRANSACTION_isUsbMassStorageEnabled, _data, _reply, 0); 136 _reply.readException(); 137 _result = 0 != _reply.readInt(); 138 } finally { 139 _reply.recycle(); 140 _data.recycle(); 141 } 142 return _result; 143 } 144 145 /** 146 * Mount external storage at given mount point. Returns an int 147 * consistent with MountServiceResultCode 148 */ 149 public int mountVolume(String mountPoint) throws RemoteException { 150 Parcel _data = Parcel.obtain(); 151 Parcel _reply = Parcel.obtain(); 152 int _result; 153 try { 154 _data.writeInterfaceToken(DESCRIPTOR); 155 _data.writeString(mountPoint); 156 mRemote.transact(Stub.TRANSACTION_mountVolume, _data, _reply, 0); 157 _reply.readException(); 158 _result = _reply.readInt(); 159 } finally { 160 _reply.recycle(); 161 _data.recycle(); 162 } 163 return _result; 164 } 165 166 /** 167 * Safely unmount external storage at given mount point. The unmount 168 * is an asynchronous operation. Applications should register 169 * StorageEventListener for storage related status changes. 170 */ 171 public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption) 172 throws RemoteException { 173 Parcel _data = Parcel.obtain(); 174 Parcel _reply = Parcel.obtain(); 175 try { 176 _data.writeInterfaceToken(DESCRIPTOR); 177 _data.writeString(mountPoint); 178 _data.writeInt((force ? 1 : 0)); 179 _data.writeInt((removeEncryption ? 1 : 0)); 180 mRemote.transact(Stub.TRANSACTION_unmountVolume, _data, _reply, 0); 181 _reply.readException(); 182 } finally { 183 _reply.recycle(); 184 _data.recycle(); 185 } 186 } 187 188 /** 189 * Format external storage given a mount point. Returns an int 190 * consistent with MountServiceResultCode 191 */ 192 public int formatVolume(String mountPoint) throws RemoteException { 193 Parcel _data = Parcel.obtain(); 194 Parcel _reply = Parcel.obtain(); 195 int _result; 196 try { 197 _data.writeInterfaceToken(DESCRIPTOR); 198 _data.writeString(mountPoint); 199 mRemote.transact(Stub.TRANSACTION_formatVolume, _data, _reply, 0); 200 _reply.readException(); 201 _result = _reply.readInt(); 202 } finally { 203 _reply.recycle(); 204 _data.recycle(); 205 } 206 return _result; 207 } 208 209 /** 210 * Returns an array of pids with open files on the specified path. 211 */ 212 public int[] getStorageUsers(String path) throws RemoteException { 213 Parcel _data = Parcel.obtain(); 214 Parcel _reply = Parcel.obtain(); 215 int[] _result; 216 try { 217 _data.writeInterfaceToken(DESCRIPTOR); 218 _data.writeString(path); 219 mRemote.transact(Stub.TRANSACTION_getStorageUsers, _data, _reply, 0); 220 _reply.readException(); 221 _result = _reply.createIntArray(); 222 } finally { 223 _reply.recycle(); 224 _data.recycle(); 225 } 226 return _result; 227 } 228 229 /** 230 * Gets the state of a volume via its mountpoint. 231 */ 232 public String getVolumeState(String mountPoint) throws RemoteException { 233 Parcel _data = Parcel.obtain(); 234 Parcel _reply = Parcel.obtain(); 235 String _result; 236 try { 237 _data.writeInterfaceToken(DESCRIPTOR); 238 _data.writeString(mountPoint); 239 mRemote.transact(Stub.TRANSACTION_getVolumeState, _data, _reply, 0); 240 _reply.readException(); 241 _result = _reply.readString(); 242 } finally { 243 _reply.recycle(); 244 _data.recycle(); 245 } 246 return _result; 247 } 248 249 /* 250 * Creates a secure container with the specified parameters. Returns 251 * an int consistent with MountServiceResultCode 252 */ 253 public int createSecureContainer(String id, int sizeMb, String fstype, String key, 254 int ownerUid, boolean external) throws RemoteException { 255 Parcel _data = Parcel.obtain(); 256 Parcel _reply = Parcel.obtain(); 257 int _result; 258 try { 259 _data.writeInterfaceToken(DESCRIPTOR); 260 _data.writeString(id); 261 _data.writeInt(sizeMb); 262 _data.writeString(fstype); 263 _data.writeString(key); 264 _data.writeInt(ownerUid); 265 _data.writeInt(external ? 1 : 0); 266 mRemote.transact(Stub.TRANSACTION_createSecureContainer, _data, _reply, 0); 267 _reply.readException(); 268 _result = _reply.readInt(); 269 } finally { 270 _reply.recycle(); 271 _data.recycle(); 272 } 273 return _result; 274 } 275 276 /* 277 * Destroy a secure container, and free up all resources associated 278 * with it. NOTE: Ensure all references are released prior to 279 * deleting. Returns an int consistent with MountServiceResultCode 280 */ 281 public int destroySecureContainer(String id, boolean force) throws RemoteException { 282 Parcel _data = Parcel.obtain(); 283 Parcel _reply = Parcel.obtain(); 284 int _result; 285 try { 286 _data.writeInterfaceToken(DESCRIPTOR); 287 _data.writeString(id); 288 _data.writeInt((force ? 1 : 0)); 289 mRemote.transact(Stub.TRANSACTION_destroySecureContainer, _data, _reply, 0); 290 _reply.readException(); 291 _result = _reply.readInt(); 292 } finally { 293 _reply.recycle(); 294 _data.recycle(); 295 } 296 return _result; 297 } 298 299 /* 300 * Finalize a container which has just been created and populated. 301 * After finalization, the container is immutable. Returns an int 302 * consistent with MountServiceResultCode 303 */ 304 public int finalizeSecureContainer(String id) throws RemoteException { 305 Parcel _data = Parcel.obtain(); 306 Parcel _reply = Parcel.obtain(); 307 int _result; 308 try { 309 _data.writeInterfaceToken(DESCRIPTOR); 310 _data.writeString(id); 311 mRemote.transact(Stub.TRANSACTION_finalizeSecureContainer, _data, _reply, 0); 312 _reply.readException(); 313 _result = _reply.readInt(); 314 } finally { 315 _reply.recycle(); 316 _data.recycle(); 317 } 318 return _result; 319 } 320 321 /* 322 * Mount a secure container with the specified key and owner UID. 323 * Returns an int consistent with MountServiceResultCode 324 */ 325 public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly) 326 throws RemoteException { 327 Parcel _data = Parcel.obtain(); 328 Parcel _reply = Parcel.obtain(); 329 int _result; 330 try { 331 _data.writeInterfaceToken(DESCRIPTOR); 332 _data.writeString(id); 333 _data.writeString(key); 334 _data.writeInt(ownerUid); 335 _data.writeInt(readOnly ? 1 : 0); 336 mRemote.transact(Stub.TRANSACTION_mountSecureContainer, _data, _reply, 0); 337 _reply.readException(); 338 _result = _reply.readInt(); 339 } finally { 340 _reply.recycle(); 341 _data.recycle(); 342 } 343 return _result; 344 } 345 346 /* 347 * Unount a secure container. Returns an int consistent with 348 * MountServiceResultCode 349 */ 350 public int unmountSecureContainer(String id, boolean force) throws RemoteException { 351 Parcel _data = Parcel.obtain(); 352 Parcel _reply = Parcel.obtain(); 353 int _result; 354 try { 355 _data.writeInterfaceToken(DESCRIPTOR); 356 _data.writeString(id); 357 _data.writeInt((force ? 1 : 0)); 358 mRemote.transact(Stub.TRANSACTION_unmountSecureContainer, _data, _reply, 0); 359 _reply.readException(); 360 _result = _reply.readInt(); 361 } finally { 362 _reply.recycle(); 363 _data.recycle(); 364 } 365 return _result; 366 } 367 368 /* 369 * Returns true if the specified container is mounted 370 */ 371 public boolean isSecureContainerMounted(String id) throws RemoteException { 372 Parcel _data = Parcel.obtain(); 373 Parcel _reply = Parcel.obtain(); 374 boolean _result; 375 try { 376 _data.writeInterfaceToken(DESCRIPTOR); 377 _data.writeString(id); 378 mRemote.transact(Stub.TRANSACTION_isSecureContainerMounted, _data, _reply, 0); 379 _reply.readException(); 380 _result = 0 != _reply.readInt(); 381 } finally { 382 _reply.recycle(); 383 _data.recycle(); 384 } 385 return _result; 386 } 387 388 /* 389 * Rename an unmounted secure container. Returns an int consistent 390 * with MountServiceResultCode 391 */ 392 public int renameSecureContainer(String oldId, String newId) throws RemoteException { 393 Parcel _data = Parcel.obtain(); 394 Parcel _reply = Parcel.obtain(); 395 int _result; 396 try { 397 _data.writeInterfaceToken(DESCRIPTOR); 398 _data.writeString(oldId); 399 _data.writeString(newId); 400 mRemote.transact(Stub.TRANSACTION_renameSecureContainer, _data, _reply, 0); 401 _reply.readException(); 402 _result = _reply.readInt(); 403 } finally { 404 _reply.recycle(); 405 _data.recycle(); 406 } 407 return _result; 408 } 409 410 /* 411 * Returns the filesystem path of a mounted secure container. 412 */ 413 public String getSecureContainerPath(String id) throws RemoteException { 414 Parcel _data = Parcel.obtain(); 415 Parcel _reply = Parcel.obtain(); 416 String _result; 417 try { 418 _data.writeInterfaceToken(DESCRIPTOR); 419 _data.writeString(id); 420 mRemote.transact(Stub.TRANSACTION_getSecureContainerPath, _data, _reply, 0); 421 _reply.readException(); 422 _result = _reply.readString(); 423 } finally { 424 _reply.recycle(); 425 _data.recycle(); 426 } 427 return _result; 428 } 429 430 /** 431 * Gets an Array of currently known secure container IDs 432 */ 433 public String[] getSecureContainerList() throws RemoteException { 434 Parcel _data = Parcel.obtain(); 435 Parcel _reply = Parcel.obtain(); 436 String[] _result; 437 try { 438 _data.writeInterfaceToken(DESCRIPTOR); 439 mRemote.transact(Stub.TRANSACTION_getSecureContainerList, _data, _reply, 0); 440 _reply.readException(); 441 _result = _reply.createStringArray(); 442 } finally { 443 _reply.recycle(); 444 _data.recycle(); 445 } 446 return _result; 447 } 448 449 /** 450 * Shuts down the MountService and gracefully unmounts all external 451 * media. Invokes call back once the shutdown is complete. 452 */ 453 public void shutdown(IMountShutdownObserver observer) 454 throws RemoteException { 455 Parcel _data = Parcel.obtain(); 456 Parcel _reply = Parcel.obtain(); 457 try { 458 _data.writeInterfaceToken(DESCRIPTOR); 459 _data.writeStrongBinder((observer != null ? observer.asBinder() : null)); 460 mRemote.transact(Stub.TRANSACTION_shutdown, _data, _reply, 0); 461 _reply.readException(); 462 } finally { 463 _reply.recycle(); 464 _data.recycle(); 465 } 466 } 467 468 /** 469 * Call into MountService by PackageManager to notify that its done 470 * processing the media status update request. 471 */ 472 public void finishMediaUpdate() throws RemoteException { 473 Parcel _data = Parcel.obtain(); 474 Parcel _reply = Parcel.obtain(); 475 try { 476 _data.writeInterfaceToken(DESCRIPTOR); 477 mRemote.transact(Stub.TRANSACTION_finishMediaUpdate, _data, _reply, 0); 478 _reply.readException(); 479 } finally { 480 _reply.recycle(); 481 _data.recycle(); 482 } 483 } 484 485 /** 486 * Mounts an Opaque Binary Blob (OBB) with the specified decryption 487 * key and only allows the calling process's UID access to the 488 * contents. MountService will call back to the supplied 489 * IObbActionListener to inform it of the terminal state of the 490 * call. 491 */ 492 public void mountObb(String rawPath, String canonicalPath, String key, 493 IObbActionListener token, int nonce) throws RemoteException { 494 Parcel _data = Parcel.obtain(); 495 Parcel _reply = Parcel.obtain(); 496 try { 497 _data.writeInterfaceToken(DESCRIPTOR); 498 _data.writeString(rawPath); 499 _data.writeString(canonicalPath); 500 _data.writeString(key); 501 _data.writeStrongBinder((token != null ? token.asBinder() : null)); 502 _data.writeInt(nonce); 503 mRemote.transact(Stub.TRANSACTION_mountObb, _data, _reply, 0); 504 _reply.readException(); 505 } finally { 506 _reply.recycle(); 507 _data.recycle(); 508 } 509 } 510 511 /** 512 * Unmounts an Opaque Binary Blob (OBB). When the force flag is 513 * specified, any program using it will be forcibly killed to 514 * unmount the image. MountService will call back to the supplied 515 * IObbActionListener to inform it of the terminal state of the 516 * call. 517 */ 518 public void unmountObb( 519 String rawPath, boolean force, IObbActionListener token, int nonce) 520 throws RemoteException { 521 Parcel _data = Parcel.obtain(); 522 Parcel _reply = Parcel.obtain(); 523 try { 524 _data.writeInterfaceToken(DESCRIPTOR); 525 _data.writeString(rawPath); 526 _data.writeInt((force ? 1 : 0)); 527 _data.writeStrongBinder((token != null ? token.asBinder() : null)); 528 _data.writeInt(nonce); 529 mRemote.transact(Stub.TRANSACTION_unmountObb, _data, _reply, 0); 530 _reply.readException(); 531 } finally { 532 _reply.recycle(); 533 _data.recycle(); 534 } 535 } 536 537 /** 538 * Checks whether the specified Opaque Binary Blob (OBB) is mounted 539 * somewhere. 540 */ 541 public boolean isObbMounted(String rawPath) throws RemoteException { 542 Parcel _data = Parcel.obtain(); 543 Parcel _reply = Parcel.obtain(); 544 boolean _result; 545 try { 546 _data.writeInterfaceToken(DESCRIPTOR); 547 _data.writeString(rawPath); 548 mRemote.transact(Stub.TRANSACTION_isObbMounted, _data, _reply, 0); 549 _reply.readException(); 550 _result = 0 != _reply.readInt(); 551 } finally { 552 _reply.recycle(); 553 _data.recycle(); 554 } 555 return _result; 556 } 557 558 /** 559 * Gets the path to the mounted Opaque Binary Blob (OBB). 560 */ 561 public String getMountedObbPath(String rawPath) throws RemoteException { 562 Parcel _data = Parcel.obtain(); 563 Parcel _reply = Parcel.obtain(); 564 String _result; 565 try { 566 _data.writeInterfaceToken(DESCRIPTOR); 567 _data.writeString(rawPath); 568 mRemote.transact(Stub.TRANSACTION_getMountedObbPath, _data, _reply, 0); 569 _reply.readException(); 570 _result = _reply.readString(); 571 } finally { 572 _reply.recycle(); 573 _data.recycle(); 574 } 575 return _result; 576 } 577 578 /** 579 * Returns whether the external storage is emulated. 580 */ 581 public boolean isExternalStorageEmulated() throws RemoteException { 582 Parcel _data = Parcel.obtain(); 583 Parcel _reply = Parcel.obtain(); 584 boolean _result; 585 try { 586 _data.writeInterfaceToken(DESCRIPTOR); 587 mRemote.transact(Stub.TRANSACTION_isExternalStorageEmulated, _data, _reply, 0); 588 _reply.readException(); 589 _result = 0 != _reply.readInt(); 590 } finally { 591 _reply.recycle(); 592 _data.recycle(); 593 } 594 return _result; 595 } 596 597 public int getEncryptionState() throws RemoteException { 598 Parcel _data = Parcel.obtain(); 599 Parcel _reply = Parcel.obtain(); 600 int _result; 601 try { 602 _data.writeInterfaceToken(DESCRIPTOR); 603 mRemote.transact(Stub.TRANSACTION_getEncryptionState, _data, _reply, 0); 604 _reply.readException(); 605 _result = _reply.readInt(); 606 } finally { 607 _reply.recycle(); 608 _data.recycle(); 609 } 610 return _result; 611 } 612 613 public int decryptStorage(String password) throws RemoteException { 614 Parcel _data = Parcel.obtain(); 615 Parcel _reply = Parcel.obtain(); 616 int _result; 617 try { 618 _data.writeInterfaceToken(DESCRIPTOR); 619 _data.writeString(password); 620 mRemote.transact(Stub.TRANSACTION_decryptStorage, _data, _reply, 0); 621 _reply.readException(); 622 _result = _reply.readInt(); 623 } finally { 624 _reply.recycle(); 625 _data.recycle(); 626 } 627 return _result; 628 } 629 630 public int encryptStorage(int type, String password) throws RemoteException { 631 Parcel _data = Parcel.obtain(); 632 Parcel _reply = Parcel.obtain(); 633 int _result; 634 try { 635 _data.writeInterfaceToken(DESCRIPTOR); 636 _data.writeInt(type); 637 _data.writeString(password); 638 mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0); 639 _reply.readException(); 640 _result = _reply.readInt(); 641 } finally { 642 _reply.recycle(); 643 _data.recycle(); 644 } 645 return _result; 646 } 647 648 public int changeEncryptionPassword(int type, String password) throws RemoteException { 649 Parcel _data = Parcel.obtain(); 650 Parcel _reply = Parcel.obtain(); 651 int _result; 652 try { 653 _data.writeInterfaceToken(DESCRIPTOR); 654 _data.writeInt(type); 655 _data.writeString(password); 656 mRemote.transact(Stub.TRANSACTION_changeEncryptionPassword, _data, _reply, 0); 657 _reply.readException(); 658 _result = _reply.readInt(); 659 } finally { 660 _reply.recycle(); 661 _data.recycle(); 662 } 663 return _result; 664 } 665 666 @Override 667 public int verifyEncryptionPassword(String password) throws RemoteException { 668 Parcel _data = Parcel.obtain(); 669 Parcel _reply = Parcel.obtain(); 670 int _result; 671 try { 672 _data.writeInterfaceToken(DESCRIPTOR); 673 _data.writeString(password); 674 mRemote.transact(Stub.TRANSACTION_verifyEncryptionPassword, _data, _reply, 0); 675 _reply.readException(); 676 _result = _reply.readInt(); 677 } finally { 678 _reply.recycle(); 679 _data.recycle(); 680 } 681 return _result; 682 } 683 684 public int getPasswordType() throws RemoteException { 685 Parcel _data = Parcel.obtain(); 686 Parcel _reply = Parcel.obtain(); 687 int _result; 688 try { 689 _data.writeInterfaceToken(DESCRIPTOR); 690 mRemote.transact(Stub.TRANSACTION_getPasswordType, _data, _reply, 0); 691 _reply.readException(); 692 _result = _reply.readInt(); 693 } finally { 694 _reply.recycle(); 695 _data.recycle(); 696 } 697 return _result; 698 } 699 700 public String getPassword() throws RemoteException { 701 Parcel _data = Parcel.obtain(); 702 Parcel _reply = Parcel.obtain(); 703 String _result; 704 try { 705 _data.writeInterfaceToken(DESCRIPTOR); 706 mRemote.transact(Stub.TRANSACTION_getPassword, _data, _reply, 0); 707 _reply.readException(); 708 _result = _reply.readString(); 709 } finally { 710 _reply.recycle(); 711 _data.recycle(); 712 } 713 return _result; 714 } 715 716 public void clearPassword() throws RemoteException { 717 Parcel _data = Parcel.obtain(); 718 Parcel _reply = Parcel.obtain(); 719 try { 720 _data.writeInterfaceToken(DESCRIPTOR); 721 mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, IBinder.FLAG_ONEWAY); 722 _reply.readException(); 723 } finally { 724 _reply.recycle(); 725 _data.recycle(); 726 } 727 } 728 729 public void setField(String field, String data) throws RemoteException { 730 Parcel _data = Parcel.obtain(); 731 Parcel _reply = Parcel.obtain(); 732 try { 733 _data.writeInterfaceToken(DESCRIPTOR); 734 _data.writeString(field); 735 _data.writeString(data); 736 mRemote.transact(Stub.TRANSACTION_setField, _data, _reply, IBinder.FLAG_ONEWAY); 737 _reply.readException(); 738 } finally { 739 _reply.recycle(); 740 _data.recycle(); 741 } 742 } 743 744 public String getField(String field) throws RemoteException { 745 Parcel _data = Parcel.obtain(); 746 Parcel _reply = Parcel.obtain(); 747 String _result; 748 try { 749 _data.writeInterfaceToken(DESCRIPTOR); 750 _data.writeString(field); 751 mRemote.transact(Stub.TRANSACTION_getField, _data, _reply, 0); 752 _reply.readException(); 753 _result = _reply.readString(); 754 } finally { 755 _reply.recycle(); 756 _data.recycle(); 757 } 758 return _result; 759 } 760 761 public StorageVolume[] getVolumeList(int uid, String packageName, int flags) 762 throws RemoteException { 763 Parcel _data = Parcel.obtain(); 764 Parcel _reply = Parcel.obtain(); 765 StorageVolume[] _result; 766 try { 767 _data.writeInterfaceToken(DESCRIPTOR); 768 _data.writeInt(uid); 769 _data.writeString(packageName); 770 _data.writeInt(flags); 771 mRemote.transact(Stub.TRANSACTION_getVolumeList, _data, _reply, 0); 772 _reply.readException(); 773 _result = _reply.createTypedArray(StorageVolume.CREATOR); 774 } finally { 775 _reply.recycle(); 776 _data.recycle(); 777 } 778 return _result; 779 } 780 781 /* 782 * Returns the filesystem path of a mounted secure container. 783 */ 784 public String getSecureContainerFilesystemPath(String id) throws RemoteException { 785 Parcel _data = Parcel.obtain(); 786 Parcel _reply = Parcel.obtain(); 787 String _result; 788 try { 789 _data.writeInterfaceToken(DESCRIPTOR); 790 _data.writeString(id); 791 mRemote.transact(Stub.TRANSACTION_getSecureContainerFilesystemPath, _data, _reply, 0); 792 _reply.readException(); 793 _result = _reply.readString(); 794 } finally { 795 _reply.recycle(); 796 _data.recycle(); 797 } 798 return _result; 799 } 800 801 /** 802 * Fix permissions in a container which has just been created and 803 * populated. Returns an int consistent with MountServiceResultCode 804 */ 805 public int fixPermissionsSecureContainer(String id, int gid, String filename) 806 throws RemoteException { 807 Parcel _data = Parcel.obtain(); 808 Parcel _reply = Parcel.obtain(); 809 int _result; 810 try { 811 _data.writeInterfaceToken(DESCRIPTOR); 812 _data.writeString(id); 813 _data.writeInt(gid); 814 _data.writeString(filename); 815 mRemote.transact(Stub.TRANSACTION_fixPermissionsSecureContainer, _data, _reply, 0); 816 _reply.readException(); 817 _result = _reply.readInt(); 818 } finally { 819 _reply.recycle(); 820 _data.recycle(); 821 } 822 return _result; 823 } 824 825 @Override 826 public int mkdirs(String callingPkg, String path) throws RemoteException { 827 Parcel _data = Parcel.obtain(); 828 Parcel _reply = Parcel.obtain(); 829 int _result; 830 try { 831 _data.writeInterfaceToken(DESCRIPTOR); 832 _data.writeString(callingPkg); 833 _data.writeString(path); 834 mRemote.transact(Stub.TRANSACTION_mkdirs, _data, _reply, 0); 835 _reply.readException(); 836 _result = _reply.readInt(); 837 } finally { 838 _reply.recycle(); 839 _data.recycle(); 840 } 841 return _result; 842 } 843 844 @Override 845 public int resizeSecureContainer(String id, int sizeMb, String key) 846 throws RemoteException { 847 Parcel _data = Parcel.obtain(); 848 Parcel _reply = Parcel.obtain(); 849 int _result; 850 try { 851 _data.writeInterfaceToken(DESCRIPTOR); 852 _data.writeString(id); 853 _data.writeInt(sizeMb); 854 _data.writeString(key); 855 mRemote.transact(Stub.TRANSACTION_resizeSecureContainer, _data, _reply, 0); 856 _reply.readException(); 857 _result = _reply.readInt(); 858 } finally { 859 _reply.recycle(); 860 _data.recycle(); 861 } 862 return _result; 863 } 864 865 @Override 866 public long lastMaintenance() throws RemoteException { 867 Parcel _data = Parcel.obtain(); 868 Parcel _reply = Parcel.obtain(); 869 long _result; 870 try { 871 _data.writeInterfaceToken(DESCRIPTOR); 872 mRemote.transact(Stub.TRANSACTION_lastMaintenance, _data, _reply, 0); 873 _reply.readException(); 874 _result = _reply.readLong(); 875 } finally { 876 _reply.recycle(); 877 _data.recycle(); 878 } 879 return _result; 880 } 881 882 @Override 883 public void runMaintenance() throws RemoteException { 884 Parcel _data = Parcel.obtain(); 885 Parcel _reply = Parcel.obtain(); 886 try { 887 _data.writeInterfaceToken(DESCRIPTOR); 888 mRemote.transact(Stub.TRANSACTION_runMaintenance, _data, _reply, 0); 889 _reply.readException(); 890 } finally { 891 _reply.recycle(); 892 _data.recycle(); 893 } 894 return; 895 } 896 897 @Override 898 public void waitForAsecScan() throws RemoteException { 899 Parcel _data = Parcel.obtain(); 900 Parcel _reply = Parcel.obtain(); 901 try { 902 _data.writeInterfaceToken(DESCRIPTOR); 903 mRemote.transact(Stub.TRANSACTION_waitForAsecScan, _data, _reply, 0); 904 _reply.readException(); 905 } finally { 906 _reply.recycle(); 907 _data.recycle(); 908 } 909 return; 910 } 911 912 @Override 913 public DiskInfo[] getDisks() throws RemoteException { 914 Parcel _data = Parcel.obtain(); 915 Parcel _reply = Parcel.obtain(); 916 DiskInfo[] _result; 917 try { 918 _data.writeInterfaceToken(DESCRIPTOR); 919 mRemote.transact(Stub.TRANSACTION_getDisks, _data, _reply, 0); 920 _reply.readException(); 921 _result = _reply.createTypedArray(DiskInfo.CREATOR); 922 } finally { 923 _reply.recycle(); 924 _data.recycle(); 925 } 926 return _result; 927 } 928 929 @Override 930 public VolumeInfo[] getVolumes(int _flags) throws RemoteException { 931 Parcel _data = Parcel.obtain(); 932 Parcel _reply = Parcel.obtain(); 933 VolumeInfo[] _result; 934 try { 935 _data.writeInterfaceToken(DESCRIPTOR); 936 _data.writeInt(_flags); 937 mRemote.transact(Stub.TRANSACTION_getVolumes, _data, _reply, 0); 938 _reply.readException(); 939 _result = _reply.createTypedArray(VolumeInfo.CREATOR); 940 } finally { 941 _reply.recycle(); 942 _data.recycle(); 943 } 944 return _result; 945 } 946 947 @Override 948 public VolumeRecord[] getVolumeRecords(int _flags) throws RemoteException { 949 Parcel _data = Parcel.obtain(); 950 Parcel _reply = Parcel.obtain(); 951 VolumeRecord[] _result; 952 try { 953 _data.writeInterfaceToken(DESCRIPTOR); 954 _data.writeInt(_flags); 955 mRemote.transact(Stub.TRANSACTION_getVolumeRecords, _data, _reply, 0); 956 _reply.readException(); 957 _result = _reply.createTypedArray(VolumeRecord.CREATOR); 958 } finally { 959 _reply.recycle(); 960 _data.recycle(); 961 } 962 return _result; 963 } 964 965 @Override 966 public void mount(String volId) throws RemoteException { 967 Parcel _data = Parcel.obtain(); 968 Parcel _reply = Parcel.obtain(); 969 try { 970 _data.writeInterfaceToken(DESCRIPTOR); 971 _data.writeString(volId); 972 mRemote.transact(Stub.TRANSACTION_mount, _data, _reply, 0); 973 _reply.readException(); 974 } finally { 975 _reply.recycle(); 976 _data.recycle(); 977 } 978 } 979 980 @Override 981 public void unmount(String volId) throws RemoteException { 982 Parcel _data = Parcel.obtain(); 983 Parcel _reply = Parcel.obtain(); 984 try { 985 _data.writeInterfaceToken(DESCRIPTOR); 986 _data.writeString(volId); 987 mRemote.transact(Stub.TRANSACTION_unmount, _data, _reply, 0); 988 _reply.readException(); 989 } finally { 990 _reply.recycle(); 991 _data.recycle(); 992 } 993 } 994 995 @Override 996 public void format(String volId) throws RemoteException { 997 Parcel _data = Parcel.obtain(); 998 Parcel _reply = Parcel.obtain(); 999 try { 1000 _data.writeInterfaceToken(DESCRIPTOR); 1001 _data.writeString(volId); 1002 mRemote.transact(Stub.TRANSACTION_format, _data, _reply, 0); 1003 _reply.readException(); 1004 } finally { 1005 _reply.recycle(); 1006 _data.recycle(); 1007 } 1008 } 1009 1010 @Override 1011 public long benchmark(String volId) throws RemoteException { 1012 Parcel _data = Parcel.obtain(); 1013 Parcel _reply = Parcel.obtain(); 1014 try { 1015 _data.writeInterfaceToken(DESCRIPTOR); 1016 _data.writeString(volId); 1017 mRemote.transact(Stub.TRANSACTION_benchmark, _data, _reply, 0); 1018 _reply.readException(); 1019 return _reply.readLong(); 1020 } finally { 1021 _reply.recycle(); 1022 _data.recycle(); 1023 } 1024 } 1025 1026 @Override 1027 public void partitionPublic(String diskId) throws RemoteException { 1028 Parcel _data = Parcel.obtain(); 1029 Parcel _reply = Parcel.obtain(); 1030 try { 1031 _data.writeInterfaceToken(DESCRIPTOR); 1032 _data.writeString(diskId); 1033 mRemote.transact(Stub.TRANSACTION_partitionPublic, _data, _reply, 0); 1034 _reply.readException(); 1035 } finally { 1036 _reply.recycle(); 1037 _data.recycle(); 1038 } 1039 } 1040 1041 @Override 1042 public void partitionPrivate(String diskId) throws RemoteException { 1043 Parcel _data = Parcel.obtain(); 1044 Parcel _reply = Parcel.obtain(); 1045 try { 1046 _data.writeInterfaceToken(DESCRIPTOR); 1047 _data.writeString(diskId); 1048 mRemote.transact(Stub.TRANSACTION_partitionPrivate, _data, _reply, 0); 1049 _reply.readException(); 1050 } finally { 1051 _reply.recycle(); 1052 _data.recycle(); 1053 } 1054 } 1055 1056 @Override 1057 public void partitionMixed(String diskId, int ratio) throws RemoteException { 1058 Parcel _data = Parcel.obtain(); 1059 Parcel _reply = Parcel.obtain(); 1060 try { 1061 _data.writeInterfaceToken(DESCRIPTOR); 1062 _data.writeString(diskId); 1063 _data.writeInt(ratio); 1064 mRemote.transact(Stub.TRANSACTION_partitionMixed, _data, _reply, 0); 1065 _reply.readException(); 1066 } finally { 1067 _reply.recycle(); 1068 _data.recycle(); 1069 } 1070 } 1071 1072 @Override 1073 public void setVolumeNickname(String fsUuid, String nickname) throws RemoteException { 1074 Parcel _data = Parcel.obtain(); 1075 Parcel _reply = Parcel.obtain(); 1076 try { 1077 _data.writeInterfaceToken(DESCRIPTOR); 1078 _data.writeString(fsUuid); 1079 _data.writeString(nickname); 1080 mRemote.transact(Stub.TRANSACTION_setVolumeNickname, _data, _reply, 0); 1081 _reply.readException(); 1082 } finally { 1083 _reply.recycle(); 1084 _data.recycle(); 1085 } 1086 } 1087 1088 @Override 1089 public void setVolumeUserFlags(String fsUuid, int flags, int mask) throws RemoteException { 1090 Parcel _data = Parcel.obtain(); 1091 Parcel _reply = Parcel.obtain(); 1092 try { 1093 _data.writeInterfaceToken(DESCRIPTOR); 1094 _data.writeString(fsUuid); 1095 _data.writeInt(flags); 1096 _data.writeInt(mask); 1097 mRemote.transact(Stub.TRANSACTION_setVolumeUserFlags, _data, _reply, 0); 1098 _reply.readException(); 1099 } finally { 1100 _reply.recycle(); 1101 _data.recycle(); 1102 } 1103 } 1104 1105 @Override 1106 public void forgetVolume(String fsUuid) throws RemoteException { 1107 Parcel _data = Parcel.obtain(); 1108 Parcel _reply = Parcel.obtain(); 1109 try { 1110 _data.writeInterfaceToken(DESCRIPTOR); 1111 _data.writeString(fsUuid); 1112 mRemote.transact(Stub.TRANSACTION_forgetVolume, _data, _reply, 0); 1113 _reply.readException(); 1114 } finally { 1115 _reply.recycle(); 1116 _data.recycle(); 1117 } 1118 } 1119 1120 @Override 1121 public void forgetAllVolumes() throws RemoteException { 1122 Parcel _data = Parcel.obtain(); 1123 Parcel _reply = Parcel.obtain(); 1124 try { 1125 _data.writeInterfaceToken(DESCRIPTOR); 1126 mRemote.transact(Stub.TRANSACTION_forgetAllVolumes, _data, _reply, 0); 1127 _reply.readException(); 1128 } finally { 1129 _reply.recycle(); 1130 _data.recycle(); 1131 } 1132 } 1133 1134 @Override 1135 public void setDebugFlags(int _flags, int _mask) throws RemoteException { 1136 Parcel _data = Parcel.obtain(); 1137 Parcel _reply = Parcel.obtain(); 1138 try { 1139 _data.writeInterfaceToken(DESCRIPTOR); 1140 _data.writeInt(_flags); 1141 _data.writeInt(_mask); 1142 mRemote.transact(Stub.TRANSACTION_setDebugFlags, _data, _reply, 0); 1143 _reply.readException(); 1144 } finally { 1145 _reply.recycle(); 1146 _data.recycle(); 1147 } 1148 } 1149 1150 @Override 1151 public String getPrimaryStorageUuid() throws RemoteException { 1152 Parcel _data = Parcel.obtain(); 1153 Parcel _reply = Parcel.obtain(); 1154 String _result; 1155 try { 1156 _data.writeInterfaceToken(DESCRIPTOR); 1157 mRemote.transact(Stub.TRANSACTION_getPrimaryStorageUuid, _data, _reply, 0); 1158 _reply.readException(); 1159 _result = _reply.readString(); 1160 } finally { 1161 _reply.recycle(); 1162 _data.recycle(); 1163 } 1164 return _result; 1165 } 1166 1167 @Override 1168 public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback) 1169 throws RemoteException { 1170 Parcel _data = Parcel.obtain(); 1171 Parcel _reply = Parcel.obtain(); 1172 try { 1173 _data.writeInterfaceToken(DESCRIPTOR); 1174 _data.writeString(volumeUuid); 1175 _data.writeStrongBinder((callback != null ? callback.asBinder() : null)); 1176 mRemote.transact(Stub.TRANSACTION_setPrimaryStorageUuid, _data, _reply, 0); 1177 _reply.readException(); 1178 } finally { 1179 _reply.recycle(); 1180 _data.recycle(); 1181 } 1182 } 1183 } 1184 1185 private static final String DESCRIPTOR = "IMountService"; 1186 1187 static final int TRANSACTION_registerListener = IBinder.FIRST_CALL_TRANSACTION + 0; 1188 1189 static final int TRANSACTION_unregisterListener = IBinder.FIRST_CALL_TRANSACTION + 1; 1190 1191 static final int TRANSACTION_isUsbMassStorageConnected = IBinder.FIRST_CALL_TRANSACTION + 2; 1192 1193 static final int TRANSACTION_setUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 3; 1194 1195 static final int TRANSACTION_isUsbMassStorageEnabled = IBinder.FIRST_CALL_TRANSACTION + 4; 1196 1197 static final int TRANSACTION_mountVolume = IBinder.FIRST_CALL_TRANSACTION + 5; 1198 1199 static final int TRANSACTION_unmountVolume = IBinder.FIRST_CALL_TRANSACTION + 6; 1200 1201 static final int TRANSACTION_formatVolume = IBinder.FIRST_CALL_TRANSACTION + 7; 1202 1203 static final int TRANSACTION_getStorageUsers = IBinder.FIRST_CALL_TRANSACTION + 8; 1204 1205 static final int TRANSACTION_getVolumeState = IBinder.FIRST_CALL_TRANSACTION + 9; 1206 1207 static final int TRANSACTION_createSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 10; 1208 1209 static final int TRANSACTION_finalizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 11; 1210 1211 static final int TRANSACTION_destroySecureContainer = IBinder.FIRST_CALL_TRANSACTION + 12; 1212 1213 static final int TRANSACTION_mountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 13; 1214 1215 static final int TRANSACTION_unmountSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 14; 1216 1217 static final int TRANSACTION_isSecureContainerMounted = IBinder.FIRST_CALL_TRANSACTION + 15; 1218 1219 static final int TRANSACTION_renameSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 16; 1220 1221 static final int TRANSACTION_getSecureContainerPath = IBinder.FIRST_CALL_TRANSACTION + 17; 1222 1223 static final int TRANSACTION_getSecureContainerList = IBinder.FIRST_CALL_TRANSACTION + 18; 1224 1225 static final int TRANSACTION_shutdown = IBinder.FIRST_CALL_TRANSACTION + 19; 1226 1227 static final int TRANSACTION_finishMediaUpdate = IBinder.FIRST_CALL_TRANSACTION + 20; 1228 1229 static final int TRANSACTION_mountObb = IBinder.FIRST_CALL_TRANSACTION + 21; 1230 1231 static final int TRANSACTION_unmountObb = IBinder.FIRST_CALL_TRANSACTION + 22; 1232 1233 static final int TRANSACTION_isObbMounted = IBinder.FIRST_CALL_TRANSACTION + 23; 1234 1235 static final int TRANSACTION_getMountedObbPath = IBinder.FIRST_CALL_TRANSACTION + 24; 1236 1237 static final int TRANSACTION_isExternalStorageEmulated = IBinder.FIRST_CALL_TRANSACTION + 25; 1238 1239 static final int TRANSACTION_decryptStorage = IBinder.FIRST_CALL_TRANSACTION + 26; 1240 1241 static final int TRANSACTION_encryptStorage = IBinder.FIRST_CALL_TRANSACTION + 27; 1242 1243 static final int TRANSACTION_changeEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 28; 1244 1245 static final int TRANSACTION_getVolumeList = IBinder.FIRST_CALL_TRANSACTION + 29; 1246 1247 static final int TRANSACTION_getSecureContainerFilesystemPath = IBinder.FIRST_CALL_TRANSACTION + 30; 1248 1249 static final int TRANSACTION_getEncryptionState = IBinder.FIRST_CALL_TRANSACTION + 31; 1250 1251 static final int TRANSACTION_verifyEncryptionPassword = IBinder.FIRST_CALL_TRANSACTION + 32; 1252 1253 static final int TRANSACTION_fixPermissionsSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 33; 1254 1255 static final int TRANSACTION_mkdirs = IBinder.FIRST_CALL_TRANSACTION + 34; 1256 1257 static final int TRANSACTION_getPasswordType = IBinder.FIRST_CALL_TRANSACTION + 35; 1258 1259 static final int TRANSACTION_getPassword = IBinder.FIRST_CALL_TRANSACTION + 36; 1260 1261 static final int TRANSACTION_clearPassword = IBinder.FIRST_CALL_TRANSACTION + 37; 1262 1263 static final int TRANSACTION_setField = IBinder.FIRST_CALL_TRANSACTION + 38; 1264 1265 static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39; 1266 1267 static final int TRANSACTION_resizeSecureContainer = IBinder.FIRST_CALL_TRANSACTION + 40; 1268 1269 static final int TRANSACTION_lastMaintenance = IBinder.FIRST_CALL_TRANSACTION + 41; 1270 1271 static final int TRANSACTION_runMaintenance = IBinder.FIRST_CALL_TRANSACTION + 42; 1272 1273 static final int TRANSACTION_waitForAsecScan = IBinder.FIRST_CALL_TRANSACTION + 43; 1274 1275 static final int TRANSACTION_getDisks = IBinder.FIRST_CALL_TRANSACTION + 44; 1276 static final int TRANSACTION_getVolumes = IBinder.FIRST_CALL_TRANSACTION + 45; 1277 static final int TRANSACTION_getVolumeRecords = IBinder.FIRST_CALL_TRANSACTION + 46; 1278 1279 static final int TRANSACTION_mount = IBinder.FIRST_CALL_TRANSACTION + 47; 1280 static final int TRANSACTION_unmount = IBinder.FIRST_CALL_TRANSACTION + 48; 1281 static final int TRANSACTION_format = IBinder.FIRST_CALL_TRANSACTION + 49; 1282 1283 static final int TRANSACTION_partitionPublic = IBinder.FIRST_CALL_TRANSACTION + 50; 1284 static final int TRANSACTION_partitionPrivate = IBinder.FIRST_CALL_TRANSACTION + 51; 1285 static final int TRANSACTION_partitionMixed = IBinder.FIRST_CALL_TRANSACTION + 52; 1286 1287 static final int TRANSACTION_setVolumeNickname = IBinder.FIRST_CALL_TRANSACTION + 53; 1288 static final int TRANSACTION_setVolumeUserFlags = IBinder.FIRST_CALL_TRANSACTION + 54; 1289 static final int TRANSACTION_forgetVolume = IBinder.FIRST_CALL_TRANSACTION + 55; 1290 static final int TRANSACTION_forgetAllVolumes = IBinder.FIRST_CALL_TRANSACTION + 56; 1291 1292 static final int TRANSACTION_getPrimaryStorageUuid = IBinder.FIRST_CALL_TRANSACTION + 57; 1293 static final int TRANSACTION_setPrimaryStorageUuid = IBinder.FIRST_CALL_TRANSACTION + 58; 1294 1295 static final int TRANSACTION_benchmark = IBinder.FIRST_CALL_TRANSACTION + 59; 1296 static final int TRANSACTION_setDebugFlags = IBinder.FIRST_CALL_TRANSACTION + 60; 1297 1298 /** 1299 * Cast an IBinder object into an IMountService interface, generating a 1300 * proxy if needed. 1301 */ 1302 public static IMountService asInterface(IBinder obj) { 1303 if (obj == null) { 1304 return null; 1305 } 1306 IInterface iin = obj.queryLocalInterface(DESCRIPTOR); 1307 if (iin != null && iin instanceof IMountService) { 1308 return (IMountService) iin; 1309 } 1310 return new IMountService.Stub.Proxy(obj); 1311 } 1312 1313 /** Construct the stub at attach it to the interface. */ 1314 public Stub() { 1315 attachInterface(this, DESCRIPTOR); 1316 } 1317 1318 public IBinder asBinder() { 1319 return this; 1320 } 1321 1322 @Override 1323 public boolean onTransact(int code, Parcel data, Parcel reply, 1324 int flags) throws RemoteException { 1325 switch (code) { 1326 case INTERFACE_TRANSACTION: { 1327 reply.writeString(DESCRIPTOR); 1328 return true; 1329 } 1330 case TRANSACTION_registerListener: { 1331 data.enforceInterface(DESCRIPTOR); 1332 IMountServiceListener listener; 1333 listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder()); 1334 registerListener(listener); 1335 reply.writeNoException(); 1336 return true; 1337 } 1338 case TRANSACTION_unregisterListener: { 1339 data.enforceInterface(DESCRIPTOR); 1340 IMountServiceListener listener; 1341 listener = IMountServiceListener.Stub.asInterface(data.readStrongBinder()); 1342 unregisterListener(listener); 1343 reply.writeNoException(); 1344 return true; 1345 } 1346 case TRANSACTION_isUsbMassStorageConnected: { 1347 data.enforceInterface(DESCRIPTOR); 1348 boolean result = isUsbMassStorageConnected(); 1349 reply.writeNoException(); 1350 reply.writeInt((result ? 1 : 0)); 1351 return true; 1352 } 1353 case TRANSACTION_setUsbMassStorageEnabled: { 1354 data.enforceInterface(DESCRIPTOR); 1355 boolean enable; 1356 enable = 0 != data.readInt(); 1357 setUsbMassStorageEnabled(enable); 1358 reply.writeNoException(); 1359 return true; 1360 } 1361 case TRANSACTION_isUsbMassStorageEnabled: { 1362 data.enforceInterface(DESCRIPTOR); 1363 boolean result = isUsbMassStorageEnabled(); 1364 reply.writeNoException(); 1365 reply.writeInt((result ? 1 : 0)); 1366 return true; 1367 } 1368 case TRANSACTION_mountVolume: { 1369 data.enforceInterface(DESCRIPTOR); 1370 String mountPoint; 1371 mountPoint = data.readString(); 1372 int resultCode = mountVolume(mountPoint); 1373 reply.writeNoException(); 1374 reply.writeInt(resultCode); 1375 return true; 1376 } 1377 case TRANSACTION_unmountVolume: { 1378 data.enforceInterface(DESCRIPTOR); 1379 String mountPoint; 1380 mountPoint = data.readString(); 1381 boolean force = 0 != data.readInt(); 1382 boolean removeEncrypt = 0 != data.readInt(); 1383 unmountVolume(mountPoint, force, removeEncrypt); 1384 reply.writeNoException(); 1385 return true; 1386 } 1387 case TRANSACTION_formatVolume: { 1388 data.enforceInterface(DESCRIPTOR); 1389 String mountPoint; 1390 mountPoint = data.readString(); 1391 int result = formatVolume(mountPoint); 1392 reply.writeNoException(); 1393 reply.writeInt(result); 1394 return true; 1395 } 1396 case TRANSACTION_getStorageUsers: { 1397 data.enforceInterface(DESCRIPTOR); 1398 String path; 1399 path = data.readString(); 1400 int[] pids = getStorageUsers(path); 1401 reply.writeNoException(); 1402 reply.writeIntArray(pids); 1403 return true; 1404 } 1405 case TRANSACTION_getVolumeState: { 1406 data.enforceInterface(DESCRIPTOR); 1407 String mountPoint; 1408 mountPoint = data.readString(); 1409 String state = getVolumeState(mountPoint); 1410 reply.writeNoException(); 1411 reply.writeString(state); 1412 return true; 1413 } 1414 case TRANSACTION_createSecureContainer: { 1415 data.enforceInterface(DESCRIPTOR); 1416 String id; 1417 id = data.readString(); 1418 int sizeMb; 1419 sizeMb = data.readInt(); 1420 String fstype; 1421 fstype = data.readString(); 1422 String key; 1423 key = data.readString(); 1424 int ownerUid; 1425 ownerUid = data.readInt(); 1426 boolean external; 1427 external = 0 != data.readInt(); 1428 int resultCode = createSecureContainer(id, sizeMb, fstype, key, ownerUid, 1429 external); 1430 reply.writeNoException(); 1431 reply.writeInt(resultCode); 1432 return true; 1433 } 1434 case TRANSACTION_finalizeSecureContainer: { 1435 data.enforceInterface(DESCRIPTOR); 1436 String id; 1437 id = data.readString(); 1438 int resultCode = finalizeSecureContainer(id); 1439 reply.writeNoException(); 1440 reply.writeInt(resultCode); 1441 return true; 1442 } 1443 case TRANSACTION_destroySecureContainer: { 1444 data.enforceInterface(DESCRIPTOR); 1445 String id; 1446 id = data.readString(); 1447 boolean force; 1448 force = 0 != data.readInt(); 1449 int resultCode = destroySecureContainer(id, force); 1450 reply.writeNoException(); 1451 reply.writeInt(resultCode); 1452 return true; 1453 } 1454 case TRANSACTION_mountSecureContainer: { 1455 data.enforceInterface(DESCRIPTOR); 1456 String id; 1457 id = data.readString(); 1458 String key; 1459 key = data.readString(); 1460 int ownerUid; 1461 ownerUid = data.readInt(); 1462 boolean readOnly; 1463 readOnly = data.readInt() != 0; 1464 int resultCode = mountSecureContainer(id, key, ownerUid, readOnly); 1465 reply.writeNoException(); 1466 reply.writeInt(resultCode); 1467 return true; 1468 } 1469 case TRANSACTION_unmountSecureContainer: { 1470 data.enforceInterface(DESCRIPTOR); 1471 String id; 1472 id = data.readString(); 1473 boolean force; 1474 force = 0 != data.readInt(); 1475 int resultCode = unmountSecureContainer(id, force); 1476 reply.writeNoException(); 1477 reply.writeInt(resultCode); 1478 return true; 1479 } 1480 case TRANSACTION_isSecureContainerMounted: { 1481 data.enforceInterface(DESCRIPTOR); 1482 String id; 1483 id = data.readString(); 1484 boolean status = isSecureContainerMounted(id); 1485 reply.writeNoException(); 1486 reply.writeInt((status ? 1 : 0)); 1487 return true; 1488 } 1489 case TRANSACTION_renameSecureContainer: { 1490 data.enforceInterface(DESCRIPTOR); 1491 String oldId; 1492 oldId = data.readString(); 1493 String newId; 1494 newId = data.readString(); 1495 int resultCode = renameSecureContainer(oldId, newId); 1496 reply.writeNoException(); 1497 reply.writeInt(resultCode); 1498 return true; 1499 } 1500 case TRANSACTION_getSecureContainerPath: { 1501 data.enforceInterface(DESCRIPTOR); 1502 String id; 1503 id = data.readString(); 1504 String path = getSecureContainerPath(id); 1505 reply.writeNoException(); 1506 reply.writeString(path); 1507 return true; 1508 } 1509 case TRANSACTION_getSecureContainerList: { 1510 data.enforceInterface(DESCRIPTOR); 1511 String[] ids = getSecureContainerList(); 1512 reply.writeNoException(); 1513 reply.writeStringArray(ids); 1514 return true; 1515 } 1516 case TRANSACTION_shutdown: { 1517 data.enforceInterface(DESCRIPTOR); 1518 IMountShutdownObserver observer; 1519 observer = IMountShutdownObserver.Stub.asInterface(data 1520 .readStrongBinder()); 1521 shutdown(observer); 1522 reply.writeNoException(); 1523 return true; 1524 } 1525 case TRANSACTION_finishMediaUpdate: { 1526 data.enforceInterface(DESCRIPTOR); 1527 finishMediaUpdate(); 1528 reply.writeNoException(); 1529 return true; 1530 } 1531 case TRANSACTION_mountObb: { 1532 data.enforceInterface(DESCRIPTOR); 1533 final String rawPath = data.readString(); 1534 final String canonicalPath = data.readString(); 1535 final String key = data.readString(); 1536 IObbActionListener observer; 1537 observer = IObbActionListener.Stub.asInterface(data.readStrongBinder()); 1538 int nonce; 1539 nonce = data.readInt(); 1540 mountObb(rawPath, canonicalPath, key, observer, nonce); 1541 reply.writeNoException(); 1542 return true; 1543 } 1544 case TRANSACTION_unmountObb: { 1545 data.enforceInterface(DESCRIPTOR); 1546 String filename; 1547 filename = data.readString(); 1548 boolean force; 1549 force = 0 != data.readInt(); 1550 IObbActionListener observer; 1551 observer = IObbActionListener.Stub.asInterface(data.readStrongBinder()); 1552 int nonce; 1553 nonce = data.readInt(); 1554 unmountObb(filename, force, observer, nonce); 1555 reply.writeNoException(); 1556 return true; 1557 } 1558 case TRANSACTION_isObbMounted: { 1559 data.enforceInterface(DESCRIPTOR); 1560 String filename; 1561 filename = data.readString(); 1562 boolean status = isObbMounted(filename); 1563 reply.writeNoException(); 1564 reply.writeInt((status ? 1 : 0)); 1565 return true; 1566 } 1567 case TRANSACTION_getMountedObbPath: { 1568 data.enforceInterface(DESCRIPTOR); 1569 String filename; 1570 filename = data.readString(); 1571 String mountedPath = getMountedObbPath(filename); 1572 reply.writeNoException(); 1573 reply.writeString(mountedPath); 1574 return true; 1575 } 1576 case TRANSACTION_isExternalStorageEmulated: { 1577 data.enforceInterface(DESCRIPTOR); 1578 boolean emulated = isExternalStorageEmulated(); 1579 reply.writeNoException(); 1580 reply.writeInt(emulated ? 1 : 0); 1581 return true; 1582 } 1583 case TRANSACTION_decryptStorage: { 1584 data.enforceInterface(DESCRIPTOR); 1585 String password = data.readString(); 1586 int result = decryptStorage(password); 1587 reply.writeNoException(); 1588 reply.writeInt(result); 1589 return true; 1590 } 1591 case TRANSACTION_encryptStorage: { 1592 data.enforceInterface(DESCRIPTOR); 1593 int type = data.readInt(); 1594 String password = data.readString(); 1595 int result = encryptStorage(type, password); 1596 reply.writeNoException(); 1597 reply.writeInt(result); 1598 return true; 1599 } 1600 case TRANSACTION_changeEncryptionPassword: { 1601 data.enforceInterface(DESCRIPTOR); 1602 int type = data.readInt(); 1603 String password = data.readString(); 1604 int result = changeEncryptionPassword(type, password); 1605 reply.writeNoException(); 1606 reply.writeInt(result); 1607 return true; 1608 } 1609 case TRANSACTION_getVolumeList: { 1610 data.enforceInterface(DESCRIPTOR); 1611 int uid = data.readInt(); 1612 String packageName = data.readString(); 1613 int _flags = data.readInt(); 1614 StorageVolume[] result = getVolumeList(uid, packageName, _flags); 1615 reply.writeNoException(); 1616 reply.writeTypedArray(result, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 1617 return true; 1618 } 1619 case TRANSACTION_getSecureContainerFilesystemPath: { 1620 data.enforceInterface(DESCRIPTOR); 1621 String id; 1622 id = data.readString(); 1623 String path = getSecureContainerFilesystemPath(id); 1624 reply.writeNoException(); 1625 reply.writeString(path); 1626 return true; 1627 } 1628 case TRANSACTION_getEncryptionState: { 1629 data.enforceInterface(DESCRIPTOR); 1630 int result = getEncryptionState(); 1631 reply.writeNoException(); 1632 reply.writeInt(result); 1633 return true; 1634 } 1635 case TRANSACTION_fixPermissionsSecureContainer: { 1636 data.enforceInterface(DESCRIPTOR); 1637 String id; 1638 id = data.readString(); 1639 int gid; 1640 gid = data.readInt(); 1641 String filename; 1642 filename = data.readString(); 1643 int resultCode = fixPermissionsSecureContainer(id, gid, filename); 1644 reply.writeNoException(); 1645 reply.writeInt(resultCode); 1646 return true; 1647 } 1648 case TRANSACTION_mkdirs: { 1649 data.enforceInterface(DESCRIPTOR); 1650 String callingPkg = data.readString(); 1651 String path = data.readString(); 1652 int result = mkdirs(callingPkg, path); 1653 reply.writeNoException(); 1654 reply.writeInt(result); 1655 return true; 1656 } 1657 case TRANSACTION_getPasswordType: { 1658 data.enforceInterface(DESCRIPTOR); 1659 int result = getPasswordType(); 1660 reply.writeNoException(); 1661 reply.writeInt(result); 1662 return true; 1663 } 1664 case TRANSACTION_getPassword: { 1665 data.enforceInterface(DESCRIPTOR); 1666 String result = getPassword(); 1667 reply.writeNoException(); 1668 reply.writeString(result); 1669 return true; 1670 } 1671 case TRANSACTION_clearPassword: { 1672 data.enforceInterface(DESCRIPTOR); 1673 clearPassword(); 1674 reply.writeNoException(); 1675 return true; 1676 } 1677 case TRANSACTION_setField: { 1678 data.enforceInterface(DESCRIPTOR); 1679 String field = data.readString(); 1680 String contents = data.readString(); 1681 setField(field, contents); 1682 reply.writeNoException(); 1683 return true; 1684 } 1685 case TRANSACTION_getField: { 1686 data.enforceInterface(DESCRIPTOR); 1687 String field = data.readString(); 1688 String contents = getField(field); 1689 reply.writeNoException(); 1690 reply.writeString(contents); 1691 return true; 1692 } 1693 case TRANSACTION_resizeSecureContainer: { 1694 data.enforceInterface(DESCRIPTOR); 1695 String id; 1696 id = data.readString(); 1697 int sizeMb; 1698 sizeMb = data.readInt(); 1699 String key; 1700 key = data.readString(); 1701 int resultCode = resizeSecureContainer(id, sizeMb, key); 1702 reply.writeNoException(); 1703 reply.writeInt(resultCode); 1704 return true; 1705 } 1706 case TRANSACTION_lastMaintenance: { 1707 data.enforceInterface(DESCRIPTOR); 1708 long lastMaintenance = lastMaintenance(); 1709 reply.writeNoException(); 1710 reply.writeLong(lastMaintenance); 1711 return true; 1712 } 1713 case TRANSACTION_runMaintenance: { 1714 data.enforceInterface(DESCRIPTOR); 1715 runMaintenance(); 1716 reply.writeNoException(); 1717 return true; 1718 } 1719 case TRANSACTION_waitForAsecScan: { 1720 data.enforceInterface(DESCRIPTOR); 1721 waitForAsecScan(); 1722 reply.writeNoException(); 1723 return true; 1724 } 1725 case TRANSACTION_getDisks: { 1726 data.enforceInterface(DESCRIPTOR); 1727 DiskInfo[] disks = getDisks(); 1728 reply.writeNoException(); 1729 reply.writeTypedArray(disks, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 1730 return true; 1731 } 1732 case TRANSACTION_getVolumes: { 1733 data.enforceInterface(DESCRIPTOR); 1734 int _flags = data.readInt(); 1735 VolumeInfo[] volumes = getVolumes(_flags); 1736 reply.writeNoException(); 1737 reply.writeTypedArray(volumes, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 1738 return true; 1739 } 1740 case TRANSACTION_getVolumeRecords: { 1741 data.enforceInterface(DESCRIPTOR); 1742 int _flags = data.readInt(); 1743 VolumeRecord[] volumes = getVolumeRecords(_flags); 1744 reply.writeNoException(); 1745 reply.writeTypedArray(volumes, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE); 1746 return true; 1747 } 1748 case TRANSACTION_mount: { 1749 data.enforceInterface(DESCRIPTOR); 1750 String volId = data.readString(); 1751 mount(volId); 1752 reply.writeNoException(); 1753 return true; 1754 } 1755 case TRANSACTION_unmount: { 1756 data.enforceInterface(DESCRIPTOR); 1757 String volId = data.readString(); 1758 unmount(volId); 1759 reply.writeNoException(); 1760 return true; 1761 } 1762 case TRANSACTION_format: { 1763 data.enforceInterface(DESCRIPTOR); 1764 String volId = data.readString(); 1765 format(volId); 1766 reply.writeNoException(); 1767 return true; 1768 } 1769 case TRANSACTION_benchmark: { 1770 data.enforceInterface(DESCRIPTOR); 1771 String volId = data.readString(); 1772 long res = benchmark(volId); 1773 reply.writeNoException(); 1774 reply.writeLong(res); 1775 return true; 1776 } 1777 case TRANSACTION_partitionPublic: { 1778 data.enforceInterface(DESCRIPTOR); 1779 String diskId = data.readString(); 1780 partitionPublic(diskId); 1781 reply.writeNoException(); 1782 return true; 1783 } 1784 case TRANSACTION_partitionPrivate: { 1785 data.enforceInterface(DESCRIPTOR); 1786 String diskId = data.readString(); 1787 partitionPrivate(diskId); 1788 reply.writeNoException(); 1789 return true; 1790 } 1791 case TRANSACTION_partitionMixed: { 1792 data.enforceInterface(DESCRIPTOR); 1793 String diskId = data.readString(); 1794 int ratio = data.readInt(); 1795 partitionMixed(diskId, ratio); 1796 reply.writeNoException(); 1797 return true; 1798 } 1799 case TRANSACTION_setVolumeNickname: { 1800 data.enforceInterface(DESCRIPTOR); 1801 String volId = data.readString(); 1802 String nickname = data.readString(); 1803 setVolumeNickname(volId, nickname); 1804 reply.writeNoException(); 1805 return true; 1806 } 1807 case TRANSACTION_setVolumeUserFlags: { 1808 data.enforceInterface(DESCRIPTOR); 1809 String volId = data.readString(); 1810 int _flags = data.readInt(); 1811 int _mask = data.readInt(); 1812 setVolumeUserFlags(volId, _flags, _mask); 1813 reply.writeNoException(); 1814 return true; 1815 } 1816 case TRANSACTION_forgetVolume: { 1817 data.enforceInterface(DESCRIPTOR); 1818 String fsUuid = data.readString(); 1819 forgetVolume(fsUuid); 1820 reply.writeNoException(); 1821 return true; 1822 } 1823 case TRANSACTION_forgetAllVolumes: { 1824 data.enforceInterface(DESCRIPTOR); 1825 forgetAllVolumes(); 1826 reply.writeNoException(); 1827 return true; 1828 } 1829 case TRANSACTION_setDebugFlags: { 1830 data.enforceInterface(DESCRIPTOR); 1831 int _flags = data.readInt(); 1832 int _mask = data.readInt(); 1833 setDebugFlags(_flags, _mask); 1834 reply.writeNoException(); 1835 return true; 1836 } 1837 case TRANSACTION_getPrimaryStorageUuid: { 1838 data.enforceInterface(DESCRIPTOR); 1839 String volumeUuid = getPrimaryStorageUuid(); 1840 reply.writeNoException(); 1841 reply.writeString(volumeUuid); 1842 return true; 1843 } 1844 case TRANSACTION_setPrimaryStorageUuid: { 1845 data.enforceInterface(DESCRIPTOR); 1846 String volumeUuid = data.readString(); 1847 IPackageMoveObserver listener = IPackageMoveObserver.Stub.asInterface( 1848 data.readStrongBinder()); 1849 setPrimaryStorageUuid(volumeUuid, listener); 1850 reply.writeNoException(); 1851 return true; 1852 } 1853 } 1854 return super.onTransact(code, data, reply, flags); 1855 } 1856 } 1857 1858 /* 1859 * Creates a secure container with the specified parameters. Returns an int 1860 * consistent with MountServiceResultCode 1861 */ 1862 public int createSecureContainer(String id, int sizeMb, String fstype, String key, 1863 int ownerUid, boolean external) throws RemoteException; 1864 1865 /* 1866 * Destroy a secure container, and free up all resources associated with it. 1867 * NOTE: Ensure all references are released prior to deleting. Returns an 1868 * int consistent with MountServiceResultCode 1869 */ 1870 public int destroySecureContainer(String id, boolean force) throws RemoteException; 1871 1872 /* 1873 * Finalize a container which has just been created and populated. After 1874 * finalization, the container is immutable. Returns an int consistent with 1875 * MountServiceResultCode 1876 */ 1877 public int finalizeSecureContainer(String id) throws RemoteException; 1878 1879 /** 1880 * Call into MountService by PackageManager to notify that its done 1881 * processing the media status update request. 1882 */ 1883 public void finishMediaUpdate() throws RemoteException; 1884 1885 /** 1886 * Format external storage given a mount point. Returns an int consistent 1887 * with MountServiceResultCode 1888 */ 1889 public int formatVolume(String mountPoint) throws RemoteException; 1890 1891 /** 1892 * Gets the path to the mounted Opaque Binary Blob (OBB). 1893 */ 1894 public String getMountedObbPath(String rawPath) throws RemoteException; 1895 1896 /** 1897 * Gets an Array of currently known secure container IDs 1898 */ 1899 public String[] getSecureContainerList() throws RemoteException; 1900 1901 /* 1902 * Returns the filesystem path of a mounted secure container. 1903 */ 1904 public String getSecureContainerPath(String id) throws RemoteException; 1905 1906 /** 1907 * Returns an array of pids with open files on the specified path. 1908 */ 1909 public int[] getStorageUsers(String path) throws RemoteException; 1910 1911 /** 1912 * Gets the state of a volume via its mountpoint. 1913 */ 1914 public String getVolumeState(String mountPoint) throws RemoteException; 1915 1916 /** 1917 * Checks whether the specified Opaque Binary Blob (OBB) is mounted 1918 * somewhere. 1919 */ 1920 public boolean isObbMounted(String rawPath) throws RemoteException; 1921 1922 /* 1923 * Returns true if the specified container is mounted 1924 */ 1925 public boolean isSecureContainerMounted(String id) throws RemoteException; 1926 1927 /** 1928 * Returns true if a USB mass storage host is connected 1929 */ 1930 public boolean isUsbMassStorageConnected() throws RemoteException; 1931 1932 /** 1933 * Returns true if a USB mass storage host is enabled (media is shared) 1934 */ 1935 public boolean isUsbMassStorageEnabled() throws RemoteException; 1936 1937 /** 1938 * Mounts an Opaque Binary Blob (OBB) with the specified decryption key and 1939 * only allows the calling process's UID access to the contents. 1940 * MountService will call back to the supplied IObbActionListener to inform 1941 * it of the terminal state of the call. 1942 */ 1943 public void mountObb(String rawPath, String canonicalPath, String key, 1944 IObbActionListener token, int nonce) throws RemoteException; 1945 1946 /* 1947 * Mount a secure container with the specified key and owner UID. Returns an 1948 * int consistent with MountServiceResultCode 1949 */ 1950 public int mountSecureContainer(String id, String key, int ownerUid, boolean readOnly) 1951 throws RemoteException; 1952 1953 /** 1954 * Mount external storage at given mount point. Returns an int consistent 1955 * with MountServiceResultCode 1956 */ 1957 public int mountVolume(String mountPoint) throws RemoteException; 1958 1959 /** 1960 * Registers an IMountServiceListener for receiving async notifications. 1961 */ 1962 public void registerListener(IMountServiceListener listener) throws RemoteException; 1963 1964 /* 1965 * Rename an unmounted secure container. Returns an int consistent with 1966 * MountServiceResultCode 1967 */ 1968 public int renameSecureContainer(String oldId, String newId) throws RemoteException; 1969 1970 /** 1971 * Enables / disables USB mass storage. The caller should check actual 1972 * status of enabling/disabling USB mass storage via StorageEventListener. 1973 */ 1974 public void setUsbMassStorageEnabled(boolean enable) throws RemoteException; 1975 1976 /** 1977 * Shuts down the MountService and gracefully unmounts all external media. 1978 * Invokes call back once the shutdown is complete. 1979 */ 1980 public void shutdown(IMountShutdownObserver observer) throws RemoteException; 1981 1982 /** 1983 * Unmounts an Opaque Binary Blob (OBB). When the force flag is specified, 1984 * any program using it will be forcibly killed to unmount the image. 1985 * MountService will call back to the supplied IObbActionListener to inform 1986 * it of the terminal state of the call. 1987 */ 1988 public void unmountObb(String rawPath, boolean force, IObbActionListener token, int nonce) 1989 throws RemoteException; 1990 1991 /* 1992 * Unount a secure container. Returns an int consistent with 1993 * MountServiceResultCode 1994 */ 1995 public int unmountSecureContainer(String id, boolean force) throws RemoteException; 1996 1997 /** 1998 * Safely unmount external storage at given mount point. The unmount is an 1999 * asynchronous operation. Applications should register StorageEventListener 2000 * for storage related status changes. 2001 * @param mountPoint the mount point 2002 * @param force whether or not to forcefully unmount it (e.g. even if programs are using this 2003 * data currently) 2004 * @param removeEncryption whether or not encryption mapping should be removed from the volume. 2005 * This value implies {@code force}. 2006 */ 2007 public void unmountVolume(String mountPoint, boolean force, boolean removeEncryption) 2008 throws RemoteException; 2009 2010 /** 2011 * Unregisters an IMountServiceListener 2012 */ 2013 public void unregisterListener(IMountServiceListener listener) throws RemoteException; 2014 2015 /** 2016 * Returns whether or not the external storage is emulated. 2017 */ 2018 public boolean isExternalStorageEmulated() throws RemoteException; 2019 2020 /** The volume is not encrypted. */ 2021 static final int ENCRYPTION_STATE_NONE = 1; 2022 /** The volume has been encrypted succesfully. */ 2023 static final int ENCRYPTION_STATE_OK = 0; 2024 /** The volume is in a bad state.*/ 2025 static final int ENCRYPTION_STATE_ERROR_UNKNOWN = -1; 2026 /** Encryption is incomplete */ 2027 static final int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2; 2028 /** Encryption is incomplete and irrecoverable */ 2029 static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3; 2030 /** Underlying data is corrupt */ 2031 static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4; 2032 2033 /** 2034 * Determines the encryption state of the volume. 2035 * @return a numerical value. See {@code ENCRYPTION_STATE_*} for possible values. 2036 */ 2037 public int getEncryptionState() throws RemoteException; 2038 2039 /** 2040 * Decrypts any encrypted volumes. 2041 */ 2042 public int decryptStorage(String password) throws RemoteException; 2043 2044 /** 2045 * Encrypts storage. 2046 */ 2047 public int encryptStorage(int type, String password) throws RemoteException; 2048 2049 /** 2050 * Changes the encryption password. 2051 */ 2052 public int changeEncryptionPassword(int type, String password) 2053 throws RemoteException; 2054 2055 /** 2056 * Verify the encryption password against the stored volume. This method 2057 * may only be called by the system process. 2058 */ 2059 public int verifyEncryptionPassword(String password) throws RemoteException; 2060 2061 /** 2062 * Returns list of all mountable volumes. 2063 */ 2064 public StorageVolume[] getVolumeList(int uid, String packageName, int flags) throws RemoteException; 2065 2066 /** 2067 * Gets the path on the filesystem for the ASEC container itself. 2068 * 2069 * @param cid ASEC container ID 2070 * @return path to filesystem or {@code null} if it's not found 2071 * @throws RemoteException 2072 */ 2073 public String getSecureContainerFilesystemPath(String cid) throws RemoteException; 2074 2075 /* 2076 * Fix permissions in a container which has just been created and populated. 2077 * Returns an int consistent with MountServiceResultCode 2078 */ 2079 public int fixPermissionsSecureContainer(String id, int gid, String filename) 2080 throws RemoteException; 2081 2082 /** 2083 * Ensure that all directories along given path exist, creating parent 2084 * directories as needed. Validates that given path is absolute and that it 2085 * contains no relative "." or ".." paths or symlinks. Also ensures that 2086 * path belongs to a volume managed by vold, and that path is either 2087 * external storage data or OBB directory belonging to calling app. 2088 */ 2089 public int mkdirs(String callingPkg, String path) throws RemoteException; 2090 2091 /** 2092 * Determines the type of the encryption password 2093 * @return PasswordType 2094 */ 2095 public int getPasswordType() throws RemoteException; 2096 2097 /** 2098 * Get password from vold 2099 * @return password or empty string 2100 */ 2101 public String getPassword() throws RemoteException; 2102 2103 /** 2104 * Securely clear password from vold 2105 */ 2106 public void clearPassword() throws RemoteException; 2107 2108 /** 2109 * Set a field in the crypto header. 2110 * @param field field to set 2111 * @param contents contents to set in field 2112 */ 2113 public void setField(String field, String contents) throws RemoteException; 2114 2115 /** 2116 * Gets a field from the crypto header. 2117 * @param field field to get 2118 * @return contents of field 2119 */ 2120 public String getField(String field) throws RemoteException; 2121 2122 public int resizeSecureContainer(String id, int sizeMb, String key) throws RemoteException; 2123 2124 /** 2125 * Report the time of the last maintenance operation such as fstrim. 2126 * @return Timestamp of the last maintenance operation, in the 2127 * System.currentTimeMillis() time base 2128 * @throws RemoteException 2129 */ 2130 public long lastMaintenance() throws RemoteException; 2131 2132 /** 2133 * Kick off an immediate maintenance operation 2134 * @throws RemoteException 2135 */ 2136 public void runMaintenance() throws RemoteException; 2137 2138 public void waitForAsecScan() throws RemoteException; 2139 2140 public DiskInfo[] getDisks() throws RemoteException; 2141 public VolumeInfo[] getVolumes(int flags) throws RemoteException; 2142 public VolumeRecord[] getVolumeRecords(int flags) throws RemoteException; 2143 2144 public void mount(String volId) throws RemoteException; 2145 public void unmount(String volId) throws RemoteException; 2146 public void format(String volId) throws RemoteException; 2147 public long benchmark(String volId) throws RemoteException; 2148 2149 public void partitionPublic(String diskId) throws RemoteException; 2150 public void partitionPrivate(String diskId) throws RemoteException; 2151 public void partitionMixed(String diskId, int ratio) throws RemoteException; 2152 2153 public void setVolumeNickname(String fsUuid, String nickname) throws RemoteException; 2154 public void setVolumeUserFlags(String fsUuid, int flags, int mask) throws RemoteException; 2155 public void forgetVolume(String fsUuid) throws RemoteException; 2156 public void forgetAllVolumes() throws RemoteException; 2157 public void setDebugFlags(int flags, int mask) throws RemoteException; 2158 2159 public String getPrimaryStorageUuid() throws RemoteException; 2160 public void setPrimaryStorageUuid(String volumeUuid, IPackageMoveObserver callback) 2161 throws RemoteException; 2162 } 2163