diff -r 7a31f7298d8f -r 0c91f0baec58 crashanalysercmd/Libraries/File Formats/Plugins/XmlFilePlugin/FileFormat/PlainTextOutput.cs --- /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 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"; + } + } +}