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