178e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme/*
278e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * Copyright (C) 2016 The Android Open Source Project
378e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme *
478e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * Licensed under the Apache License, Version 2.0 (the "License");
578e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * you may not use this file except in compliance with the License.
678e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * You may obtain a copy of the License at
778e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme *
878e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme *      http://www.apache.org/licenses/LICENSE-2.0
978e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme *
1078e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * Unless required by applicable law or agreed to in writing, software
1178e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * distributed under the License is distributed on an "AS IS" BASIS,
1278e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1378e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * See the License for the specific language governing permissions and
1478e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme * limitations under the License.
1578e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme */
1678e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme
1778e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme#ifndef COMMANDLINE_H
1878e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme#define COMMANDLINE_H
1978e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme
2078e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme#include "adb.h"
2178e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme
2207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// Callback used to handle the standard streams (stdout and stderr) sent by the
2307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// device's upon receiving a command.
2407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme//
2507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Lemeclass StandardStreamsCallbackInterface {
2607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme  public:
2707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    StandardStreamsCallbackInterface() {
2807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
2907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // Handles the stdout output from devices supporting the Shell protocol.
3007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    virtual void OnStdout(const char* buffer, int length) = 0;
3107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
3207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // Handles the stderr output from devices supporting the Shell protocol.
3307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    virtual void OnStderr(const char* buffer, int length) = 0;
3407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
3507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // Indicates the communication is finished and returns the appropriate error
3607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // code.
3707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    //
3807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // |status| has the status code returning by the underlying communication
3907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // channels
4007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    virtual int Done(int status) = 0;
4107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
4207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme  protected:
4307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    static void OnStream(std::string* string, FILE* stream, const char* buffer, int length) {
4407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        if (string != nullptr) {
4507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme            string->append(buffer, length);
4607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        } else {
4707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme            fwrite(buffer, 1, length, stream);
4807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme            fflush(stream);
4907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        }
5007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
5107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
5207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme  private:
5307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    DISALLOW_COPY_AND_ASSIGN(StandardStreamsCallbackInterface);
5407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme};
5507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
5607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// Default implementation that redirects the streams to the equilavent host
5707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// stream or to a string
5807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// passed to the constructor.
5907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Lemeclass DefaultStandardStreamsCallback : public StandardStreamsCallbackInterface {
6007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme  public:
6107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // If |stdout_str| is non-null, OnStdout will append to it.
6207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    // If |stderr_str| is non-null, OnStderr will append to it.
6307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    DefaultStandardStreamsCallback(std::string* stdout_str, std::string* stderr_str)
6407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        : stdout_str_(stdout_str), stderr_str_(stderr_str) {
6507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
6607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
6707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    void OnStdout(const char* buffer, int length) {
6807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        OnStream(stdout_str_, stdout, buffer, length);
6907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
7007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
7107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    void OnStderr(const char* buffer, int length) {
7207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        OnStream(stderr_str_, stderr, buffer, length);
7307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
7407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
7507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    int Done(int status) {
7607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme        return status;
7707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    }
7807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
7907ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme  private:
8007ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    std::string* stdout_str_;
8107ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    std::string* stderr_str_;
8207ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
8307ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme    DISALLOW_COPY_AND_ASSIGN(DefaultStandardStreamsCallback);
8407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme};
8507ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
8607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// Singleton.
8707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Lemeextern DefaultStandardStreamsCallback DEFAULT_STANDARD_STREAMS_CALLBACK;
8807ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme
8978e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Lemeint adb_commandline(int argc, const char** argv);
9078e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Lemeint usage();
9178e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme
9278e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme// Connects to the device "shell" service with |command| and prints the
9378e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme// resulting output.
9407ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme// if |callback| is non-null, stdout/stderr output will be handled by it.
9578e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Lemeint send_shell_command(TransportType transport_type, const char* serial, const std::string& command,
9607ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme                       bool disable_shell_protocol, StandardStreamsCallbackInterface* callback =
9707ac8554b477dc81579a5e63a2fbabc740fa8a92Felipe Leme                                                        &DEFAULT_STANDARD_STREAMS_CALLBACK);
9878e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme
9978e0963e4bce9cc9f0bbf0b686004ba15b1e3929Felipe Leme#endif  // COMMANDLINE_H
100