137237839e87988208296a57d70767ebbd9c6880bJohn Grossman/*
237237839e87988208296a57d70767ebbd9c6880bJohn Grossman * Copyright (C) 2012 The Android Open Source Project
337237839e87988208296a57d70767ebbd9c6880bJohn Grossman *
437237839e87988208296a57d70767ebbd9c6880bJohn Grossman * Licensed under the Apache License, Version 2.0 (the "License");
537237839e87988208296a57d70767ebbd9c6880bJohn Grossman * you may not use this file except in compliance with the License.
637237839e87988208296a57d70767ebbd9c6880bJohn Grossman * You may obtain a copy of the License at
737237839e87988208296a57d70767ebbd9c6880bJohn Grossman *
837237839e87988208296a57d70767ebbd9c6880bJohn Grossman *      http://www.apache.org/licenses/LICENSE-2.0
937237839e87988208296a57d70767ebbd9c6880bJohn Grossman *
1037237839e87988208296a57d70767ebbd9c6880bJohn Grossman * Unless required by applicable law or agreed to in writing, software
1137237839e87988208296a57d70767ebbd9c6880bJohn Grossman * distributed under the License is distributed on an "AS IS" BASIS,
1237237839e87988208296a57d70767ebbd9c6880bJohn Grossman * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1337237839e87988208296a57d70767ebbd9c6880bJohn Grossman * See the License for the specific language governing permissions and
1437237839e87988208296a57d70767ebbd9c6880bJohn Grossman * limitations under the License.
1537237839e87988208296a57d70767ebbd9c6880bJohn Grossman */
1637237839e87988208296a57d70767ebbd9c6880bJohn Grossmanpackage android.os;
1737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
1837237839e87988208296a57d70767ebbd9c6880bJohn Grossmanimport java.net.InetAddress;
1937237839e87988208296a57d70767ebbd9c6880bJohn Grossmanimport java.net.Inet4Address;
2037237839e87988208296a57d70767ebbd9c6880bJohn Grossmanimport java.net.Inet6Address;
2137237839e87988208296a57d70767ebbd9c6880bJohn Grossmanimport java.net.InetSocketAddress;
2237237839e87988208296a57d70767ebbd9c6880bJohn Grossmanimport static libcore.io.OsConstants.*;
2337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
2437237839e87988208296a57d70767ebbd9c6880bJohn Grossmanclass CommonTimeUtils {
2537237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
2637237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Successful operation.
2737237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
2837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int SUCCESS = 0;
2937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3037237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Unspecified error.
3137237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
3237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR = -1;
3337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3437237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Operation failed due to bad parameter value.
3537237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
3637237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR_BAD_VALUE = -4;
3737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3837237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Operation failed due to dead remote object.
3937237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
4037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR_DEAD_OBJECT = -7;
4137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
4237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public CommonTimeUtils(IBinder remote, String interfaceDesc) {
4337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        mRemote = remote;
4437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        mInterfaceDesc = interfaceDesc;
4537237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
4637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
4737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactGetInt(int method_code, int error_ret_val)
4837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
4937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
5037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
5137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        int ret_val;
5237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
5337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
5437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
5537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
5637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
5737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
5837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
5937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readInt() : error_ret_val;
6037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
6137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
6237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
6337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
6437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
6537237839e87988208296a57d70767ebbd9c6880bJohn Grossman
6637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
6737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
6837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
6937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetInt(int method_code, int val) {
7037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
7137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
7237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
7337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
7437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
7537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInt(val);
7637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
7737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
7837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
7937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
8137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
8237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
8437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
8537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
8637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
8837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
8937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public long transactGetLong(int method_code, long error_ret_val)
9037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
9137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
9237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
9337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        long ret_val;
9437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
9537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
9637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
9737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
9837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
9937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
10037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
10137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readLong() : error_ret_val;
10237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
10337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
10437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
10537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
10637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
10737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
10837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
10937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
11037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
11137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetLong(int method_code, long val) {
11237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
11337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
11437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
11537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
11637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
11737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeLong(val);
11837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
11937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
12037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
12137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
12237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
12337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
12437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
12537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
12637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
12737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
12837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
12937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
13037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
13137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public String transactGetString(int method_code, String error_ret_val)
13237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
13337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
13437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
13537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        String ret_val;
13637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
13737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
13837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
13937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
14037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
14137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
14237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
14337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readString() : error_ret_val;
14437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
14537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
14637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
14737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
14837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
14937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
15137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
15237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetString(int method_code, String val) {
15437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
15537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
15637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
15837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
15937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeString(val);
16037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
16137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
16237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
16337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
16437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
16537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
16637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
16737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
16837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
16937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
17037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
17137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
17237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
17337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public InetSocketAddress transactGetSockaddr(int method_code)
17437237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
17537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
17637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
17737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        InetSocketAddress ret_val = null;
17837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
17937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
18037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
18137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
18237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
18337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
18437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
18537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            if (0 == res) {
18637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                int type;
18737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                int port = 0;
18837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                String addrStr = null;
18937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
19037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                type = reply.readInt();
19137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
19237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (AF_INET == type) {
19337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr = reply.readInt();
19437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    port = reply.readInt();
19537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    addrStr = String.format("%d.%d.%d.%d", (addr >> 24) & 0xFF,
19637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                                           (addr >> 16) & 0xFF,
19737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                                           (addr >>  8) & 0xFF,
19837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                                            addr        & 0xFF);
19937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else if (AF_INET6 == type) {
20037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr1 = reply.readInt();
20137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr2 = reply.readInt();
20237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr3 = reply.readInt();
20337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr4 = reply.readInt();
20437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
20537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    port = reply.readInt();
20637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
20737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int flowinfo = reply.readInt();
20837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int scope_id = reply.readInt();
20937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
21037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    addrStr = String.format("[%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X]",
21137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                            (addr1 >> 16) & 0xFFFF, addr1 & 0xFFFF,
21237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                            (addr2 >> 16) & 0xFFFF, addr2 & 0xFFFF,
21337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                            (addr3 >> 16) & 0xFFFF, addr3 & 0xFFFF,
21437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                            (addr4 >> 16) & 0xFFFF, addr4 & 0xFFFF);
21537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
21637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
21737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (null != addrStr) {
21837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    ret_val = new InetSocketAddress(addrStr, port);
21937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
22037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            }
22137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
22237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
22337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
22437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
22537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
22637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
22737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
22837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
22937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
23037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetSockaddr(int method_code, InetSocketAddress addr) {
23137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
23237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
23337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        int ret_val = ERROR;
23437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
23537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
23637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
23737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
23837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            if (null == addr) {
23937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                data.writeInt(0);
24037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            } else {
24137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                data.writeInt(1);
24237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final InetAddress a = addr.getAddress();
24337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final byte[]      b = a.getAddress();
24437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final int         p = addr.getPort();
24537237839e87988208296a57d70767ebbd9c6880bJohn Grossman
24637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (a instanceof Inet4Address) {
24737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int v4addr = (((int)b[0] & 0xFF) << 24) |
24837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                 (((int)b[1] & 0xFF) << 16) |
24937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                 (((int)b[2] & 0xFF) << 8) |
25037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                  ((int)b[3] & 0xFF);
25137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
25237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(AF_INET);
25337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(v4addr);
25437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(p);
25537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else
25637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (a instanceof Inet6Address) {
25737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int i;
25837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    Inet6Address v6 = (Inet6Address)a;
25937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(AF_INET6);
26037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    for (i = 0; i < 4; ++i) {
26137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                        int aword = (((int)b[(i*4) + 0] & 0xFF) << 24) |
26237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                    (((int)b[(i*4) + 1] & 0xFF) << 16) |
26337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                    (((int)b[(i*4) + 2] & 0xFF) << 8) |
26437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                     ((int)b[(i*4) + 3] & 0xFF);
26537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                        data.writeInt(aword);
26637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    }
26737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(p);
26837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(0);   // flow info
26937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(v6.getScopeId());
27037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else {
27137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    return ERROR_BAD_VALUE;
27237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
27337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            }
27437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
27537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
27637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = reply.readInt();
27737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
27837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
27937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = ERROR_DEAD_OBJECT;
28037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
28137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
28237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
28337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
28437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
28537237839e87988208296a57d70767ebbd9c6880bJohn Grossman
28637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
28737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
28837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
28937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    private IBinder mRemote;
29037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    private String mInterfaceDesc;
29137237839e87988208296a57d70767ebbd9c6880bJohn Grossman};
292