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