| /* |
| * 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 com.motorola.studio.android.utilities; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.OutputStream; |
| import java.io.PrintWriter; |
| |
| import org.apache.commons.net.telnet.TelnetClient; |
| |
| /** |
| * DESCRIPTION: This class defines the framework for telnet services to |
| * comunicate with phoe or emulator devices. <BR> |
| * RESPONSIBILITY: Provide telnet connection <BR> |
| * COLABORATORS: none <BR> |
| * USAGE: This class should be instantiated whenever a telnet connection to a |
| * phone or emulator device is needed. <BR> |
| */ |
| public class TelnetFrameworkAndroid |
| { |
| |
| //private InputStreamReader responseReader; |
| |
| //private PrintWriter commandWriter; |
| |
| private TelnetClient telnetClient; |
| |
| private long timeout = 5000L; |
| |
| /** |
| * Connect to a device using telnet. |
| * |
| * @param telnetHost |
| * the telnet host IP address |
| * @param telnetPort |
| * the telnet port |
| * |
| * @throws MotodevException |
| * when the connection cannot be established |
| */ |
| public synchronized void connect(String telnetHost, int telnetPort) throws IOException |
| { |
| if ((telnetClient == null) || ((telnetClient != null) && (!telnetClient.isConnected()))) |
| { |
| telnetClient = new TelnetClient(telnetHost); |
| telnetClient.connect(telnetHost, telnetPort); |
| } |
| } |
| |
| /** |
| * Disconnect a telnet connection to a device |
| * |
| * @throws MotodevException |
| * when the disconnection cannot be executed |
| */ |
| public synchronized void disconnect() throws IOException |
| { |
| if ((telnetClient != null) && (telnetClient.isConnected())) |
| { |
| telnetClient.disconnect(); |
| } |
| } |
| |
| /** |
| * @return |
| * |
| */ |
| public synchronized String write(String telnetInputText, String[] waitFor) throws IOException |
| { |
| PrintWriter commandWriter = null; |
| try |
| { |
| commandWriter = new PrintWriter(telnetClient.getOutputStream()); |
| commandWriter.println(telnetInputText); |
| commandWriter.flush(); |
| if (waitFor != null) |
| { |
| return waitFor(waitFor); |
| } |
| } |
| finally |
| { |
| if (commandWriter != null) |
| { |
| commandWriter.close(); |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Tests if the telnet client instance is connected |
| * |
| * @return true if it is connected; false otherwise |
| */ |
| public boolean isConnected() |
| { |
| boolean connected = false; |
| if (telnetClient != null) |
| { |
| connected = telnetClient.isConnected(); |
| } |
| return connected; |
| } |
| |
| /** |
| * |
| */ |
| public String waitFor(String[] waitForArray) throws IOException |
| { |
| InputStreamReader responseReader = null; |
| StringBuffer answerFromRemoteHost = new StringBuffer(); |
| |
| try |
| { |
| responseReader = new InputStreamReader(telnetClient.getInputStream()); |
| |
| boolean found = false; |
| |
| do |
| { |
| char readChar = 0; |
| long currentTime = System.currentTimeMillis(); |
| long timeoutTime = currentTime + timeout; |
| |
| while (readChar == 0) |
| { |
| if (responseReader == null) |
| { |
| // responseReader can only be set to null if method |
| // releaseTelnetInputStreamReader() |
| // has been called, which should happen if host becomes |
| // unavailable. |
| throw new IOException( |
| "Telnet host is unavailable; stopped waiting for answer."); |
| } |
| |
| if (responseReader.ready()) |
| { |
| readChar = (char) responseReader.read(); |
| } |
| else |
| { |
| try |
| { |
| Thread.sleep(50); |
| } |
| catch (InterruptedException e) |
| { |
| // Do nothing |
| } |
| } |
| |
| currentTime = System.currentTimeMillis(); |
| |
| if ((!responseReader.ready()) && (currentTime > timeoutTime)) |
| { |
| throw new IOException( |
| "A timeout has occured when trying to read the telnet stream"); |
| } |
| } |
| |
| answerFromRemoteHost.append(readChar); |
| |
| for (String aWaitFor : waitForArray) |
| { |
| found = answerFromRemoteHost.toString().contains(aWaitFor); |
| } |
| |
| } |
| while (!found); |
| } |
| finally |
| { |
| if (responseReader != null) |
| { |
| responseReader.close(); |
| } |
| } |
| |
| return answerFromRemoteHost.toString(); |
| } |
| |
| /** |
| * Retrieves the input stream associated to this telnet connection |
| */ |
| public InputStream getInputStream() |
| { |
| InputStream s = null; |
| if (telnetClient != null) |
| { |
| s = telnetClient.getInputStream(); |
| } |
| return s; |
| } |
| |
| /** |
| * Retrieves the output stream associated to this telnet connection |
| */ |
| public OutputStream getOutputStream() |
| { |
| OutputStream s = null; |
| if (telnetClient != null) |
| { |
| s = telnetClient.getOutputStream(); |
| } |
| return s; |
| } |
| } |