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