コード例 #1
0
ファイル: Program.cs プロジェクト: GThreepwd/TP4Unzip
        private static void OnThreadException(object sender, ThreadExceptionEventArgs e)
        {
            // Logger.LogError("ThreadException: {0}", e.Exception.Message);

            EventService.CreateMsg(null, string.Format("ThreadException: {0}", e.Exception.Message));
        }
コード例 #2
0
ファイル: TP4File.cs プロジェクト: GThreepwd/TP4Unzip
        private void ProcessGZipData(string directory, string fileName, bool fontList)
        {
            try
            {
                var lFileNameXml = string.Format(@"{0}\{1}\{2}", OutputDirectory, directory, fileName).ToLower();

                var lMemStream = new MemoryStream();

                try
                {
                    GZip.Decompress(new MemoryStream(mData.ToArray()), lMemStream, false);
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [ProcessGZipData-Decompress] Message={0}", ex.Message);

                    try
                    {
                        // Try save memory to file
                        if (CreateXml)
                        {
                            CreateResourceDirectory("xml");

                            lFileNameXml = string.Format(@"{0}\{1}\{2}.corrupted{3}", OutputDirectory, directory, Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)).ToLower();

                            File.WriteAllText(lFileNameXml, Encoding.Default.GetString(lMemStream.ToArray()));
                        }
                    }
                    catch { }

                    return;
                }

                Application.DoEvents();

                var lXml = Encoding.Default.GetString(lMemStream.ToArray());

                var lXmlDoc = new XmlDocument();

                try
                {
                    lXmlDoc.LoadXml(lXml);

                    if (CreateXml)
                    {
                        CreateResourceDirectory("xml");

                        lXmlDoc.Save(lFileNameXml);
                    }
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [ProcessGZipData-LoadXml] Message={0}", ex.Message);

                    if (CreateXml)
                    {
                        CreateResourceDirectory("xml");

                        File.WriteAllText(lFileNameXml, lXml);
                    }
                }

                // Import System Fonts!
                // %CommonProgramFiles(x86)%\AMXShare\G4SupportFiles\__system\graphics\fnt.xma
                if (fontList)
                {
                    var lXmlDocSysFonts = new XmlDocument();

                    lXmlDocSysFonts.LoadXml(Resources.SysFonts);

                    var lTargetNode = lXmlDoc.DocumentElement.SelectSingleNode("/root/fontList");

                    if (lTargetNode.ChildNodes.Count == 0)
                    {
                        foreach (XmlNode node in lXmlDocSysFonts.DocumentElement.SelectNodes("/root/fontList/font"))
                        {
                            var lNode = lXmlDoc.ImportNode(node, true);

                            lTargetNode.AppendChild(lNode);
                        }
                    }
                    else
                    {
                        XmlNode lRefChild = null;

                        foreach (XmlNode node in lXmlDocSysFonts.DocumentElement.SelectNodes("/root/fontList/font"))
                        {
                            var lNode = lXmlDoc.ImportNode(node, true);

                            // Order by Font-Index
                            if (lRefChild == null)
                            {
                                lRefChild = lTargetNode.InsertBefore(lNode, lTargetNode.FirstChild);
                            }
                            else
                            {
                                lRefChild = lTargetNode.InsertAfter(lNode, lRefChild);
                            }
                        }
                    }

                    if (CreateXml)
                    {
                        CreateResourceDirectory("xml");

                        var lFileNameSysFont = string.Format(@"{0}\xml\$SysFnt.xml", OutputDirectory, directory).ToLower();

                        lXmlDocSysFonts.Save(lFileNameSysFont);
                    }
                }

                try
                {
                    // Remove XmlDeclaration
                    foreach (XmlNode node in lXmlDoc)
                    {
                        if (node.NodeType == XmlNodeType.XmlDeclaration)
                        {
                            lXmlDoc.RemoveChild(node);
                        }
                    }

                    JsonArrrayHelper(lXmlDoc);

                    var lJson = JsonConvert.SerializeXmlNode(lXmlDoc, Newtonsoft.Json.Formatting.Indented, true);

                    // <page type="page">
                    // JSON.NET and Replacing @ Sign in XML to JSON converstion
                    lJson = (Regex.Replace(lJson, "(?<=\")(@)(?!.*\":\\s )", string.Empty, RegexOptions.IgnoreCase));

                    mJsonList.Add(lJson);

                    // Project -> JSON
                    if (CreateJson)
                    {
                        CreateResourceDirectory("json");

                        var lFileNameJson = string.Format(@"{0}\{1}\{2}.json", OutputDirectory, "json", Path.GetFileNameWithoutExtension(lFileNameXml)).ToLower();

                        File.WriteAllText(lFileNameJson, lJson);
                    }
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [ProcessGZipData-CreateJson] Message={0}", ex.Message);
                }
            }
            catch (Exception ex)
            {
                mTotalErrors++;

                EventService.CreateMsg(this, "Error: [ProcessGZipData] Message={0}", ex.Message);
            }
        }
