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