12cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville/* 22cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Copyright (C) 2010, The Android Open Source Project 32cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 42cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 52cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * you may not use this file except in compliance with the License. 62cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * You may obtain a copy of the License at 72cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 82cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * http://www.apache.org/licenses/LICENSE-2.0 92cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 102cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Unless required by applicable law or agreed to in writing, software 112cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 122cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * See the License for the specific language governing permissions and 142cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * limitations under the License. 152cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 162cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 172cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savillepackage com.android.internal.telephony; 182cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 192cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savilleimport android.util.Log; 202cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 212cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savilleimport java.io.IOException; 222cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savilleimport java.net.InetSocketAddress; 232cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savilleimport java.nio.channels.SocketChannel; 242cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savilleimport java.nio.ByteBuffer; 252cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 262cfb450e1a044b928917b2e40ec90ab03d66b12bWink Savillepublic class RilChannel { 272cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private static final boolean DBG = false; 282cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 292cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private static final String MOCKRIL_ADDR_STR = "127.0.0.1"; 302cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private static final int MOCKRIL_PORT = 54312; 312cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private SocketChannel mChannel = null; 322cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 332cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 342cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Constructor 352cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 362cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private RilChannel() { 372cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville if (DBG) log("ctor EX"); 382cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 392cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 402cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 412cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Open the channel 422cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 432cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 442cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 452cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville private void open() throws IOException { 462cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville InetSocketAddress mockRilAddr = new InetSocketAddress(MOCKRIL_ADDR_STR, MOCKRIL_PORT); 472cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville mChannel= SocketChannel.open(mockRilAddr); 482cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 492cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 502cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 512cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Make the channel 522cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 532cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return the channel 542cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 552cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 562cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public static RilChannel makeRilChannel() throws IOException { 572cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville if (DBG) log("makeMockRilChannel E"); 582cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville RilChannel sm = new RilChannel(); 592cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville sm.open(); 602cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville if (DBG) log("makeMockRilChannel X"); 612cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return sm; 622cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 632cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 642cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 652cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Close an open channel 662cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 672cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public void close() { 682cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville try { 692cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville if (mChannel != null) { 702cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville mChannel.close(); 712cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville if (DBG) log("DefaultState.enter closed socket"); 722cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 732cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } catch (IOException e) { 742cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville log("Could not close conection to mock-ril"); 752cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville e.printStackTrace(); 762cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 772cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 782cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 792cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 802cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return the channel 812cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 822cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public SocketChannel getChannel() { 832cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return mChannel; 842cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 852cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 862cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 872cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * write the bb contents to sc 882cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 892cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @param bb is the ByteBuffer to write 902cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return number of bytes written 912cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 922cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 932cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public final int sendAll(ByteBuffer bb) throws IOException { 942cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville int count = 0; 952cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville while (bb.remaining() != 0) { 962cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville count += mChannel.write(bb); 972cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 982cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return count; 992cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1002cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 1012cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 1022cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * read from sc until bb is filled then rewind bb 1032cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 1042cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @param bb is the ByteBuffer to fill 1052cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return number of bytes read 1062cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 1072cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 1082cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public final int recvAll(ByteBuffer bb) throws IOException { 1092cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville int count = 0; 1102cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville while (bb.remaining() != 0) { 1112cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville count += mChannel.read(bb); 1122cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1132cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return count; 1142cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1152cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 1162cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 1172cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Rewind bb then write the contents to sc 1182cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 1192cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @param bb is the ByteBuffer to write 1202cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return number of bytes written 1212cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 1222cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 1232cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public final int rewindSendAll(ByteBuffer bb) throws IOException { 1242cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville bb.rewind(); 1252cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return sendAll(bb); 1262cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1272cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 1282cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 1292cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * read from sc until bb is filled then rewind bb 1302cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 1312cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @param bb is the ByteBuffer to fill 1322cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @return number of bytes read 1332cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @throws IOException 1342cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 1352cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville public final int recvAllRewind(ByteBuffer bb) throws IOException { 1362cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville int count = recvAll(bb); 1372cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville bb.rewind(); 1382cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville return count; 1392cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1402cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville 1412cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville /** 1422cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * Write to log. 1432cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * 1442cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville * @param s 1452cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville */ 1462cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville static void log(String s) { 1472cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville Log.v("MockRilChannel", s); 1482cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville } 1492cfb450e1a044b928917b2e40ec90ab03d66b12bWink Saville} 150