Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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"
                    });
                }
            }
        }