forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			263 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/************************************************************************************
 | 
						|
 | 
						|
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);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |