crashanalysercmd/Libraries/File Formats/Plugins/XmlFilePlugin/FileFormat/PlainTextOutput.cs
changeset 2 0c91f0baec58
child 3 045ade241ef5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crashanalysercmd/Libraries/File Formats/Plugins/XmlFilePlugin/FileFormat/PlainTextOutput.cs	Wed Apr 21 09:51:02 2010 +0300
@@ -0,0 +1,381 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+* 
+* Description:
+* The class PlainTextOutput is part of CrashAnalyser XmlFilePlugin plugin.
+* This class creates plain text output.
+*
+*/
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+using XmlFilePlugin.PluginImplementations.FileFormat;
+using System.Text.RegularExpressions;
+
+namespace XmlFilePlugin.PluginImplementations.FileFormat
+{
+    class PlainTextOutput
+    {
+        private static int KColumnWidth = 30;
+        private static string KTitleCrashFile    = "Crash File";
+        private static string KTitleCodesegments = "Crash Time Loaded Code Segments";
+        private static string KTitleRegisters    = "Registers";
+        private static string KTitleCallStacks   = "Call Stacks";
+        private static string KTitleOstTraces    = "OST Traces";
+        private static string KTitleEventLog     = "Event Log";
+        private static string KTitleSymbolFileNames = "Symbol File Names";
+        private static string KTitleUniqueValues = "Unique Values";
+
+        public static void Write(StreamWriter writer, List<CXmlDataBlock> datablocks)
+        {
+            foreach (CXmlDataBlock datablock in datablocks)
+            {
+                WriteDataBlock(writer, datablock);
+                WriteUniqueValues(writer, datablock);
+            }
+        }
+
+        /**
+         * Writes one datablock as plain text.
+         */
+        private static void WriteDataBlock(StreamWriter writer, CXmlDataBlock datablock)
+        {
+            writer.Write(PrettyTitle(KTitleCrashFile));
+
+            // Device
+            if (datablock.Platform().Equals(XmlConsts.Kxml_sos))
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_platform, XmlConsts.Kxml_s60));
+            }
+            else
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_platform, datablock.Platform()));
+            }
+
+            writer.Write(PrettyString(XmlConsts.Kxml_code, datablock.ProductType()));
+            writer.Write(PrettyString(XmlConsts.Kxml_version, datablock.SWVersion()));
+
+            if (datablock.RomId() != null)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_romid, "0x" + datablock.RomId().Value.ToString("X8")));
+            }
+
+            // variant is not written.
+
+            if (datablock.Imei() != string.Empty)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_imei, datablock.Imei()));
+            }
+
+            writer.Write(PrettyString(XmlConsts.Kxml_timestamp, datablock.TimeStampText()));
+
+            string crashtypestr = "Not found";
+            if (datablock.FileType() == XmlConsts.MobileCrashFileType.ETypeBasicCrash)
+            {
+                crashtypestr = XmlConsts.Kxml_type_crash;
+            }
+            else if (datablock.FileType() == XmlConsts.MobileCrashFileType.ETypeAliveMessage)
+            {
+                crashtypestr = XmlConsts.Kxml_type_alivemsg;
+            }
+            else if (datablock.FileType() == XmlConsts.MobileCrashFileType.ETypeCrashAPIReport)
+            {
+                crashtypestr = XmlConsts.Kxml_type_report;
+            }
+            else if (datablock.FileType() == XmlConsts.MobileCrashFileType.ETypeRegistrationMessage)
+            {
+                crashtypestr = XmlConsts.Kxml_type_regmsg;
+            }
+
+            writer.Write(PrettyString(XmlConsts.Kxml_type, crashtypestr));
+
+            writer.Write(PrettyString(XmlConsts.Kxml_file_name, datablock.BinFilename()));
+
+            if (crashtypestr.Equals(XmlConsts.Kxml_type_report))
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_report_category, datablock.ReportCategory()));
+            }
+
+            if (crashtypestr.Equals(XmlConsts.Kxml_type_report))
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_report_type, datablock.ReportType()));
+            }
+
+            if (datablock.CrashedModuleName() != string.Empty)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_crashed_module, datablock.CrashedModuleName()));
+            }
+
+            if (datablock.Hash() != string.Empty)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_defect_hash, datablock.Hash()));
+            }
+
+            WriteDictionaryValues(writer, datablock);
+
+            // Codesegments
+            if (datablock.CodeSegs().Count > 0)
+                writer.Write(PrettyTitle(KTitleCodesegments));
+    
+            foreach (CXmlCodeSegItem codeseg in datablock.CodeSegs())
+            {
+                string range = "0x" + codeseg.Start.ToString("X8") + " - " + "0x" + codeseg.End.ToString("x8");
+                writer.WriteLine(range + FillSpaces(range) + codeseg.Name);
+            }
+
+            // Registers
+            if (datablock.RegStorage().BasicRegs().ToPrettyString().Length > 0 ||
+                datablock.RegStorage().OtherRegLists().Count > 0)
+            {
+                writer.Write(PrettyTitle(KTitleRegisters));
+            }
+            writer.WriteLine(datablock.RegStorage().BasicRegs().ToPrettyString());
+
+            // Extra registers
+            foreach (CXmlRegisterStorage.CCrashInfoRegisterList registerList in datablock.RegStorage().OtherRegLists())
+            {
+                writer.WriteLine(registerList.ToPrettyString());
+            }
+
+            // Call stacks
+            if (datablock.CallStacks().Count > 0)
+                writer.Write(PrettyTitle(KTitleCallStacks));
+    
+            foreach (XmlFilePlugin.FileFormat.CXmlCallStack stack in datablock.CallStacks())
+            {
+                writer.WriteLine(stack.ToString());
+            }
+
+            // OST traces
+            if (datablock.OstTraces().Count > 0)
+                writer.Write(PrettyTitle(KTitleOstTraces));
+ 
+            foreach (string line in datablock.OstTraces())
+            {
+                writer.WriteLine(line);
+            }
+
+            // Event log
+            if (datablock.Eventlog().Count > 0)
+                writer.Write(PrettyTitle(KTitleEventLog));
+            
+            foreach (string line in datablock.Eventlog())
+            {
+                writer.WriteLine(line);
+            }
+        }
+
+
+        /**
+         * Writes dictionary values.
+         */
+        private static void WriteDictionaryValues(StreamWriter writer, CXmlDataBlock datablock)
+        {
+            writer.Write(PrettyString(XmlConsts.Kxml_panic_id, datablock.PanicId()));
+            writer.Write(PrettyString(XmlConsts.Kxml_panic_category, datablock.PanicCategory()));
+            writer.Write(PrettyString(XmlConsts.Kxml_panic_description, Regex.Replace(datablock.PanicDescription(), "<(.|\n)*?>", "")));
+            writer.Write(PrettyString(XmlConsts.Kxml_language, datablock.Language()));
+            
+            if (!datablock.Process().Equals(XmlConsts.Kxml_unknown_process))
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_panicked_process, datablock.Process()));
+            }
+
+            writer.Write(PrettyString(XmlConsts.Kxml_network_country_code, datablock.NetworkCountry()));
+            writer.Write(PrettyString(XmlConsts.Kxml_network_identity, datablock.NetworkIdentity()));
+            writer.Write(PrettyString(XmlConsts.Kxml_s60version, datablock.S60Version()));
+            writer.Write(PrettyString(XmlConsts.Kxml_product_code, datablock.ProductCode()));
+            writer.Write(PrettyString(XmlConsts.Kxml_variant_version, datablock.VariantVersion()));
+
+            if (datablock.ReportType() != string.Empty)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_file_type, "1"));
+            }
+            else
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_file_type, "0"));
+            }
+
+            // Production mode
+            if (datablock.ProductionMode() != -1)
+            {
+                if (datablock.ProductionMode() == 1)
+                {
+                    writer.Write(PrettyString(XmlConsts.Kxml_production_mode, XmlConsts.Kxml_production_mode_value));
+                }
+                else
+                {
+                    writer.Write(PrettyString(XmlConsts.Kxml_production_mode, XmlConsts.Kxml_rnd_mode_value));
+                }
+            }
+
+            // Crash source
+            if (datablock.CrashSource() != -1)
+            {
+                if (datablock.CrashSource() == 1)
+                {
+                    writer.Write(PrettyString(XmlConsts.Kxml_crash_source, XmlConsts.Kxml_crash_source_user));
+                }
+                else
+                {
+                    writer.Write(PrettyString(XmlConsts.Kxml_crash_source, XmlConsts.Kxml_crash_source_kernel));
+                }
+            }
+
+            // Symbol file names
+            if (datablock.SymbolFiles().Count > 0)
+                writer.Write(PrettyTitle(KTitleSymbolFileNames));
+    
+            foreach (string fileName in datablock.SymbolFiles())
+            {
+                writer.WriteLine(fileName);
+            }
+        
+        }
+
+
+        /**
+         * Writes unique values.
+         */
+        private static void WriteUniqueValues(StreamWriter writer, CXmlDataBlock datablock)
+        {
+            // Unique values
+            writer.Write(PrettyTitle(KTitleUniqueValues));
+
+            // Available memory
+            writer.Write(PrettyString(XmlConsts.Kxml_available_memory, datablock.FreeMemory()));
+
+            if (datablock.RegStorage() != null && datablock.RegStorage().ProgramCounter() != null)
+            {
+                writer.Write(PrettyString(XmlConsts.Kxml_program_counter, "0x" + datablock.RegStorage().ProgramCounter().Value.ToString("X8")));
+                writer.Write(PrettyString(XmlConsts.Kxml_program_counter_symbol, datablock.RegStorage().ProgramCounter().Symbol));
+            }
+
+            writer.Write(PrettyString(XmlConsts.Kxml_misc_info, datablock.GetMiscInfo()));
+
+            // Reporter not written.
+            // Resetreason not written.
+
+            writer.Write(PrettyString(XmlConsts.Kxml_uptime, datablock.Uptime()));
+            writer.Write(PrettyString(XmlConsts.Kxml_siminfo, datablock.Imsi()));
+            writer.Write(PrettyString(XmlConsts.Kxml_locinfo, datablock.LocInfo()));
+            writer.Write(PrettyString(XmlConsts.Kxml_cellid, datablock.NetworkCell()));
+            writer.Write(PrettyString(XmlConsts.Kxml_psninfo, datablock.SerialNumber()));
+
+            if (datablock.UID() != null)
+               writer.Write(PrettyString(XmlConsts.Kxml_uid, "0x" + datablock.UID().Value.ToString("X8")));
+            
+            writer.Write(PrettyString(XmlConsts.Kxml_testset, datablock.TestSet()));
+            writer.Write(PrettyString(XmlConsts.Kxml_diskinfo, datablock.DiskInfo()));
+            writer.Write(PrettyString(XmlConsts.Kxml_phone_number, datablock.PhoneNumber()));
+
+            writer.Write(PrettyString(XmlConsts.Kxml_report_ok, datablock.ReportOK()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_fail, datablock.ReportFail()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_name1, datablock.ReportParamName1()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_value1, datablock.ReportParamValue1()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_name2, datablock.ReportParamName2()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_value2, datablock.ReportParamValue2()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_name3, datablock.ReportParamName3()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_param_value3, datablock.ReportParamValue3()));
+            writer.Write(PrettyString(XmlConsts.Kxml_report_comments, datablock.ReportComments()));
+        }
+
+
+        /**
+         * Returns string in the pretty format (i.e. two columns).
+         * Converts int param to string.
+         */
+        private static string PrettyString(string key, int? value)
+        {
+            if (value == null)
+            {
+                return string.Empty;
+            }
+            return PrettyString(key, value.ToString());
+        }
+
+        /**
+         * Returns string in the pretty format (i.e. two columns).
+         * Converts ulong param to string.
+         */
+        private static string PrettyString(string key, ulong? value)
+        {
+            if (value == null)
+            {
+                return string.Empty;
+            }
+            return PrettyString(key, value.ToString());
+        }
+
+        /**
+         * Returns string in the pretty format (i.e. two columns).
+         * Converts uint param to string.
+         */
+        private static string PrettyString(string key, uint? value)
+        {
+            if (value == null)
+            {
+                return string.Empty;
+            }
+            return PrettyString(key, value.ToString());
+        }
+
+        /**
+         * Returns string in the pretty format (i.e. two columns).
+         * Converts double param to string.
+         */
+        private static string PrettyString(string key, double? value)
+        {
+            if (value == null)
+            {
+                return string.Empty;
+            }
+            return PrettyString(key, value.ToString());
+        }
+
+        /**
+         * Returns string in the pretty format (i.e. two columns)
+         */
+        private static string PrettyString(string key, string value)
+        {
+            if (value == string.Empty || value.Length == 0)
+                return string.Empty;
+
+            return key.ToUpper() + ":" + FillSpaces(key) + value + "\n";
+        }
+
+        /**
+         * Fill spaces so that the output looks nice.
+         */
+        private static string FillSpaces(string key)
+        {
+            string spaceString = "";
+            
+            for (int i = key.Length; i < KColumnWidth; i++)
+            {
+                spaceString += " ";
+            }
+
+            return spaceString;
+        }
+
+        /**
+         * Writes title in the pretty format
+         */
+        private static string PrettyTitle(string titleString)
+        {
+            return "\n === " + titleString + " ===\n";
+        }
+    }
+}