| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package android.os; |
| |
| import java.net.InetAddress; |
| import java.net.Inet4Address; |
| import java.net.Inet6Address; |
| import java.net.InetSocketAddress; |
| import java.util.Locale; |
| import static android.system.OsConstants.*; |
| |
| class CommonTimeUtils { |
| /** |
| * Successful operation. |
| */ |
| public static final int SUCCESS = 0; |
| /** |
| * Unspecified error. |
| */ |
| public static final int ERROR = -1; |
| /** |
| * Operation failed due to bad parameter value. |
| */ |
| public static final int ERROR_BAD_VALUE = -4; |
| /** |
| * Operation failed due to dead remote object. |
| */ |
| public static final int ERROR_DEAD_OBJECT = -7; |
| |
| public CommonTimeUtils(IBinder remote, String interfaceDesc) { |
| mRemote = remote; |
| mInterfaceDesc = interfaceDesc; |
| } |
| |
| public int transactGetInt(int method_code, int error_ret_val) |
| throws RemoteException { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| int ret_val; |
| |
| try { |
| int res; |
| data.writeInterfaceToken(mInterfaceDesc); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| res = reply.readInt(); |
| ret_val = (0 == res) ? reply.readInt() : error_ret_val; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| |
| return ret_val; |
| } |
| |
| public int transactSetInt(int method_code, int val) { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| |
| try { |
| data.writeInterfaceToken(mInterfaceDesc); |
| data.writeInt(val); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| return reply.readInt(); |
| } |
| catch (RemoteException e) { |
| return ERROR_DEAD_OBJECT; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| } |
| |
| public long transactGetLong(int method_code, long error_ret_val) |
| throws RemoteException { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| long ret_val; |
| |
| try { |
| int res; |
| data.writeInterfaceToken(mInterfaceDesc); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| res = reply.readInt(); |
| ret_val = (0 == res) ? reply.readLong() : error_ret_val; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| |
| return ret_val; |
| } |
| |
| public int transactSetLong(int method_code, long val) { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| |
| try { |
| data.writeInterfaceToken(mInterfaceDesc); |
| data.writeLong(val); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| return reply.readInt(); |
| } |
| catch (RemoteException e) { |
| return ERROR_DEAD_OBJECT; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| } |
| |
| public String transactGetString(int method_code, String error_ret_val) |
| throws RemoteException { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| String ret_val; |
| |
| try { |
| int res; |
| data.writeInterfaceToken(mInterfaceDesc); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| res = reply.readInt(); |
| ret_val = (0 == res) ? reply.readString() : error_ret_val; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| |
| return ret_val; |
| } |
| |
| public int transactSetString(int method_code, String val) { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| |
| try { |
| data.writeInterfaceToken(mInterfaceDesc); |
| data.writeString(val); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| return reply.readInt(); |
| } |
| catch (RemoteException e) { |
| return ERROR_DEAD_OBJECT; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| } |
| |
| public InetSocketAddress transactGetSockaddr(int method_code) |
| throws RemoteException { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| InetSocketAddress ret_val = null; |
| |
| try { |
| int res; |
| data.writeInterfaceToken(mInterfaceDesc); |
| mRemote.transact(method_code, data, reply, 0); |
| |
| res = reply.readInt(); |
| if (0 == res) { |
| int type; |
| int port = 0; |
| String addrStr = null; |
| |
| type = reply.readInt(); |
| |
| if (AF_INET == type) { |
| int addr = reply.readInt(); |
| port = reply.readInt(); |
| addrStr = String.format(Locale.US, "%d.%d.%d.%d", |
| (addr >> 24) & 0xFF, |
| (addr >> 16) & 0xFF, |
| (addr >> 8) & 0xFF, |
| addr & 0xFF); |
| } else if (AF_INET6 == type) { |
| int addr1 = reply.readInt(); |
| int addr2 = reply.readInt(); |
| int addr3 = reply.readInt(); |
| int addr4 = reply.readInt(); |
| |
| port = reply.readInt(); |
| |
| int flowinfo = reply.readInt(); |
| int scope_id = reply.readInt(); |
| |
| addrStr = String.format(Locale.US, "[%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X]", |
| (addr1 >> 16) & 0xFFFF, addr1 & 0xFFFF, |
| (addr2 >> 16) & 0xFFFF, addr2 & 0xFFFF, |
| (addr3 >> 16) & 0xFFFF, addr3 & 0xFFFF, |
| (addr4 >> 16) & 0xFFFF, addr4 & 0xFFFF); |
| } |
| |
| if (null != addrStr) { |
| ret_val = new InetSocketAddress(addrStr, port); |
| } |
| } |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| |
| return ret_val; |
| } |
| |
| public int transactSetSockaddr(int method_code, InetSocketAddress addr) { |
| android.os.Parcel data = android.os.Parcel.obtain(); |
| android.os.Parcel reply = android.os.Parcel.obtain(); |
| int ret_val = ERROR; |
| |
| try { |
| data.writeInterfaceToken(mInterfaceDesc); |
| |
| if (null == addr) { |
| data.writeInt(0); |
| } else { |
| data.writeInt(1); |
| final InetAddress a = addr.getAddress(); |
| final byte[] b = a.getAddress(); |
| final int p = addr.getPort(); |
| |
| if (a instanceof Inet4Address) { |
| int v4addr = (((int)b[0] & 0xFF) << 24) | |
| (((int)b[1] & 0xFF) << 16) | |
| (((int)b[2] & 0xFF) << 8) | |
| ((int)b[3] & 0xFF); |
| |
| data.writeInt(AF_INET); |
| data.writeInt(v4addr); |
| data.writeInt(p); |
| } else |
| if (a instanceof Inet6Address) { |
| int i; |
| Inet6Address v6 = (Inet6Address)a; |
| data.writeInt(AF_INET6); |
| for (i = 0; i < 4; ++i) { |
| int aword = (((int)b[(i*4) + 0] & 0xFF) << 24) | |
| (((int)b[(i*4) + 1] & 0xFF) << 16) | |
| (((int)b[(i*4) + 2] & 0xFF) << 8) | |
| ((int)b[(i*4) + 3] & 0xFF); |
| data.writeInt(aword); |
| } |
| data.writeInt(p); |
| data.writeInt(0); // flow info |
| data.writeInt(v6.getScopeId()); |
| } else { |
| return ERROR_BAD_VALUE; |
| } |
| } |
| |
| mRemote.transact(method_code, data, reply, 0); |
| ret_val = reply.readInt(); |
| } |
| catch (RemoteException e) { |
| ret_val = ERROR_DEAD_OBJECT; |
| } |
| finally { |
| reply.recycle(); |
| data.recycle(); |
| } |
| |
| return ret_val; |
| } |
| |
| private IBinder mRemote; |
| private String mInterfaceDesc; |
| }; |