Viewing & Organizing Log Files 
by Phil Grenetz

Listing One

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

public interface ILogViewParser
{
   void Initialize(string sFileName, Mutex sortParseMutex);
   void SetListViewColumnInfo(ref ListViewColumnInfo lvColumnInfo);
   int FormatGridColumns(ListView listViewMain,ListView listViewSort);
   bool ParseLineIntoGrid(string line, ListView listViewMain, 
      ListView listViewSort,SortOrder order,ref int nNewRow);
   void GetAllHeadings(string[] sHeadings);
   SortDataType GetSortDataType(int iCol);
   string GetColumnHeading(int iCol);
   int GetColumnWidth(int iCol);
   void DisplayHeading(ListView listView,int iCol,string adornedValue);
   void GetPluginMenuItems(MenuItem[] menuItems);
}


Listing Two

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

System.Runtime.Remoting.ObjectHandle handle =   
  Activator.CreateInstanceFrom(sPluginFile + ".dll", "LogViewPlugin.Parser"); 
m_LogViewParser = (LogViewInterfaces.ILogViewParser)handle.Unwrap();
m_LogViewParser.Initialize(sFormatFile + ".xml", m_SortParseMutex);
m_nColumns = m_LogViewParser.FormatGridColumns(listViewMain, listViewSort);
m_lvColumnInfo = new ListViewColumnInfo();
m_lvColumnInfo.SetSortColumns(m_anSortCols);
m_lvColumnInfo.SetSortOrders(m_anSortOrders);
m_LogViewParser.SetListViewColumnInfo(ref m_lvColumnInfo);

if (m_nColumns >= 1)
{
    m_sFormatFileName = sFormatFile;
    menuFormat.MenuItems.Clear();
    MenuItem[] menuItems = null;
    m_LogViewParser.GetPluginMenuItems(ref menuItems);
    int nMenuItems = menuItems.Length;
    for (int iItem = 0; iItem < nMenuItems; iItem++)
    {
        menuFormat.MenuItems.Add(iItem, menuItems[iItem]);
    }
}


Listing Three

(a)

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

m_HeaderMenuItems = new MenuItem[3];

m_HeaderMenuItems[0] = new MenuItem("&Numeric Tags", new System.EventHandler(
                                         HeaderMenu_NumericTags_OnClick));
m_HeaderMenuItems[1] = new MenuItem("&Alphabetic Labels",
                  new System.EventHandler(HeaderMenu_AlphaLabels_OnClick));
m_HeaderMenuItems[2] = new MenuItem("&Both", 
                  new System.EventHandler(HeaderMenu_Both_OnClick));
m_MenuItems = new MenuItem[1];
m_MenuItems[0] = new MenuItem("&Header Format", m_HeaderMenuItems);

(b)

private void
HeaderMenu_AlphaLabels_OnClick(object sender, System.EventArgs e)
{
    if (m_headerFormat != HeaderFormat.Alpha)
    {
        m_headerFormat = HeaderFormat.Alpha;
        UpdateColumnHeadings(m_asColLabels);
    }
}


Listing Four

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="PluginAssembly_1" value="LogViewPlugin_FIX_4_1" />
        <add key="PluginFormatFile_1" value="Fix_4_1_LogFormat" />
        <add key="UserDataRootFolder" value="c:\Temp" />
    </appSettings>
</configuration>


Listing Five

(a)

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

// Restore selected columns, their widths and order
// and selected sort columns and their sort order.
RestoreViewSettings();

// Populate list view.
m_bInitialLoadInProgress = true;
m_bLoadInProgress = true;
m_thPopulateList = new Thread(new ThreadStart(PopulateListThreadFunc));
m_thPopulateList.Priority = ThreadPriority.Lowest;
m_thPopulateList.Start();

(b)

