|
|
/*----------------------------------------------------------------------------
/ 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
|