//FIXME: needs better file list and handling of subdirectories
		public static void Upload (TizenSdkInfo sdkInfo,
					   TizenProjectConfiguration conf,
					   string[] extraPaths,
					   TextWriter outWriter,
					   TextWriter errorWriter)
		{
			var sdb = new TizenSdkSdb (conf, sdkInfo);

			var outDirFiles = Directory.GetFiles (conf.OutputDirectory, "*", SearchOption.TopDirectoryOnly);
			var op = conf.OutputDirectory.ParentDirectory;
			var localPaths = new List<string> ();
			for (int i = 0; i < outDirFiles.Length; i++)
				localPaths.Add (op.Combine (outDirFiles[i]));
			if (extraPaths != null)
				localPaths.AddRange (extraPaths);

			var s = TizenSdkSdb.DevicePathSeparator;
			var remoteDir = TizenSdkSdb.DeviceHome + s + conf.ParentItem.Name;
			foreach (var localPath in localPaths) {
				var f = Path.GetFileName (localPath);
				var remotePath = remoteDir + s + f;

				sdb.Push (localPath, remotePath);
			}
		}
		public static TizenSdkInfo EnsureSdkInfo (bool forceDialog)
		{
			if (sdkInfo == null || forceDialog) {
				DispatchService.GuiSyncDispatch (delegate {
					sdkInfo = TizenSdkDialog.GetSdkInfo (null);
				});
			}
			return sdkInfo;
		}
		public static SdbShellCommand CreateProcess (
			TizenExecutionCommand cmd,
			string sdbOptions,
			TizenSdkInfo sdkInfo,
			Action<string> stdOut, Action<string> stdErr)
		{
			string exec = GetCommandString (cmd, sdbOptions);

			var sdb = new TizenSdkSdb (cmd.Config, sdkInfo);

			return new SdbShellCommand (sdb, exec, stdOut, stdErr);
		}
		public TizenSdkBuild (TizenProjectConfiguration config,
				      TizenSdkInfo sdkInfo)
		{
			this.Config = config;
			this.SdkInfo = sdkInfo;
		}
		public TizenSoftDebuggerStartInfo (IPAddress address,
						   int debugPort,
						   TizenExecutionCommand cmd,
						   TizenSdkInfo sdkInfo)
			: base (new SoftDebuggerListenArgs (cmd.Name, address, debugPort))
		{
			ExecutionCommand = cmd;
			SdkInfo = sdkInfo;
		}