private static X509Certificate2 SelectCertificate(CompileOptions compileOptions) { X509Certificate2 certificate = null; if (compileOptions.Sign && compileOptions.CertificateThumbprint == null) { X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.OpenExistingOnly); //Put certificates from the store into a collection so user can select one. X509Certificate2Collection fcollection = (X509Certificate2Collection)store.Certificates; IntPtr handle = Process.GetCurrentProcess().MainWindowHandle; X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(fcollection, "Select an X509 Certificate", "Choose a certificate to sign your component with.", X509SelectionFlag.SingleSelection, handle); certificate = collection[0]; } else if (compileOptions.Sign) { X509Store store = new X509Store("MY", StoreLocation.CurrentUser); store.Open(OpenFlags.OpenExistingOnly); X509Certificate2Collection fcollection = (X509Certificate2Collection)store.Certificates; certificate = fcollection.Find(X509FindType.FindByThumbprint, compileOptions.CertificateThumbprint, false)[0]; } return(certificate); }
private static bool CompileComponent(string inputPath, CompileOptions compileOptions) { List <ComponentDescription> componentDescriptions = new List <ComponentDescription>(); List <BinaryResource> binaryResources = new List <BinaryResource>(); XmlLoader loader = new XmlLoader(); loader.Load(new FileStream(inputPath, FileMode.Open)); if (loader.LoadErrors.Count(e => e.Category == LoadErrorCategory.Error) > 0) { foreach (var error in loader.LoadErrors) { Console.WriteLine(error.ToString()); } return(false); } ComponentDescription description = loader.GetDescriptions()[0]; description.ID = "C0"; componentDescriptions.Add(description); SetIcons(compileOptions, description); string output = compileOptions.Output; if (!Path.HasExtension(output)) { if (!Directory.Exists(output)) { Directory.CreateDirectory(output); } output += "\\" + description.ComponentName.ToLowerInvariant() + ".cdcom"; } FileStream stream = new FileStream(output, FileMode.Create, FileAccess.Write); X509Certificate2 certificate = SelectCertificate(compileOptions); CircuitDiagram.IO.BinaryWriter.BinaryWriterSettings settings = new CircuitDiagram.IO.BinaryWriter.BinaryWriterSettings(); settings.Certificate = certificate; CircuitDiagram.IO.BinaryWriter writer = new CircuitDiagram.IO.BinaryWriter(stream, settings); writer.Descriptions.AddRange(componentDescriptions); writer.Resources.AddRange(binaryResources); writer.Write(); stream.Flush(); return(true); }
static void Main(string[] args) { var compileOptions = new CompileOptions(); bool help = false; var p = new OptionSet() { { "i|input=", "Path to input XML component or component folder.", v => compileOptions.Input = v }, { "o|output=", "Path to write compiled component to.", v => compileOptions.Output = v }, { "icon=", "Path to PNG icon.", v => compileOptions.IconPaths.Add(v) }, { "icondir=", "Find icons automatically in the specified directory.", v => compileOptions.DefaultIconPath = v }, { "sign", "If present, presents a dialog for choosing a certificate for component signing.", v => compileOptions.Sign = v != null }, { "certificate=", "Thumbprint of certificate to use for signing.", v => compileOptions.CertificateThumbprint = v }, { "h|?|help", "Display help and options.", v => help = v != null }, }; List <string> extra = p.Parse(args); if (compileOptions.Input == null || compileOptions.Output == null || help) { p.WriteOptionDescriptions(Console.Out); return; } if (File.Exists(compileOptions.Input)) { // Compile a single component CompileComponent(compileOptions.Input, compileOptions); Console.WriteLine("Compiled {0}", Path.GetFileName(compileOptions.Input)); } else if (Directory.Exists(compileOptions.Input)) { // Compile a directory of components Console.WriteLine("Compiling components"); int failed = 0; string[] inputPaths = Directory.GetFiles(compileOptions.Input, "*.xml"); foreach (string input in inputPaths) { if (!CompileComponent(input, compileOptions)) { failed++; } } Console.WriteLine("Compiled {0} components", inputPaths.Length - failed); } }
private static void SetIcons(CompileOptions compileOptions, ComponentDescription description) { if (compileOptions.DefaultIconPath != null) { // Set icon from default path description.Metadata.Icon = SetDefaultIcon(description.ComponentName, "", compileOptions.DefaultIconPath); } else { // Icon was specified manually // First icon is default if (compileOptions.IconPaths.Count > 0) { byte[] iconData = File.ReadAllBytes(compileOptions.IconPaths[0]); description.Metadata.Icon = new MultiResolutionImage(); description.Metadata.Icon.Add(new SingleResolutionImage() { Data = iconData, MimeType = "image/png" }); // Icons with same base name are different resolutions string baseName = GetIconBaseName(compileOptions.IconPaths[0]); if (baseName != null) { var otherResolutions = compileOptions.IconPaths.Where(ic => ic != compileOptions.IconPaths[0] && GetIconBaseName(ic) == baseName); foreach (var otherResolution in otherResolutions) { iconData = File.ReadAllBytes(otherResolution); description.Metadata.Icon.Add(new SingleResolutionImage() { Data = iconData, MimeType = "image/png" }); } } } } // Map remaining icons to configurations if (compileOptions.DefaultIconPath != null) { for (int i = 1; i < description.Metadata.Configurations.Count; i++) { var configuration = description.Metadata.Configurations[i]; // Set icon from default path configuration.Icon = SetDefaultIcon(description.ComponentName, configuration.Name, compileOptions.DefaultIconPath); } } else { // Icon was specified manually for (int i = 1; i < compileOptions.IconPaths.Count && i < description.Metadata.Configurations.Count; i++) { var configuration = description.Metadata.Configurations[i]; byte[] iconData = File.ReadAllBytes(compileOptions.IconPaths[i]); configuration.Icon = new MultiResolutionImage(); configuration.Icon.Add(new SingleResolutionImage() { Data = iconData, MimeType = "image/png" }); } } }