| /* |
| * 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(); |
| } |
| } |
| } |
| |