1be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root/* 2be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Copyright (C) 2009 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 related to shutdown. 27be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 28be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @hide - For internal consumption only. 29be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 30be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Rootpublic interface IMountShutdownObserver extends IInterface { 31be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Local-side IPC implementation stub class. */ 32be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static abstract class Stub extends Binder implements IMountShutdownObserver { 33be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static final java.lang.String DESCRIPTOR = "IMountShutdownObserver"; 34be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 35be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** Construct the stub at attach it to the interface. */ 36be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public Stub() { 37be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.attachInterface(this, DESCRIPTOR); 38be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 39be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 40be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 41be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * Cast an IBinder object into an IMountShutdownObserver interface, 42be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * generating a proxy if needed. 43be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 44be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public static IMountShutdownObserver asInterface(IBinder obj) { 45be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if ((obj == null)) { 46be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return null; 47be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 48be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root IInterface iin = (IInterface) obj.queryLocalInterface(DESCRIPTOR); 49be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root if (((iin != null) && (iin instanceof IMountShutdownObserver))) { 50be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return ((IMountShutdownObserver) iin); 51be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 52be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return new IMountShutdownObserver.Stub.Proxy(obj); 53be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 54be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 55be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 56be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return this; 57be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 58be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 59be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root @Override 60be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public boolean onTransact(int code, Parcel data, Parcel reply, int flags) 61be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root throws RemoteException { 62be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root switch (code) { 63be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case INTERFACE_TRANSACTION: { 64be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeString(DESCRIPTOR); 65be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 66be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 67be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root case TRANSACTION_onShutDownComplete: { 68be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root data.enforceInterface(DESCRIPTOR); 69be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root int statusCode; 70be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root statusCode = data.readInt(); 71be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root this.onShutDownComplete(statusCode); 72be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root reply.writeNoException(); 73be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return true; 74be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 75be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 76be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return super.onTransact(code, data, reply, flags); 77be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 78be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 79be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private static class Proxy implements IMountShutdownObserver { 80be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root private IBinder mRemote; 81be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 82be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Proxy(IBinder remote) { 83be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote = remote; 84be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 85be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 86be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public IBinder asBinder() { 87be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return mRemote; 88be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 89be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 90be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public java.lang.String getInterfaceDescriptor() { 91be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root return DESCRIPTOR; 92be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 93be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 94be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 95be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * This method is called when the shutdown of MountService 96be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * completed. 97be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 98be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param statusCode indicates success or failure of the shutdown. 99be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 100be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onShutDownComplete(int statusCode) throws RemoteException { 101be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _data = Parcel.obtain(); 102be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root Parcel _reply = Parcel.obtain(); 103be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root try { 104be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInterfaceToken(DESCRIPTOR); 105be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.writeInt(statusCode); 106be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root mRemote.transact(Stub.TRANSACTION_onShutDownComplete, _data, _reply, 0); 107be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.readException(); 108be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } finally { 109be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _reply.recycle(); 110be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root _data.recycle(); 111be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 112be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 113be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 114be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 115be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root static final int TRANSACTION_onShutDownComplete = (IBinder.FIRST_CALL_TRANSACTION + 0); 116be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root } 117be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root 118be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root /** 119be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * This method is called when the shutdown of MountService completed. 120be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * 121be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root * @param statusCode indicates success or failure of the shutdown. 122be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root */ 123be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root public void onShutDownComplete(int statusCode) throws RemoteException; 124be857d42849eaaa554d4772dbba7755f8a0f3547Kenny Root} 125