Skip to content
This repository has been archived by the owner on Dec 31, 2022. It is now read-only.

Create funcion shell interactive #118

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion SharpAdbClient/AdbSocket.cs
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ public Stream GetShellStream()
/// <remarks>
/// This uses the default time out value.
/// </remarks>
protected bool Write(byte[] data)
internal bool Write(byte[] data)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you're actually using this method, right? So can we keep it protected?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, you're right, I called this function, but I switched to

 (shellStream.Inner as System.Net.Sockets.NetworkStream).Write(bytes, 0, bytes.Length);

I'll correct it, thank you.

{
try
{
Expand Down
100 changes: 100 additions & 0 deletions SharpAdbClient/InteractiveShell/Shell.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using SharpAdbClient.Exceptions;
using SharpAdbClient.Logs;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SharpAdbClient.InteractiveShell
{
public delegate Boolean ShellResponseEventHandler(String adbResponse, ShellResponseEventArgs args);

public class Shell
{
public event ShellResponseEventHandler ResponseAdb = null;

public AdbClient AdbClient { get; set;}

public Shell(AdbClient adbClient)
{
this.AdbClient = adbClient;
}

public async Task ExecuteRemoteCommandAsync(string command, DeviceData device, CancellationToken cancellationToken, int maxTimeToOutputResponse)
{
using (AdbSocket adbSocket = new AdbSocket(this.AdbClient.EndPoint))
{
cancellationToken.Register(() => adbSocket.Dispose());
this.AdbClient.SetDevice(adbSocket, device);
adbSocket.SendAdbRequest($"shell:{command}");
var response = adbSocket.ReadAdbResponse();

ShellResponseEventArgs shellResponseEventArgs = new ShellResponseEventArgs(this);
shellResponseEventArgs.LastCommand = command;

try
{
var shellStream = (adbSocket.GetShellStream() as ShellStream);

using (StreamReader reader = new StreamReader(shellStream.Inner, AdbClient.Encoding))
{
while (!cancellationToken.IsCancellationRequested && shellResponseEventArgs.CloseShell == false)
{
var line = await reader.ReadLineAsync().ConfigureAwait(false);

if (ResponseAdb(line, shellResponseEventArgs))
{
if (String.IsNullOrEmpty(shellResponseEventArgs.NextCommand) == false)
{
byte[] bytes = FormAdbNextRequest(shellResponseEventArgs.NextCommand);

(shellStream.Inner as System.Net.Sockets.NetworkStream).Write(bytes, 0, bytes.Length);
(shellStream.Inner as System.Net.Sockets.NetworkStream).Flush();
shellResponseEventArgs.LastCommand = shellResponseEventArgs.NextCommand;
shellResponseEventArgs.NextCommand = null;
}
}


}
}
}
catch (Exception e)
{
if (!cancellationToken.IsCancellationRequested)
{
throw new ShellCommandUnresponsiveException(e);
}
}
finally
{

}
}

}

public static byte[] FormAdbNextRequest(string req)
{
byte[] result = AdbClient.Encoding.GetBytes(req + "\n");
return result;
}
}


public class ShellResponseEventArgs : EventArgs
{
public Shell Shell { get; private set; }
public String LastCommand { get; internal set; }
public String NextCommand { get; set; }
public Boolean CloseShell { get; set; } = false;

public ShellResponseEventArgs(Shell shell)
{
this.Shell = shell;
}
}
}