sysperfana/heapanalyser/Libraries/Engine/HeapComparisonLib/CSV/Excel/CSVExcelExporterTwoDataSets.cs
author Jussi Ryoma <ext-jussi.s.ryoma@nokia.com>
Tue, 24 Aug 2010 14:01:48 +0300
changeset 16 72f198be1c1d
parent 8 15296fd0af4a
permissions -rw-r--r--
Crash Analyser Carbide Extension 1.4.0

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
*   this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
*   this list of conditions and the following disclaimer in the documentation
*   and/or other materials provided with the distribution.
* - Neither the name of Nokia Corporation nor the names of its contributors
*   may be used to endorse or promote products derived from this software
*   without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* 
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

using System;
using System.IO;
using System.Threading;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection; 
using SymbianExcelUtils;
using SymbianUtils;

namespace HeapComparisonLib.CSV
{
    internal class CSVExcelExporterTwoDataSets : DisposableObject
    {
        #region Constructors & destructor
        public CSVExcelExporterTwoDataSets( string aOutputFileName, string aCol1FileName, string aCol2FileName )
        {
            iFileName = aOutputFileName;
            iCol1FileName = aCol1FileName;
            iCol2FileName = aCol2FileName;
            //
            iExcelApp = new Excel.Application();
            if ( iExcelApp != null )
            {
                iExcelApp.Visible = false;
                iExcelApp.DisplayAlerts = false;

                // Prepare sheets
                PrepareWorksheetReadyForData();
            }
            else
            {
                throw new Exception( "Microsoft Excel not available" );
            }
        }
        #endregion

        #region API
        public void CompareThread( CSVThread aThread1, CSVThread aThread2 )
        {
            // Do comparison
            iComparerHeapSize.Compare( aThread1, aThread2 );
            iComparerCellCounts.Compare( aThread1, aThread2 );
            iComparerLargestCells.Compare( aThread1, aThread2 );
            iComparerFragmentation.Compare( aThread1, aThread2 );
            iComparerSlackSpace.Compare( aThread1, aThread2 );
        }
        #endregion

        #region From DisposableObject
        protected override void CleanupManagedResources()
        {
            try
            {
                if ( iExcelApp != null )
                {
                    // We're finished
                    PrepareWorsheetForSaving();

                    // Save excel workbook
                    SaveWorkbook();

                    // Close app
                    Utils.CloseExcel( iExcelApp );
                }

                iExcelApp = null;
            }
            finally
            {
                base.CleanupManagedResources();
            }
        }
        #endregion

        #region Internal methods
        private void PrepareWorksheetReadyForData()
        {
            Excel.Workbooks workbooks = iExcelApp.Workbooks;
            workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
            Excel.Workbook workbook = workbooks.get_Item(workbooks.Count);
            Excel.Sheets sheets = workbook.Worksheets;

            Excel.Worksheet sheet = null;
            //
            sheet = (Excel.Worksheet)sheets.Add(Type.Missing, sheets.get_Item(sheets.Count), 1, Excel.XlSheetType.xlWorksheet);
            iComparerHeapSize = new Comparers.HeapSize( sheet, iCol1FileName, iCol2FileName );
            iComparerHeapSize.PrepareWorksheetReadyForData();
            //
            sheet = (Excel.Worksheet)sheets.Add(Type.Missing, sheets.get_Item(sheets.Count), 1, Excel.XlSheetType.xlWorksheet);
            iComparerCellCounts = new Comparers.CellCounts( sheet, iCol1FileName, iCol2FileName );
            iComparerCellCounts.PrepareWorksheetReadyForData();
            //
            sheet = (Excel.Worksheet)sheets.Add(Type.Missing, sheets.get_Item(sheets.Count), 1, Excel.XlSheetType.xlWorksheet);
            iComparerLargestCells = new Comparers.LargestCells( sheet, iCol1FileName, iCol2FileName );
            iComparerLargestCells.PrepareWorksheetReadyForData();
            //
            sheet = (Excel.Worksheet)sheets.Add(Type.Missing, sheets.get_Item(sheets.Count), 1, Excel.XlSheetType.xlWorksheet);
            iComparerFragmentation = new Comparers.Fragmentation( sheet, iCol1FileName, iCol2FileName );
            iComparerFragmentation.PrepareWorksheetReadyForData();
            //
            sheet = (Excel.Worksheet)sheets.Add(Type.Missing, sheets.get_Item(sheets.Count), 1, Excel.XlSheetType.xlWorksheet);
            iComparerSlackSpace = new Comparers.SlackSpace( sheet, iCol1FileName, iCol2FileName );
            iComparerSlackSpace.PrepareWorksheetReadyForData();
        }

