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;
22636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestigimport java.util.Locale;
2334385d352da19805ae948215e2edbeedd16b7941Elliott Hughesimport static android.system.OsConstants.*;
2437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
2537237839e87988208296a57d70767ebbd9c6880bJohn Grossmanclass CommonTimeUtils {
2637237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
2737237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Successful operation.
2837237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
2937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int SUCCESS = 0;
3037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3137237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Unspecified error.
3237237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
3337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR = -1;
3437237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3537237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Operation failed due to bad parameter value.
3637237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
3737237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR_BAD_VALUE = -4;
3837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    /**
3937237839e87988208296a57d70767ebbd9c6880bJohn Grossman     * Operation failed due to dead remote object.
4037237839e87988208296a57d70767ebbd9c6880bJohn Grossman     */
4137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public static final int ERROR_DEAD_OBJECT = -7;
4237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
4337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public CommonTimeUtils(IBinder remote, String interfaceDesc) {
4437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        mRemote = remote;
4537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        mInterfaceDesc = interfaceDesc;
4637237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
4737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
4837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactGetInt(int method_code, int error_ret_val)
4937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
5037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
5137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
5237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        int ret_val;
5337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
5437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
5537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
5637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
5737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
5837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
5937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
6037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readInt() : error_ret_val;
6137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
6237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
6337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
6437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
6537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
6637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
6737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
6837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
6937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
7037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetInt(int method_code, int val) {
7137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
7237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
7337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
7437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
7537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
7637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInt(val);
7737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
7837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
7937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
8037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
8237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
8337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
8537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
8637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
8737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
8837237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
8937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
9037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public long transactGetLong(int method_code, long error_ret_val)
9137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
9237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
9337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
9437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        long ret_val;
9537237839e87988208296a57d70767ebbd9c6880bJohn Grossman
9637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
9737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
9837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
9937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
10037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
10137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
10237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readLong() : error_ret_val;
10337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
10437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
10537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
10637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
10737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
10837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
10937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
11037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
11137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
11237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetLong(int method_code, long val) {
11337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
11437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
11537237839e87988208296a57d70767ebbd9c6880bJohn Grossman
11637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
11737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
11837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeLong(val);
11937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
12037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
12137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
12237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
12337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
12437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
12537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
12637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
12737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
12837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
12937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
13037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
13137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
13237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public String transactGetString(int method_code, String error_ret_val)
13337237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
13437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
13537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
13637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        String ret_val;
13737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
13837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
13937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
14037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
14137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
14237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
14337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
14437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = (0 == res) ? reply.readString() : error_ret_val;
14537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
14637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
14737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
14837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
14937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
15037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
15237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
15337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15437237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetString(int method_code, String val) {
15537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
15637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
15737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
15837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
15937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
16037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeString(val);
16137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
16237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
16337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return reply.readInt();
16437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
16537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
16637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            return ERROR_DEAD_OBJECT;
16737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
16837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
16937237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
17037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
17137237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
17237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
17337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
17437237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public InetSocketAddress transactGetSockaddr(int method_code)
17537237839e87988208296a57d70767ebbd9c6880bJohn Grossman    throws RemoteException {
17637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
17737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
17837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        InetSocketAddress ret_val = null;
17937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
18037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
18137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            int res;
18237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
18337237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
18437237839e87988208296a57d70767ebbd9c6880bJohn Grossman
18537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            res = reply.readInt();
18637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            if (0 == res) {
18737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                int type;
18837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                int port = 0;
18937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                String addrStr = null;
19037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
19137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                type = reply.readInt();
19237237839e87988208296a57d70767ebbd9c6880bJohn Grossman
19337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (AF_INET == type) {
19437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr = reply.readInt();
19537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    port = reply.readInt();
196636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                    addrStr = String.format(Locale.US, "%d.%d.%d.%d",
197636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr >> 24) & 0xFF,
198636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr >> 16) & 0xFF,
199636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr >>  8) & 0xFF,
200636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                        addr        & 0xFF);
20137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else if (AF_INET6 == type) {
20237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr1 = reply.readInt();
20337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr2 = reply.readInt();
20437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr3 = reply.readInt();
20537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int addr4 = reply.readInt();
20637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
20737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    port = reply.readInt();
20837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
20937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int flowinfo = reply.readInt();
21037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int scope_id = reply.readInt();
21137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
212636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                    addrStr = String.format(Locale.US, "[%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X]",
213636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr1 >> 16) & 0xFFFF, addr1 & 0xFFFF,
214636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr2 >> 16) & 0xFFFF, addr2 & 0xFFFF,
215636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr3 >> 16) & 0xFFFF, addr3 & 0xFFFF,
216636c0ff499e01b3dfe90264fc26f3df5ca6346cfJohan Redestig                                                       (addr4 >> 16) & 0xFFFF, addr4 & 0xFFFF);
21737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
21837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
21937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (null != addrStr) {
22037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    ret_val = new InetSocketAddress(addrStr, port);
22137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
22237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            }
22337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
22437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
22537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
22637237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
22737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
22837237839e87988208296a57d70767ebbd9c6880bJohn Grossman
22937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
23037237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
23137237839e87988208296a57d70767ebbd9c6880bJohn Grossman
23237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    public int transactSetSockaddr(int method_code, InetSocketAddress addr) {
23337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel data  = android.os.Parcel.obtain();
23437237839e87988208296a57d70767ebbd9c6880bJohn Grossman        android.os.Parcel reply = android.os.Parcel.obtain();
23537237839e87988208296a57d70767ebbd9c6880bJohn Grossman        int ret_val = ERROR;
23637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
23737237839e87988208296a57d70767ebbd9c6880bJohn Grossman        try {
23837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.writeInterfaceToken(mInterfaceDesc);
23937237839e87988208296a57d70767ebbd9c6880bJohn Grossman
24037237839e87988208296a57d70767ebbd9c6880bJohn Grossman            if (null == addr) {
24137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                data.writeInt(0);
24237237839e87988208296a57d70767ebbd9c6880bJohn Grossman            } else {
24337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                data.writeInt(1);
24437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final InetAddress a = addr.getAddress();
24537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final byte[]      b = a.getAddress();
24637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                final int         p = addr.getPort();
24737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
24837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (a instanceof Inet4Address) {
24937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int v4addr = (((int)b[0] & 0xFF) << 24) |
25037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                 (((int)b[1] & 0xFF) << 16) |
25137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                 (((int)b[2] & 0xFF) << 8) |
25237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                  ((int)b[3] & 0xFF);
25337237839e87988208296a57d70767ebbd9c6880bJohn Grossman
25437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(AF_INET);
25537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(v4addr);
25637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(p);
25737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else
25837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                if (a instanceof Inet6Address) {
25937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    int i;
26037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    Inet6Address v6 = (Inet6Address)a;
26137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(AF_INET6);
26237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    for (i = 0; i < 4; ++i) {
26337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                        int aword = (((int)b[(i*4) + 0] & 0xFF) << 24) |
26437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                    (((int)b[(i*4) + 1] & 0xFF) << 16) |
26537237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                    (((int)b[(i*4) + 2] & 0xFF) << 8) |
26637237839e87988208296a57d70767ebbd9c6880bJohn Grossman                                     ((int)b[(i*4) + 3] & 0xFF);
26737237839e87988208296a57d70767ebbd9c6880bJohn Grossman                        data.writeInt(aword);
26837237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    }
26937237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(p);
27037237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(0);   // flow info
27137237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    data.writeInt(v6.getScopeId());
27237237839e87988208296a57d70767ebbd9c6880bJohn Grossman                } else {
27337237839e87988208296a57d70767ebbd9c6880bJohn Grossman                    return ERROR_BAD_VALUE;
27437237839e87988208296a57d70767ebbd9c6880bJohn Grossman                }
27537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            }
27637237839e87988208296a57d70767ebbd9c6880bJohn Grossman
27737237839e87988208296a57d70767ebbd9c6880bJohn Grossman            mRemote.transact(method_code, data, reply, 0);
27837237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = reply.readInt();
27937237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
28037237839e87988208296a57d70767ebbd9c6880bJohn Grossman        catch (RemoteException e) {
28137237839e87988208296a57d70767ebbd9c6880bJohn Grossman            ret_val = ERROR_DEAD_OBJECT;
28237237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
28337237839e87988208296a57d70767ebbd9c6880bJohn Grossman        finally {
28437237839e87988208296a57d70767ebbd9c6880bJohn Grossman            reply.recycle();
28537237839e87988208296a57d70767ebbd9c6880bJohn Grossman            data.recycle();
28637237839e87988208296a57d70767ebbd9c6880bJohn Grossman        }
28737237839e87988208296a57d70767ebbd9c6880bJohn Grossman
28837237839e87988208296a57d70767ebbd9c6880bJohn Grossman        return ret_val;
28937237839e87988208296a57d70767ebbd9c6880bJohn Grossman    }
29037237839e87988208296a57d70767ebbd9c6880bJohn Grossman
29137237839e87988208296a57d70767ebbd9c6880bJohn Grossman    private IBinder mRemote;
29237237839e87988208296a57d70767ebbd9c6880bJohn Grossman    private String mInterfaceDesc;
29337237839e87988208296a57d70767ebbd9c6880bJohn Grossman};
294