1dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/*
2dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Copyright (C) 2016 The Android Open Source Project
3dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
4dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * you may not use this file except in compliance with the License.
6dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * You may obtain a copy of the License at
7dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
8dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber *
10dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * See the License for the specific language governing permissions and
14dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber * limitations under the License.
15dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber */
16dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
17dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberpackage android.os;
18dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
19f3c53496c055c523c93025e9ddf6eab97de84476Steven Morelandimport java.util.ArrayList;
20c0631d0bb72781b81dabd66064ee5a5dda2d6103Steven Morelandimport java.util.NoSuchElementException;
21dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberimport libcore.util.NativeAllocationRegistry;
22dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
23dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber/** @hide */
24dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huberpublic abstract class HwBinder implements IHwBinder {
25dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static final String TAG = "HwBinder";
26dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
27dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static final NativeAllocationRegistry sNativeRegistry;
28dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
29dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public HwBinder() {
30dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        native_setup();
31dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
32dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        sNativeRegistry.registerNativeAllocation(
33dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                this,
34dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                mNativeContext);
35dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
36dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
37e62b1f32f3ab72508daeda63c9be49743e8f8b7eSteven Moreland    @Override
38dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public final native void transact(
39e62b1f32f3ab72508daeda63c9be49743e8f8b7eSteven Moreland            int code, HwParcel request, HwParcel reply, int flags)
40e62b1f32f3ab72508daeda63c9be49743e8f8b7eSteven Moreland        throws RemoteException;
41dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
42dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    public abstract void onTransact(
43e62b1f32f3ab72508daeda63c9be49743e8f8b7eSteven Moreland            int code, HwParcel request, HwParcel reply, int flags)
44e62b1f32f3ab72508daeda63c9be49743e8f8b7eSteven Moreland        throws RemoteException;
45dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
4685d12da977d575a7461867a732084d64488d1502Martijn Coenen    public native final void registerService(String serviceName)
47c0631d0bb72781b81dabd66064ee5a5dda2d6103Steven Moreland        throws RemoteException;
4835eb7994f81c3507583bccc6f43fc0258f3a1e91Andreas Huber
4935eb7994f81c3507583bccc6f43fc0258f3a1e91Andreas Huber    public static native final IHwBinder getService(
50f3c53496c055c523c93025e9ddf6eab97de84476Steven Moreland            String iface,
51c0631d0bb72781b81dabd66064ee5a5dda2d6103Steven Moreland            String serviceName)
52c0631d0bb72781b81dabd66064ee5a5dda2d6103Steven Moreland        throws RemoteException, NoSuchElementException;
53dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
54dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    // Returns address of the "freeFunction".
55dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private static native final long native_init();
56dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
57dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private native final void native_setup();
58dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
59dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    static {
60dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        long freeFunction = native_init();
61dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
62dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber        sNativeRegistry = new NativeAllocationRegistry(
63dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                HwBinder.class.getClassLoader(),
64dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                freeFunction,
65dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber                128 /* size */);
66dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    }
67dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber
68dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber    private long mNativeContext;
69dab5fc65b92b37ee623b10f86a6ccf1709ba17d4Andreas Huber}
70