Example #1
0
        private void saveButton_Click(object sender, EventArgs e)
        {
            @enum.Name = enumNameTextBox.Text;

            var values = new Dictionary <string, long>();

            foreach (var row in enumDataGridView.Rows.Cast <DataGridViewRow>().Where(r => r.IsNewRow == false))
            {
                if (!long.TryParse(Convert.ToString(row.Cells[0].Value), out var itemValue))
                {
                    continue;
                }

                var itemName = Convert.ToString(row.Cells[1].Value);

                values.Add(itemName, itemValue);
            }

            @enum.SetData(enumFlagCheckBox.Checked, enumUnderlyingTypeSizeComboBox.SelectedValue, values);
        }
Example #2
0
        public void Load(Stream input, ILogger logger)
        {
            Contract.Requires(input != null);
            Contract.Requires(logger != null);

            using (var archive = new ZipArchive(input, ZipArchiveMode.Read))
            {
                var dataEntry = archive.GetEntry(DataFileName);
                if (dataEntry == null)
                {
                    throw new FormatException();
                }
                using (var entryStream = dataEntry.Open())
                {
                    var document = XDocument.Load(entryStream);
                    if (document.Root?.Element(XmlClassesElement) == null)
                    {
                        throw new FormatException("The data has not the correct format.");
                    }

                    uint.TryParse(document.Root.Attribute(XmlVersionAttribute)?.Value, out var fileVersion);
                    if ((fileVersion & FileVersionCriticalMask) > (FileVersion & FileVersionCriticalMask))
                    {
                        throw new FormatException($"The file version is unsupported. A newer {Constants.ApplicationName} version is required to read it.");
                    }

                    var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value;
                    if (platform != Constants.Platform)
                    {
                        logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform}).");
                    }

                    var customDataElement = document.Root.Element(XmlCustomDataElement);
                    if (customDataElement != null)
                    {
                        project.CustomData.Deserialize(customDataElement);
                    }

                    var typeMappingElement = document.Root.Element(XmlTypeMappingElement);
                    if (typeMappingElement != null)
                    {
                        project.TypeMapping.Deserialize(typeMappingElement);
                    }

                    var enumsElement = document.Root.Element(XmlEnumsElement);
                    if (enumsElement != null)
                    {
                        foreach (var enumElement in enumsElement.Elements(XmlEnumElement))
                        {
                            var name         = enumElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty;
                            var useFlagsMode = (bool?)enumElement.Attribute(XmlFlagsAttribute) ?? false;
                            var size         = enumElement.Attribute(XmlSizeAttribute).GetEnumValue <EnumDescription.UnderlyingTypeSize>();

                            var values = new Dictionary <string, long>();
                            foreach (var itemElement in enumElement.Elements(XmlItemElement))
                            {
                                var itemName  = itemElement.Attribute(XmlNameAttribute)?.Value ?? string.Empty;
                                var itemValue = (long?)itemElement.Attribute(XmlValueAttribute) ?? 0L;

                                values.Add(itemName, itemValue);
                            }

                            var @enum = new EnumDescription
                            {
                                Name = name
                            };
                            @enum.SetData(useFlagsMode, size, values);

                            project.AddEnum(@enum);
                        }
                    }

                    var classes = new List <Tuple <XElement, ClassNode> >();

                    var classesElement = document.Root.Element(XmlClassesElement);
                    if (classesElement != null)
                    {
                        foreach (var element in classesElement
                                 .Elements(XmlClassElement)
                                 .DistinctBy(e => e.Attribute(XmlUuidAttribute)?.Value))
                        {
                            var node = new ClassNode(false)
                            {
                                Uuid           = NodeUuid.FromBase64String(element.Attribute(XmlUuidAttribute)?.Value, true),
                                Name           = element.Attribute(XmlNameAttribute)?.Value ?? string.Empty,
                                Comment        = element.Attribute(XmlCommentAttribute)?.Value ?? string.Empty,
                                AddressFormula = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty
                            };

                            if (!project.ContainsClass(node.Uuid))
                            {
                                project.AddClass(node);

                                classes.Add(Tuple.Create(element, node));
                            }
                        }
                    }

                    foreach (var t in classes)
                    {
                        var nodes = t.Item1.Elements(XmlNodeElement)
                                    .Select(e => CreateNodeFromElement(e, t.Item2, logger))
                                    .Where(n => n != null);

                        foreach (var node in nodes)
                        {
                            t.Item2.AddNode(node);
                        }
                    }
                }
            }
        }