// PropPageLogFiles.cpp : implementation file // #include "stdafx.h" #include "emshell.h" #include "ReadLogsDlg.h" #include "PropPageLogFiles.h" #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CPropPageLogFiles property page IMPLEMENT_DYNCREATE(CPropPageLogFiles, CPropertyPage) CPropPageLogFiles::CPropPageLogFiles() : CPropertyPage(CPropPageLogFiles::IDD) { //{{AFX_DATA_INIT(CPropPageLogFiles) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } extern BSTR CopyBSTR( LPBYTE pb, ULONG cb ); extern PEmObject GetEmObj(BSTR bstrEmObj); CPropPageLogFiles::~CPropPageLogFiles() { } void CPropPageLogFiles::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPropPageLogFiles) DDX_Control(pDX, IDC_LIST_LOGFILES, m_ListCtrl); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPropPageLogFiles, CPropertyPage) //{{AFX_MSG_MAP(CPropPageLogFiles) ON_NOTIFY(NM_DBLCLK, IDC_LIST_LOGFILES, OnDblclkListLogfiles) ON_BN_CLICKED(IDC_BUTTON_EXPORT, OnButtonExport) ON_BN_CLICKED(IDC_BUTTON_VIEWLOGFILE, OnButtonViewlogfile) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPropPageLogFiles message handlers BOOL CPropPageLogFiles::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here //Load the string resources for the CListCtrl columns CString strFileName, strSize, strTime; strFileName.LoadString(IDS_LC_FILENAME); strSize.LoadString(IDS_LC_FILESIZE); strTime.LoadString(IDS_LC_FILETIME); //Add the columns to the list control m_ListCtrl.BeginSetColumn(3); m_ListCtrl.AddColumn(strFileName); m_ListCtrl.AddColumn(strSize, VT_I4); m_ListCtrl.AddColumn(strTime); m_ListCtrl.EndSetColumn(); // Populate the list control with the log files PopulateLogType(); m_ListCtrl.ResizeColumnsFitScreen(); m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPropPageLogFiles::PopulateLogType() { _variant_t var; //This will create and initialize the var variant HRESULT hr = E_FAIL; LONG lLBound = 0; LONG lUBound = 0; BSTR bstrEmObj = NULL; BSTR bstrEmObjectFilter = NULL; EmObject *pCurrentObj = NULL; EmObject EmObjectFilter; memset(&EmObjectFilter, 0, sizeof( EmObject ) ); do { memcpy( &EmObjectFilter, m_pEmObject, sizeof( EmObject ) ); EmObjectFilter.type = EMOBJ_LOGFILE; bstrEmObjectFilter = CopyBSTR ( (LPBYTE)&EmObjectFilter, sizeof( EmObject ) ); //Populate the list control based on the EmObjectType //Enumerate all the objects and stick them in the variant hr = m_pIEmManager->EnumObjectsEx(bstrEmObjectFilter, &var); if(FAILED(hr)) break; //Get the lower and upper bounds of the variant array hr = SafeArrayGetLBound(var.parray, 1, &lLBound); if(FAILED(hr)) break; hr = SafeArrayGetUBound(var.parray, 1, &lUBound); if(FAILED(hr)) break; //There are elements at both the lower bound and upper bound, so include them for(; lLBound <= lUBound; lLBound++) { //Get a BSTR object from the safe array hr = SafeArrayGetElement(var.parray, &lLBound, &bstrEmObj); if (FAILED(hr)) break; //Create a local copy of the EmObject (there aren't any pointers in //EmObject structure, so don't worry about doing a deep copy pCurrentObj = ((CEmshellApp*)AfxGetApp())->AllocEmObject(); if (pCurrentObj != NULL) { *pCurrentObj = *GetEmObj(bstrEmObj); } SysFreeString( bstrEmObj ); //Unallocate the EmObject if it has an hr of E_FAIL if (FAILED(pCurrentObj->hr)) { ((CEmshellApp*)AfxGetApp())->DeAllocEmObject(pCurrentObj); continue; } //Convert the BSTR object to an EmObject and pass it to DisplayData DisplayLogData(pCurrentObj); } } while (FALSE); SafeArrayDestroyData(var.parray); SysFreeString( bstrEmObj ); SysFreeString ( bstrEmObjectFilter ); if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } HRESULT CPropPageLogFiles::DisplayLogData(PEmObject pEmObject) { _ASSERTE(pEmObject != NULL); HRESULT hr = E_FAIL; CString strFileSize; CString strStartDate; LONG lRow = 0L; int nImage = 0; int nImageOffset = 0; do { if( pEmObject == NULL ){ hr = E_INVALIDARG; break; } strFileSize.Format(_T("%d"), pEmObject->dwBucket1); lRow = m_ListCtrl.SetItemText(-1, 0, pEmObject->szName); if(lRow == -1L){ hr = E_FAIL; break; } //Set the itemData m_ListCtrl.SetItemData(lRow, (ULONG_PTR) pEmObject); //Get the correct offset into the bitmap for the current status // nImageOffset = GetImageOffsetFromStatus((EmSessionStatus)pEmObject->nStatus); //Call SetItem() with the index and image to show based on the state of pEmObject m_ListCtrl.SetItem(lRow, 0, LVIF_IMAGE, NULL, nImageOffset, 0, 0, 0); lRow = m_ListCtrl.SetItemText(lRow, 1, strFileSize); if(lRow == -1L){ hr = E_FAIL; break; } // // a-mando // if( pEmObject->dateStart != 0L ) { COleDateTime oleDtTm(pEmObject->dateStart); strStartDate = oleDtTm.Format(_T("%c")); lRow = m_ListCtrl.SetItemText(lRow, 2, strStartDate); if(lRow == -1L){ hr = E_FAIL; break; } } // a-mando hr = S_OK; } while( false ); return hr; } void CPropPageLogFiles::OnDblclkListLogfiles(NMHDR* pNMHDR, LRESULT* pResult) { PEmObject pEmObject = NULL; // TODO: Add your control notification handler code here do { //Get the currently selected object in the list control pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; DoModalReadLogsDlg(pEmObject); }while (FALSE); *pResult = 0; } void CPropPageLogFiles::DoModalReadLogsDlg(PEmObject pEmObject) { CReadLogsDlg readLogDlg( pEmObject, m_pIEmManager ); BOOL bInActiveSessionTable = FALSE; // readLogDlg.m_pEmObject = pEmObject; // readLogDlg.m_pIEmManager = m_pIEmManager; readLogDlg.DoModal(); } PEmObject CPropPageLogFiles::GetSelectedEmObject() { POSITION pos = 0; int nIndex = 0; PEmObject pEmObject = NULL; PEmObject pRetVal = NULL; do { pos = m_ListCtrl.GetFirstSelectedItemPosition(); if(pos == NULL) break; //Get the itemdata for the element at nIndex nIndex = m_ListCtrl.GetNextSelectedItem(pos); if (nIndex == -1) break; pEmObject = (PEmObject) m_ListCtrl.GetItemData(nIndex); if ( pEmObject == NULL ) break; pRetVal = pEmObject; } while (FALSE); return pRetVal; } void CPropPageLogFiles::OnButtonExport() { PEmObject pEmObject = NULL; HRESULT hr = S_OK; CString strDirPath; //Iterate through each element in the m_ListCtrl, getting it's pEmObject and calling ExportLog() on it. //Step through every item in the list control int nCount = m_ListCtrl.GetItemCount(); //Get the path if ( ( (CEmshellApp*) AfxGetApp() )->AskForPath( strDirPath ) ) { for (int i = 0;i < nCount; i++) { pEmObject = (PEmObject)m_ListCtrl.GetItemData(i); if (pEmObject == NULL) { hr = E_FAIL; break; } //Export the file ((CEmshellApp*)AfxGetApp())->ExportLog( pEmObject, strDirPath, m_pIEmManager ); } } if (FAILED(hr)) { ((CEmshellApp*)AfxGetApp())->DisplayErrMsgFromHR(hr); } } void CPropPageLogFiles::OnButtonViewlogfile() { PEmObject pEmObject = NULL; // TODO: Add your control notification handler code here do { //Get the currently selected object in the list control pEmObject = GetSelectedEmObject(); if (pEmObject == NULL) break; DoModalReadLogsDlg(pEmObject); }while (FALSE); }