/*
* Copyright (C) 2013 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.ddmlib;
import com.android.annotations.NonNull;
import java.io.IOException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
/**
* An abstract device that can receive shell commands.
*/
public interface IShellEnabledDevice {
/**
* Returns a (humanized) name for this device. Typically this is the AVD name for AVD's, and
* a combination of the manufacturer name, model name & serial number for devices.
*/
String getName();
/**
* Executes a shell command on the device, and sends the result to a <var>receiver</var>.
* <p/><var>maxTimeToOutputResponse</var> is used as a maximum waiting time when expecting the
* command output from the device.<br>
* At any time, if the shell command does not output anything for a period longer than
* <var>maxTimeToOutputResponse</var>, then the method will throw
* {@link ShellCommandUnresponsiveException}.
* <p/>For commands like log output, a <var>maxTimeToOutputResponse</var> value of 0, meaning
* that the method will never throw and will block until the receiver's
* {@link IShellOutputReceiver#isCancelled()} returns <code>true</code>, should be
* used.
*
* @param command the shell command to execute
* @param receiver the {@link IShellOutputReceiver} that will receives the output of the shell
* command
* @param maxTimeToOutputResponse the maximum amount of time during which the command is allowed
* to not output any response. A value of 0 means the method will wait forever
* (until the <var>receiver</var> cancels the execution) for command output and
* never throw.
* @param maxTimeUnits Units for non-zero {@code maxTimeToOutputResponse} values.
* @throws TimeoutException in case of timeout on the connection when sending the command.
* @throws AdbCommandRejectedException if adb rejects the command.
* @throws ShellCommandUnresponsiveException in case the shell command doesn't send any output
* for a period longer than <var>maxTimeToOutputResponse</var>.
* @throws IOException in case of I/O error on the connection.
*
* @see DdmPreferences#getTimeOut()
*/
void executeShellCommand(String command, IShellOutputReceiver receiver,
long maxTimeToOutputResponse, TimeUnit maxTimeUnits)
throws TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException,
IOException;
/**
* Do a potential asynchronous query for a system property.
*
* @param name the name of the value to return.
* @return a {@link java.util.concurrent.Future} which can be used to retrieve value of property. Future#get() can
* return null if property can not be retrieved.
*/
@NonNull
Future<String> getSystemProperty(@NonNull String name);
}