コード例 #3
0
ファイル: TP4File.cs プロジェクト: GThreepwd/TP4Unzip
        public void Extract()
        {
            mJsonList = new List <string>();

            var mKeys = new List <InfoSegment>();

            mTotalErrors = 0;

            mDataSegments = new Dictionary <uint, DataSegment>();
            mInfoSegments = new Dictionary <uint, InfoSegment>();

            try
            {
                if (!string.IsNullOrWhiteSpace(OutputDirectory))
                {
                    Directory.CreateDirectory(OutputDirectory);
                }

                mStream = File.OpenRead(FileName);

                var lBytes = new byte[14];

                // Das Erste Segment beginnt nach 12 Bytes
                mStream.Seek(12, SeekOrigin.Begin);

                // Ein Segment hat immer die Grösse von 14 Bytes
                while (mStream.Read(lBytes, 0, 14) == 14)
                {
                    var lSegment = Segment.Create(mStream.Position - 14, lBytes);

                    if (lSegment is InfoSegment lInfoSegment)
                    {
                        if (lSegment is InfoSegment)
                        {
                            mInfoSegments.Add(lSegment.SegmentNo, lInfoSegment);
                        }

                        var lBuffer = new byte[BlockSize];

                        mStream.Read(lBuffer, 0, BlockSize);

                        lInfoSegment.AddInfoBlock(lBuffer);
                    }
                    else
                    {
                        mDataSegments.Add(lSegment.SegmentNo, (DataSegment)lSegment);

                        // Springe zum nächsten Segment
                        // Die Grösse eines Blocks beträgt jeweils 512 Bytes
                        // Die im Block enthaltenen Daten (Bytes) können auch kleiner sein
                        mStream.Seek(BlockSize, SeekOrigin.Current);
                    }
                }

                EventService.CreateMsg(this, "Gefundene Info-Segmente: {0}, Aktuelle Position={1}", mInfoSegments.Count, mStream.Position);

                if (Settings.Default.CreateSegmentInfo)
                {
                    DebugInfoSegments();
                }

                ProcessJunkData();

                try
                {
                    var lJsonProject = new JObject();

                    var lJsonPages    = new JArray();
                    var lJsonPalettes = new JArray();

                    foreach (var json in mJsonList)
                    {
                        var lJsonObj = JObject.Parse(json).SelectToken("", false);

                        // Omit root object
                        if ((lJsonObj.First as JProperty)?.Name == "root")
                        {
                            lJsonObj = lJsonObj.SelectToken("root", false);
                        }

                        var lProperty = lJsonObj.First as JProperty;

                        switch (lProperty?.Name)
                        {
                        case "versionInfo":
                        {
                            lJsonProject["project"] = lJsonObj;

                            // Add pages after Project-Info
                            if (lProperty?.Name == "versionInfo")
                            {
                                lJsonProject.Add(new JProperty("pages"));
                            }

                            break;
                        }

                        case "page":
                        {
                            lJsonPages.Add(lJsonObj);

                            break;
                        }

                        case "cm":
                        {
                            lJsonProject.Add(new JProperty("map", lJsonObj));

                            break;
                        }

                        case "paletteData":
                        {
                            lJsonPalettes.Add(lJsonObj);

                            break;
                        }

                        default:
                        {
                            lJsonProject.Merge(lJsonObj);
                            break;
                        }
                        }
                    }

                    // All pages (Array)
                    lJsonProject["pages"] = lJsonPages;

                    // Palette Data
                    lJsonProject["palettes"] = lJsonPalettes;

                    var lJSonProjStr = lJsonProject.ToString();

                    // Project -> JSON
                    if (CreateJson)
                    {
                        var lFileName = string.Format(@"{0}\project.json", OutputDirectory).ToLower();

                        File.WriteAllText(lFileName, lJSonProjStr);
                    }

                    // Project -> JavaScript
                    lJSonProjStr = string.Format("var {0} = {1}", Settings.Default.JsVariableName, lJSonProjStr);

                    var lFileNameJsProject = string.Format(@"{0}\{1}", OutputDirectory, Settings.Default.JsFileName);

                    File.WriteAllText(lFileNameJsProject, lJSonProjStr);
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [Extract-CreateJson] Message={0}", ex.Message);
                }
            }
            catch (Exception ex)
            {
                mTotalErrors++;

                EventService.CreateMsg(this, "Error: [Extract] Message={0}", ex.Message);
            }
            finally
            {
                mStream?.Dispose();
            }

            EventService.CreateMsg(this, "Fertig, Anzahl Fehler: {0}", mTotalErrors);
        }