        private void PrepareWorsheetForSaving()
        {
            // Finalise comparison sheets
            iComparerHeapSize.FinaliseWorksheet();
            iComparerCellCounts.FinaliseWorksheet();
            iComparerLargestCells.FinaliseWorksheet();
            iComparerFragmentation.FinaliseWorksheet();
            iComparerSlackSpace.FinaliseWorksheet();

            // Create summary sheet
            Excel.Workbooks workbooks = iExcelApp.Workbooks;
            Excel.Workbook workbook = workbooks.get_Item(workbooks.Count);
            Excel.Sheets sheets = workbook.Worksheets;
            Excel.Worksheet sheet = (Excel.Worksheet)sheets.get_Item(1);
            CreateSummary( sheet );
            sheet.Activate();
        }

        private void CreateSummary( Microsoft.Office.Interop.Excel.Worksheet aSheet )
        {
            aSheet.Name = "Summary";
            //
            int row = 1;
            Utils.SetValue( row, 2, aSheet, "Delta" );
            Utils.MakeBoxedTitleRow( row, 2, aSheet, 0xFF0000 );
            row++;
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "File 1:" );
            Utils.SetValue( row, 2, aSheet, iCol1FileName );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "File 2:" );
            Utils.SetValue( row, 2, aSheet, iCol2FileName );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Heap size:" );
            Utils.SetValue( row, 2, aSheet, iComparerHeapSize.DeltaFormula( 0 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Free space:" );
            Utils.SetValue( row, 2, aSheet, iComparerHeapSize.DeltaFormula( 1 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Alloc space:" );
            Utils.SetValue( row, 2, aSheet, iComparerHeapSize.DeltaFormula( 2 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Heap size:" );
            Utils.SetValue( row, 2, aSheet, iComparerHeapSize.DeltaFormula( 0 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Free cell count:" );
            Utils.SetValue( row, 2, aSheet, iComparerCellCounts.DeltaFormula( 0 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Allocated cell count:" );
            Utils.SetValue( row, 2, aSheet, iComparerCellCounts.DeltaFormula( 1 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Fragmentation:" );
            Utils.SetValue( row, 2, aSheet, iComparerFragmentation.DeltaFormula( 0 ) );
            //
            row++;
            Utils.SetValue( row, 1, aSheet, "Slack space:" );
            Utils.SetValue( row, 2, aSheet, iComparerSlackSpace.DeltaFormula( 0 ) );
            Utils.BoldColumn( 1, aSheet );

            // Calculate column sizes
            Utils.AutoFitColumn( 1, aSheet );
            Utils.AutoFitColumn( 2, aSheet );
        }

        private void SaveWorkbook()
        {
            string path = Path.GetDirectoryName( iFileName );
            System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo( path );
            if ( !dirInfo.Exists )
            {
                dirInfo.Create();
            }

            System.IO.FileInfo fileInfo = new System.IO.FileInfo( iFileName );
            if ( fileInfo.Exists )
            {
                try
                {
                    fileInfo.Delete();
                }
                catch ( Exception )
                {
                }
            }

            Microsoft.Office.Interop.Excel.Workbooks workbooks = iExcelApp.Workbooks;
            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.get_Item( workbooks.Count );

            try
            {
                workbook.SaveAs( iFileName,
                                    Excel.XlFileFormat.xlExcel9795,
                                    Type.Missing,
                                    Type.Missing,
                                    Type.Missing,
                                    Type.Missing,
                                    Excel.XlSaveAsAccessMode.xlNoChange,
                                    Type.Missing,
                                    Type.Missing,
                                    Type.Missing,
                                    Type.Missing,
                                    Type.Missing );
            }
            catch ( System.IO.IOException )
            {
            }

            workbook.Close( false, Type.Missing, Type.Missing );
        }
        #endregion

        #region Data members
        private readonly string iFileName;
        private readonly string iCol1FileName;
        private readonly string iCol2FileName;
        private Excel.Application iExcelApp;
        private Comparers.HeapSize iComparerHeapSize;
        private Comparers.CellCounts iComparerCellCounts;
        private Comparers.LargestCells iComparerLargestCells;
        private Comparers.Fragmentation iComparerFragmentation;
        private Comparers.SlackSpace iComparerSlackSpace;
        #endregion
    }
}