//                                          
// Application Verifier UI
// Copyright (c) Microsoft Corporation, 2001
//
//
//
// module: ChooseExe.cpp
// author: CLupu
// created: 04/13/2001
//
// Description:
//  
// "Select individual tests" wizard page class.
//

#include "stdafx.h"
#include "appverif.h"

#include "ViewLog.h"
#include "AVUtil.h"
#include "AVGlobal.h"
#include "Log.h"

#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//
// Help IDs
//

static DWORD MyHelpIds[] =
{
    0, 0
};


/////////////////////////////////////////////////////////////////////////////
// CViewLogPage property page

IMPLEMENT_DYNCREATE(CViewLogPage, CAppverifPage)

CViewLogPage::CViewLogPage() : CAppverifPage(CViewLogPage::IDD)
{
    //{{AFX_DATA_INIT(CViewLogPage)
    // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT

    m_nIssues = 0;
}

CViewLogPage::~CViewLogPage()
{
}

void CViewLogPage::DoDataExchange(CDataExchange* pDX)
{
    CAppverifPage::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CViewLogPage)
    DDX_Control(pDX, IDC_ISSUES, m_IssuesList);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CViewLogPage, CAppverifPage)
//{{AFX_MSG_MAP(CViewLogPage)
ON_MESSAGE( WM_HELP, OnHelp )
ON_WM_CONTEXTMENU()
ON_NOTIFY( NM_CLICK, IDC_ISSUES, OnClickIssue )
ON_NOTIFY( NM_CLICK, IDC_ISSUE_DESCRIPTION, OnClickURL )
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
ULONG CViewLogPage::GetDialogId() const
{
    return IDD_VIEWLOG_PAGE;
}

/////////////////////////////////////////////////////////////////////////////

void CViewLogPage::InsertIssue( DWORD dwIssueId, DWORD dwOccurenceCount )
{
    LVITEM   lvi;
    TCHAR    szBuffer[32];
    TCHAR    szIssue[256];

    wsprintf(szBuffer, _T("%d."), m_nIssues + 1);

    VERIFY( AVLoadString( dwIssueId, szIssue, 256) );

    lvi.mask      = LVIF_TEXT | LVIF_PARAM;
    lvi.pszText   = szBuffer;
    lvi.iItem     = m_nIssues;
    lvi.iSubItem  = 0;
    lvi.lParam    = dwIssueId;

    m_IssuesList.InsertItem(&lvi);

    wsprintf(szBuffer, _T("%d"), dwOccurenceCount);

    m_IssuesList.SetItemText(m_nIssues, COLUMN_TIMES, szBuffer);
    m_IssuesList.SetItemText(m_nIssues, COLUMN_DESCRIPTION, szIssue);

    m_nIssues++;

    return;
}

BOOL CViewLogPage::ReadLog()
{
    HANDLE      hFile = INVALID_HANDLE_VALUE;
    HANDLE      hMap = NULL;
    PBYTE       pMap = NULL;
    BOOL        bReturn = FALSE;
    PISSUEREC   pRecord;
    int         i;

    hFile = CreateFile( g_szFileLog,
                        GENERIC_READ,
                        0,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
                        NULL );

    if ( hFile == INVALID_HANDLE_VALUE )
    {
        goto CleanupAndFail;
    }

    hMap = CreateFileMapping( hFile,
                              NULL,
                              PAGE_READONLY,
                              0,
                              LOGFILESIZE,
                              NULL );

    if ( hMap == NULL )
    {
        goto CleanupAndFail;
    }

    pMap = (PBYTE)MapViewOfFile( hMap, FILE_MAP_READ, 0, 0, LOGFILESIZE );

    if ( pMap == NULL )
    {
        goto CleanupAndFail;
    }

    pRecord = (PISSUEREC)(pMap + sizeof(LOGFILEHEADER));

    for ( i = 0; i < MAX_ISSUES_COUNT; i++ )
    {
        if ( pRecord->dwOccurenceCount > 0 )
        {
            InsertIssue( EVENT_FROM_IND( i ), pRecord->dwOccurenceCount ); 
        }
        pRecord++;
    }

    bReturn = TRUE;

    CleanupAndFail:

    if ( !bReturn )
    {
        AVErrorResourceFormat( IDS_READLOG_FAILED );
    }

    if ( pMap != NULL )
    {
        UnmapViewOfFile( pMap );
    }

    if ( hMap != NULL )
    {
        CloseHandle( hMap );
    }

    if ( hFile != INVALID_HANDLE_VALUE )
    {
        CloseHandle( hFile );
    }

    return bReturn;
}


