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