public IProcessAsyncOperation Execute (ExecutionCommand command, IConsole console)
		{
			IPhoneExecutionCommand cmd = (IPhoneExecutionCommand) command;
			if (!cmd.Simulator) {
				if (IPhoneSettings.ShowStartOnDeviceMessage) {
					Gtk.Application.Invoke (delegate {
						TellUserToStartApplication ();
					});
				}
				return NullProcessAsyncOperation.Success;
			}
			
			var psi = CreateMtouchSimStartInfo (cmd, true, SimulatorTarget ?? cmd.SimulatorTarget);
			
			psi.RedirectStandardOutput = true;
			psi.RedirectStandardError = true;
			psi.RedirectStandardInput = true;
			
			LineInterceptingTextWriter intercepter = null;
			intercepter = new LineInterceptingTextWriter (null, delegate {
				if (intercepter.GetLine ().StartsWith ("Application launched")) {
					IPhoneUtility.MakeSimulatorGrabFocus ();
					intercepter.FinishedIntercepting = true;
				} else if (intercepter.LineCount > 20) {
					intercepter.FinishedIntercepting = true;
				}
			});
			
			var outTail = new Tail (cmd.OutputLogPath, console.Out.Write);
			var errTail = new Tail (cmd.ErrorLogPath, console.Error.Write);
			outTail.Start ();
			errTail.Start ();
			
			var mtouchProcess = Runtime.ProcessService.StartProcess (psi, intercepter, console.Log, null);
			return new IPhoneProcess (mtouchProcess, outTail, errTail);
		}
		public IPhoneProcess (ProcessWrapper mtouchProcess, Tail outTail, Tail errTail)
		{
			this.mtouchProcess = mtouchProcess;
			this.outTail = outTail;
			this.errTail = errTail;
		}
 public IPhoneProcess(ProcessWrapper mtouchProcess, Tail outTail, Tail errTail)
 {
     this.mtouchProcess = mtouchProcess;
     this.outTail       = outTail;
     this.errTail       = errTail;
 }