/////////////////////////////////////////////////////////////////////////////
// CViewLogPage message handlers

/////////////////////////////////////////////////////////////
LONG CViewLogPage::OnHelp( WPARAM wParam, LPARAM lParam )
{
    LONG lResult = 0;
    LPHELPINFO lpHelpInfo = (LPHELPINFO)lParam;

    ::WinHelp(
             (HWND) lpHelpInfo->hItemHandle,
             g_szAVHelpFile,
             HELP_WM_HELP,
             (DWORD_PTR) MyHelpIds );

    return lResult;
}

void CViewLogPage::HandleSelectionChanged( int nSel )
{
    if (nSel == -1)
    {
        return;
    }

    LVITEM lvi;
    TCHAR  szRemedy[512];

    lvi.iItem    = nSel;
    lvi.iSubItem = 0;
    lvi.mask     = LVIF_PARAM;

    m_IssuesList.GetItem( &lvi );

    VERIFY( AVLoadString( (UINT)(lvi.lParam + 1), szRemedy, 512 ) );

    m_dwSelectedIssue = (DWORD)lvi.lParam;

    SetDlgItemText( IDC_ISSUE_DESCRIPTION, szRemedy );
}


void CViewLogPage::OnClickIssue( NMHDR* pNMHDR, LRESULT* pResult ) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    LVHITTESTINFO ht;
    int           nSel;

    ::GetCursorPos(&ht.pt);

    m_IssuesList.ScreenToClient( &ht.pt );

    nSel = m_IssuesList.SubItemHitTest( &ht );

    if (nSel != -1)
    {
        m_IssuesList.SetItemState( nSel,
                                   LVIS_SELECTED | LVIS_FOCUSED,
                                   LVIS_SELECTED | LVIS_FOCUSED );
    }

    HandleSelectionChanged( nSel );
}

void CViewLogPage::OnClickURL( NMHDR* pNMHDR, LRESULT* pResult ) 
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    SHELLEXECUTEINFO sei = { 0};
    TCHAR            szURL[256] = _T("");

    VERIFY( AVLoadString( m_dwSelectedIssue + 2, szURL, 256 ) );

    if (szURL[0] == 0)
    {
        return;
    }

    sei.cbSize = sizeof(SHELLEXECUTEINFO);
    sei.fMask  = SEE_MASK_DOENVSUBST;
    sei.hwnd   = m_hWnd;
    sei.nShow  = SW_SHOWNORMAL;
    sei.lpFile = szURL;

    ShellExecuteEx(&sei);
}


/////////////////////////////////////////////////////////////////////////////
void CViewLogPage::OnContextMenu(CWnd* pWnd, CPoint point) 
{
    ::WinHelp(
             pWnd->m_hWnd,
             g_szAVHelpFile,
             HELP_CONTEXTMENU,
             (DWORD_PTR) MyHelpIds );
}


/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
BOOL CViewLogPage::OnSetActive() 
{
    ASSERT_VALID( m_pParentSheet );

    m_pParentSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_FINISH );

    return CAppverifPage::OnSetActive();
}



/////////////////////////////////////////////////////////////////////////////
BOOL CViewLogPage::OnInitDialog() 
{
    CAppverifPage::OnInitDialog();

    m_IssuesList.SetExtendedStyle( LVS_EX_FULLROWSELECT | m_IssuesList.GetExtendedStyle() );

    m_IssuesList.InsertColumn( COLUMN_NUMBER, _T("No."), LVCFMT_LEFT, 40 );
    m_IssuesList.InsertColumn( COLUMN_TIMES, _T("Times"), LVCFMT_LEFT, 80 );
    m_IssuesList.InsertColumn( COLUMN_DESCRIPTION, _T("Issue description"), LVCFMT_LEFT, 250 );

    ReadLog();

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

/////////////////////////////////////////////////////////////////////////////
// CViewLogPage message handlers