sources/Google.Solutions.IapDesktop.Application/Host/CommandLineOptions.cs (100 lines of code) (raw):

// // Copyright 2020 Google LLC // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software 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 Google.Solutions.Common.Text; using Google.Solutions.IapDesktop.Application.Data; using System; using System.Collections.Generic; using System.Windows.Forms; namespace Google.Solutions.IapDesktop.Application.Host { public class CommandLineOptions { /// <summary> /// URL of VM to connect to (for browser integration). /// </summary> public IapRdpUrl? StartupUrl { get; set; } = null; /// <summary> /// Enable logging. /// </summary> public bool IsLoggingEnabled { get; set; } = false; /// <summary> /// Custom profile to load. /// </summary> public string? Profile { get; set; } = null; /// <summary> /// Launched after completion of an installation/upgrade. /// </summary> public bool IsPostInstall { get; set; } = false; public CommandLineOptions() { } public static CommandLineOptions Parse(string[] args) { var options = new CommandLineOptions(); for (var i = 0; i < args.Length; i++) { if (args[i] == "/debug") { options.IsLoggingEnabled = true; } else if (args[i] == "/postinstall") { options.IsPostInstall = true; } else if (args[i] == "/url" && i + 1 < args.Length) { // // Certain legacy browsers do not properly quote URLs when passing them // as command line arguments. If the URL contains a space, it might be // delivered as two separate arguments. // var url = string.Join(" ", args[++i]).Trim(); try { options.StartupUrl = IapRdpUrl.FromString(url); } catch (UriFormatException e) { throw new InvalidCommandLineException( "Invalid startup URL:\n\n" + e.Message); } } else if (args[i] == "/profile" && i + 1 < args.Length) { options.Profile = args[++i] .Trim() .NullIfEmptyOrWhitespace(); } else { throw new InvalidCommandLineException( $"Unrecognized command line option '{args[0]}'"); } } return options; } public static CommandLineOptions ParseOrExit(string[] args) { try { return Parse(args); } catch (Exception e) { MessageBox.Show( e.Message, "IAP Desktop", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(1); throw new InvalidOperationException(); } } public override string ToString() { var parameters = new LinkedList<string>(); if (this.IsLoggingEnabled) { parameters.AddLast("/debug"); } if (this.StartupUrl != null) { parameters.AddLast($"/url \"{this.StartupUrl}\""); } if (this.Profile != null) { parameters.AddLast($"/profile \"{this.Profile}\""); } return string.Join(" ", parameters); } } public class InvalidCommandLineException : ArgumentException { public InvalidCommandLineException(string message) : base(message) { } } }