|
|
// MsieCtl.cpp : Implementation of the CMsieCtrl ActiveX Control class.
#include "stdafx.h"
#include "Msie.h"
#include "MsieCtl.h"
#include "MsiePpg.h"
#include "MsieData.h"
#include "resdefs.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
// WMI Interfaces used (defining here instead of linking to wbemuuid.lib)
const IID IID_IWbemProviderInit = { 0x1be41572, 0x91dd, 0x11d1, { 0xae, 0xb2, 0x00, 0xc0, 0x4f, 0xb6, 0x88, 0x20 } };
//const IID IID_IWbemServices =
// { 0x9556dc99, 0x828c, 0x11cf, { 0xa3, 0x7e, 0x00, 0xaa, 0x00, 0x32, 0x40, 0xc7 } };
// Macro for setting a WBEM property
#define SETPROPERTY(prop) \
if (pData->prop.vt == VT_DATE) \ ConvertDateToWbemString(pData->prop); \ pInstance->Put(L#prop, 0, &pData->prop, 0);
IMPLEMENT_DYNCREATE(CMsieCtrl, COleControl)
/////////////////////////////////////////////////////////////////////////////
// Message map
BEGIN_MESSAGE_MAP(CMsieCtrl, COleControl) //{{AFX_MSG_MAP(CMsieCtrl)
ON_WM_CREATE() ON_WM_SIZE() ON_WM_CTLCOLOR() ON_BN_CLICKED(IDC_BTN_BASIC, OnBasicBtnClicked) ON_BN_CLICKED(IDC_BTN_ADVANCED, OnAdvancedBtnClicked) //}}AFX_MSG_MAP
ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Dispatch map
BEGIN_DISPATCH_MAP(CMsieCtrl, COleControl) //{{AFX_DISPATCH_MAP(CMsieCtrl)
DISP_PROPERTY_NOTIFY(CMsieCtrl, "MSInfoView", m_MSInfoView, OnMSInfoViewChanged, VT_I4) DISP_FUNCTION(CMsieCtrl, "MSInfoRefresh", MSInfoRefresh, VT_EMPTY, VTS_BOOL VTS_PI4) DISP_FUNCTION(CMsieCtrl, "MSInfoLoadFile", MSInfoLoadFile, VT_BOOL, VTS_BSTR) DISP_FUNCTION(CMsieCtrl, "MSInfoSelectAll", MSInfoSelectAll, VT_EMPTY, VTS_NONE) DISP_FUNCTION(CMsieCtrl, "MSInfoCopy", MSInfoCopy, VT_EMPTY, VTS_NONE) DISP_FUNCTION(CMsieCtrl, "MSInfoUpdateView", MSInfoUpdateView, VT_EMPTY, VTS_NONE) DISP_FUNCTION(CMsieCtrl, "MSInfoGetData", MSInfoGetData, VT_I4, VTS_I4 VTS_PI4 VTS_I4) //}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()
/////////////////////////////////////////////////////////////////////////////
// Interface map
BEGIN_INTERFACE_MAP(CMsieCtrl, COleControl) INTERFACE_PART(CMsieCtrl, IID_IWbemProviderInit, WbemProviderInit) INTERFACE_PART(CMsieCtrl, IID_IWbemServices, WbemServices) END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Event map
BEGIN_EVENT_MAP(CMsieCtrl, COleControl) //{{AFX_EVENT_MAP(CMsieCtrl)
//}}AFX_EVENT_MAP
END_EVENT_MAP()
/////////////////////////////////////////////////////////////////////////////
// Property pages
BEGIN_PROPPAGEIDS(CMsieCtrl, 1) PROPPAGEID(CMsiePropPage::guid) END_PROPPAGEIDS(CMsieCtrl)
/////////////////////////////////////////////////////////////////////////////
// Initialize class factory and guid
IMPLEMENT_OLECREATE_EX(CMsieCtrl, "MSIE.MsieCtrl.1", 0x25959bef, 0xe700, 0x11d2, 0xa7, 0xaf, 0, 0xc0, 0x4f, 0x80, 0x62, 0)
/////////////////////////////////////////////////////////////////////////////
// Type library ID and version
IMPLEMENT_OLETYPELIB(CMsieCtrl, _tlid, _wVerMajor, _wVerMinor)
/////////////////////////////////////////////////////////////////////////////
// Interface IDs
const IID BASED_CODE IID_DMsie = { 0x25959bed, 0xe700, 0x11d2, { 0xa7, 0xaf, 0, 0xc0, 0x4f, 0x80, 0x62, 0 } }; const IID BASED_CODE IID_DMsieEvents = { 0x25959bee, 0xe700, 0x11d2, { 0xa7, 0xaf, 0, 0xc0, 0x4f, 0x80, 0x62, 0 } };
/////////////////////////////////////////////////////////////////////////////
// Control type information
static const DWORD BASED_CODE _dwMsieOleMisc = OLEMISC_SIMPLEFRAME | OLEMISC_INVISIBLEATRUNTIME | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE;
IMPLEMENT_OLECTLTYPE(CMsieCtrl, IDS_MSIE, _dwMsieOleMisc)
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::CMsieCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CMsieCtrl
BOOL CMsieCtrl::CMsieCtrlFactory::UpdateRegistry(BOOL bRegister) { // TODO: Verify that your control follows apartment-model threading rules.
// Refer to MFC TechNote 64 for more information.
// If your control does not conform to the apartment-model rules, then
// you must modify the code below, changing the 6th parameter from
// afxRegApartmentThreading to 0.
if (bRegister) return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_MSIE, IDB_MSIE, afxRegApartmentThreading, _dwMsieOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::CMsieCtrl - Constructor
CMsieCtrl::CMsieCtrl() { TRACE0("-- CMsieCtrl::CMsieCtrl()\n");
InitializeIIDs(&IID_DMsie, &IID_DMsieEvents);
EnableSimpleFrame();
// set background brush to white (used with static and radio button controls)
m_pCtlBkBrush = new CBrush(RGB(255,255,255));
// You don't need to initialize your data members here. In fact, you
// shouldn't do any time consuming updates here. MSInfoRefresh will
// be called before you need to render or save information.
//
// You will want to initialize the member variable which indicates
// that the control is showing current system info (not any loaded
// information) as this is the default.
m_bCurrent = true; m_cColumns = 0; m_MSInfoView = 0; m_pNamespace = NULL; }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::~CMsieCtrl - Destructor
CMsieCtrl::~CMsieCtrl() { TRACE0("-- CMsieCtrl::~CMsieCtrl()\n");
// Delete all of the items in the pointer array.
for (int i = 0; i < m_ptrarray.GetSize(); i++) DeleteArrayObject(m_ptrarray.GetAt(i)); m_ptrarray.RemoveAll();
delete m_pCtlBkBrush;
if (m_pNamespace) m_pNamespace->Release(); }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::OnDraw - Drawing function
void CMsieCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { TRACE0("-- CMsieCtrl::OnDraw()\n");
if (m_MSInfoView) { if (m_MSInfoView == MSIVIEW_CONNECTIVITY) { DrawLine(); m_edit.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_FRAME); } else m_list.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_FRAME); } }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::DoPropExchange - Persistence support
void CMsieCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX);
// Not using properties, so I'll just leave this one alone.
}
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::OnResetState - Reset control to default state
void CMsieCtrl::OnResetState() { COleControl::OnResetState(); // Resets defaults found in DoPropExchange
}
//-----------------------------------------------------------------------------
// The OnCreate method is used to create the list control. Also, if we've
// already loaded information using Serialize, we can add the lines to
// the list control.
//-----------------------------------------------------------------------------
int CMsieCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { TRACE0("-- CMsieCtrl::OnCreate()\n");
CRect rect; DWORD dwExStyles; CString strText; CHARFORMAT cf; NONCLIENTMETRICS ncm;
// setup fonts for static and radio button controls
memset(&ncm, 0, sizeof(ncm)); ncm.cbSize = sizeof(ncm); SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
ncm.lfMessageFont.lfWeight = FW_BOLD; m_fontStatic.CreateFontIndirect(&ncm.lfMessageFont);
ncm.lfMessageFont.lfWeight = FW_NORMAL; m_fontBtn.CreateFontIndirect(&ncm.lfMessageFont);
if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // In this control, we want to process the WM_CREATE message so we
// can create the list control which is used to display the print
// information. Make the list control the same size as the
// client area.
GetClientRect(&rect);
if (!m_list.Create(WS_CHILD | WS_VSCROLL | WS_HSCROLL | LVS_REPORT, rect, this, IDC_LISTCTRL)) return -1;
// set to FullRowSelect (via extended style)
dwExStyles = (DWORD) ::SendMessage(m_list.m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); ::SendMessage(m_list.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwExStyles | LVS_EX_FULLROWSELECT);
// create static text for Connectivity node
strText.LoadString(IDS_CONNECTIVITY); if (!m_static.Create(strText, WS_CHILD | WS_GROUP | WS_EX_TRANSPARENT | SS_LEFT, CRect(rect.left + 5, rect.top, rect.left + 100, rect.top + 20), this, IDC_STATIC)) return -1; m_static.SetFont(&m_fontStatic);
// create basic and advanced radio buttons for Connectivity node
strText.LoadString(IDS_BASIC_INFO); if (!m_btnBasic.Create(strText, WS_CHILD | WS_TABSTOP | WS_GROUP | BS_AUTORADIOBUTTON, CRect(rect.left + 5, rect.top + 25, rect.left + 200, rect.top + 45), this, IDC_BTN_BASIC)) return -1; m_btnBasic.SetFont(&m_fontBtn); m_btnBasic.SetCheck(1);
strText.LoadString(IDS_ADVANCED_INFO); if (!m_btnAdvanced.Create(strText, WS_CHILD | BS_AUTORADIOBUTTON, CRect(rect.left + 200, rect.top + 25, rect.left + 400, rect.top + 45), this, IDC_BTN_ADVANCED)) return -1; m_btnAdvanced.SetFont(&m_fontBtn);
// create a rich edit control for display Connectivity node
if (!m_edit.Create(WS_CHILD | WS_CLIPCHILDREN | WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_SAVESEL | ES_READONLY, CRect(rect.left, rect.top + 63, rect.right, rect.bottom), this, IDC_EDITCTRL)) return -1;
// set default character formatting for rich edit control
cf.cbSize = sizeof(cf); cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE | CFM_SIZE; cf.dwEffects = CFE_AUTOCOLOR; cf.yHeight = 180; strcpy(cf.szFaceName, "MS Sans Serif"); m_edit.SetDefaultCharFormat(cf);
return 0; }
void CMsieCtrl::DrawLine() { CRect rect; CDC *dc = GetDC(); CBrush brush;
GetClientRect(&rect); brush.CreateSolidBrush(GetBkColor(*dc)); dc->FillRect(rect, &brush); dc->MoveTo(0, 61); dc->LineTo(rect.Width(), 61); dc->MoveTo(0, 62); dc->LineTo(rect.Width(), 62);
ReleaseDC(dc); }
//-----------------------------------------------------------------------------
// The FormatColumns method makes calls to the AddColumn method to create
// all of the necessary columns for this control.
//-----------------------------------------------------------------------------
BOOL CMsieCtrl::FormatColumns() { TRACE1("-- CMsieCtrl::FormatColumns: %i\n", m_MSInfoView);
int idsCol1, idsCol2;
// remove current columns
for (int iCol = m_cColumns - 1; iCol >= 0; iCol--) m_list.DeleteColumn(iCol); m_cColumns = 0; if (m_MSInfoView == MSIVIEW_FILE_VERSIONS) { // File, Version, Size, Date, Path, Company
AddColumn(IDS_FILE, 0, 17); AddColumn(IDS_VERSION, 1, 17); AddColumn(IDS_SIZE, 2, 17, 0, LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, LVCFMT_RIGHT); AddColumn(IDS_DATE, 3, 17); AddColumn(IDS_PATH, 4, 17); AddColumn(IDS_COMPANY, 5, -1); } else if (m_MSInfoView == MSIVIEW_OBJECT_LIST) { AddColumn(IDS_PROGRAM_FILE, 0, 40); AddColumn(IDS_STATUS, 1, 20); AddColumn(IDS_CODE_BASE, 5, -1); } else if ((m_MSInfoView == MSIVIEW_PERSONAL_CERTIFICATES) || (m_MSInfoView == MSIVIEW_OTHER_PEOPLE_CERTIFICATES)) { AddColumn(IDS_ISSUED_TO, 0, 30); AddColumn(IDS_ISSUED_BY, 1, 30); AddColumn(IDS_VALIDITY, 5, 20); AddColumn(IDS_SIGNATURE_ALGORITHM, 5, -1); } else if (m_MSInfoView == MSIVIEW_PUBLISHERS) { AddColumn(IDS_NAME, 0, -1); } else { if (m_MSInfoView == MSIVIEW_SECURITY) { idsCol1 = IDS_ZONE; idsCol2 = IDS_SECURITY_LEVEL; } else { idsCol1 = IDS_ITEM; idsCol2 = IDS_VALUE; }
// Item, Value
// The item lable gets 40% of the control width, the value label the rest.
AddColumn(idsCol1, 0, 40); AddColumn(idsCol2, 1, -1); }
return TRUE; }
//-----------------------------------------------------------------------------
// The AddColumn method adds (you guessed it) a column to the list control. If
// size is zero, the column is sized large enough to hold the text. If size is
// positive, it is treated as a percentage of the window width. If size is -1,
// the column is sized to fill the remaining space in the window.
//-----------------------------------------------------------------------------
BOOL CMsieCtrl::AddColumn(int idsLabel, int nItem, int size, int nSubItem, int nMask, int nFmt) { LV_COLUMN lvc, getlvc; CString strLabel; CRect rect; int nIndex, spaceUsed = 0, nCol = 0;
strLabel.LoadString(idsLabel);
// strip off W2K "[]" stuff
if (-1 != (nIndex = strLabel.Find(_T('[')))) strLabel = strLabel.Left(nIndex - 1);
lvc.mask = nMask; lvc.fmt = nFmt; lvc.pszText = (LPTSTR)(LPCTSTR)strLabel; // Save the ratio for this column.
ASSERT(nItem < 20); m_aiRequestedWidths[nItem] = size; if (m_cColumns < nItem + 1) m_cColumns = nItem + 1;
// Determine the size of this new column.
switch (size) { case 0: // shouldn't use this, though.
lvc.cx = m_list.GetStringWidth(lvc.pszText) + 15; break; case -1: getlvc.mask = LVCF_WIDTH; for (nCol = 0; m_list.GetColumn(nCol, &getlvc); nCol++) spaceUsed += getlvc.cx; m_list.GetClientRect(&rect); lvc.cx = rect.Width() - spaceUsed; break; default: m_list.GetClientRect(&rect); lvc.cx = (rect.Width() * size) / 100; }
if (nMask & LVCF_SUBITEM) { if (nSubItem != -1) lvc.iSubItem = nSubItem; else lvc.iSubItem = nItem; }
m_aiColumnWidths[nItem] = lvc.cx; m_aiMaxWidths[nItem] = lvc.cx; m_aiMinWidths[nItem] = lvc.cx;
return m_list.InsertColumn(nItem, &lvc); }
//-----------------------------------------------------------------------------
// The RefigureColumns method is called when the control is resized. It should
// use the information saved about the columns to change their widths. We
// assume that the last column should be sized to fit the remaining space, if
// possible. Here are our resizing rules:
//
// 1. If the user has resized something, LEAVE THAT WIDTH ALONE.
// 2. Otherwise, use the ratios originally set.
// 3. If a column's wider than its widest item, use the widest item.
// 4. If a column's smaller than its minimum width, use the min.
// 5. Always size the last column to fit, unless it would be smaller
// than its minimum.
//-----------------------------------------------------------------------------
void CMsieCtrl::RefigureColumns(CRect& rect) { int iCol, iPercentageLeft, cxAvailable, cxTotal, cxWidth; BOOL bIgnoreColumn[20];
if (rect == CRect(0,0,0,0)) m_list.GetClientRect(&rect);
// Initialize the running totals.
iPercentageLeft = 100; cxAvailable = rect.Width();
// The first pass will be used to find out what columns to leave alone.
// Doing this allows us to use make a better estimate of the other
// column's size using the ratios.
for (iCol = 0; iCol < m_cColumns; iCol++) { if (m_list.GetColumnWidth(iCol) != m_aiColumnWidths[iCol]) { cxAvailable -= m_list.GetColumnWidth(iCol); iPercentageLeft -= m_aiRequestedWidths[iCol]; bIgnoreColumn[iCol] = TRUE; } else bIgnoreColumn[iCol] = FALSE; } cxTotal = cxAvailable;
// Now, resize the rest of the columns.
for (iCol = 0; iCol < m_cColumns; iCol++) { if (bIgnoreColumn[iCol]) continue;
// Compute how big this column should be, based on the space
// remaining. Remember, cxTotal is the total remaining space
// left after the fixed size columns have been accounted for.
if (iCol + 1 < m_cColumns) { cxWidth = m_aiRequestedWidths[iCol] * cxAvailable / iPercentageLeft; iPercentageLeft -= m_aiRequestedWidths[iCol];
if (cxWidth > m_aiMaxWidths[iCol]) cxWidth = m_aiMaxWidths[iCol]; if (cxWidth < m_aiMinWidths[iCol]) cxWidth = m_aiMinWidths[iCol]; } else { // This is the last column. Try out using the space available.
cxWidth = cxAvailable; if (cxWidth < m_aiMinWidths[iCol]) cxWidth = m_aiMinWidths[iCol]; }
// if first column, add space for icon
if (!iCol) cxWidth += 20;
cxAvailable -= cxWidth; m_list.SetColumnWidth(iCol, cxWidth); m_aiColumnWidths[iCol] = m_list.GetColumnWidth(iCol); } }
//-----------------------------------------------------------------------------
// The AddItem method is used to add a line to the list control.
//-----------------------------------------------------------------------------
BOOL CMsieCtrl::AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex) { LV_ITEM lvItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = nItem; lvItem.iSubItem = nSubItem; lvItem.pszText = (LPTSTR)strItem; if (nSubItem == 0) { if (nImageIndex != -1) { lvItem.mask |= LVIF_IMAGE; lvItem.iImage = nImageIndex; } return m_list.InsertItem(&lvItem); } return m_list.SetItem(&lvItem); }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// When the view property is changed, we should update whatever
// variables used to display the information so the new view will
// be reflected when the control is redrawn, or when data is returned
// by the MSInfoGetText method. This method should NOT refresh the
// information from the system (that's what MSInfoRefresh is for) or
// cause the control to redraw itself.
//-----------------------------------------------------------------------------
void CMsieCtrl::OnMSInfoViewChanged() { TRACE1("-- CMsieCtrl::OnMSInfoViewChanged() [changed to %ld]\n", m_MSInfoView); }
void CMsieCtrl::DeleteArrayObject(void *ptrArray) { LIST_ITEM *pListItem; LIST_FILE_VERSION *pFileVersion; LIST_OBJECT *pObject; LIST_CERT *pCert; LIST_NAME *pName; EDIT_ITEM *pEditItem;
if (ptrArray) { switch (m_MSInfoView) { case MSIVIEW_FILE_VERSIONS: pFileVersion = (LIST_FILE_VERSION *)ptrArray; delete pFileVersion; break; case MSIVIEW_OBJECT_LIST: pObject = (LIST_OBJECT *)ptrArray; delete pObject; break; case MSIVIEW_CONNECTIVITY: pEditItem = (EDIT_ITEM *)ptrArray; delete pEditItem; break; case MSIVIEW_PERSONAL_CERTIFICATES: case MSIVIEW_OTHER_PEOPLE_CERTIFICATES: pCert = (LIST_CERT *)ptrArray; delete pCert; break; case MSIVIEW_PUBLISHERS: pName = (LIST_NAME *)ptrArray; delete pName; break; default: pListItem = (LIST_ITEM *)ptrArray; delete pListItem; } } }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// The MSInfoRefresh method is where the bulk of the work will be
// done for your control. You should requery the system for all of the
// information you display. If this query has the potential to be
// at all time consuming, monitor the long pointed to by pCancel.
// If it is ever non-zero, cancel the update. If the update is
// cancelled, the control is responsible for restoring itself to the
// original, pre-refresh state.
//
// This method should never be called if the control is displaying
// previously saved information.
//
// If the fForSave parameter is TRUE, then the control is being
// updated prior to saving to a stream. In this case, ALL information
// should be gathered (not just info relevant to the current
// MSInfoView) and the control should not be redrawn. Otherwise, for
// efficiency, you can update information only shown by the current
// view.
//-----------------------------------------------------------------------------
void CMsieCtrl::MSInfoRefresh(BOOL fForSave, long FAR* pCancel) { TRACE1("-- CMsieCtrl::MSInfoRefresh(%s,...)\n", (fForSave) ? "TRUE" : "FALSE");
CPtrArray ptrarrayNew; int i, iListItem;
if (!m_bCurrent) return;
// Remember, we need to check if the update was cancelled. It's a good idea
// to check before we start the update, in case it was cancelled while the
// control was being loaded.
if (*pCancel != 0L) return;
// Call a method to update the new pointer array with current info, based
// on what view we should be showing.
iListItem = 0; if (fForSave) { for (i = MSIVIEW_BEGIN; i <= MSIVIEW_END; i++) RefreshArray(i, iListItem, ptrarrayNew); } else RefreshArray(m_MSInfoView, iListItem, ptrarrayNew);
// If this loop has been broken out of because of a cancel, then
// deallocate all of the structures we've allocated for the list
// and exit. If we're still OK, copy all of the new items over
// to the real pointer array (deallocating what's already there).
if (*pCancel == 0L) { i = 0; while (i < ptrarrayNew.GetSize()) { // Delete what's already in the list (if there is anything
// in the list).
if (i < m_ptrarray.GetSize()) DeleteArrayObject(m_ptrarray.GetAt(i));
// Copy the element from the new array to the real array.
m_ptrarray.SetAtGrow(i++, ptrarrayNew.GetAt(i)); }
// Finish emptying out the list (if necessary).
while (i < m_ptrarray.GetSize()) { DeleteArrayObject(m_ptrarray.GetAt(i)); m_ptrarray.SetAt(i++, NULL); } } else { // Delete all of the items in the pointer array.
for (int i = 0; i < ptrarrayNew.GetSize(); i++) DeleteArrayObject(ptrarrayNew.GetAt(i));
ptrarrayNew.RemoveAll(); } }
void CMsieCtrl::RefreshArray(int iView, int &iListItem, CPtrArray &ptrarrayNew) { TRACE0("-- CMsieCtrl::RefreshArray\n");
long lCount, lIndex;
m_uiView = iView;
if (iView == MSIVIEW_SUMMARY) { IE_SUMMARY **ppData; CString strVersion;
theApp.AppGetIEData(SummaryType, &lCount, (void***)&ppData); if (lCount == 1) { AddToArray(ptrarrayNew, iListItem++, IDS_VERSION, GetStringFromVariant((*ppData)->Version)); AddToArray(ptrarrayNew, iListItem++, IDS_BUILD, GetStringFromVariant((*ppData)->Build)); AddToArray(ptrarrayNew, iListItem++, IDS_PRODUCT_ID, GetStringFromVariant((*ppData)->ProductID)); AddToArray(ptrarrayNew, iListItem++, IDS_APP_PATH, GetStringFromVariant((*ppData)->Path)); AddToArray(ptrarrayNew, iListItem++, IDS_LAST_INSTALL_DATE, GetStringFromVariant((*ppData)->LastInstallDate)); AddToArray(ptrarrayNew, iListItem++, IDS_LANGUAGE, GetStringFromVariant((*ppData)->Language)); AddToArray(ptrarrayNew, iListItem++, IDS_ACTIVE_PRINTER, GetStringFromVariant((*ppData)->ActivePrinter)); AddBlankLineToArray(ptrarrayNew, iListItem++); AddToArray(ptrarrayNew, iListItem++, IDS_CIPHER_STRENGTH, GetStringFromVariant((*ppData)->CipherStrength, IDS_FORMAT_BIT)); AddToArray(ptrarrayNew, iListItem++, IDS_CONTENT_ADVISOR, GetStringFromVariant((*ppData)->ContentAdvisor)); AddToArray(ptrarrayNew, iListItem++, IDS_IEAK_INSTALL, GetStringFromVariant((*ppData)->IEAKInstall)); } theApp.AppDeleteIEData(SummaryType, lCount, (void**)ppData); } else if (iView == MSIVIEW_FILE_VERSIONS) { IE_FILE_VERSION **ppData;
theApp.AppGetIEData(FileVersionType, &lCount, (void***)&ppData); for (lIndex = 0; lIndex < lCount; lIndex++) { AddFileVersionToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppData[lIndex]->File), GetStringFromVariant(ppData[lIndex]->Version), GetStringFromVariant(ppData[lIndex]->Size, IDS_FORMAT_KB), GetStringFromVariant(ppData[lIndex]->Date), GetStringFromVariant(ppData[lIndex]->Path), GetStringFromVariant(ppData[lIndex]->Company), ppData[lIndex]->Size.lVal, ppData[lIndex]->Date.date); } theApp.AppDeleteIEData(FileVersionType, lCount, (void**)ppData); } else if (iView == MSIVIEW_CONNECTIVITY) { IE_CONN_SUMMARY **ppData; IE_LAN_SETTINGS **ppLanData; IE_CONN_SETTINGS **ppConnData; CString strTemp; long lLanCount, lConnCount;
theApp.AppGetIEData(ConnSummaryType, &lCount, (void***)&ppData); if (lCount == 1) { AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_CONN_PREF, GetStringFromVariant((*ppData)->ConnectionPreference)); AddEditToArray(ptrarrayNew, iListItem++, IDS_ENABLE_HTTP_1_1, GetStringFromVariant((*ppData)->EnableHttp11)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY_HTTP_1_1, GetStringFromVariant((*ppData)->ProxyHttp11)); } theApp.AppDeleteIEData(ConnSummaryType, lCount, (void**)ppData);
theApp.AppGetIEData(LanSettingsType, &lLanCount, (void***)&ppLanData); if (lCount == 1) { AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_LAN_SETTINGS, _T(""), TRUE); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_CONFIG_PROXY, GetStringFromVariant((*ppLanData)->AutoConfigProxy)); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_PROXY_DETECT_MODE, GetStringFromVariant((*ppLanData)->AutoProxyDetectMode)); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_CONFIG_URL, GetStringFromVariant((*ppLanData)->AutoConfigURL)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY, GetStringFromVariant((*ppLanData)->Proxy)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY_SERVER, GetStringFromVariant((*ppLanData)->ProxyServer)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY_OVERRIDE, GetStringFromVariant((*ppLanData)->ProxyOverride)); } theApp.AppDeleteIEData(LanSettingsType, lLanCount, (void**)ppLanData);
theApp.AppGetIEData(ConnSettingsType, &lConnCount, (void***)&ppConnData); if (lConnCount > 0) { for (lIndex = 0; lIndex < lConnCount; lIndex++) { AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppConnData[lIndex]->Name), _T(""), TRUE); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_PROXY_DETECT_MODE, GetStringFromVariant(ppConnData[lIndex]->AutoProxyDetectMode)); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_CONFIG_URL, GetStringFromVariant(ppConnData[lIndex]->AutoConfigURL)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY, GetStringFromVariant(ppConnData[lIndex]->Proxy)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY_SERVER, GetStringFromVariant(ppConnData[lIndex]->ProxyServer)); AddEditToArray(ptrarrayNew, iListItem++, IDS_PROXY_OVERRIDE, GetStringFromVariant(ppConnData[lIndex]->ProxyOverride)); AddEditToArray(ptrarrayNew, iListItem++, IDS_ALLOW_INTERNET_PROGRAMS, GetStringFromVariant(ppConnData[lIndex]->AllowInternetPrograms)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_MAX_ATTEMPTS, GetStringFromVariant(ppConnData[lIndex]->RedialAttempts)); AddEditToArray(ptrarrayNew, iListItem++, IDS_WAIT_BETWEEN_ATTEMPTS, GetStringFromVariant(ppConnData[lIndex]->RedialWait)); AddEditToArray(ptrarrayNew, iListItem++, IDS_DISCONNECT_IDLE_TIME, GetStringFromVariant(ppConnData[lIndex]->DisconnectIdleTime)); AddEditToArray(ptrarrayNew, iListItem++, IDS_AUTO_DISCONNECT, GetStringFromVariant(ppConnData[lIndex]->AutoDisconnect)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_MODEM, GetStringFromVariant(ppConnData[lIndex]->Modem)); AddEditToArray(ptrarrayNew, iListItem++, IDS_DIAL_UP_SERVER, GetStringFromVariant(ppConnData[lIndex]->DialUpServer)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_LOG_ON_TO_NETWORK, GetStringFromVariant(ppConnData[lIndex]->NetworkLogon)); AddEditToArray(ptrarrayNew, iListItem++, IDS_ENABLE_SOFTWARE_COMPRESSION, GetStringFromVariant(ppConnData[lIndex]->SoftwareCompression)); AddEditToArray(ptrarrayNew, iListItem++, IDS_REQUIRE_ENCRYPTED_PASSWORD, GetStringFromVariant(ppConnData[lIndex]->EncryptedPassword)); AddEditToArray(ptrarrayNew, iListItem++, IDS_REQUIRE_DATA_ENCRYPTION, GetStringFromVariant(ppConnData[lIndex]->DataEncryption)); AddEditToArray(ptrarrayNew, iListItem++, IDS_RECORD_LOG_FILE, GetStringFromVariant(ppConnData[lIndex]->RecordLogFile)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_NETWORK_PROTOCOLS, GetStringFromVariant(ppConnData[lIndex]->NetworkProtocols)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_USE_SERVER_ASSIGNED_IP_ADDRESS, GetStringFromVariant(ppConnData[lIndex]->ServerAssignedIPAddress)); AddEditToArray(ptrarrayNew, iListItem++, IDS_IP_ADDRESS, GetStringFromVariant(ppConnData[lIndex]->IPAddress)); AddEditToArray(ptrarrayNew, iListItem++, IDS_USE_SERVER_ASSIGNED_NAME_SERVER, GetStringFromVariant(ppConnData[lIndex]->ServerAssignedNameServer)); strTemp.Format(IDS_PRIMARY_DNS, GetStringFromVariant(ppConnData[lIndex]->PrimaryDNS)); AddEditToArray(ptrarrayNew, iListItem++, IDS_NAME_SERVER_ADDRESSES, strTemp); strTemp.Format(IDS_SECONDARY_DNS, GetStringFromVariant(ppConnData[lIndex]->SecondaryDNS)); AddEditToArray(ptrarrayNew, iListItem++, _T(""), strTemp); strTemp.Format(IDS_PRIMARY_WINS, GetStringFromVariant(ppConnData[lIndex]->PrimaryWINS)); AddEditToArray(ptrarrayNew, iListItem++, _T(""), strTemp); strTemp.Format(IDS_SECONDARY_WINS, GetStringFromVariant(ppConnData[lIndex]->SecondaryWINS)); AddEditToArray(ptrarrayNew, iListItem++, _T(""), strTemp); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_USE_IP_HEADER_COMPRESSION, GetStringFromVariant(ppConnData[lIndex]->IPHeaderCompression)); AddEditToArray(ptrarrayNew, iListItem++, IDS_USE_DEFAULT_GATEWAY, GetStringFromVariant(ppConnData[lIndex]->DefaultGateway)); AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_SCRIPT_FILE_NAME, GetStringFromVariant(ppConnData[lIndex]->ScriptFileName)); } theApp.AppDeleteIEData(ConnSettingsType, lConnCount, (void**)ppConnData); } else { AddEditBlankLineToArray(ptrarrayNew, iListItem++); AddEditToArray(ptrarrayNew, iListItem++, IDS_NO_CONNECTIONS, _T("")); } } else if (iView == MSIVIEW_CACHE) { IE_CACHE **ppData;
theApp.AppGetIEData(CacheType, &lCount, (void***)&ppData); if (lCount == 1) { AddToArray(ptrarrayNew, iListItem++, IDS_PAGE_REFRESH_TYPE, GetStringFromVariant((*ppData)->PageRefreshType)); AddToArray(ptrarrayNew, iListItem++, IDS_TEMPORARY_INTERNET_FILES_FOLDER, GetStringFromVariant((*ppData)->TempInternetFilesFolder)); AddToArray(ptrarrayNew, iListItem++, IDS_TOTAL_DISK_SPACE, GetStringFromVariant((*ppData)->TotalDiskSpace, IDS_FORMAT_MB)); AddToArray(ptrarrayNew, iListItem++, IDS_AVAILABLE_DISK_SPACE, GetStringFromVariant((*ppData)->AvailableDiskSpace, IDS_FORMAT_MB)); AddToArray(ptrarrayNew, iListItem++, IDS_MAX_CACHE_SIZE, GetStringFromVariant((*ppData)->MaxCacheSize, IDS_FORMAT_MB)); AddToArray(ptrarrayNew, iListItem++, IDS_AVAILABLE_CACHE_SIZE, GetStringFromVariant((*ppData)->AvailableCacheSize, IDS_FORMAT_MB)); } theApp.AppDeleteIEData(CacheType, lCount, (void**)ppData); } else if (iView == MSIVIEW_OBJECT_LIST) { IE_OBJECT **ppData;
theApp.AppGetIEData(ObjectType, &lCount, (void***)&ppData); if (lCount > 0) { for (lIndex = 0; lIndex < lCount; lIndex++) { AddObjectToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppData[lIndex]->ProgramFile), GetStringFromVariant(ppData[lIndex]->Status), GetStringFromVariant(ppData[lIndex]->CodeBase)); } theApp.AppDeleteIEData(ObjectType, lCount, (void**)ppData); } } else if (iView == MSIVIEW_CONTENT) { IE_CONTENT **ppData;
theApp.AppGetIEData(ContentType, &lCount, (void***)&ppData); if (lCount == 1) { AddToArray(ptrarrayNew, iListItem++, IDS_CONTENT_ADVISOR, GetStringFromVariant((*ppData)->Advisor)); } theApp.AppDeleteIEData(ContentType, lCount, (void**)ppData); } else if ((iView == MSIVIEW_PERSONAL_CERTIFICATES) || (iView == MSIVIEW_OTHER_PEOPLE_CERTIFICATES)) { IE_CERTIFICATE **ppData; CString strType; int idsType;
theApp.AppGetIEData(CertificateType, &lCount, (void***)&ppData); if (lCount > 0) { idsType = (iView == MSIVIEW_PERSONAL_CERTIFICATES)? IDS_PERSONAL_TYPE : IDS_OTHER_PEOPLE_TYPE; strType.LoadString(idsType);
for (lIndex = 0; lIndex < lCount; lIndex++) { if (strType == ppData[lIndex]->Type.bstrVal) AddCertificateToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppData[lIndex]->IssuedTo), GetStringFromVariant(ppData[lIndex]->IssuedBy), GetStringFromVariant(ppData[lIndex]->Validity), GetStringFromVariant(ppData[lIndex]->SignatureAlgorithm)); } theApp.AppDeleteIEData(CertificateType, lCount, (void**)ppData); } } else if (iView == MSIVIEW_PUBLISHERS) { IE_PUBLISHER **ppData;
theApp.AppGetIEData(PublisherType, &lCount, (void***)&ppData); if (lCount > 0) { for (lIndex = 0; lIndex < lCount; lIndex++) { AddNameToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppData[lIndex]->Name)); } theApp.AppDeleteIEData(PublisherType, lCount, (void**)ppData); } } else if (iView == MSIVIEW_SECURITY) { IE_SECURITY **ppData;
theApp.AppGetIEData(SecurityType, &lCount, (void***)&ppData); if (lCount > 0) { for (lIndex = 0; lIndex < lCount; lIndex++) { AddToArray(ptrarrayNew, iListItem++, GetStringFromVariant(ppData[lIndex]->Zone), GetStringFromVariant(ppData[lIndex]->Level)); } theApp.AppDeleteIEData(SecurityType, lCount, (void**)ppData); } } }
CString CMsieCtrl::GetStringFromVariant(COleVariant &var, int idsFormat) { COleDateTime dateTime; CString strRet;
switch (var.vt) { case VT_BSTR: strRet = var.bstrVal; break;
case VT_I4: if (idsFormat) strRet.Format(idsFormat, var.lVal); else strRet.Format(_T("%d"), var.lVal); break;
case VT_R4: if (idsFormat) strRet.Format(idsFormat, var.fltVal); else strRet.Format(_T("%0.1f"), var.fltVal); break;
case VT_BOOL: strRet.LoadString(var.boolVal ? IDS_TRUE : IDS_FALSE); break;
case VT_I2: // boolean
strRet.LoadString(var.iVal ? IDS_TRUE : IDS_FALSE); break;
case VT_DATE: dateTime = var.date; strRet = dateTime.Format(); break;
case VT_EMPTY: strRet.LoadString(IDS_NOT_AVAILABLE); break;
default: ASSERT(false); // should be handling this type
strRet.LoadString(IDS_NOT_AVAILABLE); } return strRet; }
//-----------------------------------------------------------------------------
// This helper method is called to add a list item to an array.
//-----------------------------------------------------------------------------
void CMsieCtrl::AddToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszItem, LPCTSTR pszValue) { LIST_ITEM *pListItem;
if ((pListItem = new LIST_ITEM) == NULL) return; lstrcpyn(pListItem->szItem, pszItem, ITEM_LEN); lstrcpyn(pListItem->szValue, pszValue, VALUE_LEN); pListItem->uiView = m_uiView; ptrarray.SetAtGrow(itemNum, pListItem); }
void CMsieCtrl::AddToArray(CPtrArray &ptrarray, int itemNum, int idsItem, LPCTSTR pszValue) { CString strItem;
strItem.LoadString(idsItem); AddToArray(ptrarray, itemNum, strItem, pszValue); }
void CMsieCtrl::AddFileVersionToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszFile, LPCTSTR pszVersion, LPCTSTR pszSize, LPCTSTR pszDate, LPCTSTR pszPath, LPCTSTR pszCompany, DWORD dwSize, DATE date) { LIST_FILE_VERSION *pFileVersion;
if ((pFileVersion = new LIST_FILE_VERSION) == NULL) return; lstrcpyn(pFileVersion->szFile, pszFile, _MAX_FNAME); lstrcpyn(pFileVersion->szVersion, pszVersion, VERSION_LEN); lstrcpyn(pFileVersion->szSize, pszSize, SIZE_LEN); lstrcpyn(pFileVersion->szDate, pszDate, DATE_LEN); lstrcpyn(pFileVersion->szPath, pszPath, VALUE_LEN); lstrcpyn(pFileVersion->szCompany, pszCompany, VALUE_LEN); pFileVersion->uiView = m_uiView; pFileVersion->dwSize = dwSize; pFileVersion->date = date; ptrarray.SetAtGrow(itemNum, pFileVersion); }
void CMsieCtrl::AddEditToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszItem, LPCTSTR pszValue, BOOL bBold) { EDIT_ITEM *pEditItem;
if ((pEditItem = new EDIT_ITEM) == NULL) return;
lstrcpyn(pEditItem->szItem, pszItem, ITEM_LEN); lstrcpyn(pEditItem->szValue, pszValue, VALUE_LEN); pEditItem->uiView = m_uiView; pEditItem->bBold = bBold; ptrarray.SetAtGrow(itemNum, pEditItem); }
void CMsieCtrl::AddEditToArray(CPtrArray &ptrarray, int itemNum, int idsItem, LPCTSTR pszValue, BOOL bBold) { CString strItem;
strItem.LoadString(idsItem); AddEditToArray(ptrarray, itemNum, strItem, pszValue, bBold); }
void CMsieCtrl::AddObjectToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszProgramFile, LPCTSTR pszStatus, LPCTSTR pszCodeBase) { LIST_OBJECT *pObject;
if ((pObject = new LIST_OBJECT) == NULL) return; lstrcpyn(pObject->szProgramFile, pszProgramFile, _MAX_FNAME); lstrcpyn(pObject->szStatus, pszStatus, STATUS_LEN); lstrcpyn(pObject->szCodeBase, pszCodeBase, MAX_PATH); pObject->uiView = m_uiView; ptrarray.SetAtGrow(itemNum, pObject); }
void CMsieCtrl::AddCertificateToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszIssuedTo, LPCTSTR pszIssuedBy, LPCTSTR pszValidity, LPCTSTR pszSignatureAlgorithm) { LIST_CERT *pCert;
if ((pCert = new LIST_CERT) == NULL) return; lstrcpyn(pCert->szIssuedTo, pszIssuedTo, _MAX_FNAME); lstrcpyn(pCert->szIssuedBy, pszIssuedBy, _MAX_FNAME); lstrcpyn(pCert->szValidity, pszValidity, _MAX_FNAME); lstrcpyn(pCert->szSignatureAlgorithm, pszSignatureAlgorithm, _MAX_FNAME); pCert->uiView = m_uiView; ptrarray.SetAtGrow(itemNum, pCert); }
void CMsieCtrl::AddNameToArray(CPtrArray &ptrarray, int itemNum, LPCTSTR pszName) { LIST_NAME *pName;
if ((pName = new LIST_NAME) == NULL) return; lstrcpyn(pName->szName, pszName, _MAX_FNAME); pName->uiView = m_uiView; ptrarray.SetAtGrow(itemNum, pName); }
//-----------------------------------------------------------------------------
// This helper method is called to add a blank line list item to an array.
//-----------------------------------------------------------------------------
void CMsieCtrl::AddBlankLineToArray(CPtrArray &ptrarray, int itemNum) { AddToArray(ptrarray, itemNum, _T(""), _T("")); }
void CMsieCtrl::AddEditBlankLineToArray(CPtrArray &ptrarray, int itemNum) { AddEditToArray(ptrarray, itemNum, _T(""), _T("")); }
//-----------------------------------------------------------------------------
// This method is called to update the display with the current data.
//-----------------------------------------------------------------------------
void CMsieCtrl::MSInfoUpdateView() { TRACE0("-- CMsieCtrl::MSInfoUpdateView()\n");
if (m_MSInfoView == MSIVIEW_CONNECTIVITY) { if (!m_edit.IsWindowVisible()) { m_list.ShowWindow(SW_HIDE); m_list.EnableWindow(FALSE);
m_static.ShowWindow(SW_SHOW); m_btnBasic.ShowWindow(SW_SHOW); m_btnBasic.EnableWindow(TRUE); m_btnAdvanced.ShowWindow(SW_SHOW); m_btnAdvanced.EnableWindow(TRUE); m_edit.ShowWindow(SW_SHOW); m_edit.EnableWindow(TRUE); } RefreshEditControl(TRUE); } else { if (!m_list.IsWindowVisible()) { m_static.ShowWindow(SW_HIDE); m_btnBasic.ShowWindow(SW_HIDE); m_btnBasic.EnableWindow(FALSE); m_btnAdvanced.ShowWindow(SW_HIDE); m_btnAdvanced.EnableWindow(FALSE); m_edit.ShowWindow(SW_HIDE); m_edit.EnableWindow(FALSE);
m_list.ShowWindow(SW_SHOW); m_list.EnableWindow(TRUE); } RefreshListControl(TRUE); } }
//-----------------------------------------------------------------------------
// This method updates the list control to contain the contents of the
// pointer array. This is also where we compute some of the values used in
// sizing the columns (like minimum and maximum column widths). Remember, only
// put the item in the list view if the MSInfoView index and the flag for
// the item agree.
//
// For each line we add, we set the item data for that line to be the index
// to the element in the pointer array for that item. Since more than one
// line comes from each element in the array, we OR in a constant.
//-----------------------------------------------------------------------------
void CMsieCtrl::RefreshListControl(BOOL bRedraw) { TRACE0("-- CMsieCtrl::RefreshListControl()\n");
LIST_ITEM *pListItem; LIST_FILE_VERSION *pFileVersion; LIST_OBJECT *pObject; LIST_CERT *pCert; LIST_NAME *pName; CRect rect; int listIndex = 0;
m_list.SetRedraw(FALSE); m_list.DeleteAllItems();
// Format columns adds the appropriate columns to the list control.
FormatColumns();
for (int itemNum = 0; itemNum < m_ptrarray.GetSize(); itemNum++) { pListItem = (LIST_ITEM *)m_ptrarray.GetAt(itemNum); if (pListItem) { if ((long)pListItem->uiView == m_MSInfoView) { if (pListItem->uiView == MSIVIEW_FILE_VERSIONS) { pFileVersion = (LIST_FILE_VERSION *)pListItem;
AddItem(listIndex, 0, pFileVersion->szFile); AddItem(listIndex, 1, pFileVersion->szVersion); AddItem(listIndex, 2, pFileVersion->szSize); AddItem(listIndex, 3, pFileVersion->szDate); AddItem(listIndex, 4, pFileVersion->szPath); AddItem(listIndex, 5, pFileVersion->szCompany); } else if (pListItem->uiView == MSIVIEW_OBJECT_LIST) { pObject = (LIST_OBJECT *)pListItem;
AddItem(listIndex, 0, pObject->szProgramFile); AddItem(listIndex, 1, pObject->szStatus); AddItem(listIndex, 2, pObject->szCodeBase); } else if ((pListItem->uiView == MSIVIEW_PERSONAL_CERTIFICATES) || (pListItem->uiView == MSIVIEW_OTHER_PEOPLE_CERTIFICATES)) { pCert = (LIST_CERT *)pListItem;
AddItem(listIndex, 0, pCert->szIssuedTo); AddItem(listIndex, 1, pCert->szIssuedBy); AddItem(listIndex, 2, pCert->szValidity); AddItem(listIndex, 3, pCert->szSignatureAlgorithm); } else if (pListItem->uiView == MSIVIEW_PUBLISHERS) { pName = (LIST_NAME *)pListItem;
AddItem(listIndex, 0, pName->szName); } else { AddItem(listIndex, 0, pListItem->szItem); AddItem(listIndex, 1, pListItem->szValue); } m_list.SetItemData(listIndex, itemNum); listIndex++; } } }
// Now, figure some values for the column widths. But only if we actually added
// items to the list.
if (listIndex) { int cxMax, cxWidth, cxMin, cxAverage; for (int iCol = 0; iCol < m_cColumns; iCol++) { cxMax = 0; cxMin = 0; cxAverage = 0; for (int iRow = 0; iRow < m_list.GetItemCount(); iRow++) { cxWidth = m_list.GetStringWidth(m_list.GetItemText(iRow, iCol)); if (cxWidth > cxMax) cxMax = cxWidth; if ((cxWidth < cxMin || cxMin == 0) && cxWidth != 0) cxMin = cxWidth;
cxAverage += cxWidth; }
cxAverage /= m_list.GetItemCount(); m_aiMaxWidths[iCol] = cxMax + 12; m_aiMinWidths[iCol] = cxAverage + 12; } }
GetClientRect(&rect); RefigureColumns(rect); m_list.SetRedraw(TRUE);
if (bRedraw) InvalidateControl(); }
void CMsieCtrl::RefreshEditControl(BOOL bRedraw) { TRACE0("-- CMsieCtrl::RefreshEditControl()\n");
EDIT_ITEM *pEditItem; CString strLine; CHARFORMAT cf; SIZE sizeSpace, sizeStr; int itemNum, nLen, i, cLines = 0; BOOL bBasicView;
DrawLine();
m_edit.SetRedraw(FALSE); m_edit.SetWindowText(_T(""));
bBasicView = m_btnBasic.GetCheck();
cf.cbSize = sizeof(cf); cf.dwMask = CFM_BOLD; GetTextExtentPoint(m_edit.GetDC()->m_hDC, _T(" "), 1, &sizeSpace); for (itemNum = 0; itemNum < m_ptrarray.GetSize(); itemNum++) { pEditItem = (EDIT_ITEM *)m_ptrarray.GetAt(itemNum); if (pEditItem) { if ((long)pEditItem->uiView == m_MSInfoView) { strLine = _T(" "); if (!pEditItem->bBold) strLine += _T(' ');
strLine += pEditItem->szItem;
if (pEditItem->szValue[0] != _T('\0')) { GetTextExtentPoint(m_edit.GetDC()->m_hDC, pEditItem->szItem, _tcslen(pEditItem->szItem), &sizeStr);
nLen = sizeStr.cx / sizeSpace.cx; if (nLen < 50) { for (i = nLen; i < 50; i++) strLine += _T(' '); } strLine += _T('\t'); strLine += pEditItem->szValue; } strLine += _T('\n');
m_edit.SetSel(-1, -1);
cf.dwEffects = pEditItem->bBold ? CFE_BOLD : 0; m_edit.SetSelectionCharFormat(cf);
m_edit.ReplaceSel(strLine);
// only show default connection info if basic info button checked
if (bBasicView) if (++cLines == CONNECTIVITY_BASIC_LINES) break; } } }
m_edit.SetRedraw(TRUE); if (bRedraw) InvalidateControl(); }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// When the control is resized, we want to also resize the list
// control. We'll also call a method to resize the columns in the
// list control, based on the new control size.
//-----------------------------------------------------------------------------
void CMsieCtrl::OnSize(UINT nType, int cx, int cy) { COleControl::OnSize(nType, cx, cy);
CRect rect; GetClientRect(&rect);
m_edit.MoveWindow(CRect(rect.left, rect.top + 63, rect.right, rect.bottom)); m_list.MoveWindow(&rect);
if (m_MSInfoView == MSIVIEW_CONNECTIVITY) { m_edit.Invalidate(); } else { RefigureColumns(rect); m_list.Invalidate(); } }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// The Serialize method is used to save the state of your object to
// a stream, or to load it from a stream. This stream is part of the
// compound MSInfo file. Your control can also open a file directly
// by making an entry in the MSInfo registry key indicating what
// file types it can open. In that case, the file will be passed to
// MSInfoLoadFile.
//
// The InternetExplorer category will save the items in it's list view to the
// archive as a struct. The first item in the archive will be a DWORD
// indicating how many pairs will be saved. The view for each struct will be
// archived out just before the struct for easier loading (knowing which type
// of struct to new for loading).
//-----------------------------------------------------------------------------
void CMsieCtrl::Serialize(CArchive& ar) { TRACE1("-- CMsieCtrl::Serialize() [%s]\n", (ar.IsStoring()) ? "STORE" : "LOAD");
LIST_ITEM *pListItem; LIST_FILE_VERSION *pFileVersion; LIST_OBJECT *pObject; LIST_CERT *pCert; LIST_NAME *pName; EDIT_ITEM *pEditItem; DWORD dwCount; UINT uiView;
if (ar.IsStoring()) { dwCount = (DWORD) m_ptrarray.GetSize(); ar << dwCount;
for (DWORD i = 0; i < dwCount; i++) { pListItem = (LIST_ITEM *)m_ptrarray.GetAt(i); if (pListItem) { ar << pListItem->uiView; switch (pListItem->uiView) { case MSIVIEW_FILE_VERSIONS: pFileVersion = (LIST_FILE_VERSION *)pListItem; ar.Write((void *)pFileVersion, sizeof(LIST_FILE_VERSION)); break; case MSIVIEW_OBJECT_LIST: pObject = (LIST_OBJECT *)pListItem; ar.Write((void *)pObject, sizeof(LIST_OBJECT)); break; case MSIVIEW_CONNECTIVITY: pEditItem = (EDIT_ITEM *)pListItem; ar.Write((void *)pEditItem, sizeof(EDIT_ITEM)); break; case MSIVIEW_PERSONAL_CERTIFICATES: case MSIVIEW_OTHER_PEOPLE_CERTIFICATES: pCert = (LIST_CERT *)pListItem; ar.Write((void *)pCert, sizeof(LIST_CERT)); break; case MSIVIEW_PUBLISHERS: pName = (LIST_NAME *)pListItem; ar.Write((void *)pName, sizeof(LIST_NAME)); break; default: ar.Write((void *)pListItem, sizeof(LIST_ITEM)); } } } } else { ar >> dwCount; for (DWORD i = 0; i < dwCount; i++) { ar >> uiView; switch (uiView) { case MSIVIEW_FILE_VERSIONS: pFileVersion = new LIST_FILE_VERSION; if (pFileVersion) { if (ar.Read((void *)pFileVersion, sizeof(LIST_FILE_VERSION)) != sizeof(LIST_FILE_VERSION)) break; m_ptrarray.SetAtGrow(i, pFileVersion); } break; case MSIVIEW_OBJECT_LIST: pObject = new LIST_OBJECT; if (pObject) { if (ar.Read((void *)pObject, sizeof(LIST_OBJECT)) != sizeof(LIST_OBJECT)) break; m_ptrarray.SetAtGrow(i, pObject); } break; case MSIVIEW_CONNECTIVITY: pEditItem = new EDIT_ITEM; if (pEditItem) { if (ar.Read((void *)pEditItem, sizeof(EDIT_ITEM)) != sizeof(EDIT_ITEM)) break; m_ptrarray.SetAtGrow(i, pEditItem); } break; case MSIVIEW_PERSONAL_CERTIFICATES: case MSIVIEW_OTHER_PEOPLE_CERTIFICATES: pCert = new LIST_CERT; if (pCert) { if (ar.Read((void *)pCert, sizeof(LIST_CERT)) != sizeof(LIST_CERT)) break; m_ptrarray.SetAtGrow(i, pCert); } break; case MSIVIEW_PUBLISHERS: pName = new LIST_NAME; if (pName) { if (ar.Read((void *)pName, sizeof(LIST_NAME)) != sizeof(LIST_NAME)) break; m_ptrarray.SetAtGrow(i, pName); } break; default: pListItem = new LIST_ITEM; if (pListItem) { if (ar.Read((void *)pListItem, sizeof(LIST_ITEM)) != sizeof(LIST_ITEM)) break; m_ptrarray.SetAtGrow(i, pListItem); } } } m_bCurrent = false; } }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// A control used in MSInfo has the ability to register itself as
// recognizing a file type (by extension). This entry is made in the
// registry, and when MSInfo lets the user open a file, files of this
// type can be displayed. If a file is chosen, a different set of
// categories is loaded, presumably all using this control. When
// the control is created, a call will be made to MSInfoLoadFile with
// the file to load.
//
// There isn't a native file format for this control, so we do
// exactly nothing.
//-----------------------------------------------------------------------------
BOOL CMsieCtrl::MSInfoLoadFile(LPCTSTR szFileName) { TRACE1("-- CMsieCtrl::MSInfoLoadFile(%s)\n", szFileName); return TRUE; }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// This method should do a select all on the information the control
// shows. This only applies to controls which support selection.
// If the selection is changed, the control is responsible for
// redrawing itself
//
// For this control, we mark all of the items in the list view as selected.
//-----------------------------------------------------------------------------
void CMsieCtrl::MSInfoSelectAll() { TRACE0("-- CMsieCtrl::SelectAll()\n");
if (m_MSInfoView == MSIVIEW_CONNECTIVITY) { m_edit.SetFocus(); m_edit.SetSel(0, -1); } else { m_list.SetFocus(); for (int i = 0; i < m_list.GetItemCount(); i++) m_list.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); }
InvalidateControl(); }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// Use this method to copy the currently selected information into
// the clipboard in an appropriate format. If your control does not
// support user selection, then all of the data displayed by your
// control should be put into the clipboard. If this is the case,
// only the information shown by the current MSInfoView should be
// copied (if you support multiple views).
//
// We'll scan through the list view, and generate a text string
// containing the text from each selected line.
//-----------------------------------------------------------------------------
void CMsieCtrl::MSInfoCopy() { TRACE0("-- CMsieCtrl::MSInfoCopy()\n");
CString strReturnText; int i, nIndex;
// Build a string of the text of selected items.
if (m_MSInfoView == MSIVIEW_CONNECTIVITY) { strReturnText = m_edit.GetSelText(); } else { for (i = 0; i < m_list.GetItemCount(); i++) { if (m_list.GetItemState(i, LVIS_SELECTED) != 0) { strReturnText += m_list.GetItemText(i, 0); for (nIndex = 1; nIndex < m_cColumns; nIndex++) { strReturnText += '\t'; strReturnText += m_list.GetItemText(i, nIndex); } strReturnText += CString("\r\n"); } } }
// Put that text in the clipboard.
if (OpenClipboard()) { if (EmptyClipboard()) { DWORD dwSize = strReturnText.GetLength() + 1; // +1 for terminating NULL
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, dwSize);
if (hMem) { LPVOID lpvoid = GlobalLock(hMem); if (lpvoid) { memcpy(lpvoid, (LPCTSTR) strReturnText, dwSize); GlobalUnlock(hMem); SetClipboardData(CF_TEXT, hMem); } } } CloseClipboard(); } }
//-----------------------------------------------------------------------------
// MSInfo Specific...
//
// The control should return its contents as text when this method
// is called. The parameters are a pointer to a buffer and a length
// of the buffer in bytes. Write the contents of the control to the
// buffer (including a null) up to dwLength. Return the number of
// bytes copied (not including the null). If the pointer parameter is
// null, then just return the length.
//
// For this example, we get the text from the list and concatenate
// the columns together.
//-----------------------------------------------------------------------------
static CString strGetDataReturnText;
long CMsieCtrl::MSInfoGetData(long dwMSInfoView, long FAR* pBuffer, long dwLength) { TRACE2("-- CMsieCtrl::MSInfoGetData(0x%08x, %ld)\n", (long) pBuffer, dwLength);
LIST_ITEM * pListItem; LIST_FILE_VERSION *pFileVersion; LIST_OBJECT *pObject; LIST_CERT *pCert; LIST_NAME *pName; CString strWorking, strTemp;
if (pBuffer == NULL) { // We should get the data from the array of pointers, not the list
// control. This is because this method might be called without
// ever drawing the list. We need to use the current MSInfoView
// in determining what to return.
strGetDataReturnText.Empty();
// write out column headers if view with columns
switch (dwMSInfoView) { case MSIVIEW_FILE_VERSIONS: strTemp.LoadString(IDS_FILE); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_VERSION); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_SIZE); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_DATE); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_PATH); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_COMPANY); strGetDataReturnText += strTemp; break;
case MSIVIEW_OBJECT_LIST: strTemp.LoadString(IDS_PROGRAM_FILE); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_STATUS); strGetDataReturnText += strTemp; strGetDataReturnText += '\t'; strTemp.LoadString(IDS_CODE_BASE); strGetDataReturnText += strTemp; break;
case MSIVIEW_PERSONAL_CERTIFICATES: case MSIVIEW_OTHER_PEOPLE_CERTIFICATES: break;
// BUGBUG: NEED TO FILL IN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
case MSIVIEW_PUBLISHERS: break;
// BUGBUG: NEED TO FILL IN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
break; }
for (int i = 0; i < m_ptrarray.GetSize(); i++) { pListItem = (LIST_ITEM *) m_ptrarray.GetAt(i); if (pListItem != NULL) { if ((long)pListItem->uiView == dwMSInfoView) { strWorking.Empty();
switch (dwMSInfoView) { case MSIVIEW_FILE_VERSIONS: pFileVersion = (LIST_FILE_VERSION *)pListItem; if (pFileVersion->szFile[0] != _T('\0')) { strWorking += pFileVersion->szFile; strWorking += '\t'; strWorking += pFileVersion->szVersion; strWorking += '\t'; strWorking += pFileVersion->szSize; strWorking += '\t'; strWorking += pFileVersion->szDate; strWorking += '\t'; strWorking += pFileVersion->szPath; strWorking += '\t'; strWorking += pFileVersion->szCompany; } break;
case MSIVIEW_OBJECT_LIST: pObject = (LIST_OBJECT *)pListItem; if (pObject->szProgramFile[0] != _T('\0')) { strWorking += pObject->szProgramFile; strWorking += '\t'; strWorking += pObject->szStatus; strWorking += '\t'; strWorking += pObject->szCodeBase; } break;
case MSIVIEW_PERSONAL_CERTIFICATES: case MSIVIEW_OTHER_PEOPLE_CERTIFICATES: pCert = (LIST_CERT *)pListItem; if (pCert->szIssuedTo[0] != _T('\0')) { strWorking += pCert->szIssuedTo; strWorking += '\t'; strWorking += pCert->szIssuedBy; strWorking += '\t'; strWorking += pCert->szValidity; strWorking += '\t'; strWorking += pCert->szSignatureAlgorithm; } break;
case MSIVIEW_PUBLISHERS: pName = (LIST_NAME *)pListItem; if (pName->szName[0] != _T('\0')) { strWorking += pName->szName; } break;
default: strWorking += pListItem->szItem; strWorking += '\t'; strWorking += pListItem->szValue; } strWorking.TrimRight(); if (!strGetDataReturnText.IsEmpty()) strGetDataReturnText += _T("\r\n"); strGetDataReturnText += strWorking; } } }
return (long) strGetDataReturnText.GetLength(); } else { DWORD dwSize;
// dwSize will be the number of characters to copy, and shouldn't
// include the null terminator.
dwSize = strGetDataReturnText.GetLength(); if (dwLength <= (long)dwSize) { // There isn't enough room in the buffer to copy all of the
// characters and the null, so we'll need to concatenate.
dwSize = dwLength - 1; }
memcpy(pBuffer, (LPCTSTR) strGetDataReturnText, dwSize); ((char *)pBuffer)[dwSize] = '\0'; return (long) dwSize; } }
//-----------------------------------------------------------------------------
// We override the OnNotify member because we want to be able to take action
// when the user resizes a column (possibly by double clicking the divider)
// and when the user clicks on a column header (we want to sort by that
// column).
//-----------------------------------------------------------------------------
CPtrArray* pptrarray; static bool bAscendingOrder = true; static int nLastColumn = 0; int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); BOOL CMsieCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { NMHDR *pnmhdr = (NMHDR *)lParam; NM_LISTVIEW *pnmlv;
if (pnmhdr) { if (pnmhdr->code == HDN_ENDTRACK || pnmhdr->code == HDN_DIVIDERDBLCLICK) RefigureColumns(CRect(0,0,0,0));
if (wParam == IDC_LISTCTRL) { switch (pnmhdr->code) { case LVN_COLUMNCLICK:
if ((m_MSInfoView == MSIVIEW_FILE_VERSIONS) || (m_MSInfoView == MSIVIEW_OBJECT_LIST) || (m_MSInfoView == MSIVIEW_PERSONAL_CERTIFICATES) || (m_MSInfoView == MSIVIEW_OTHER_PEOPLE_CERTIFICATES) || (m_MSInfoView == MSIVIEW_PUBLISHERS)) { pnmlv = (NM_LISTVIEW*)lParam; pptrarray = &m_ptrarray;
if (nLastColumn == pnmlv->iSubItem) { bAscendingOrder = !bAscendingOrder; } else { bAscendingOrder = true; nLastColumn = pnmlv->iSubItem; }
m_list.SortItems(CompareFunc, (LPARAM)pnmlv->iSubItem); } break; } } } return COleControl::OnNotify(wParam, lParam, pResult); }
//-----------------------------------------------------------------------------
// This compare function is called by the list control as a callback when we
// sort the list.
//-----------------------------------------------------------------------------
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { int nRet = 0; double flDateDiff;
// lParamSort contains a pointer to the list view control.
// The lParam of an item is just its index.
LIST_ITEM *pItem = (LIST_ITEM *)pptrarray->GetAt(lParam1);
if (pItem->uiView == MSIVIEW_FILE_VERSIONS) { LIST_FILE_VERSION* pItem1 = (LIST_FILE_VERSION *)pptrarray->GetAt(lParam1); LIST_FILE_VERSION* pItem2 = (LIST_FILE_VERSION *)pptrarray->GetAt(lParam2);
ASSERT(pItem1 != NULL && pItem2 != NULL); if (pItem1 == NULL || pItem2 == NULL) return 0;
switch (lParamSort) { case 0: nRet = _tcsicmp(pItem1->szFile, pItem2->szFile); break;
case 1: nRet = _tcsicmp(pItem2->szVersion, pItem1->szVersion); break; case 2: nRet = pItem1->dwSize - pItem2->dwSize; break; case 3: flDateDiff = pItem1->date - pItem2->date; if (flDateDiff > 0) nRet = -1; else if (flDateDiff < 0) nRet = 1; break;
case 4: nRet = _tcsicmp(pItem1->szPath, pItem2->szPath); break;
case 5: nRet = _tcsicmp(pItem1->szCompany, pItem2->szCompany); break; } } else if (pItem->uiView == MSIVIEW_OBJECT_LIST) { LIST_OBJECT* pItem1 = (LIST_OBJECT *)pptrarray->GetAt(lParam1); LIST_OBJECT* pItem2 = (LIST_OBJECT *)pptrarray->GetAt(lParam2);
ASSERT(pItem1 != NULL && pItem2 != NULL); if (pItem1 == NULL || pItem2 == NULL) return 0;
switch (lParamSort) { case 0: nRet = _tcsicmp(pItem1->szProgramFile, pItem2->szProgramFile); break;
case 1: nRet = _tcsicmp(pItem1->szStatus, pItem2->szStatus); break; case 2: nRet = _tcsicmp(pItem1->szCodeBase, pItem2->szCodeBase); break; } } else if ((pItem->uiView == MSIVIEW_PERSONAL_CERTIFICATES) || (pItem->uiView == MSIVIEW_OTHER_PEOPLE_CERTIFICATES)) { LIST_CERT* pItem1 = (LIST_CERT *)pptrarray->GetAt(lParam1); LIST_CERT* pItem2 = (LIST_CERT *)pptrarray->GetAt(lParam2);
ASSERT(pItem1 != NULL && pItem2 != NULL); if (pItem1 == NULL || pItem2 == NULL) return 0;
switch (lParamSort) { case 0: nRet = _tcsicmp(pItem1->szIssuedTo, pItem2->szIssuedTo); break;
case 1: nRet = _tcsicmp(pItem1->szIssuedBy, pItem2->szIssuedBy); break; case 2: nRet = _tcsicmp(pItem1->szValidity, pItem2->szValidity); break;
case 3: nRet = _tcsicmp(pItem1->szSignatureAlgorithm, pItem2->szSignatureAlgorithm); break; } } else if (pItem->uiView == MSIVIEW_PUBLISHERS) { LIST_NAME* pItem1 = (LIST_NAME *)pptrarray->GetAt(lParam1); LIST_NAME* pItem2 = (LIST_NAME *)pptrarray->GetAt(lParam2);
ASSERT(pItem1 != NULL && pItem2 != NULL); if (pItem1 == NULL || pItem2 == NULL) return 0;
switch (lParamSort) { case 0: nRet = _tcsicmp(pItem1->szName, pItem2->szName); break; } }
if (!bAscendingOrder) nRet = -nRet;
return nRet; }
HBRUSH CMsieCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { switch (nCtlColor) { case CTLCOLOR_STATIC: case CTLCOLOR_BTN: return (HBRUSH)(m_pCtlBkBrush->GetSafeHandle());
default: return CWnd::OnCtlColor(pDC, pWnd, nCtlColor); } }
void CMsieCtrl::OnBasicBtnClicked() { MSInfoUpdateView(); }
void CMsieCtrl::OnAdvancedBtnClicked() { MSInfoUpdateView(); }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::XWbemProviderInit
STDMETHODIMP_(ULONG) CMsieCtrl::XWbemProviderInit::AddRef() { METHOD_PROLOGUE(CMsieCtrl, WbemProviderInit) return pThis->ExternalAddRef(); }
STDMETHODIMP_(ULONG) CMsieCtrl::XWbemProviderInit::Release() { METHOD_PROLOGUE(CMsieCtrl, WbemProviderInit) return pThis->ExternalRelease(); }
STDMETHODIMP CMsieCtrl::XWbemProviderInit::QueryInterface(REFIID iid, LPVOID* ppvObj) { METHOD_PROLOGUE(CMsieCtrl, WbemProviderInit) return pThis->ExternalQueryInterface(&iid, ppvObj); }
STDMETHODIMP CMsieCtrl::XWbemProviderInit::Initialize(LPWSTR pszUser, LONG lFlags, LPWSTR pszNamespace, LPWSTR pszLocale, IWbemServices *pNamespace, IWbemContext *pCtx, IWbemProviderInitSink *pInitSink) { METHOD_PROLOGUE(CMsieCtrl, WbemProviderInit)
if (pNamespace) pNamespace->AddRef(); pThis->m_pNamespace = pNamespace;
//Let CIMOM know you are initialized
pInitSink->SetStatus(WBEM_S_INITIALIZED, 0);
return WBEM_S_NO_ERROR; }
/////////////////////////////////////////////////////////////////////////////
// CMsieCtrl::XWbemServices
STDMETHODIMP_(ULONG) CMsieCtrl::XWbemServices::AddRef() { METHOD_PROLOGUE(CMsieCtrl, WbemServices) return pThis->ExternalAddRef(); }
STDMETHODIMP_(ULONG) CMsieCtrl::XWbemServices::Release() { METHOD_PROLOGUE(CMsieCtrl, WbemServices) return pThis->ExternalRelease(); }
STDMETHODIMP CMsieCtrl::XWbemServices::QueryInterface(REFIID iid, LPVOID* ppvObj) { METHOD_PROLOGUE(CMsieCtrl, WbemServices) return pThis->ExternalQueryInterface(&iid, ppvObj); }
SCODE CMsieCtrl::XWbemServices::CreateInstanceEnumAsync(const BSTR RefStr, long lFlags, IWbemContext *pCtx, IWbemObjectSink *pHandler) { METHOD_PROLOGUE(CMsieCtrl, WbemServices)
IWbemClassObject *pClass = NULL; IWbemClassObject **ppInstances = NULL; SCODE sc; void **ppData; IEDataType enType; long cInstances, lIndex;
CoImpersonateClient();
// Do a check of arguments and make sure we have pointer to Namespace
if (pHandler == NULL || pThis->m_pNamespace == NULL) return WBEM_E_INVALID_PARAMETER;
// Get a class object from CIMOM
sc = pThis->m_pNamespace->GetObject(RefStr, 0, pCtx, &pClass, NULL); if (sc != S_OK) return WBEM_E_FAILED;
if (pThis->GetIEType(RefStr, enType)) { theApp.AppGetIEData(enType, &cInstances, (void***)&ppData);
ppInstances = (IWbemClassObject**)new LPVOID[cInstances];
for (lIndex = 0; lIndex < cInstances; lIndex++) { // Create an instance object and fill it will appropriate Office data
sc = pClass->SpawnInstance(0, &ppInstances[lIndex]); if (SUCCEEDED(sc)) { pThis->SetIEProperties(enType, ppData[lIndex], ppInstances[lIndex]); } } theApp.AppDeleteIEData(enType, cInstances, ppData); } else { sc = WBEM_E_NOT_FOUND; }
pClass->Release();
if (SUCCEEDED(sc)) { // Send the instances to the caller
pHandler->Indicate(cInstances, ppInstances);
for (lIndex = 0; lIndex < cInstances; lIndex++) ppInstances[lIndex]->Release(); }
// Clean up
if (ppInstances) delete []ppInstances;
// Set status
pHandler->SetStatus(0, sc, NULL, NULL);
return sc; }
bool CMsieCtrl::GetIEType(const BSTR classStr, IEDataType &enType) { bool bRet = true; CString strClass(classStr);
if (strClass == _T("MicrosoftIE_Summary")) enType = SummaryType; else if (strClass == _T("MicrosoftIE_FileVersion")) enType = FileVersionType; else if (strClass == _T("MicrosoftIE_ConnectionSummary")) enType = ConnSummaryType; else if (strClass == _T("MicrosoftIE_LanSettings")) enType = LanSettingsType; else if (strClass == _T("MicrosoftIE_ConnectionSettings")) enType = ConnSettingsType; else if (strClass == _T("MicrosoftIE_Cache")) enType = CacheType; else if (strClass == _T("MicrosoftIE_Object")) enType = ObjectType; else if (strClass == _T("MicrosoftIE_Certificate")) enType = CertificateType; else if (strClass == _T("MicrosoftIE_Publisher")) enType = PublisherType; else if (strClass == _T("MicrosoftIE_Security")) enType = SecurityType; else { bRet = false; }
return bRet; }
void CMsieCtrl::ConvertDateToWbemString(COleVariant &var) { COleDateTime dateTime; CString strDateTime;
dateTime = var.date; strDateTime = dateTime.Format(_T("%Y%m%d%H%M%S.******+***")); var = strDateTime.AllocSysString(); }
void CMsieCtrl::SetIEProperties(IEDataType enType, void *pIEData, IWbemClassObject *pInstance) { if (enType == SummaryType) { IE_SUMMARY *pData = (IE_SUMMARY*)pIEData;
SETPROPERTY(Name); SETPROPERTY(Version); SETPROPERTY(Build); SETPROPERTY(ProductID); SETPROPERTY(Path); SETPROPERTY(Language); SETPROPERTY(ActivePrinter); SETPROPERTY(CipherStrength); SETPROPERTY(ContentAdvisor); SETPROPERTY(IEAKInstall); } else if (enType == FileVersionType) { IE_FILE_VERSION *pData = (IE_FILE_VERSION*)pIEData; CString strVersion, strFileMissing;
SETPROPERTY(File); SETPROPERTY(Version);
// don't set rest of properties if file is missing
strVersion = pData->Version.bstrVal; strFileMissing.LoadString(IDS_FILE_MISSING); if (strFileMissing != strVersion) { SETPROPERTY(Size); SETPROPERTY(Date); SETPROPERTY(Path); SETPROPERTY(Company); } } else if (enType == ConnSummaryType) { IE_CONN_SUMMARY *pData = (IE_CONN_SUMMARY*)pIEData;
SETPROPERTY(ConnectionPreference); SETPROPERTY(EnableHttp11); SETPROPERTY(ProxyHttp11); } else if (enType == LanSettingsType) { IE_LAN_SETTINGS *pData = (IE_LAN_SETTINGS*)pIEData;
SETPROPERTY(AutoConfigProxy); SETPROPERTY(AutoProxyDetectMode); SETPROPERTY(AutoConfigURL); SETPROPERTY(Proxy); SETPROPERTY(ProxyServer); SETPROPERTY(ProxyOverride); } else if (enType == ConnSettingsType) { IE_CONN_SETTINGS *pData = (IE_CONN_SETTINGS*)pIEData;
SETPROPERTY(Name); SETPROPERTY(Default); SETPROPERTY(AutoProxyDetectMode); SETPROPERTY(AutoConfigURL); SETPROPERTY(Proxy); SETPROPERTY(ProxyServer); SETPROPERTY(ProxyOverride); SETPROPERTY(AllowInternetPrograms); SETPROPERTY(RedialAttempts); SETPROPERTY(RedialWait); SETPROPERTY(DisconnectIdleTime); SETPROPERTY(AutoDisconnect); SETPROPERTY(Modem); SETPROPERTY(DialUpServer); SETPROPERTY(NetworkLogon); SETPROPERTY(SoftwareCompression); SETPROPERTY(EncryptedPassword); SETPROPERTY(DataEncryption); SETPROPERTY(NetworkProtocols); SETPROPERTY(ServerAssignedIPAddress); SETPROPERTY(IPAddress); SETPROPERTY(ServerAssignedNameServer); SETPROPERTY(PrimaryDNS); SETPROPERTY(SecondaryDNS); SETPROPERTY(PrimaryWINS); SETPROPERTY(SecondaryWINS); SETPROPERTY(IPHeaderCompression); SETPROPERTY(DefaultGateway); SETPROPERTY(ScriptFileName); } else if (enType == CacheType) { IE_CACHE *pData = (IE_CACHE*)pIEData;
SETPROPERTY(PageRefreshType); SETPROPERTY(TempInternetFilesFolder); SETPROPERTY(TotalDiskSpace); SETPROPERTY(AvailableDiskSpace); SETPROPERTY(MaxCacheSize); SETPROPERTY(AvailableCacheSize); } else if (enType == ObjectType) { IE_OBJECT *pData = (IE_OBJECT*)pIEData;
SETPROPERTY(ProgramFile); SETPROPERTY(Status); SETPROPERTY(CodeBase); } else if (enType == CertificateType) { IE_CERTIFICATE *pData = (IE_CERTIFICATE*)pIEData;
SETPROPERTY(Type); SETPROPERTY(IssuedTo); SETPROPERTY(IssuedBy); SETPROPERTY(Validity); SETPROPERTY(SignatureAlgorithm); } else if (enType == PublisherType) { IE_PUBLISHER *pData = (IE_PUBLISHER*)pIEData;
SETPROPERTY(Name); } else if (enType == SecurityType) { IE_SECURITY *pData = (IE_SECURITY*)pIEData;
SETPROPERTY(Zone); SETPROPERTY(Level); } }
|