diff options
Diffstat (limited to 'src/plugins/android/src/com/motorola/studio/android/utilities/TelnetFrameworkAndroid.java')
-rw-r--r-- | src/plugins/android/src/com/motorola/studio/android/utilities/TelnetFrameworkAndroid.java | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/src/plugins/android/src/com/motorola/studio/android/utilities/TelnetFrameworkAndroid.java b/src/plugins/android/src/com/motorola/studio/android/utilities/TelnetFrameworkAndroid.java new file mode 100644 index 0000000..f92a1a3 --- /dev/null +++ b/src/plugins/android/src/com/motorola/studio/android/utilities/TelnetFrameworkAndroid.java @@ -0,0 +1,225 @@ +/* + * 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; + } +} |