public BlackBerryLaunchOptions(string exePath, MICore.Xml.LaunchOptions.BlackBerryLaunchOptions xmlOptions, TargetEngine targetEngine) { if (string.IsNullOrEmpty(exePath)) throw new ArgumentNullException("exePath"); if (xmlOptions == null) throw new ArgumentNullException("xmlOptions"); GdbPath = LaunchOptions.RequireAttribute(xmlOptions.GdbPath, "GdbPath"); GdbHostPath = LaunchOptions.RequireAttribute(xmlOptions.GdbHostPath, "GdbHostPath"); PID = LaunchOptions.RequirePositiveAttribute(xmlOptions.PID, "PID"); ExePath = exePath; TargetAddress = LaunchOptions.RequireAttribute(xmlOptions.TargetAddress, "TargetAddress"); TargetPort = xmlOptions.TargetPort; TargetType = GetTargetType(xmlOptions.TargetType); IsAttach = xmlOptions.Attach; AdditionalSOLibSearchPath = Combine(";", xmlOptions.AdditionalSOLibSearchPath, GetDefaultSearchPaths(xmlOptions.NdkHostPath, xmlOptions.NdkTargetPath, TargetType)); TargetArchitecture = LaunchOptions.ConvertTargetArchitectureAttribute(xmlOptions.TargetArchitecture); }
public AndroidLaunchOptions(MICore.Xml.LaunchOptions.AndroidLaunchOptions xmlOptions, TargetEngine targetEngine) { if (xmlOptions == null) { throw new ArgumentNullException("xmlOptions"); } this.Package = LaunchOptions.RequireAttribute(xmlOptions.Package, "Package"); this.IsAttach = xmlOptions.Attach; if (!IsAttach) { // LaunchActivity is only required when we're launching this.LaunchActivity = LaunchOptions.RequireAttribute(xmlOptions.LaunchActivity, "LaunchActivity"); } this.SDKRoot = GetOptionalDirectoryAttribute(xmlOptions.SDKRoot, "SDKRoot"); this.NDKRoot = GetOptionalDirectoryAttribute(xmlOptions.NDKRoot, "NDKRoot"); this.TargetArchitecture = LaunchOptions.ConvertTargetArchitectureAttribute(xmlOptions.TargetArchitecture); if (targetEngine == TargetEngine.Native) this.IntermediateDirectory = RequireValidDirectoryAttribute(xmlOptions.IntermediateDirectory, "IntermediateDirectory"); else this.IntermediateDirectory = GetOptionalDirectoryAttribute(xmlOptions.IntermediateDirectory, "IntermediateDirectory"); if (targetEngine == TargetEngine.Java) { this.JVMHost = LaunchOptions.RequireAttribute(xmlOptions.JVMHost, "JVMHost"); this.JVMPort = xmlOptions.JVMPort; this.SourceRoots = GetSourceRoots(xmlOptions.SourceRoots); foreach (SourceRoot root in this.SourceRoots) { EnsureValidDirectory(root.Path, "SourceRoots"); } } this.AdditionalSOLibSearchPath = xmlOptions.AdditionalSOLibSearchPath; this.AbsolutePrefixSOLibSearchPath = xmlOptions.AbsolutePrefixSOLibSearchPath ?? "\"\""; this.DeviceId = LaunchOptions.RequireAttribute(xmlOptions.DeviceId, "DeviceId"); this.LogcatServiceId = GetLogcatServiceIdAttribute(xmlOptions.LogcatServiceId); this.WaitDynamicLibLoad = xmlOptions.WaitDynamicLibLoad; CheckTargetArchitectureSupported(); }
/// <summary> /// Initializes the launcher from the launch settings /// </summary> /// <param name="exePath">[Required] Path to the executable provided in the VsDebugTargetInfo by the project system. Some launchers may ignore this.</param> /// <param name="args">[Optional] Arguments to the executable provided in the VsDebugTargetInfo by the project system. Some launchers may ignore this.</param> /// <param name="dir">[Optional] Working directory of the executable provided in the VsDebugTargetInfo by the project system. Some launchers may ignore this.</param> /// <param name="launcherXmlOptions">[Required] Deserialized XML options structure</param> public void SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { if (launcherXmlOptions == null) throw new ArgumentNullException("launcherXmlOptions"); if (_callback == null) { Debug.Fail("Why is ParseLaunchOptions called before Initialize?"); throw new InvalidOperationException(); } if (_launchOptions != null) { Debug.Fail("Why is ParseLaunchOptions being called more than once?"); throw new InvalidOperationException(); } _launchOptions = new BlackBerryLaunchOptions(exePath, (MICore.Xml.LaunchOptions.BlackBerryLaunchOptions)launcherXmlOptions, targetEngine); }
void IPlatformAppLauncher.SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { if (launcherXmlOptions == null) throw new ArgumentNullException("launcherXmlOptions"); var androidXmlOptions = (MICore.Xml.LaunchOptions.AndroidLaunchOptions)launcherXmlOptions; if (_eventCallback == null) { Debug.Fail("Why is ParseLaunchOptions called before Initialize?"); throw new InvalidOperationException(); } if (_launchOptions != null) { Debug.Fail("Why is ParseLaunchOptions being called more than once?"); throw new InvalidOperationException(); } _launchOptions = new AndroidLaunchOptions(androidXmlOptions, targetEngine); _targetEngine = targetEngine; }
void IPlatformAppLauncher.SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { if (launcherXmlOptions == null) throw new ArgumentNullException("launcherXmlOptions"); if (targetEngine != TargetEngine.Native) throw new LauncherException(String.Format(CultureInfo.CurrentCulture, LauncherResources.Error_BadTargetEngine, targetEngine.ToString())); var iosXmlOptions = (MICore.Xml.LaunchOptions.IOSLaunchOptions)launcherXmlOptions; if (_callback == null) { Debug.Fail("Why is ParseLaunchOptions called before Initialize?"); throw new InvalidOperationException(); } if (_launchOptions != null) { Debug.Fail("Why is ParseLaunchOptions being called more than once?"); throw new InvalidOperationException(); } _launchOptions = new IOSLaunchOptions(exePath, iosXmlOptions); }
void IPlatformAppLauncher.SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { if (launcherXmlOptions == null) { throw new ArgumentNullException("launcherXmlOptions"); } var androidXmlOptions = (MICore.Xml.LaunchOptions.AndroidLaunchOptions)launcherXmlOptions; if (_eventCallback == null) { Debug.Fail("Why is ParseLaunchOptions called before Initialize?"); throw new InvalidOperationException(); } if (_launchOptions != null) { Debug.Fail("Why is ParseLaunchOptions being called more than once?"); throw new InvalidOperationException(); } _launchOptions = new AndroidLaunchOptions(androidXmlOptions, targetEngine); _targetEngine = targetEngine; }
public static LaunchOptions GetInstance(string registryRoot, string exePath, string args, string dir, string options, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { if (string.IsNullOrWhiteSpace(exePath)) { throw new ArgumentNullException("exePath"); } if (string.IsNullOrWhiteSpace(options)) { throw new InvalidLaunchOptionsException(MICoreResources.Error_StringIsNullOrEmpty); } if (string.IsNullOrEmpty(registryRoot)) { throw new ArgumentNullException("registryRoot"); } Logger.WriteTextBlock("LaunchOptions", options); LaunchOptions launchOptions = null; Guid clsidLauncher = Guid.Empty; object launcherXmlOptions = null; try { using (XmlReader reader = OpenXml(options)) { switch (reader.LocalName) { case "LocalLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.LocalLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.LocalLaunchOptions)Deserialize(serializer, reader); launchOptions = LocalLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "SerialPortLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.SerialPortLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.SerialPortLaunchOptions)Deserialize(serializer, reader); launchOptions = SerialLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "PipeLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.PipeLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.PipeLaunchOptions)Deserialize(serializer, reader); launchOptions = PipeLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "TcpLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.TcpLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.TcpLaunchOptions)Deserialize(serializer, reader); launchOptions = TcpLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "IOSLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.IOSLaunchOptionsSerializer(); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("316783D1-1824-4847-B3D3-FB048960EDCF"); } break; case "AndroidLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.AndroidLaunchOptionsSerializer(); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("C9A403DA-D3AA-4632-A572-E81FF6301E9B"); } break; default: { throw new XmlException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_UnknownXmlElement, reader.LocalName)); } } // Read any remaining bits of XML to catch other errors while (reader.NodeType != XmlNodeType.None) { reader.Read(); } } } catch (XmlException e) { throw new InvalidLaunchOptionsException(e.Message); } if (clsidLauncher != Guid.Empty) { launchOptions = ExecuteLauncher(registryRoot, clsidLauncher, exePath, args, dir, launcherXmlOptions, eventCallback, targetEngine); } if (targetEngine == TargetEngine.Native) { if (launchOptions.ExePath == null) { launchOptions.ExePath = exePath; } } if (string.IsNullOrEmpty(launchOptions.ExeArguments)) { launchOptions.ExeArguments = args; } if (string.IsNullOrEmpty(launchOptions.WorkingDirectory)) { launchOptions.WorkingDirectory = dir; } if (launchOptions._setupCommands == null) { launchOptions._setupCommands = new List <LaunchCommand>(capacity: 0).AsReadOnly(); } launchOptions._initializationComplete = true; return(launchOptions); }
public static LaunchOptions GetInstance(HostConfigurationStore configStore, string exePath, string args, string dir, string options, bool noDebug, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine, Logger logger) { if (string.IsNullOrWhiteSpace(exePath)) throw new ArgumentNullException("exePath"); if (string.IsNullOrWhiteSpace(options)) throw new InvalidLaunchOptionsException(MICoreResources.Error_StringIsNullOrEmpty); logger?.WriteTextBlock("LaunchOptions", options); LaunchOptions launchOptions = null; Guid clsidLauncher = Guid.Empty; object launcher = null; object launcherXmlOptions = null; try { XmlSerializer serializer; using (XmlReader reader = OpenXml(options)) { switch (reader.LocalName) { case "LocalLaunchOptions": { serializer = GetXmlSerializer(typeof(Xml.LaunchOptions.LocalLaunchOptions)); var xmlLaunchOptions = (Xml.LaunchOptions.LocalLaunchOptions)Deserialize(serializer, reader); launchOptions = LocalLaunchOptions.CreateFromXml(xmlLaunchOptions); launchOptions.BaseOptions = xmlLaunchOptions; } break; case "PipeLaunchOptions": { serializer = GetXmlSerializer(typeof(Xml.LaunchOptions.PipeLaunchOptions)); var xmlLaunchOptions = (Xml.LaunchOptions.PipeLaunchOptions)Deserialize(serializer, reader); launchOptions = PipeLaunchOptions.CreateFromXml(xmlLaunchOptions); launchOptions.BaseOptions = xmlLaunchOptions; } break; case "TcpLaunchOptions": { serializer = GetXmlSerializer(typeof(Xml.LaunchOptions.TcpLaunchOptions)); var xmlLaunchOptions = (Xml.LaunchOptions.TcpLaunchOptions)Deserialize(serializer, reader); launchOptions = TcpLaunchOptions.CreateFromXml(xmlLaunchOptions); launchOptions.BaseOptions = xmlLaunchOptions; } break; case "IOSLaunchOptions": { serializer = GetXmlSerializer(typeof(IOSLaunchOptions)); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("316783D1-1824-4847-B3D3-FB048960EDCF"); } break; case "AndroidLaunchOptions": { serializer = GetXmlSerializer(typeof(AndroidLaunchOptions)); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("C9A403DA-D3AA-4632-A572-E81FF6301E9B"); } break; case "SSHLaunchOptions": { serializer = GetXmlSerializer(typeof(SSHLaunchOptions)); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("7E3052B2-FB42-4E38-B22C-1FD281BD4413"); } break; default: { launcher = configStore?.GetCustomLauncher(reader.LocalName); if (launcher == null) { throw new XmlException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_UnknownXmlElement, reader.LocalName)); } if (launcher as IPlatformAppLauncher == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, reader.LocalName)); } var deviceAppLauncher = (IPlatformAppLauncherSerializer)launcher; if (deviceAppLauncher == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherSerializerNotFound, clsidLauncher.ToString("B"))); } serializer = deviceAppLauncher.GetXmlSerializer(reader.LocalName); launcherXmlOptions = Deserialize(serializer, reader); } break; } // Read any remaining bits of XML to catch other errors while (reader.NodeType != XmlNodeType.None) reader.Read(); } } catch (XmlException e) { throw new InvalidLaunchOptionsException(e.Message); } if (clsidLauncher != Guid.Empty) { launchOptions = ExecuteLauncher(configStore, clsidLauncher, exePath, args, dir, launcherXmlOptions, eventCallback, targetEngine, logger); } else if (launcher != null) { launchOptions = ExecuteLauncher(configStore, (IPlatformAppLauncher)launcher, exePath, args, dir, launcherXmlOptions, eventCallback, targetEngine, logger); } if (targetEngine == TargetEngine.Native) { if (launchOptions.ExePath == null) launchOptions.ExePath = exePath; } if (string.IsNullOrEmpty(launchOptions.ExeArguments)) launchOptions.ExeArguments = args; if (string.IsNullOrEmpty(launchOptions.WorkingDirectory)) launchOptions.WorkingDirectory = dir; launchOptions.NoDebug = noDebug; if (launchOptions._setupCommands == null) launchOptions._setupCommands = new List<LaunchCommand>(capacity: 0).AsReadOnly(); launchOptions.SetInitializationComplete(); return launchOptions; }
private static LaunchOptions ExecuteLauncher(HostConfigurationStore configStore, IPlatformAppLauncher deviceAppLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine, Logger logger) { bool success = false; try { try { deviceAppLauncher.Initialize(configStore, eventCallback); deviceAppLauncher.SetLaunchOptions(exePath, args, dir, launcherXmlOptions, targetEngine); } catch (Exception e) when (!(e is InvalidLaunchOptionsException) && ExceptionHelper.BeforeCatch(e, logger, reportOnlyCorrupting: true)) { throw new InvalidLaunchOptionsException(e.Message); } LaunchOptions debuggerLaunchOptions; deviceAppLauncher.SetupForDebugging(out debuggerLaunchOptions); debuggerLaunchOptions.DeviceAppLauncher = deviceAppLauncher; success = true; return debuggerLaunchOptions; } finally { if (!success) { deviceAppLauncher.Dispose(); } } }
private static LaunchOptions ExecuteLauncher(HostConfigurationStore configStore, Guid clsidLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine, Logger logger) { var deviceAppLauncher = (IPlatformAppLauncher)HostLoader.VsCoCreateManagedObject(configStore, clsidLauncher); if (deviceAppLauncher == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, clsidLauncher.ToString("B"))); } return ExecuteLauncher(configStore, deviceAppLauncher, exePath, args, dir, launcherXmlOptions, eventCallback, targetEngine, logger); }
private static LaunchOptions ExecuteLauncher(string registryRoot, Guid clsidLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { var deviceAppLauncher = (IPlatformAppLauncher)VSLoader.VsCoCreateManagedObject(registryRoot, clsidLauncher); if (deviceAppLauncher == null) { throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, clsidLauncher.ToString("B"))); } bool success = false; try { try { deviceAppLauncher.Initialize(registryRoot, eventCallback); deviceAppLauncher.SetLaunchOptions(exePath, args, dir, launcherXmlOptions, targetEngine); } catch (Exception e) when (!(e is InvalidLaunchOptionsException)) { throw new InvalidLaunchOptionsException(e.Message); } LaunchOptions debuggerLaunchOptions; deviceAppLauncher.SetupForDebugging(out debuggerLaunchOptions); debuggerLaunchOptions.DeviceAppLauncher = deviceAppLauncher; success = true; return debuggerLaunchOptions; } finally { if (!success) { deviceAppLauncher.Dispose(); } } }
public static LaunchOptions GetInstance(string registryRoot, string exePath, string args, string dir, string options, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { if (string.IsNullOrWhiteSpace(exePath)) throw new ArgumentNullException("exePath"); if (string.IsNullOrWhiteSpace(options)) throw new InvalidLaunchOptionsException(MICoreResources.Error_StringIsNullOrEmpty); if (string.IsNullOrEmpty(registryRoot)) throw new ArgumentNullException("registryRoot"); Logger.WriteTextBlock("LaunchOptions", options); LaunchOptions launchOptions = null; Guid clsidLauncher = Guid.Empty; object launcherXmlOptions = null; try { using (XmlReader reader = OpenXml(options)) { switch (reader.LocalName) { case "LocalLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.LocalLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.LocalLaunchOptions)Deserialize(serializer, reader); launchOptions = LocalLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "SerialPortLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.SerialPortLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.SerialPortLaunchOptions)Deserialize(serializer, reader); launchOptions = SerialLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "PipeLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.PipeLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.PipeLaunchOptions)Deserialize(serializer, reader); launchOptions = PipeLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "TcpLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.TcpLaunchOptionsSerializer(); var xmlLaunchOptions = (Xml.LaunchOptions.TcpLaunchOptions)Deserialize(serializer, reader); launchOptions = TcpLaunchOptions.CreateFromXml(xmlLaunchOptions); } break; case "IOSLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.IOSLaunchOptionsSerializer(); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("316783D1-1824-4847-B3D3-FB048960EDCF"); } break; case "AndroidLaunchOptions": { var serializer = new Microsoft.Xml.Serialization.GeneratedAssembly.AndroidLaunchOptionsSerializer(); launcherXmlOptions = Deserialize(serializer, reader); clsidLauncher = new Guid("C9A403DA-D3AA-4632-A572-E81FF6301E9B"); } break; default: { throw new XmlException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_UnknownXmlElement, reader.LocalName)); } } // Read any remaining bits of XML to catch other errors while (reader.NodeType != XmlNodeType.None) reader.Read(); } } catch (XmlException e) { throw new InvalidLaunchOptionsException(e.Message); } if (clsidLauncher != Guid.Empty) { launchOptions = ExecuteLauncher(registryRoot, clsidLauncher, exePath, args, dir, launcherXmlOptions, eventCallback, targetEngine); } if (targetEngine == TargetEngine.Native) { if (launchOptions.ExePath == null) launchOptions.ExePath = exePath; } if (string.IsNullOrEmpty(launchOptions.ExeArguments)) launchOptions.ExeArguments = args; if (string.IsNullOrEmpty(launchOptions.WorkingDirectory)) launchOptions.WorkingDirectory = dir; if (launchOptions._setupCommands == null) launchOptions._setupCommands = new List<LaunchCommand>(capacity: 0).AsReadOnly(); launchOptions._initializationComplete = true; return launchOptions; }
/// <summary> /// Resolves the various file paths used by the AndroidDebugLauncher and returns an initialized InstallPaths object /// </summary> /// <param name="token">token to check for cancelation</param> /// <param name="launchOptions">[Required] launch options object</param> /// <param name="logger">logger object</param> /// <param name="targetEngine">target engine</param> /// <returns>[Required] Created InstallPaths object</returns> public static InstallPaths Resolve(CancellationToken token, AndroidLaunchOptions launchOptions, MICore.Logger logger, TargetEngine targetEngine) { var result = new InstallPaths(); if (launchOptions.SDKRoot != null) { result.SDKRoot = launchOptions.SDKRoot; } else { result.SDKRoot = GetDirectoryFromRegistry(@"SOFTWARE\Android SDK Tools", "Path", checkBothBitnesses: true, externalProductName: LauncherResources.ProductName_SDK); } if (targetEngine != TargetEngine.Java) { string ndkRoot = launchOptions.NDKRoot; if (ndkRoot == null) { ndkRoot = GetDirectoryFromRegistry(RegistryRoot.Value + @"\Setup\VS\SecondaryInstaller\AndroidNDK", "NDK_HOME", checkBothBitnesses: false, externalProductName: LauncherResources.ProductName_NDK); } NdkReleaseId ndkReleaseId = new NdkReleaseId(); string ndkReleaseVersionFile = Path.Combine(ndkRoot, "RELEASE.TXT"); string ndkSourcePropertiesFile = Path.Combine(ndkRoot, "source.properties"); // NDK releases >= r11 have a source.properties file if (File.Exists(ndkSourcePropertiesFile)) { NdkReleaseId.TryParsePropertiesFile(ndkSourcePropertiesFile, out ndkReleaseId); } // NDK releases < r11 have a RELEASE.txt file else if (File.Exists(ndkReleaseVersionFile)) { NdkReleaseId.TryParseFile(ndkReleaseVersionFile, out ndkReleaseId); } else { ThrowExternalFileNotFoundException(ndkReleaseVersionFile, LauncherResources.ProductName_NDK); } logger.WriteLine("Using NDK '{0}' from path '{1}'", ndkReleaseId, ndkRoot); // 32 vs 64-bit doesn't matter when comparing var r11 = new NdkReleaseId(11, 'a'); // In NDK r11 and later, gdb is multi-arch and there's only one binary // in the prebuilt directory bool usePrebuiltGDB = ndkReleaseId.CompareVersion(r11) >= 0; IEnumerable <INDKFilePath> prebuiltGDBPath = NDKPrebuiltFilePath.GDBPaths(); string targetArchitectureName = launchOptions.TargetArchitecture.ToNDKArchitectureName(); IEnumerable <INDKFilePath> possibleGDBPaths; switch (launchOptions.TargetArchitecture) { case MICore.TargetArchitecture.X86: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.x86_GDBPaths(); break; case MICore.TargetArchitecture.X64: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.x64_GDBPaths(); break; case MICore.TargetArchitecture.ARM: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.ARM_GDBPaths(); break; case MICore.TargetArchitecture.ARM64: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.ARM64_GDBPaths(); break; default: Debug.Fail("Should be impossible"); throw new InvalidOperationException(); } INDKFilePath gdbMatchedPath; result.GDBPath = GetNDKFilePath( string.Concat("Android-", targetArchitectureName, "-GDBPath"), ndkRoot, possibleGDBPaths, out gdbMatchedPath ); if (launchOptions.TargetArchitecture == MICore.TargetArchitecture.X86 && gdbMatchedPath != null) { var r10b = new NdkReleaseId(10, 'b'); // Before r10b, the 'windows-x86_64' ndk didn't support x86 debugging if (ndkReleaseId.IsValid && ndkReleaseId.CompareVersion(r10b) < 0 && gdbMatchedPath.PartialFilePath.Contains(@"\windows-x86_64\")) { throw new LauncherException(Telemetry.LaunchFailureCode.NoReport, LauncherResources.Error_64BitNDKNotSupportedForX86); } } IEnumerable <INDKFilePath> gdbServerPath = NDKPrebuiltFilePath.GDBServerPaths(targetArchitectureName); INDKFilePath gdbServerMatchedPath; result.GDBServerPath = GetNDKFilePath( string.Concat("Android-", targetArchitectureName, "-GDBServerPath"), ndkRoot, gdbServerPath, out gdbServerMatchedPath // not used ); token.ThrowIfCancellationRequested(); } return(result); }
private static LaunchOptions ExecuteLauncher(HostConfigurationStore configStore, Guid clsidLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine, Logger logger) { var deviceAppLauncher = (IPlatformAppLauncher)HostLoader.VsCoCreateManagedObject(configStore, clsidLauncher); if (deviceAppLauncher == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, clsidLauncher.ToString("B"))); } bool success = false; try { try { deviceAppLauncher.Initialize(configStore, eventCallback); deviceAppLauncher.SetLaunchOptions(exePath, args, dir, launcherXmlOptions, targetEngine); } catch (Exception e) when (!(e is InvalidLaunchOptionsException) && ExceptionHelper.BeforeCatch(e, logger, reportOnlyCorrupting: true)) { throw new InvalidLaunchOptionsException(e.Message); } LaunchOptions debuggerLaunchOptions; deviceAppLauncher.SetupForDebugging(out debuggerLaunchOptions); debuggerLaunchOptions.DeviceAppLauncher = deviceAppLauncher; success = true; return debuggerLaunchOptions; } finally { if (!success) { deviceAppLauncher.Dispose(); } } }
private static LaunchOptions ExecuteLauncher(string registryRoot, Guid clsidLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { var deviceAppLauncher = (IPlatformAppLauncher)VSLoader.VsCoCreateManagedObject(registryRoot, clsidLauncher); if (deviceAppLauncher == null) { throw new ApplicationException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, clsidLauncher.ToString("B"))); } bool success = false; try { try { deviceAppLauncher.Initialize(registryRoot, eventCallback); deviceAppLauncher.SetLaunchOptions(exePath, args, dir, launcherXmlOptions, targetEngine); } catch (Exception e) when(!(e is InvalidLaunchOptionsException)) { throw new InvalidLaunchOptionsException(e.Message); } LaunchOptions debuggerLaunchOptions; deviceAppLauncher.SetupForDebugging(out debuggerLaunchOptions); debuggerLaunchOptions.DeviceAppLauncher = deviceAppLauncher; success = true; return(debuggerLaunchOptions); } finally { if (!success) { deviceAppLauncher.Dispose(); } } }
// Kofe debugger depends on this method to generate LaunchOptions public static LaunchOptions GetInstance(HostConfigurationStore configStore, string exePath, string args, string dir, string options, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { return(GetInstance(configStore, exePath, args, dir, options, eventCallback, targetEngine, null)); }
void IPlatformAppLauncher.SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { // NOTE: exePath/args/dir can all be ignored, as LaunchOptions.GetInstance will use those values if they aren't specified in the XML. _launchOptions = (SSHLaunchOptions)launcherXmlOptions; }
// Kofe debugger depends on this method to generate LaunchOptions public static LaunchOptions GetInstance(HostConfigurationStore configStore, string exePath, string args, string dir, string options, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine) { return GetInstance(configStore, exePath, args, dir, options, eventCallback, targetEngine, null); }
/// <summary> /// Resolves the various file paths used by the AndroidDebugLauncher and returns an initialized InstallPaths object /// </summary> /// <param name="token">token to check for cancelation</param> /// <param name="launchOptions">[Required] launch options object</param> /// <param name="logger">logger object</param> /// <param name="targetEngine">target engine</param> /// <returns>[Required] Created InstallPaths object</returns> public static InstallPaths Resolve(CancellationToken token, AndroidLaunchOptions launchOptions, MICore.Logger logger, TargetEngine targetEngine) { var result = new InstallPaths(); if (launchOptions.SDKRoot != null) { result.SDKRoot = launchOptions.SDKRoot; } else { result.SDKRoot = GetDirectoryFromRegistry(@"SOFTWARE\Android SDK Tools", "Path", checkBothBitnesses: true, externalProductName: LauncherResources.ProductName_SDK); } if (targetEngine != TargetEngine.Java) { string ndkRoot = launchOptions.NDKRoot; if (ndkRoot == null) { ndkRoot = GetDirectoryFromRegistry(RegistryRoot.Value + @"\Setup\VS\SecondaryInstaller\AndroidNDK", "NDK_HOME", checkBothBitnesses: false, externalProductName: LauncherResources.ProductName_NDK); } NdkReleaseId ndkReleaseId = new NdkReleaseId(); string ndkReleaseVersionFile = Path.Combine(ndkRoot, "RELEASE.TXT"); string ndkSourcePropertiesFile = Path.Combine(ndkRoot, "source.properties"); // NDK releases >= r11 have a source.properties file if (File.Exists(ndkSourcePropertiesFile)) { NdkReleaseId.TryParsePropertiesFile(ndkSourcePropertiesFile, out ndkReleaseId); } // NDK releases < r11 have a RELEASE.txt file else if (File.Exists(ndkReleaseVersionFile)) { NdkReleaseId.TryParseFile(ndkReleaseVersionFile, out ndkReleaseId); } else { ThrowExternalFileNotFoundException(ndkReleaseVersionFile, LauncherResources.ProductName_NDK); } logger.WriteLine("Using NDK '{0}' from path '{1}'", ndkReleaseId, ndkRoot); // 32 vs 64-bit doesn't matter when comparing var r11 = new NdkReleaseId(11, 'a'); // In NDK r11 and later, gdb is multi-arch and there's only one binary // in the prebuilt directory bool usePrebuiltGDB = ndkReleaseId.CompareVersion(r11) >= 0; IEnumerable<INDKFilePath> prebuiltGDBPath = NDKPrebuiltFilePath.GDBPaths(); string targetArchitectureName = launchOptions.TargetArchitecture.ToNDKArchitectureName(); IEnumerable<INDKFilePath> possibleGDBPaths; switch (launchOptions.TargetArchitecture) { case MICore.TargetArchitecture.X86: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.x86_GDBPaths(); break; case MICore.TargetArchitecture.X64: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.x64_GDBPaths(); break; case MICore.TargetArchitecture.ARM: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.ARM_GDBPaths(); break; case MICore.TargetArchitecture.ARM64: possibleGDBPaths = usePrebuiltGDB ? prebuiltGDBPath : NDKToolChainFilePath.ARM64_GDBPaths(); break; default: Debug.Fail("Should be impossible"); throw new InvalidOperationException(); } INDKFilePath gdbMatchedPath; result.GDBPath = GetNDKFilePath( string.Concat("Android-", targetArchitectureName, "-GDBPath"), ndkRoot, possibleGDBPaths, out gdbMatchedPath ); if (launchOptions.TargetArchitecture == MICore.TargetArchitecture.X86 && gdbMatchedPath != null) { var r10b = new NdkReleaseId(10, 'b'); // Before r10b, the 'windows-x86_64' ndk didn't support x86 debugging if (ndkReleaseId.IsValid && ndkReleaseId.CompareVersion(r10b) < 0 && gdbMatchedPath.PartialFilePath.Contains(@"\windows-x86_64\")) { throw new LauncherException(Telemetry.LaunchFailureCode.NoReport, LauncherResources.Error_64BitNDKNotSupportedForX86); } } IEnumerable<INDKFilePath> gdbServerPath = NDKPrebuiltFilePath.GDBServerPaths(targetArchitectureName); INDKFilePath gdbServerMatchedPath; result.GDBServerPath = GetNDKFilePath( string.Concat("Android-", targetArchitectureName, "-GDBServerPath"), ndkRoot, gdbServerPath, out gdbServerMatchedPath // not used ); token.ThrowIfCancellationRequested(); } return result; }
void IPlatformAppLauncher.SetLaunchOptions(string exePath, string args, string dir, object launcherXmlOptions, TargetEngine targetEngine) { if (launcherXmlOptions == null) { throw new ArgumentNullException("launcherXmlOptions"); } if (targetEngine != TargetEngine.Native) { throw new LauncherException(String.Format(CultureInfo.CurrentCulture, LauncherResources.Error_BadTargetEngine, targetEngine.ToString())); } var iosXmlOptions = (MICore.Xml.LaunchOptions.IOSLaunchOptions)launcherXmlOptions; if (_callback == null) { Debug.Fail("Why is ParseLaunchOptions called before Initialize?"); throw new InvalidOperationException(); } if (_launchOptions != null) { Debug.Fail("Why is ParseLaunchOptions being called more than once?"); throw new InvalidOperationException(); } _launchOptions = new IOSLaunchOptions(exePath, iosXmlOptions); }
public AndroidLaunchOptions(MICore.Xml.LaunchOptions.AndroidLaunchOptions xmlOptions, TargetEngine targetEngine) { if (xmlOptions == null) { throw new ArgumentNullException("xmlOptions"); } this.Package = LaunchOptions.RequireAttribute(xmlOptions.Package, "Package"); this.IsAttach = xmlOptions.Attach; if (!IsAttach) { // LaunchActivity is only required when we're launching this.LaunchActivity = LaunchOptions.RequireAttribute(xmlOptions.LaunchActivity, "LaunchActivity"); } this.SDKRoot = GetOptionalDirectoryAttribute(xmlOptions.SDKRoot, "SDKRoot"); this.NDKRoot = GetOptionalDirectoryAttribute(xmlOptions.NDKRoot, "NDKRoot"); this.TargetArchitecture = LaunchOptions.ConvertTargetArchitectureAttribute(xmlOptions.TargetArchitecture); if (targetEngine == TargetEngine.Native) { this.IntermediateDirectory = RequireValidDirectoryAttribute(xmlOptions.IntermediateDirectory, "IntermediateDirectory"); } else { this.IntermediateDirectory = GetOptionalDirectoryAttribute(xmlOptions.IntermediateDirectory, "IntermediateDirectory"); } if (targetEngine == TargetEngine.Java) { this.JVMHost = LaunchOptions.RequireAttribute(xmlOptions.JVMHost, "JVMHost"); this.JVMPort = xmlOptions.JVMPort; this.SourceRoots = GetSourceRoots(xmlOptions.SourceRoots); foreach (SourceRoot root in this.SourceRoots) { EnsureValidDirectory(root.Path, "SourceRoots"); } } this.AdditionalSOLibSearchPath = xmlOptions.AdditionalSOLibSearchPath; this.DeviceId = LaunchOptions.RequireAttribute(xmlOptions.DeviceId, "DeviceId"); this.LogcatServiceId = GetLogcatServiceIdAttribute(xmlOptions.LogcatServiceId); CheckTargetArchitectureSupported(); }
private static LaunchOptions ExecuteLauncher(HostConfigurationStore configStore, Guid clsidLauncher, string exePath, string args, string dir, object launcherXmlOptions, IDeviceAppLauncherEventCallback eventCallback, TargetEngine targetEngine, Logger logger) { var deviceAppLauncher = (IPlatformAppLauncher)HostLoader.VsCoCreateManagedObject(configStore, clsidLauncher); if (deviceAppLauncher == null) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, MICoreResources.Error_LauncherNotFound, clsidLauncher.ToString("B"))); } bool success = false; try { try { deviceAppLauncher.Initialize(configStore, eventCallback); deviceAppLauncher.SetLaunchOptions(exePath, args, dir, launcherXmlOptions, targetEngine); } catch (Exception e) when(!(e is InvalidLaunchOptionsException) && ExceptionHelper.BeforeCatch(e, logger, reportOnlyCorrupting: true)) { throw new InvalidLaunchOptionsException(e.Message); } LaunchOptions debuggerLaunchOptions; deviceAppLauncher.SetupForDebugging(out debuggerLaunchOptions); debuggerLaunchOptions.DeviceAppLauncher = deviceAppLauncher; success = true; return(debuggerLaunchOptions); } finally { if (!success) { deviceAppLauncher.Dispose(); } } }