/* * Copyright (C) 2011 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 com.android.tradefed.command; import com.android.tradefed.util.ArrayUtil; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * Class for sending remote commands to another TF process via sockets. */ public class RemoteClient { private final Socket mSocket; private final PrintWriter mWriter; private final BufferedReader mReader; /** * @param port * @throws IOException * @throws UnknownHostException */ RemoteClient(int port) throws UnknownHostException, IOException { String hostName = InetAddress.getLocalHost().getHostName(); mSocket = new Socket(hostName, port); mWriter = new PrintWriter(mSocket.getOutputStream(), true); mReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream())); } private synchronized boolean sendCommand(String... cmd) throws IOException { // TODO: use a more standard data protocol - such as Json mWriter.println(ArrayUtil.join(RemoteManager.DELIM, (Object[])cmd)); String response = mReader.readLine(); return response != null && Boolean.parseBoolean(response); } public static RemoteClient connect(int port) throws UnknownHostException, IOException { return new RemoteClient(port); } /** * Send a 'add this device to global ignore filter' command * @param serial * @throws IOException */ public boolean sendFilterDevice(String serial) throws IOException { return sendCommand(RemoteManager.FILTER, serial); } /** * Send a 'remove this device from global ignore filter' command * @param serial * @throws IOException */ public boolean sendUnfilterDevice(String serial) throws IOException { return sendCommand(RemoteManager.UNFILTER, serial); } /** * Send a 'add command' command. * * @param commandArgs */ public boolean sendAddCommand(long totalTime, String... commandArgs) throws IOException { String[] fullList = ArrayUtil.buildArray(new String[] {RemoteManager.ADD_COMMAND, Long.toString(totalTime)}, commandArgs); return sendCommand(fullList); } /** * Send a 'close connection' command * * @throws IOException */ public boolean sendClose() throws IOException { return sendCommand(RemoteManager.CLOSE); } /** * Close the connection to the {@link RemoteManager}. */ public synchronized void close() { if (mSocket != null) { try { mSocket.close(); } catch (IOException e) { // ignore } } if (mWriter != null) { mWriter.close(); } } }