crashanalysercmd/Libraries/File Formats/Plugins/XmlFilePlugin/FileFormat/CXmlFileDocument.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/CXmlFileDocument.cs	Wed Apr 21 09:51:02 2010 +0300
@@ -0,0 +1,465 @@
+/*
+* 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 CXmlFileDocument is part of CrashAnalyser XmlFilePlugin plugin.
+* Container and output implementation for data in XML File format.
+* XML format is an intermediate file used in the MobileCrash server
+* CXmlFileSink creates an instance of this class and uses it to output
+* crash data to file in XML format. 
+* 
+*/
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Xml;
+
+using CrashItemLib.Crash.Base;
+using CrashItemLib.Crash.Processes;
+using CrashItemLib.Crash.Container;
+using System.IO;
+using CrashItemLib.Sink;
+
+namespace XmlFilePlugin.PluginImplementations.FileFormat
+{
+    internal class CXmlFileDocument
+    {
+        #region Constructors
+        public CXmlFileDocument()
+           
+        {
+        }
+
+        #endregion
+
+        /** Creates a new datablock and inputs data from container to the datablock */
+        public void ReadDataFromContainer(CISinkSerializationParameters aParams)
+        {
+            CIContainer container = aParams.Container;
+
+            //Create a datablock for this container's contents
+            CXmlDataBlock datablock = new CXmlDataBlock();
+           
+            //Read all interesting data from container to the datablock
+            datablock.AddHeader(container);
+            datablock.AddSWInfos(container);
+            datablock.AddThreadAndExitInfo(container);
+            datablock.AddPanicedProcess(container);
+            datablock.AddRegisterLists(container);
+            datablock.AddStacks(container);
+            datablock.AddCodeSegments(container);
+            datablock.AddMemoryInfo(container);
+            datablock.AddHWInfo(container);
+            datablock.AddTelephony(container);
+            datablock.AddEnvInfo(container);
+            datablock.AddReportParameters(container);
+            datablock.AddMessages(container);
+            datablock.AddCrashHash(container);
+
+            string archivedFileName = (String)aParams.OperationData1;
+            datablock.AddFileNames(container, archivedFileName);
+            datablock.AddEventlog(container);
+
+            datablock.AddOstTraces(container);
+
+            //If all went well, we will add datablock to stored datablocks
+            iDatablocks.Add(datablock);
+        }
+
+        public void WriteToXmlStream(XmlWriter aOutput)
+        {
+            System.Diagnostics.Debug.Assert(aOutput != null);
+
+            WriteHeader(aOutput);
+
+            if (iDatablocks.Count > 0)
+            {
+                WriteReport(aOutput);
+            }
+            
+            WriteFooter(aOutput);
+        }
+
+        /**
+         * Writes as plain text.
+         */
+        public void WriteToPlainTextStream(StreamWriter aOutput)
+        {
+            PlainTextOutput.Write(aOutput, iDatablocks);
+        }
+
+        private void WriteReport(XmlWriter aOutput)
+        {
+            CXmlDataBlock datablock = iDatablocks[0];
+            
+            aOutput.WriteStartElement(XmlConsts.Kxml_report);
+
+            WriteDevice(aOutput, datablock);
+            WriteReportDetails(aOutput, datablock);
+
+            aOutput.WriteEndElement();
+        }
+
+
+        private static void WriteDevice(XmlWriter aOutput, CXmlDataBlock datablock)
+        {
+            // Device
+            aOutput.WriteStartElement(XmlConsts.Kxml_device);
+
+            if (datablock.Platform().Equals(XmlConsts.Kxml_sos))
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_platform, XmlConsts.Kxml_s60);
+            }
+            else
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_platform, datablock.Platform());
+            }
+
+            aOutput.WriteAttributeString(XmlConsts.Kxml_code, datablock.ProductType());
+            aOutput.WriteAttributeString(XmlConsts.Kxml_version, datablock.SWVersion());
+
+            if (datablock.RomId() != null)
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_romid, datablock.RomId().ToString());
+            }
+
+            // variant is not written.
+
+            if (datablock.Imei() != string.Empty)
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_imei, datablock.Imei());
+            }
+
+            // Write additional device details here if exist.
+
+            aOutput.WriteEndElement();
+        }
+
+        private static void WriteHeader(XmlWriter aOutput)
+        {
+            aOutput.WriteStartDocument();
+            aOutput.WriteDocType(XmlConsts.Kxml_report, null, XmlConsts.Kxml_doctype, null);
+        }
+
+        private static void WriteFooter(XmlWriter aOutput)
+        {
+            aOutput.WriteEndDocument();
+        }
+
+        private static void WriteReportDetails(XmlWriter aOutput, CXmlDataBlock datablock)
+        {
+            // Device report details
+            aOutput.WriteStartElement(XmlConsts.Kxml_report_details);
+            aOutput.WriteAttributeString(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;
+            }
+
+            aOutput.WriteAttributeString(XmlConsts.Kxml_type, crashtypestr);
+
+            aOutput.WriteAttributeString(XmlConsts.Kxml_file_name, datablock.BinFilename());
+
+            if (crashtypestr.Equals(XmlConsts.Kxml_type_report))
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_report_category, datablock.ReportCategory());
+            }
+
+            if (crashtypestr.Equals(XmlConsts.Kxml_type_report))
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_report_type, datablock.ReportType());
+            }
+
+            if (datablock.CrashedModuleName() != string.Empty)
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_crashed_module, datablock.CrashedModuleName());
+            }
+
+            if (datablock.Hash() != string.Empty)
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_defect_hash, datablock.Hash());
+            }
+
+            // Child elements for report details
+            if (datablock.CodeSegs().Count > 0)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_loaded_dlls);
+            }
+            foreach (CXmlCodeSegItem codeseg in datablock.CodeSegs())
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_loaded_dll);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, codeseg.Name);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_start_address, codeseg.Start.ToString());
+                aOutput.WriteAttributeString(XmlConsts.Kxml_end_address, codeseg.End.ToString());
+                aOutput.WriteEndElement(); // loaded dll
+            }
+
+            if (datablock.CodeSegs().Count > 0)
+            {
+                aOutput.WriteEndElement(); // loaded dlls
+            }
+
+            // Traces
+            if(datablock.RegStorage().BasicRegs().Registers.Count > 0 ||
+                datablock.CallStacks().Count > 0 ||
+                datablock.OstTraces().Count > 0 ||
+                datablock.Eventlog().Count > 0 ||
+                datablock.RegStorage().OtherRegLists().Count > 0)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_traces);
+            }
+
+            WriteDetail(aOutput, XmlConsts.Kxml_register, datablock.RegStorage().BasicRegs().ToString());
+
+            // Extra registers  
+            System.Text.StringBuilder extraRegisters = new System.Text.StringBuilder();
+            foreach (CXmlRegisterStorage.CCrashInfoRegisterList registerList in datablock.RegStorage().OtherRegLists())
+            {
+                extraRegisters.AppendLine(registerList.ToPrettyString());
+            }
+            WriteDetail(aOutput, XmlConsts.Kxml_register_extra, extraRegisters.ToString());
+
+            // Call stack  
+            foreach (XmlFilePlugin.FileFormat.CXmlCallStack stack in datablock.CallStacks())
+            {
+                WriteDetail(aOutput, XmlConsts.Kxml_call_stack_text, stack.ToString());
+            }
+
+            // OST traces  
+            System.Text.StringBuilder ostTraces = new System.Text.StringBuilder();
+            foreach (string line in datablock.OstTraces())
+            {
+                ostTraces.AppendLine(line);
+            }
+            WriteDetail(aOutput, XmlConsts.Kxml_trace_data, ostTraces.ToString());
+
+            // Event log
+            System.Text.StringBuilder eventLog = new System.Text.StringBuilder();
+            foreach (string line in datablock.Eventlog())
+            {
+                eventLog.AppendLine(line);
+            }
+            WriteDetail(aOutput, XmlConsts.Kxml_eventlog, eventLog.ToString());
+
+            if (datablock.RegStorage().BasicRegs().Registers.Count > 0 ||
+                datablock.CallStacks().Count > 0 ||
+                datablock.OstTraces().Count > 0 ||
+                datablock.Eventlog().Count > 0 ||
+                datablock.RegStorage().OtherRegLists().Count > 0)
+            {
+                aOutput.WriteEndElement(); // traces
+            }
+            WriteDictionaryValues(aOutput, datablock);
+            WriteUniqueValues(aOutput, datablock);
+
+            aOutput.WriteEndElement(); // report details
+        }
+
+
+        private static void WriteDictionaryValues(XmlWriter aOutput, CXmlDataBlock datablock)
+        {
+            // Dictionary values
+            aOutput.WriteStartElement(XmlConsts.Kxml_dictionary_values);
+
+            WriteDetail(aOutput, XmlConsts.Kxml_panic_id, datablock.PanicId());
+            WriteDetail(aOutput, XmlConsts.Kxml_panic_category, datablock.PanicCategory());
+            WriteDetail(aOutput, XmlConsts.Kxml_panic_description, datablock.PanicDescription());
+            WriteDetail(aOutput, XmlConsts.Kxml_language, datablock.Language());
+            
+            if (!datablock.Process().Equals(XmlConsts.Kxml_unknown_process))
+            {
+                WriteDetail(aOutput, XmlConsts.Kxml_panicked_process, datablock.Process());
+            }
+
+            WriteDetail(aOutput, XmlConsts.Kxml_network_country_code, datablock.NetworkCountry());
+            WriteDetail(aOutput, XmlConsts.Kxml_network_identity, datablock.NetworkIdentity());
+            WriteDetail(aOutput, XmlConsts.Kxml_s60version, datablock.S60Version());
+            WriteDetail(aOutput, XmlConsts.Kxml_product_code, datablock.ProductCode());
+            WriteDetail(aOutput, XmlConsts.Kxml_variant_version, datablock.VariantVersion());
+
+            aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+            aOutput.WriteAttributeString(XmlConsts.Kxml_name, XmlConsts.Kxml_file_type);
+            if (datablock.ReportType() != string.Empty)
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, "1");
+            }
+            else
+            {
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, "0");
+            }
+            aOutput.WriteEndElement();
+
+            // Production mode
+            if (datablock.ProductionMode() != -1)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, XmlConsts.Kxml_production_mode);
+                if (datablock.ProductionMode() == 1)
+                {
+                    aOutput.WriteAttributeString(XmlConsts.Kxml_value, XmlConsts.Kxml_production_mode_value);
+                }
+                else
+                {
+                    aOutput.WriteAttributeString(XmlConsts.Kxml_value, XmlConsts.Kxml_rnd_mode_value);
+                }
+                aOutput.WriteEndElement();
+            }
+
+            // Crash source
+            if (datablock.CrashSource() != -1)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, XmlConsts.Kxml_crash_source);
+                if (datablock.CrashSource() == 1)
+                {
+                    aOutput.WriteAttributeString(XmlConsts.Kxml_value, XmlConsts.Kxml_crash_source_user);
+                }
+                else
+                {
+                    aOutput.WriteAttributeString(XmlConsts.Kxml_value, XmlConsts.Kxml_crash_source_kernel);
+                }
+                aOutput.WriteEndElement();
+            }
+
+            WriteSymbolFileNames(aOutput, datablock);
+
+
+            aOutput.WriteEndElement(); // dictionary values
+        }
+
+
+        private static void WriteUniqueValues(XmlWriter aOutput, CXmlDataBlock datablock)
+        {
+            // Unique values
+            aOutput.WriteStartElement(XmlConsts.Kxml_unique_values);
+
+            // Hw version is not added because it doesn't exist.
+
+            WriteDetail(aOutput, XmlConsts.Kxml_available_memory, datablock.FreeMemory());
+
+            if (datablock.RegStorage() != null && datablock.RegStorage().ProgramCounter() != null)
+            {
+                WriteDetail(aOutput, XmlConsts.Kxml_program_counter, datablock.RegStorage().ProgramCounter().Value);
+                WriteDetail(aOutput, XmlConsts.Kxml_program_counter_symbol, datablock.RegStorage().ProgramCounter().Symbol);
+            }
+
+            WriteDetail(aOutput, XmlConsts.Kxml_misc_info, datablock.GetMiscInfo());
+
+            // Reporter not written.
+            // Resetreason not written.
+
+            WriteDetail(aOutput, XmlConsts.Kxml_uptime, datablock.Uptime());
+            WriteDetail(aOutput, XmlConsts.Kxml_siminfo, datablock.Imsi());
+            WriteDetail(aOutput, XmlConsts.Kxml_locinfo, datablock.LocInfo());
+            WriteDetail(aOutput, XmlConsts.Kxml_cellid, datablock.NetworkCell());
+            WriteDetail(aOutput, XmlConsts.Kxml_psninfo, datablock.SerialNumber());
+            WriteDetail(aOutput, XmlConsts.Kxml_uid, datablock.UID());
+            WriteDetail(aOutput, XmlConsts.Kxml_testset, datablock.TestSet());
+            WriteDetail(aOutput, XmlConsts.Kxml_diskinfo, datablock.DiskInfo());
+            WriteDetail(aOutput, XmlConsts.Kxml_phone_number, datablock.PhoneNumber());
+            
+            WriteDetail(aOutput, XmlConsts.Kxml_report_ok, datablock.ReportOK());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_fail, datablock.ReportFail());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_name1, datablock.ReportParamName1());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_value1, datablock.ReportParamValue1());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_name2, datablock.ReportParamName2());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_value2, datablock.ReportParamValue2());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_name3, datablock.ReportParamName3());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_param_value3, datablock.ReportParamValue3());
+            WriteDetail(aOutput, XmlConsts.Kxml_report_comments, datablock.ReportComments());
+
+            aOutput.WriteEndElement(); // unique values
+        }
+
+
+        private static void WriteSymbolFileNames(XmlWriter aOutput, CXmlDataBlock datablock)
+        {
+            List<string> symbolFiles = datablock.SymbolFiles();
+
+            string symbolfilenames = string.Empty;
+            foreach (string fileName in symbolFiles)
+            {
+                if (symbolfilenames != string.Empty)
+                {
+                    symbolfilenames = symbolfilenames + ", ";
+                }
+                symbolfilenames = symbolfilenames + Path.GetFileName(fileName);
+            }
+
+            WriteDetail(aOutput, XmlConsts.Kxml_symbol_file_name, symbolfilenames);
+        }
+
+        private static void WriteDetail(XmlWriter aOutput, string name, ulong? value)
+        {
+            if (value != null)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, name);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, value.ToString());
+                aOutput.WriteEndElement();
+            }
+        }
+
+        private static void WriteDetail(XmlWriter aOutput, string name, double? value)
+        {
+            if (value != null)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, name);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, value.ToString());
+                aOutput.WriteEndElement();
+            }
+        }
+
+        private static void WriteDetail(XmlWriter aOutput, string name, string value)
+        {
+            if (value != string.Empty)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, name);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, value);
+                aOutput.WriteEndElement();
+            }
+        }
+
+        private static void WriteDetail(XmlWriter aOutput, string name, int? value)
+        {
+            if (value != null)
+            {
+                aOutput.WriteStartElement(XmlConsts.Kxml_detail);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_name, name);
+                aOutput.WriteAttributeString(XmlConsts.Kxml_value, value.ToString());
+                aOutput.WriteEndElement();
+            }
+        }
+
+        #region Data members
+        private List<CXmlDataBlock> iDatablocks = new List<CXmlDataBlock>();
+        #endregion
+    }
+}