コード例 #4
0
ファイル: TP4File.cs プロジェクト: GThreepwd/TP4Unzip
        private void ProcessRessource(string originalName)
        {
            try
            {
                var lExt = Path.GetExtension(originalName);

                // <?xml version=\"1.0\"?>
                var lStr = Encoding.Default.GetString(mData.Take(21).ToArray());

                // Empty table.xma => RawXml -> Ignore
                if (lStr == "<?xml version=\"1.0\"?>")
                {
                    return;
                }

                var lDirectory   = DirectoryOthers;
                var lNewFileName = originalName;

                if (lExt == ".xma")
                {
                    lNewFileName = "$" + originalName.Replace(".xma", ".xml");
                }

                lNewFileName = lNewFileName.ToLower();

                switch (lExt)
                {
                case ".raw":
                case ".xma":
                case ".xml": lDirectory = DirectoryXml; break;

                case ".jpg":
                case ".png": lDirectory = DirectoryImages; break;

                case ".ttf": lDirectory = DirectoryFonts; break;

                case ".wav":
                case ".mp3": lDirectory = DirectoryAudio; break;
                }

                EventService.CreateMsg(this, "Erstelle Datei: {0}", lNewFileName);

                if (lExt == ".xma" || lExt == ".xml")
                {
                    ProcessGZipData(lDirectory, lNewFileName, lNewFileName == "$fnt.xml");
                }
                else
                {
                    CreateResourceDirectory(lDirectory);

                    ProcessRawData(lDirectory, lNewFileName);
                }

                Application.DoEvents();
            }
            catch (Exception ex)
            {
                mTotalErrors++;

                EventService.CreateMsg(this, "Error: [ProcessRessource] Message=" + ex.Message);
            }
        }
