/************************************************************************************
|
|
|
|
Copyright : Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
|
|
|
|
Licensed under the Oculus SDK License Version 3.4.1 (the "License");
|
|
you may not use the Oculus SDK except in compliance with the License,
|
|
which is provided at the time of installation or download, or which
|
|
otherwise accompanies this software in either electronic or hard copy form.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
https://developer.oculus.com/licenses/sdk-3.4.1
|
|
|
|
Unless required by applicable law or agreed to in writing, the Oculus SDK
|
|
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.
|
|
|
|
************************************************************************************/
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using UnityEngine;
|
|
|
|
using Debug = UnityEngine.Debug;
|
|
|
|
public class OVRADBTool
|
|
{
|
|
public bool isReady;
|
|
|
|
public string androidSdkRoot;
|
|
public string androidPlatformToolsPath;
|
|
public string adbPath;
|
|
|
|
public OVRADBTool(string androidSdkRoot)
|
|
{
|
|
if (!String.IsNullOrEmpty(androidSdkRoot))
|
|
{
|
|
this.androidSdkRoot = androidSdkRoot;
|
|
}
|
|
else
|
|
{
|
|
this.androidSdkRoot = String.Empty;
|
|
}
|
|
|
|
if (this.androidSdkRoot.EndsWith("\\") || this.androidSdkRoot.EndsWith("/"))
|
|
{
|
|
this.androidSdkRoot = this.androidSdkRoot.Remove(this.androidSdkRoot.Length - 1);
|
|
}
|
|
androidPlatformToolsPath = Path.Combine(this.androidSdkRoot, "platform-tools");
|
|
adbPath = Path.Combine(androidPlatformToolsPath, "adb.exe");
|
|
isReady = File.Exists(adbPath);
|
|
}
|
|
|
|
public static bool IsAndroidSdkRootValid(string androidSdkRoot)
|
|
{
|
|
OVRADBTool tool = new OVRADBTool(androidSdkRoot);
|
|
return tool.isReady;
|
|
}
|
|
|
|
public delegate void WaitingProcessToExitCallback();
|
|
|
|
public int StartServer(WaitingProcessToExitCallback waitingProcessToExitCallback)
|
|
{
|
|
string outputString;
|
|
string errorString;
|
|
|
|
int exitCode = RunCommand(new string[] { "start-server" }, waitingProcessToExitCallback, out outputString, out errorString);
|
|
return exitCode;
|
|
}
|
|
|
|
public int KillServer(WaitingProcessToExitCallback waitingProcessToExitCallback)
|
|
{
|
|
string outputString;
|
|
string errorString;
|
|
|
|
int exitCode = RunCommand(new string[] { "kill-server" }, waitingProcessToExitCallback, out outputString, out errorString);
|
|
return exitCode;
|
|
}
|
|
|
|
public int ForwardPort(int port, WaitingProcessToExitCallback waitingProcessToExitCallback)
|
|
{
|
|
string outputString;
|
|
string errorString;
|
|
|
|
string portString = string.Format("tcp:{0}", port);
|
|
|
|
int exitCode = RunCommand(new string[] { "forward", portString, portString }, waitingProcessToExitCallback, out outputString, out errorString);
|
|
return exitCode;
|
|
}
|
|
|
|
public int ReleasePort(int port, WaitingProcessToExitCallback waitingProcessToExitCallback)
|
|
{
|
|
string outputString;
|
|
string errorString;
|
|
|
|
string portString = string.Format("tcp:{0}", port);
|
|
|
|
int exitCode = RunCommand(new string[] { "forward", "--remove", portString }, waitingProcessToExitCallback, out outputString, out errorString);
|
|
return exitCode;
|
|
}
|
|
|
|
public List<string> GetDevices()
|
|
{
|
|
string outputString;
|
|
string errorString;
|
|
|
|
RunCommand(new string[] { "devices" }, null, out outputString, out errorString);
|
|
string[] devices = outputString.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
List<string> deviceList = new List<string>(devices);
|
|
deviceList.RemoveAt(0);
|
|
|
|
for(int i = 0; i < deviceList.Count; i++)
|
|
{
|
|
string deviceName = deviceList[i];
|
|
int index = deviceName.IndexOf('\t');
|
|
if (index >= 0)
|
|
deviceList[i] = deviceName.Substring(0, index);
|
|
else
|
|
deviceList[i] = "";
|
|
|
|
}
|
|
|
|
return deviceList;
|
|
}
|
|
|
|
private StringBuilder outputStringBuilder = null;
|
|
private StringBuilder errorStringBuilder = null;
|
|
|
|
public int RunCommand(string[] arguments, WaitingProcessToExitCallback waitingProcessToExitCallback, out string outputString, out string errorString)
|
|
{
|
|
int exitCode = -1;
|
|
|
|
if (!isReady)
|
|
{
|
|
Debug.LogWarning("OVRADBTool not ready");
|
|
outputString = string.Empty;
|
|
errorString = "OVRADBTool not ready";
|
|
return exitCode;
|
|
}
|
|
|
|
string args = string.Join(" ", arguments);
|
|
|
|
ProcessStartInfo startInfo = new ProcessStartInfo(adbPath, args);
|
|
startInfo.WorkingDirectory = androidSdkRoot;
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.UseShellExecute = false;
|
|
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
startInfo.RedirectStandardOutput = true;
|
|
startInfo.RedirectStandardError = true;
|
|
|
|
outputStringBuilder = new StringBuilder("");
|
|
errorStringBuilder = new StringBuilder("");
|
|
|
|
Process process = Process.Start(startInfo);
|
|
process.OutputDataReceived += new DataReceivedEventHandler(OutputDataReceivedHandler);
|
|
process.ErrorDataReceived += new DataReceivedEventHandler(ErrorDataReceivedHandler);
|
|
|
|
process.BeginOutputReadLine();
|
|
process.BeginErrorReadLine();
|
|
|
|
try
|
|
{
|
|
do
|
|
{
|
|
if (waitingProcessToExitCallback != null)
|
|
{
|
|
waitingProcessToExitCallback();
|
|
}
|
|
} while (!process.WaitForExit(100));
|
|
|
|
process.WaitForExit();
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.LogWarningFormat("[OVRADBTool.RunCommand] exception {0}", e.Message);
|
|
}
|
|
|
|
exitCode = process.ExitCode;
|
|
|
|
process.Close();
|
|
|
|
outputString = outputStringBuilder.ToString();
|
|
errorString = errorStringBuilder.ToString();
|
|
|
|
outputStringBuilder = null;
|
|
errorStringBuilder = null;
|
|
|
|
if (!string.IsNullOrEmpty(errorString))
|
|
{
|
|
if (errorString.Contains("Warning"))
|
|
{
|
|
UnityEngine.Debug.LogWarning("OVRADBTool " + errorString);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Debug.LogError("OVRADBTool " + errorString);
|
|
}
|
|
}
|
|
|
|
return exitCode;
|
|
}
|
|
|
|
public Process RunCommandAsync(string[] arguments, DataReceivedEventHandler outputDataRecievedHandler)
|
|
{
|
|
if (!isReady)
|
|
{
|
|
Debug.LogWarning("OVRADBTool not ready");
|
|
return null;
|
|
}
|
|
|
|
string args = string.Join(" ", arguments);
|
|
|
|
ProcessStartInfo startInfo = new ProcessStartInfo(adbPath, args);
|
|
startInfo.WorkingDirectory = androidSdkRoot;
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.UseShellExecute = false;
|
|
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
startInfo.RedirectStandardOutput = true;
|
|
startInfo.RedirectStandardError = true;
|
|
|
|
Process process = Process.Start(startInfo);
|
|
if (outputDataRecievedHandler != null)
|
|
{
|
|
process.OutputDataReceived += new DataReceivedEventHandler(outputDataRecievedHandler);
|
|
}
|
|
|
|
process.BeginOutputReadLine();
|
|
process.BeginErrorReadLine();
|
|
|
|
return process;
|
|
}
|
|
|
|
private void OutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs args)
|
|
{
|
|
// Collect the sort command output.
|
|
if (!string.IsNullOrEmpty(args.Data))
|
|
{
|
|
// Add the text to the collected output.
|
|
outputStringBuilder.Append(args.Data);
|
|
outputStringBuilder.Append(Environment.NewLine);
|
|
}
|
|
}
|
|
|
|
private void ErrorDataReceivedHandler(object sendingProcess, DataReceivedEventArgs args)
|
|
{
|
|
// Collect the sort command output.
|
|
if (!string.IsNullOrEmpty(args.Data))
|
|
{
|
|
// Add the text to the collected output.
|
|
errorStringBuilder.Append(args.Data);
|
|
errorStringBuilder.Append(Environment.NewLine);
|
|
}
|
|
}
|
|
}
|