windows-nt/Source/XPSP1/NT/com/mobile/syncmgr/dll/confres.cpp

351 lines
13 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*----------------------------------------------------------------------------
/ Title;
/ dll.cpp
/ Copyright (C) Microsoft Corporation, 1999.
/
/ Authors;
/ Jude Kavalam (judej)
/
/ Notes;
/ Entry point for File Conflict Resolution Dialog
/----------------------------------------------------------------------------*/
#include "precomp.h"
#define CX_BIGICON 48
#define CY_BIGICON 48
extern HINSTANCE g_hmodThisDll; // Handle to this DLL itself.
#define ARRAYLEN(a) (sizeof(a) / sizeof((a)[0]))
// Special flag to fix up the callback data when thunking
#define RFC_THUNK_DATA 0x80000000
/////////////////////////////////////////////////////////////////////////////
// Global UNICODE<>ANSI translation helpers
LPWSTR WINAPI AtlA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars)
{
Assert(lpa != NULL);
Assert(lpw != NULL);
// verify that no illegal character present
// since lpw was allocated based on the size of lpa
// don't worry about the number of chars
lpw[0] = L'\0';
MultiByteToWideChar(CP_ACP, 0, lpa, -1, lpw, nChars);
return lpw;
}
LPSTR WINAPI AtlW2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars)
{
Assert(lpw != NULL);
Assert(lpa != NULL);
// verify that no illegal character present
// since lpa was allocated based on the size of lpw
// don't worry about the number of chars
lpa[0] = '\0';
WideCharToMultiByte(CP_ACP, 0, lpw, -1, lpa, nChars, NULL, NULL);
return lpa;
}
INT_PTR CALLBACK RFCDlgProc(HWND, UINT, WPARAM, LPARAM);
// The caller needs to send an hwnd and fill in the RFCDLGPARAM. Only the icons
// are optional
int WINAPI SyncMgrResolveConflict(HWND hWndParent, RFCDLGPARAM *pdlgParam)
{
int nRet = 0;
HICON hIKeepBoth = NULL, hIKeepLocal = NULL, hIKeepNetwork = NULL;
if (!hWndParent || !pdlgParam)
return -1;
if (IsBadReadPtr(pdlgParam, sizeof(RFCDLGPARAM)))
return -1;
// If we don't have any of the params fail..
if (!pdlgParam->pszFilename || !pdlgParam->pszLocation || !pdlgParam->pszNewName)
return -1;
// If we do not have any of the icons, load the defaults
if (!pdlgParam->hIKeepBoth)
pdlgParam->hIKeepBoth = hIKeepBoth =
(HICON)LoadImage(g_hmodThisDll, MAKEINTRESOURCE(IDI_KEEPBOTH),
IMAGE_ICON, CX_BIGICON, CY_BIGICON,
LR_LOADMAP3DCOLORS);
if (!pdlgParam->hIKeepLocal)
pdlgParam->hIKeepLocal = hIKeepLocal =
(HICON)LoadImage(g_hmodThisDll, MAKEINTRESOURCE(IDI_KEEPLOCAL),
IMAGE_ICON, CX_BIGICON, CY_BIGICON,
LR_LOADMAP3DCOLORS);
if (!pdlgParam->hIKeepNetwork)
pdlgParam->hIKeepNetwork = hIKeepNetwork =
(HICON)LoadImage(g_hmodThisDll, MAKEINTRESOURCE(IDI_KEEPNETWORK),
IMAGE_ICON, CX_BIGICON, CY_BIGICON,
LR_LOADMAP3DCOLORS);
nRet = (int)DialogBoxParam(g_hmodThisDll, MAKEINTRESOURCE(IDD_RESFILECONFLICTS),
hWndParent, RFCDlgProc, (LPARAM)pdlgParam);
// Destroy the icons that were created
if (hIKeepBoth)
DestroyIcon(hIKeepBoth);
if (hIKeepLocal)
DestroyIcon(hIKeepLocal);
if (hIKeepNetwork)
DestroyIcon(hIKeepNetwork);
return nRet;
}
INT_PTR CALLBACK RFCDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RFCDLGPARAM * pParam = (RFCDLGPARAM*)GetWindowLongPtr(hDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
{
SHFILEINFO sfi = {0};
TCHAR szStr[INTERNET_MAX_URL_LENGTH + MAX_PATH];
TCHAR szFmt[MAX_PATH];
HICON hiExclaim;
LPTSTR pszNetUser=NULL, pszNetDate=NULL, pszLocalUser=NULL, pszLocalDate=NULL;
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)lParam);
pParam = (RFCDLGPARAM*)lParam;
if (!pParam)
{
EndDialog(hDlg, -1);
return TRUE;
}
hiExclaim = LoadIcon(NULL, IDI_EXCLAMATION);
SendDlgItemMessage(hDlg, IDI_EXCLAIMICON, STM_SETICON, (WPARAM)hiExclaim, 0L);
// Get the icon from Shell
wsprintf(szStr, TEXT("%ws%ws"), pParam->pszLocation, pParam->pszFilename);
if (SHGetFileInfo(szStr, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_LARGEICON))
SendDlgItemMessage(hDlg, IDI_DOCICON, STM_SETICON, (WPARAM)sfi.hIcon, 0L);
// Set initial selection
CheckRadioButton(hDlg, IDC_KEEPBOTH, IDC_KEEPNETWORK, IDC_KEEPBOTH);
if (pParam->hIKeepBoth)
SendDlgItemMessage(hDlg, IDB_BIGICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pParam->hIKeepBoth);
// Format and set the strings
LoadString(g_hmodThisDll, IDS_NAMEANDLOCATION, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszFilename, pParam->pszLocation);
SetDlgItemText(hDlg,IDC_FILEANDLOCATION,szStr);
if (pParam->pszNewName)
{
SetDlgItemText(hDlg,IDC_NEWFILENAME,pParam->pszNewName);
}
if (pParam->pszNetworkModifiedBy && pParam->pszNetworkModifiedOn &&
lstrlen(pParam->pszNetworkModifiedBy) && lstrlen(pParam->pszNetworkModifiedOn))
{
// we have by and on then use them both
LoadString(g_hmodThisDll, IDS_NETWORKMODIFIED, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszNetworkModifiedBy, pParam->pszNetworkModifiedOn);
}
else if ((pParam->pszNetworkModifiedBy && lstrlen(pParam->pszNetworkModifiedBy)) &&
(!pParam->pszNetworkModifiedOn || !lstrlen(pParam->pszNetworkModifiedOn)))
{
// We have the name but no date
TCHAR szTemp[MAX_PATH];
LoadString(g_hmodThisDll, IDS_UNKNOWNDATE, szTemp, ARRAYLEN(szTemp));
LoadString(g_hmodThisDll, IDS_NETWORKMODIFIED, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszNetworkModifiedBy, szTemp);
}
else if ((!pParam->pszNetworkModifiedBy || !lstrlen(pParam->pszNetworkModifiedBy)) &&
(pParam->pszNetworkModifiedOn && lstrlen(pParam->pszNetworkModifiedOn)))
{
// We have the date but no name
LoadString(g_hmodThisDll, IDS_NETWORKMODIFIED_DATEONLY, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszNetworkModifiedOn);
}
else
// we do not have on or by, use the unknown
LoadString(g_hmodThisDll, IDS_NONETINFO, szStr, ARRAYLEN(szStr));
SetDlgItemText(hDlg,IDC_NETWORKMODIFIED,szStr);
if (pParam->pszLocalModifiedBy && pParam->pszLocalModifiedOn &&
lstrlen(pParam->pszLocalModifiedBy) && lstrlen(pParam->pszLocalModifiedOn))
{
// we have by and on then use them both
LoadString(g_hmodThisDll, IDS_LOCALMODIFIED, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszLocalModifiedBy, pParam->pszLocalModifiedOn);
}
else if ((pParam->pszLocalModifiedBy && lstrlen(pParam->pszLocalModifiedBy)) &&
(!pParam->pszLocalModifiedOn || !lstrlen(pParam->pszLocalModifiedOn)))
{
// We have the name but no date
TCHAR szTemp[MAX_PATH];
LoadString(g_hmodThisDll, IDS_UNKNOWNDATE, szTemp, ARRAYLEN(szTemp));
LoadString(g_hmodThisDll, IDS_LOCALMODIFIED, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszLocalModifiedBy, szTemp);
}
else if ((!pParam->pszLocalModifiedBy || !lstrlen(pParam->pszLocalModifiedBy)) &&
(pParam->pszLocalModifiedOn && lstrlen(pParam->pszLocalModifiedOn)))
{
// We have the date but no name
LoadString(g_hmodThisDll, IDS_LOCALMODIFIED_DATEONLY, szFmt, ARRAYLEN(szFmt));
wsprintf(szStr, szFmt, pParam->pszLocalModifiedOn);
}
else
// we do not have on or by, use the unknown
LoadString(g_hmodThisDll, IDS_NOLOCALINFO, szStr, ARRAYLEN(szStr));
SetDlgItemText(hDlg,IDC_LOCALMODIFIED,szStr);
// If there is no call back function, don't show the view buttons.
if (!pParam->pfnCallBack)
{
HWND hWndButton = GetDlgItem(hDlg, IDC_VIEWLOCAL);
ShowWindow(hWndButton, SW_HIDE);
EnableWindow(hWndButton, FALSE);
hWndButton = GetDlgItem(hDlg, IDC_VIEWNETWORK);
ShowWindow(hWndButton, SW_HIDE);
EnableWindow(hWndButton, FALSE);
}
// Hide the "Apply to all" checkbox if caller doesn't want it.
if (!(RFCF_APPLY_ALL & pParam->dwFlags))
{
HWND hWndButton = GetDlgItem(hDlg, IDC_APPLY_ALL);
ShowWindow(hWndButton, SW_HIDE);
EnableWindow(hWndButton, FALSE);
}
break;
}
case WM_COMMAND:
{
int id = LOWORD(wParam);
switch (id)
{
case IDCANCEL:
EndDialog(hDlg, RFC_CANCEL);
break;
case IDOK:
{
int nRet = RFC_KEEPBOTH;
if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_KEEPBOTH))
nRet = RFC_KEEPBOTH;
else if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_KEEPLOCAL))
nRet = RFC_KEEPLOCAL;
else if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_KEEPNETWORK))
nRet = RFC_KEEPNETWORK;
if (pParam && (RFCF_APPLY_ALL & pParam->dwFlags) &&
BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_APPLY_ALL))
{
nRet |= RFC_APPLY_TO_ALL;
}
EndDialog(hDlg, nRet);
break;
}
case IDC_KEEPBOTH:
case IDC_KEEPLOCAL:
case IDC_KEEPNETWORK:
{
HICON hITemp;
if (!pParam)
break;
if (IDC_KEEPBOTH == id)
hITemp = pParam->hIKeepBoth;
else if (IDC_KEEPLOCAL == id)
hITemp = pParam->hIKeepLocal;
else
hITemp = pParam->hIKeepNetwork;
SendDlgItemMessage(hDlg, IDB_BIGICON, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hITemp);
break;
}
case IDC_VIEWLOCAL:
if (pParam)
pParam->pfnCallBack(hDlg, RFCCM_VIEWLOCAL, 0, (pParam->dwFlags & RFC_THUNK_DATA) ? pParam->lCallerData : (LPARAM)pParam);
break;
case IDC_VIEWNETWORK:
if (pParam)
pParam->pfnCallBack(hDlg, RFCCM_VIEWNETWORK, 0, (pParam->dwFlags & RFC_THUNK_DATA) ? pParam->lCallerData : (LPARAM)pParam);
break;
default:
return FALSE;
}
break;
}
default:
return FALSE;
}
return TRUE;
}
#ifdef _UNICODE
int WINAPI SyncMgrResolveConflictA(HWND hWndParent, RFCDLGPARAMA *pdlgParam)
{
USES_CONVERSION;
RFCDLGPARAMW dlgPW={0};
dlgPW.dwFlags = pdlgParam->dwFlags | RFC_THUNK_DATA;
dlgPW.hIKeepBoth = pdlgParam->hIKeepBoth;
dlgPW.hIKeepLocal = pdlgParam->hIKeepLocal;
dlgPW.hIKeepNetwork = pdlgParam->hIKeepNetwork;
dlgPW.pfnCallBack = pdlgParam->pfnCallBack;
dlgPW.lCallerData = (LPARAM)pdlgParam;
dlgPW.pszFilename = A2CW(pdlgParam->pszFilename);
dlgPW.pszLocation = A2CW(pdlgParam->pszLocation);
dlgPW.pszNewName = A2CW(pdlgParam->pszNewName);
dlgPW.pszNetworkModifiedBy = A2CW(pdlgParam->pszNetworkModifiedBy);
dlgPW.pszNetworkModifiedOn = A2CW(pdlgParam->pszNetworkModifiedOn);
dlgPW.pszLocalModifiedBy = A2CW(pdlgParam->pszLocalModifiedBy);
dlgPW.pszLocalModifiedOn = A2CW(pdlgParam->pszLocalModifiedOn);
return SyncMgrResolveConflictW(hWndParent, &dlgPW);
}
#else
int WINAPI SyncMgrResolveConflictW(HWND hWndParent, RFCDLGPARAMW *pdlgParam)
{
USES_CONVERSION;
RFCDLGPARAMA dlgPA={0};
dlgPA.dwFlags = pdlgParam->dwFlags | RFC_THUNK_DATA;
dlgPA.hIKeepBoth = pdlgParam->hIKeepBoth;
dlgPA.hIKeepLocal = pdlgParam->hIKeepLocal;
dlgPA.hIKeepNetwork = pdlgParam->hIKeepNetwork;
dlgPA.pfnCallBack = pdlgParam->pfnCallBack;
dlgPA.lCallerData = (LPARAM)pdlgParam;
dlgPA.pszFilename = W2CA(pdlgParam->pszFilename);
dlgPA.pszLocation = W2CA(pdlgParam->pszLocation);
dlgPA.pszNewName = W2CA(pdlgParam->pszNewName);
dlgPA.pszNetworkModifiedBy = W2CA(pdlgParam->pszNetworkModifiedBy);
dlgPA.pszNetworkModifiedOn = W2CA(pdlgParam->pszNetworkModifiedOn);
dlgPA.pszLocalModifiedBy = W2CA(pdlgParam->pszLocalModifiedBy);
dlgPA.pszLocalModifiedOn = W2CA(pdlgParam->pszLocalModifiedOn);
return SyncMgrResolveConflictA(hWndParent, &dlgPA);
}
#endif