746 lines
24 KiB
C++
746 lines
24 KiB
C++
|
#include "item.h"
|
||
|
#include "parseinf.h"
|
||
|
#include <mstask.h>
|
||
|
#include <iehelpid.h>
|
||
|
#include "parseinf.h"
|
||
|
|
||
|
#include <mluisupp.h>
|
||
|
|
||
|
#ifdef AUTO_UPDATE
|
||
|
#define NUM_PAGES 4
|
||
|
#else
|
||
|
#define NUM_PAGES 3
|
||
|
#endif
|
||
|
|
||
|
#define DEFAULT_LANG_CODEPAGE_PAIR 0x040904B0
|
||
|
#define MAX_QUERYPREFIX_LEN 512
|
||
|
#define MAX_QUERYSTRING_LEN 1024
|
||
|
|
||
|
// defined in utils.cpp
|
||
|
extern LPCTSTR g_lpszUpdateInfo;
|
||
|
extern LPCTSTR g_lpszCookieValue;
|
||
|
extern LPCTSTR g_lpszSavedValue;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// functions that deal with web check
|
||
|
|
||
|
// define a macro to make life easier
|
||
|
#define QUIT_IF_FAIL if (FAILED(hr)) goto Exit
|
||
|
|
||
|
void DestroyDialogIcon(HWND hDlg)
|
||
|
{
|
||
|
HICON hIcon = (HICON)SendDlgItemMessage(
|
||
|
hDlg, IDC_STATIC_ICON,
|
||
|
STM_GETICON, 0, 0);
|
||
|
if (hIcon != NULL)
|
||
|
DestroyIcon(hIcon);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// functions that deal with property page 1
|
||
|
|
||
|
void InitPropPage1(HWND hDlg, LPARAM lParam)
|
||
|
{
|
||
|
BOOL bHasActiveX;
|
||
|
BOOL bHasJava;
|
||
|
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
||
|
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
|
||
|
if (pcpidl)
|
||
|
{
|
||
|
// draw control icon
|
||
|
{
|
||
|
HICON hIcon = ExtractIcon(g_hInst, GetStringInfo(pcpidl, SI_LOCATION), 0);
|
||
|
if (hIcon == NULL)
|
||
|
hIcon = GetDefaultOCIcon( pcpidl );
|
||
|
Assert(hIcon != NULL);
|
||
|
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
||
|
}
|
||
|
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_CONTROL, GetStringInfo(pcpidl, SI_CONTROL));
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_CREATION, GetStringInfo(pcpidl, SI_CREATION));
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_LASTACCESS, GetStringInfo(pcpidl, SI_LASTACCESS));
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_CLSID, GetStringInfo(pcpidl, SI_CLSID));
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_CODEBASE, GetStringInfo(pcpidl, SI_CODEBASE));
|
||
|
|
||
|
TCHAR szBuf[MESSAGE_MAXSIZE];
|
||
|
|
||
|
|
||
|
GetContentBools( pcpidl, &bHasActiveX, &bHasJava );
|
||
|
if ( bHasJava )
|
||
|
{
|
||
|
if ( bHasActiveX )
|
||
|
MLLoadString(IDS_PROPERTY_TYPE_MIXED, szBuf, MESSAGE_MAXSIZE);
|
||
|
else
|
||
|
MLLoadString(IDS_PROPERTY_TYPE_JAVA, szBuf, MESSAGE_MAXSIZE);
|
||
|
}
|
||
|
else
|
||
|
MLLoadString(IDS_PROPERTY_TYPE_ACTX, szBuf, MESSAGE_MAXSIZE);
|
||
|
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_TYPE, szBuf);
|
||
|
|
||
|
GetStatus(pcpidl, szBuf, MESSAGE_MAXSIZE);
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_STATUS, szBuf);
|
||
|
|
||
|
DWORD dwSizeSaved = GetSizeSaved(pcpidl);
|
||
|
TCHAR szSize[20];
|
||
|
wsprintf(szSize, "%u", dwSizeSaved);
|
||
|
|
||
|
// insert commas to separate groups of digits
|
||
|
int nLen = lstrlen(szSize);
|
||
|
int i = 0, j = (nLen <= 3 ? nLen : (nLen % 3));
|
||
|
TCHAR *pCh = szSize + j;
|
||
|
|
||
|
for (; i < j; i++)
|
||
|
szBuf[i] = szSize[i];
|
||
|
|
||
|
for (; *pCh != '\0'; i++, pCh++)
|
||
|
{
|
||
|
if (((pCh - szSize) % 3 == j) && (i > 0))
|
||
|
szBuf[i++] = ',';
|
||
|
szBuf[i] = *pCh;
|
||
|
}
|
||
|
szBuf[i] = '\0';
|
||
|
|
||
|
TCHAR szBytes[BYTES_MAXSIZE];
|
||
|
|
||
|
MLLoadString(IDS_PROPERTY_BYTES, szBytes, BYTES_MAXSIZE);
|
||
|
lstrcat(szBuf, TEXT(" "));
|
||
|
lstrcat(szBuf, szBytes);
|
||
|
lstrcat(szBuf, TEXT(" ("));
|
||
|
|
||
|
GetSizeSaved(pcpidl, szBuf + lstrlen(szBuf));
|
||
|
lstrcat(szBuf, TEXT(")"));
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_TOTALSIZE, szBuf);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Dialog proc for page 1
|
||
|
INT_PTR CALLBACK ControlItem_PropPage1Proc(
|
||
|
HWND hDlg,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
|
||
|
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
|
||
|
|
||
|
const static DWORD aIds[] = {
|
||
|
IDC_STATIC_LABEL_TYPE, IDH_DLOAD_TYPE,
|
||
|
IDC_STATIC_LABEL_CREATION, IDH_DLOAD_CREATED,
|
||
|
IDC_STATIC_LABEL_LASTACCESS, IDH_DLOAD_LASTACC,
|
||
|
IDC_STATIC_LABEL_TOTALSIZE, IDH_DLOAD_TOTALSIZE,
|
||
|
IDC_STATIC_LABEL_CLSID, IDH_DLOAD_ID,
|
||
|
IDC_STATIC_LABEL_STATUS, IDH_DLOAD_STATUS,
|
||
|
IDC_STATIC_LABEL_CODEBASE, IDH_DLOAD_CODEBASE,
|
||
|
IDC_STATIC_TYPE, IDH_DLOAD_TYPE,
|
||
|
IDC_STATIC_CREATION, IDH_DLOAD_CREATED,
|
||
|
IDC_STATIC_LASTACCESS, IDH_DLOAD_LASTACC,
|
||
|
IDC_STATIC_TOTALSIZE, IDH_DLOAD_TOTALSIZE,
|
||
|
IDC_STATIC_CLSID, IDH_DLOAD_ID,
|
||
|
IDC_STATIC_STATUS, IDH_DLOAD_STATUS,
|
||
|
IDC_STATIC_CODEBASE, IDH_DLOAD_CODEBASE,
|
||
|
IDC_STATIC_CONTROL, IDH_DLOAD_OBJNAME,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
switch(message)
|
||
|
{
|
||
|
case WM_HELP:
|
||
|
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
InitPropPage1(hDlg, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
DestroyDialogIcon(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
// user can't change anything, so we don't care about any messages
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
|
||
|
} // end of switch
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// functions that deal with property page 2
|
||
|
|
||
|
int ListCtrl_InsertColumn(
|
||
|
HWND hwnd,
|
||
|
int nCol,
|
||
|
LPCTSTR lpszColumnHeading,
|
||
|
int nFormat,
|
||
|
int nWidth,
|
||
|
int nSubItem)
|
||
|
{
|
||
|
LV_COLUMN column;
|
||
|
column.mask = LVCF_TEXT|LVCF_FMT;
|
||
|
column.pszText = (LPTSTR)lpszColumnHeading;
|
||
|
column.fmt = nFormat;
|
||
|
if (nWidth != -1)
|
||
|
{
|
||
|
column.mask |= LVCF_WIDTH;
|
||
|
column.cx = nWidth;
|
||
|
}
|
||
|
if (nSubItem != -1)
|
||
|
{
|
||
|
column.mask |= LVCF_SUBITEM;
|
||
|
column.iSubItem = nSubItem;
|
||
|
}
|
||
|
|
||
|
return (int)::SendMessage(hwnd, LVM_INSERTCOLUMN, nCol, (LPARAM)&column);
|
||
|
}
|
||
|
|
||
|
BOOL ListCtrl_SetItemText(
|
||
|
HWND hwnd,
|
||
|
int nItem,
|
||
|
int nSubItem,
|
||
|
LPCTSTR lpszItem)
|
||
|
{
|
||
|
LV_ITEM lvi;
|
||
|
lvi.mask = LVIF_TEXT;
|
||
|
lvi.iItem = nItem;
|
||
|
lvi.iSubItem = nSubItem;
|
||
|
lvi.stateMask = 0;
|
||
|
lvi.state = 0;
|
||
|
lvi.pszText = (LPTSTR) lpszItem;
|
||
|
lvi.iImage = 0;
|
||
|
lvi.lParam = 0;
|
||
|
return (BOOL)::SendMessage(hwnd, LVM_SETITEM, 0, (LPARAM)&lvi);
|
||
|
}
|
||
|
|
||
|
int ListCtrl_InsertItem(
|
||
|
HWND hwnd,
|
||
|
UINT nMask,
|
||
|
int nItem,
|
||
|
LPCTSTR lpszItem,
|
||
|
UINT nState,
|
||
|
UINT nStateMask,
|
||
|
int nImage,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
LV_ITEM item;
|
||
|
item.mask = nMask;
|
||
|
item.iItem = nItem;
|
||
|
item.iSubItem = 0;
|
||
|
item.pszText = (LPTSTR)lpszItem;
|
||
|
item.state = nState;
|
||
|
item.stateMask = nStateMask;
|
||
|
item.iImage = nImage;
|
||
|
item.lParam = lParam;
|
||
|
|
||
|
return (int)::SendMessage(hwnd, LVM_INSERTITEM, 0, (LPARAM)&item);
|
||
|
}
|
||
|
|
||
|
void InitPropPage2(HWND hDlg, LPARAM lParam)
|
||
|
{
|
||
|
int iFileNameWidth = 0;
|
||
|
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
||
|
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
|
||
|
UINT cTotalFiles = GetTotalNumOfFiles(pcpidl);
|
||
|
|
||
|
{
|
||
|
HICON hIcon = ExtractIcon(g_hInst, GetStringInfo(pcpidl, SI_LOCATION), 0);
|
||
|
if (hIcon == NULL)
|
||
|
hIcon = GetDefaultOCIcon( pcpidl );
|
||
|
Assert(hIcon != NULL);
|
||
|
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
||
|
}
|
||
|
|
||
|
// insert columns into file list box
|
||
|
RECT rect;
|
||
|
int nWidth;
|
||
|
TCHAR szBuf[MAX_PATH];
|
||
|
HWND hwndCtrl = GetDlgItem(hDlg, IDC_DEPENDENCYLIST);
|
||
|
|
||
|
Assert(::IsWindow(hwndCtrl));
|
||
|
GetClientRect(hwndCtrl, &rect);
|
||
|
nWidth = rect.right - rect.left;
|
||
|
|
||
|
MLLoadString(IDS_LISTTITLE_FILENAME, szBuf, MAX_PATH);
|
||
|
iFileNameWidth = nWidth * 7 / 10;
|
||
|
ListCtrl_InsertColumn(
|
||
|
hwndCtrl,
|
||
|
0,
|
||
|
szBuf,
|
||
|
LVCFMT_LEFT,
|
||
|
iFileNameWidth, 0);
|
||
|
|
||
|
MLLoadString(IDS_LISTTITLE_FILESIZE, szBuf, MAX_PATH);
|
||
|
ListCtrl_InsertColumn(
|
||
|
hwndCtrl,
|
||
|
1,
|
||
|
szBuf,
|
||
|
LVCFMT_LEFT,
|
||
|
nWidth * 3 / 10,
|
||
|
0);
|
||
|
|
||
|
// insert dependent files into list box
|
||
|
int iIndex = -1;
|
||
|
LONG lResult = ERROR_SUCCESS;
|
||
|
DWORD dwFileSize = 0;
|
||
|
BOOL bOCXRemovable = IsModuleRemovable(GetStringInfo(pcpidl, SI_LOCATION));
|
||
|
|
||
|
for (UINT iFile = 0; iFile < cTotalFiles; iFile++)
|
||
|
{
|
||
|
if (!GetDependentFile(pcpidl, iFile, szBuf, &dwFileSize))
|
||
|
{
|
||
|
Assert(FALSE);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// put a star after file name if file is not safe for removal
|
||
|
if (!bOCXRemovable)
|
||
|
{
|
||
|
lstrcat(szBuf, TEXT("*"));
|
||
|
}
|
||
|
else if (!IsModuleRemovable(szBuf))
|
||
|
{
|
||
|
// check if it is inf file.
|
||
|
TCHAR szExt[10];
|
||
|
MLLoadString(IDS_EXTENSION_INF, szExt, 10);
|
||
|
int nLen = lstrlen(szBuf);
|
||
|
int nLenExt = lstrlen(szExt);
|
||
|
if ((nLen > nLenExt) &&
|
||
|
(lstrcmpi(szBuf+(nLen-nLenExt), szExt) != 0))
|
||
|
lstrcat(szBuf, TEXT("*"));
|
||
|
}
|
||
|
|
||
|
PathCompactPath(NULL, szBuf, iFileNameWidth);
|
||
|
iIndex = ListCtrl_InsertItem(hwndCtrl, LVIF_TEXT, iFile, szBuf, 0, 0, 0, 0);
|
||
|
|
||
|
if (dwFileSize > 0)
|
||
|
{
|
||
|
TCHAR szBuf2[100];
|
||
|
wsprintf(szBuf2, "%u", dwFileSize);
|
||
|
|
||
|
// insert commas to separate groups of digits
|
||
|
int nLen = lstrlen(szBuf2);
|
||
|
int i = 0, j = (nLen <= 3 ? nLen : (nLen % 3));
|
||
|
TCHAR *pCh = szBuf2 + j;
|
||
|
|
||
|
for (; i < j; i++)
|
||
|
szBuf[i] = szBuf2[i];
|
||
|
|
||
|
for (; *pCh != '\0'; i++, pCh++)
|
||
|
{
|
||
|
if (((pCh - szBuf2) % 3 == j) && (i > 0))
|
||
|
szBuf[i++] = ',';
|
||
|
szBuf[i] = *pCh;
|
||
|
}
|
||
|
szBuf[i] = '\0';
|
||
|
}
|
||
|
else
|
||
|
MLLoadString(IDS_STATUS_DAMAGED, szBuf, MAX_PATH);
|
||
|
|
||
|
ListCtrl_SetItemText(hwndCtrl, iIndex, 1, szBuf);
|
||
|
}
|
||
|
|
||
|
// insert columns into file list box
|
||
|
hwndCtrl = GetDlgItem(hDlg, IDC_PACKAGELIST);
|
||
|
|
||
|
Assert(::IsWindow(hwndCtrl));
|
||
|
GetClientRect(hwndCtrl, &rect);
|
||
|
nWidth = (rect.right - rect.left) / 2;
|
||
|
|
||
|
MLLoadString(IDS_LISTTITLE_PACKAGENAME, szBuf, MAX_PATH);
|
||
|
ListCtrl_InsertColumn(
|
||
|
hwndCtrl,
|
||
|
0,
|
||
|
szBuf,
|
||
|
LVCFMT_LEFT,
|
||
|
nWidth, 0);
|
||
|
|
||
|
MLLoadString(IDS_LISTTITLE_NAMESPACE, szBuf, MAX_PATH);
|
||
|
ListCtrl_InsertColumn(
|
||
|
hwndCtrl,
|
||
|
1,
|
||
|
szBuf,
|
||
|
LVCFMT_LEFT,
|
||
|
nWidth, 0);
|
||
|
|
||
|
// insert dependent packages into list box
|
||
|
UINT cTotalPackages = 0;;
|
||
|
|
||
|
if ( pcpidl->ci.dwIsDistUnit )
|
||
|
{
|
||
|
CParseInf parseInf;
|
||
|
|
||
|
if ( SUCCEEDED(parseInf.DoParseDU( GetStringInfo( pcpidl, SI_LOCATION), GetStringInfo( pcpidl,SI_CLSID ))) )
|
||
|
{
|
||
|
CPackageNode *ppn;
|
||
|
|
||
|
for ( ppn = parseInf.GetFirstPackage();
|
||
|
ppn != NULL;
|
||
|
ppn = parseInf.GetNextPackage(), cTotalPackages++ )
|
||
|
{
|
||
|
iIndex = ListCtrl_InsertItem(hwndCtrl, LVIF_TEXT, cTotalPackages, ppn->GetName(), 0, 0, 0, 0);
|
||
|
ListCtrl_SetItemText(hwndCtrl, iIndex, 1, ppn->GetNamespace());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// update description
|
||
|
{
|
||
|
TCHAR szMsg[MESSAGE_MAXSIZE];
|
||
|
TCHAR szBuf[MESSAGE_MAXSIZE];
|
||
|
// BUG: This is not the correct way to make va_list for Alpha
|
||
|
DWORD_PTR adwArgs[3];
|
||
|
adwArgs[0] = cTotalFiles;
|
||
|
adwArgs[1] = cTotalPackages;
|
||
|
adwArgs[2] = (DWORD_PTR) GetStringInfo(pcpidl, SI_CONTROL);
|
||
|
MLLoadString(IDS_MSG_DEPENDENCY, szBuf, MESSAGE_MAXSIZE);
|
||
|
FormatMessage( FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
||
|
szBuf, 0, 0, szMsg, MESSAGE_MAXSIZE, (va_list*)adwArgs );
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_DESCRIPTION, szMsg);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Dialog proc for page 2
|
||
|
INT_PTR CALLBACK ControlItem_PropPage2Proc(
|
||
|
HWND hDlg,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
|
||
|
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
|
||
|
|
||
|
const static DWORD aIds[] = {
|
||
|
IDC_DEPENDENCYLIST, IDH_DLOAD_FILE_DEP,
|
||
|
IDC_PACKAGELIST, IDH_DLOAD_JAVAPKG_DEP,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
switch(message)
|
||
|
{
|
||
|
case WM_HELP:
|
||
|
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
InitPropPage2(hDlg, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
DestroyDialogIcon(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
} // end of switch
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
// Do UI update
|
||
|
BOOL Page3_OnCommand(HWND hDlg, WORD wCmd)
|
||
|
{
|
||
|
HWND hwnd = GetDlgItem(hDlg, IDC_CHECK_NEVERUPDATE);
|
||
|
Assert(hwnd != NULL);
|
||
|
|
||
|
// if top check box is checked, disable the edit box
|
||
|
BOOL bEnable = ((int)::SendMessage(hwnd, BM_GETCHECK, 0, 0) != 1);
|
||
|
|
||
|
hwnd = GetDlgItem(hDlg, IDC_EDIT_UPDATEINTERVAL);
|
||
|
Assert(hwnd != NULL);
|
||
|
|
||
|
EnableWindow(hwnd, bEnable);
|
||
|
|
||
|
// if top check box is not checked and edit box does not
|
||
|
// have the focus and it is empty, put in default interval
|
||
|
if (bEnable && (GetFocus() != hwnd))
|
||
|
{
|
||
|
TCHAR szText[10];
|
||
|
if (GetWindowText(hwnd, szText, 10) == 0)
|
||
|
{
|
||
|
// wsprintf(szText, "%i", g_dwDefaultInterval);
|
||
|
SetWindowText(hwnd, szText);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// functions that deal with property page 4
|
||
|
|
||
|
void InitPropPage4(HWND hDlg, LPARAM lParam)
|
||
|
{
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
|
||
|
LPCONTROLPIDL pcpidl = (LPCONTROLPIDL)((LPPROPSHEETPAGE)lParam)->lParam;
|
||
|
|
||
|
LPTSTR lpszFileName = (LPTSTR)GetStringInfo(pcpidl, SI_LOCATION);
|
||
|
|
||
|
TCHAR szBuf[MESSAGE_MAXSIZE];
|
||
|
DWORD dwHandle = 0, dwSizeVer = 0;
|
||
|
LPTSTR lpBuffer = NULL;
|
||
|
UINT uSize = 0;
|
||
|
LPVOID lpVerData = NULL;
|
||
|
UINT uLen = 0;
|
||
|
DWORD dwLangCodePage = 0;
|
||
|
char szQueryPrefix[MAX_QUERYPREFIX_LEN];
|
||
|
char szQueryString[MAX_QUERYSTRING_LEN];
|
||
|
|
||
|
|
||
|
// draw control icon
|
||
|
{
|
||
|
LPCTSTR pszIcon = GetStringInfo(pcpidl, SI_LOCATION);
|
||
|
HICON hIcon = NULL;
|
||
|
if (!pszIcon || !(hIcon = ExtractIcon(g_hInst, pszIcon, 0)))
|
||
|
{
|
||
|
hIcon = GetDefaultOCIcon( pcpidl );
|
||
|
}
|
||
|
Assert(hIcon != NULL);
|
||
|
SendDlgItemMessage(hDlg, IDC_STATIC_ICON, STM_SETICON, (WPARAM)hIcon, 0);
|
||
|
}
|
||
|
|
||
|
// set page header
|
||
|
if (MLLoadString(IDS_VERSION_PAGE_HEADER, szBuf, MESSAGE_MAXSIZE))
|
||
|
{
|
||
|
TCHAR szHeading[MESSAGE_MAXSIZE];
|
||
|
LPCTSTR pszControl = GetStringInfo(pcpidl, SI_CONTROL);
|
||
|
if (pszControl)
|
||
|
{
|
||
|
wsprintf(szHeading, szBuf, pszControl);
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_HEADING, szHeading);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// set Version field
|
||
|
LPCTSTR pszVersion = GetStringInfo(pcpidl, SI_VERSION);
|
||
|
if (!pszVersion)
|
||
|
return;
|
||
|
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_VERSION, pszVersion);
|
||
|
|
||
|
if (!lpszFileName)
|
||
|
return;
|
||
|
|
||
|
dwSizeVer = GetFileVersionInfoSize(lpszFileName, &dwHandle);
|
||
|
if (dwSizeVer <= 0)
|
||
|
return;
|
||
|
|
||
|
BYTE *pbData = new BYTE[dwSizeVer];
|
||
|
if (pbData == NULL)
|
||
|
return;
|
||
|
|
||
|
if (GetFileVersionInfo(lpszFileName, 0, dwSizeVer, pbData))
|
||
|
{
|
||
|
// Get correct codepage information
|
||
|
|
||
|
if (!VerQueryValue(pbData, "\\VarFileInfo\\Translation", &lpVerData, &uLen))
|
||
|
{
|
||
|
wsprintf(szQueryPrefix, "\\StringFileInfo\\%x\\CompanyName", DEFAULT_LANG_CODEPAGE_PAIR);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
char szLangCodePad[9];
|
||
|
char szVBufPad[5], szVBuf[5]; // To fit a DWORD (padded)
|
||
|
ASSERT(lpVerData);
|
||
|
wnsprintf(szVBuf, ARRAYSIZE(szVBuf), "%x", LOWORD(*((DWORD *)lpVerData)));
|
||
|
|
||
|
// Pad the low word to 4 digits
|
||
|
|
||
|
lstrcpyn(szVBufPad, "0000", ARRAYSIZE(szVBufPad));
|
||
|
char *pszTmp = szVBufPad + (4 - lstrlen(szVBuf));
|
||
|
ASSERT(pszTmp > szVBufPad);
|
||
|
lstrcpy(pszTmp, szVBuf);
|
||
|
|
||
|
lstrcpyn(szLangCodePad, szVBufPad, ARRAYSIZE(szLangCodePad));
|
||
|
|
||
|
// Pad the high word to 4 digits
|
||
|
|
||
|
wnsprintf(szVBuf, ARRAYSIZE(szVBuf), "%x", HIWORD(*((DWORD *)lpVerData)));
|
||
|
lstrcpy(szVBufPad, "0000");
|
||
|
pszTmp = szVBufPad + (4 - lstrlen(szVBuf));
|
||
|
ASSERT(pszTmp > szVBufPad);
|
||
|
lstrcpy(pszTmp, szVBuf);
|
||
|
|
||
|
// Concatenate to get a codepage/lang-id string
|
||
|
lstrcatn(szLangCodePad, szVBufPad, ARRAYSIZE(szLangCodePad));
|
||
|
|
||
|
lstrcpy(szQueryPrefix, "\\StringFileInfo\\");
|
||
|
lstrcat(szQueryPrefix, szLangCodePad);
|
||
|
}
|
||
|
|
||
|
// set Company field
|
||
|
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\CompanyName", szQueryPrefix);
|
||
|
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_COMPANY, lpBuffer);
|
||
|
|
||
|
// set Description field
|
||
|
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\FileDescription", szQueryPrefix);
|
||
|
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_DESCRIPTION, lpBuffer);
|
||
|
|
||
|
// set CopyRight field
|
||
|
wnsprintf(szQueryString, ARRAYSIZE(szQueryString), "%s\\LegalCopyright", szQueryPrefix);
|
||
|
if (VerQueryValue(pbData, szQueryString, (void **)&lpBuffer, &uSize))
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_COPYRIGHT, lpBuffer);
|
||
|
|
||
|
// set Language field
|
||
|
if (VerQueryValue(pbData, TEXT("\\VarFileInfo\\Translation"), (void **)&lpBuffer, &uSize))
|
||
|
{
|
||
|
LPWORD lpLangId = (LPWORD)lpBuffer;
|
||
|
VerLanguageName(*lpLangId, szBuf, MESSAGE_MAXSIZE);
|
||
|
SetDlgItemText(hDlg, IDC_STATIC_VER_LANGUAGE, szBuf);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
delete [] pbData;
|
||
|
}
|
||
|
|
||
|
// Dialog proc for page 4
|
||
|
INT_PTR CALLBACK ControlItem_PropPage4Proc(
|
||
|
HWND hDlg,
|
||
|
UINT message,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
LPPROPSHEETPAGE lpPropSheet = (LPPROPSHEETPAGE) GetWindowLongPtr(hDlg, DWLP_USER);
|
||
|
LPCONTROLPIDL pcpidl = lpPropSheet ? (LPCONTROLPIDL)lpPropSheet->lParam : NULL;
|
||
|
|
||
|
const static DWORD aIds[] = {
|
||
|
IDC_STATIC_VER_LABEL_VERSION, IDH_DLOAD_VERSION,
|
||
|
IDC_STATIC_VER_LABEL_DESCRIPTION, IDH_DLOAD_DESC,
|
||
|
IDC_STATIC_VER_LABEL_COMPANY, IDH_DLOAD_COMPANY,
|
||
|
IDC_STATIC_VER_LABEL_LANGUAGE, IDH_DLOAD_LANG,
|
||
|
IDC_STATIC_VER_LABEL_COPYRIGHT, IDH_DLOAD_COPYRIGHT,
|
||
|
IDC_STATIC_VER_VERSION, IDH_DLOAD_VERSION,
|
||
|
IDC_STATIC_VER_DESCRIPTION, IDH_DLOAD_DESC,
|
||
|
IDC_STATIC_VER_COMPANY, IDH_DLOAD_COMPANY,
|
||
|
IDC_STATIC_VER_LANGUAGE, IDH_DLOAD_LANG,
|
||
|
IDC_STATIC_VER_COPYRIGHT, IDH_DLOAD_COPYRIGHT,
|
||
|
IDC_STATIC_CONTROL, IDH_DLOAD_OBJNAME,
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
switch(message)
|
||
|
{
|
||
|
case WM_HELP:
|
||
|
SHWinHelpOnDemandWrap((HWND)(((LPHELPINFO)lParam)->hItemHandle), "iexplore.hlp", HELP_WM_HELP, (DWORD_PTR)(LPSTR)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
SHWinHelpOnDemandWrap((HWND)wParam, "iexplore.hlp", HELP_CONTEXTMENU, (DWORD_PTR)(LPVOID)aIds);
|
||
|
break;
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
InitPropPage4(hDlg, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY:
|
||
|
DestroyDialogIcon(hDlg);
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
// user can't change anything, so we don't care about any messages
|
||
|
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
return FALSE;
|
||
|
|
||
|
} // end of switch
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
// functions that deal with property dialog
|
||
|
|
||
|
HRESULT CreatePropDialog(HWND hwnd, LPCONTROLPIDL pcpidl)
|
||
|
{
|
||
|
#ifdef AUTO_UPDATE
|
||
|
PROPSHEETPAGE psp[NUM_PAGES] = {{0},{0},{0},{0}};
|
||
|
#else
|
||
|
PROPSHEETPAGE psp[NUM_PAGES] = {{0},{0},{0}};
|
||
|
#endif
|
||
|
PROPSHEETHEADER psh = {0};
|
||
|
|
||
|
// initialize propsheet page 1.
|
||
|
psp[0].dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp[0].dwFlags = 0;
|
||
|
psp[0].hInstance = MLGetHinst();
|
||
|
psp[0].pszTemplate = MAKEINTRESOURCE(IDD_PROP_GENERAL);
|
||
|
psp[0].pszIcon = NULL;
|
||
|
psp[0].pfnDlgProc = ControlItem_PropPage1Proc;
|
||
|
psp[0].pszTitle = NULL;
|
||
|
psp[0].lParam = (LPARAM)pcpidl; // send it the cache entry struct
|
||
|
|
||
|
// initialize propsheet page 2.
|
||
|
psp[1].dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp[1].dwFlags = 0;
|
||
|
psp[1].hInstance = MLGetHinst();
|
||
|
psp[1].pszTemplate = MAKEINTRESOURCE(IDD_PROP_DEPENDENCY);
|
||
|
psp[1].pszIcon = NULL;
|
||
|
psp[1].pfnDlgProc = ControlItem_PropPage2Proc;
|
||
|
psp[1].pszTitle = NULL;
|
||
|
psp[1].lParam = (LPARAM)pcpidl; // send it the cache entry struct
|
||
|
|
||
|
|
||
|
#ifdef AUTO_UPDATE
|
||
|
// initialize propsheet page 3.
|
||
|
psp[2].dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp[2].dwFlags = 0;
|
||
|
psp[2].hInstance = MLGetHinst();
|
||
|
psp[2].pszTemplate = MAKEINTRESOURCE(IDD_PROP_UPDATE);
|
||
|
psp[2].pszIcon = NULL;
|
||
|
psp[2].pfnDlgProc = ControlItem_PropPage3Proc;
|
||
|
psp[2].pszTitle = NULL;
|
||
|
psp[2].lParam = (LPARAM)pcpidl; // send it the cache entry struct
|
||
|
#endif
|
||
|
|
||
|
// initialize propsheet page 4.
|
||
|
psp[NUM_PAGES-1].dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp[NUM_PAGES-1].dwFlags = 0;
|
||
|
psp[NUM_PAGES-1].hInstance = MLGetHinst();
|
||
|
psp[NUM_PAGES-1].pszTemplate = MAKEINTRESOURCE(IDD_PROP_VERSION);
|
||
|
psp[NUM_PAGES-1].pszIcon = NULL;
|
||
|
psp[NUM_PAGES-1].pfnDlgProc = ControlItem_PropPage4Proc;
|
||
|
psp[NUM_PAGES-1].pszTitle = NULL;
|
||
|
psp[NUM_PAGES-1].lParam = (LPARAM)pcpidl; // send it the cache entry struct
|
||
|
|
||
|
// initialize propsheet header.
|
||
|
psh.dwSize = sizeof(PROPSHEETHEADER);
|
||
|
psh.dwFlags = PSH_PROPSHEETPAGE|PSH_NOAPPLYNOW|PSH_PROPTITLE;
|
||
|
psh.hwndParent = hwnd;
|
||
|
psh.pszCaption = GetStringInfo(pcpidl, SI_CONTROL);
|
||
|
psh.nPages = NUM_PAGES;
|
||
|
psh.nStartPage = 0;
|
||
|
psh.ppsp = (LPCPROPSHEETPAGE)&psp;
|
||
|
|
||
|
// invoke the property sheet
|
||
|
PropertySheet(&psh);
|
||
|
|
||
|
return NOERROR;
|
||
|
}
|