1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/* 2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright (C) 2010 The Android Open Source Project 3be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 4be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * you may not use this file except in compliance with the License. 6be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * You may obtain a copy of the License at 7be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 8be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 9be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 10be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Unless required by applicable law or agreed to in writing, software 11be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * See the License for the specific language governing permissions and 14be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * limitations under the License. 15be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 16be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 17be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpackage android.os.storage; 18be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 19be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Binder; 20be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IBinder; 21be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.IInterface; 22be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.Parcel; 23be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootimport android.os.RemoteException; 24be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 25be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/** 26be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Callback class for receiving events from MountService about Opaque Binary 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Blobs (OBBs). 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - Applications should use StorageManager to interact with OBBs. 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IObbActionListener extends IInterface { 32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Local-side IPC implementation stub class. */ 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static abstract class Stub extends Binder implements IObbActionListener { 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static final String DESCRIPTOR = "IObbActionListener"; 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Construct the stub at attach it to the interface. */ 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public Stub() { 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.attachInterface(this, DESCRIPTOR); 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Cast an IBinder object into an IObbActionListener interface, 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * generating a proxy if needed. 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static IObbActionListener asInterface(IBinder obj) { 46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if ((obj == null)) { 47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return null; 48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR); 50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (((iin != null) && (iin instanceof IObbActionListener))) { 51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return ((IObbActionListener) iin); 52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return new IObbActionListener.Stub.Proxy(obj); 54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return this; 58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root @Override 61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root throws RemoteException { 63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root switch (code) { 64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case INTERFACE_TRANSACTION: { 65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeString(DESCRIPTOR); 66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case TRANSACTION_onObbResult: { 69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.enforceInterface(DESCRIPTOR); 70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root String filename; 71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root filename = data.readString(); 72af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root int nonce; 73af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root nonce = data.readInt(); 74af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root int status; 75af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root status = data.readInt(); 76af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root this.onObbResult(filename, nonce, status); 77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeNoException(); 78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return super.onTransact(code, data, reply, flags); 82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static class Proxy implements IObbActionListener { 85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private IBinder mRemote; 86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Proxy(IBinder remote) { 88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote = remote; 89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return mRemote; 93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public String getInterfaceDescriptor() { 96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return DESCRIPTOR; 97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Return from an OBB action result. 101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param filename the path to the OBB the operation was performed 103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * on 104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param returnCode status of the operation 105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 106af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void onObbResult(String filename, int nonce, int status) 107af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root throws RemoteException { 108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _data = Parcel.obtain(); 109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _reply = Parcel.obtain(); 110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root try { 111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeString(filename); 113af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root _data.writeInt(nonce); 114af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root _data.writeInt(status); 115b7db2726e91f1d9480359d0f83b9cb7769906b34Kenny Root mRemote.transact(Stub.TRANSACTION_onObbResult, _data, _reply, 1161358b6a4fb68e81058aa938e46b125350bdf0fffJean-Baptiste Queru android.os.IBinder.FLAG_ONEWAY); 117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.readException(); 118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } finally { 119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.recycle(); 120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.recycle(); 121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 125be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static final int TRANSACTION_onObbResult = (IBinder.FIRST_CALL_TRANSACTION + 0); 126be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 127be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 128be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 129be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Return from an OBB action result. 130be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 131be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param filename the path to the OBB the operation was performed on 132af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root * @param nonce identifier that is meaningful to the receiver 133af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root * @param status status code as defined in {@link OnObbStateChangeListener} 134be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 135af9d667ccf3e24058214cf4cc0a8aa8bc5100e3cKenny Root public void onObbResult(String filename, int nonce, int status) throws RemoteException; 136be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root} 137