コード例 #5
0
        private void ProcessGZipData(string directory, string fileName, bool fontList)
        {
            try
            {
                var lFileNameXml = string.Format(@"{0}\{1}\{2}", OutputDirectory, directory, fileName).ToLower();

                var lMemStream = new MemoryStream();

                try
                {
                    GZip.Decompress(new MemoryStream(mData.ToArray()), lMemStream, false);
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [ProcessGZipData-Decompress] Message={0}", ex.Message);

                    try
                    {
                        // Try save memory to file
                        lFileNameXml = string.Format(@"{0}\{1}\{2}.corrupted{3}", OutputDirectory, directory, Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)).ToLower();

                        File.WriteAllText(lFileNameXml, Encoding.Default.GetString(lMemStream.ToArray()));
                    }
                    catch { }

                    return;
                }

                Application.DoEvents();

                var lXml = Encoding.Default.GetString(lMemStream.ToArray());

                var lXmlDoc = new XmlDocument();

                try
                {
                    lXmlDoc.LoadXml(lXml);

                    try
                    {
                        // Linking XSLT to a Source XML Document:
                        // Embed an XSLT style sheet inside the source XML document
                        // Example: <?xml-stylesheet type="text/xsl" href="style.xsl"?>
                        // When you run the source XML file in Internet Explorer, the transformation is applied automatically
                        if (!string.IsNullOrWhiteSpace(XmlStyleSheetElement))
                        {
                            var lData = string.Format("type=\"text/xsl\" href=\"{0}\"", XmlStyleSheetElement);

                            var lStylesheetInstruction = lXmlDoc.CreateProcessingInstruction("xml-stylesheet", lData);

                            lXmlDoc.InsertAfter(lStylesheetInstruction, lXmlDoc.FirstChild);
                        }
                    }
                    catch (Exception ex)
                    {
                        mTotalErrors++;

                        EventService.CreateMsg(this, "Error: [ProcessGZipData-XmlStyleSheetElement] Message={0}", ex.Message);
                    }

                    lXmlDoc.Save(lFileNameXml);
                }
                catch (Exception ex)
                {
                    mTotalErrors++;

                    EventService.CreateMsg(this, "Error: [ProcessGZipData-LoadXml] Message={0}", ex.Message);

                    File.WriteAllText(lFileNameXml, lXml);
                }

                // Import System Fonts!
                // %CommonProgramFiles(x86)%\AMXShare\G4SupportFiles\__system\graphics\fnt.xma
                if (fontList)
                {
                    var lXmlDocSysFonts = new XmlDocument();

                    lXmlDocSysFonts.LoadXml(Properties.Resources.SysFonts);

                    var lTargetNode = lXmlDoc.DocumentElement.SelectSingleNode("/root/fontList");

                    if (lTargetNode.ChildNodes.Count == 0)
                    {
                        foreach (XmlNode node in lXmlDocSysFonts.DocumentElement.SelectNodes("/root/fontList/font"))
                        {
                            var lNode = lXmlDoc.ImportNode(node, true);

                            lTargetNode.AppendChild(lNode);
                        }
                    }
                    else
                    {
                        XmlNode lRefChild = null;

                        foreach (XmlNode node in lXmlDocSysFonts.DocumentElement.SelectNodes("/root/fontList/font"))
                        {
                            var lNode = lXmlDoc.ImportNode(node, true);

                            // Order by Font-Index
                            if (lRefChild == null)
                            {
                                lRefChild = lTargetNode.InsertBefore(lNode, lTargetNode.FirstChild);
                            }
                            else
                            {
                                lRefChild = lTargetNode.InsertAfter(lNode, lRefChild);
                            }
                        }
                    }

                    CreateResourceDirectory("xml");

                    var lFileNameSysFont = string.Format(@"{0}\xml\$SysFnt.xml", OutputDirectory, directory).ToLower();

                    lXmlDocSysFonts.Save(lFileNameSysFont);
                }

                if (CreateJson)
                {
                    try
                    {
                        // Remove XmlDeclaration
                        foreach (XmlNode node in lXmlDoc)
                        {
                            if (node.NodeType == XmlNodeType.XmlDeclaration)
                            {
                                lXmlDoc.RemoveChild(node);
                            }
                        }

                        // Remove Stylesheet Instruction
                        var lNode = lXmlDoc.SelectSingleNode("/processing-instruction('xml-stylesheet')");

                        if (lNode != null)
                        {
                            lXmlDoc.RemoveChild(lNode);
                        }

                        JsonArrrayHelper(lXmlDoc);

                        var lJson = JsonConvert.SerializeXmlNode(lXmlDoc, Newtonsoft.Json.Formatting.Indented, true);

                        // <page type="page">
                        // JSON.NET and Replacing @ Sign in XML to JSON converstion
                        lJson = (Regex.Replace(lJson, "(?<=\")(@)(?!.*\":\\s )", string.Empty, RegexOptions.IgnoreCase));

                        mJsonList.Add(lJson);

                        CreateResourceDirectory("json");

                        var lFileNameJson = string.Format(@"{0}\{1}\{2}.json", OutputDirectory, "json", Path.GetFileNameWithoutExtension(lFileNameXml)).ToLower();

                        File.WriteAllText(lFileNameJson, lJson);
                    }
                    catch (Exception ex)
                    {
                        mTotalErrors++;

                        EventService.CreateMsg(this, "Error: [ProcessGZipData-CreateJson] Message={0}", ex.Message);
                    }
                }

                // HTML-Transformation
                if (!string.IsNullOrWhiteSpace(XmlStyleSheetHtmlFileName))
                {
                    CreateResourceDirectory("html");

                    // Create the XslTransform object and load the style sheet.
                    var lXslt = new XslCompiledTransform();

                    lXslt.Load(XmlStyleSheetHtmlFileName);

                    // Load the file to transform.
                    var lXmlSource = new XPathDocument(lFileNameXml);

                    var lFileNameHtml = string.Format(@"{0}\{1}\{2}.html", OutputDirectory, "html", Path.GetFileNameWithoutExtension(lFileNameXml)).ToLower();

                    var lSettings = new XmlWriterSettings
                    {
                        Indent           = true,
                        NewLineHandling  = NewLineHandling.None,
                        ConformanceLevel = ConformanceLevel.Fragment
                    };

                    using (var lStrWriter = new StringWriter())
                    {
                        // Create the writer.
                        using (var lXmlWriter = XmlWriter.Create(lStrWriter, lSettings))
                        {
                            // Transform the file and send the output to the console.
                            lXslt.Transform(lXmlSource, lXmlWriter);

                            var lHtml = lStrWriter.ToString();

                            // Remove: <?xml version="1.0" encoding="utf-16"?>
                            lHtml = lHtml.Replace(XmlHeaderNet, "");

                            File.WriteAllText(lFileNameHtml, lHtml);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                mTotalErrors++;

                EventService.CreateMsg(this, "Error: [ProcessGZipData] Message={0}", ex.Message);
            }
        }