while (!m_bStopRequested)
{
    int nNewRow = -1;
    while (((line = sr.ReadLine()) != null) &&
        !m_bStopRequested &&
        (m_bInitialLoadInProgress || m_bDynamicUpdate))
    {
        if (m_bStopRequested)
        {
            m_bStopRequested = false;
            m_bLoadInProgress = false;
            return;
        }
        while (m_bLoadPaused)
        {
            Thread.Sleep(100);
            if (m_bStopRequested)
            {
                m_bStopRequested = false;
                m_bLoadInProgress = false;
                return;
            }
        }
        m_SortParseMutex.WaitOne();
        nNewRow = -1;
        if (m_bAutoScroll)
        {
            listViewMain.BeginUpdate();
        }
        bool bParse = m_LogViewParser.ParseLineIntoGrid(line,
            listViewMain, listViewSort, listViewSort.Sorting, ref nNewRow);
        if (m_bAutoScroll)
        {
            listViewMain.EndUpdate();
        }
        if (!bParse)
        {
            m_SortParseMutex.ReleaseMutex();
            break;
        }
        if (m_bAutoScroll && (nNewRow >= 0))

       {
            listViewMain.EnsureVisible(nNewRow);
        }
        m_SortParseMutex.ReleaseMutex();
    }
}


Listing Six

/********************************************************
This file is part of the LogChipper(tm) software product.
Copyright (C) 2004 Ivden Technologies, Inc. All rights reserved.
********************************************************/

class ListViewItemComparer : IComparer
{
    private int m_nSortColumns;
    private ArrayList m_anSortCols;
    private ArrayList m_anSortOrders;
    private LogViewInterfaces.ILogViewParser m_LogViewParser;
    public ListViewItemComparer() 
    {
    }
    public ListViewItemComparer(ArrayList anSortCol,ArrayList anSortOrder,
                               LogViewInterfaces.ILogViewParser logViewParser)
    {
        m_nSortColumns  = anSortCol.Count;
        m_anSortCols    = anSortCol;
        m_anSortOrders  = anSortOrder;
        m_LogViewParser = logViewParser;
    }
    public int Compare(object x, object y) 
    {
        int nRet = 0;
        for (int iCol = 0; iCol < m_nSortColumns; iCol++)
        {
            nRet = CompareSingleColumn(x,y,(int)m_anSortCols[iCol],
                                             (SortOrder)m_anSortOrders[iCol]);
            if (nRet != 0)
            {
                break;
            }
        }
        return nRet;
    }
    public int CompareSingleColumn(object x, object y, 
                                                   int iCol, SortOrder order)
    {
        int nRet = 0;
        string s1, s2;
        SortDataType type = m_LogViewParser.GetSortDataType(iCol);
        switch (type)
        {
            case    SortDataType.AlphaNoCase:
                nRet = String.Compare(
                   ((ListViewItem)x).SubItems[iCol].Text,
                    ((ListViewItem)y).SubItems[iCol].Text, true);
                break;
            case    SortDataType.AlphaCase:
                nRet = String.Compare(
                    ((ListViewItem)x).SubItems[iCol].Text,
                    ((ListViewItem)y).SubItems[iCol].Text);
                break;
            case    SortDataType.Date:
            case    SortDataType.Time:
                s1 = ((ListViewItem)x).SubItems[iCol].Text;
                s2 = ((ListViewItem)y).SubItems[iCol].Text;
                if ((s1.Length == 0) || (s2.Length == 0))
                {
                    nRet = String.Compare(s1, s2);
                    break;
                }
                try
                {
                    DateTime dt1 = DateTime.Parse(s1);
                    DateTime dt2 = DateTime.Parse(s2);
                    nRet = DateTime.Compare(dt1, dt2);
                }
                // If neither object has valid date format, compare as strings.
                catch 
                {
                    // Compare the two items as a string.
                    nRet = String.Compare(s1, s2);
                }
                break;
            case    SortDataType.Number:
                double d1 = 0;
                double d2 = 0;
                s1 = ((ListViewItem)x).SubItems[iCol].Text;
                s2 = ((ListViewItem)y).SubItems[iCol].Text;
                if ((s1 != null) && (s1.Length > 0))
                {
                    d1 = Convert.ToSingle(s1);
                }
                if ((s2 != null) && (s2.Length > 0))
                {
                    d2 = Convert.ToSingle(s2);
                }
                nRet = (d1 < d2) ? -1 : 1;
                break;
        }
        if(order == SortOrder.Descending)
        {
            nRet *= -1;
        }
        return nRet;
    }
}




5


