You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
415 lines
12 KiB
415 lines
12 KiB
#include "precomp.h"
|
|
#include "utils.h"
|
|
|
|
#define MAX_FILES 700
|
|
|
|
extern void UpdateProgress(int);
|
|
|
|
DWORD FolderSize(LPCTSTR pszFolderName)
|
|
{
|
|
DWORD dwSize = 0;
|
|
WIN32_FIND_DATA fileData;
|
|
HANDLE hFindFile;
|
|
TCHAR szFile[MAX_PATH];
|
|
|
|
if (pszFolderName == NULL || ISNULL(pszFolderName))
|
|
return dwSize;
|
|
|
|
PathCombine(szFile, pszFolderName, TEXT("*"));
|
|
|
|
if ((hFindFile = FindFirstFile(szFile, &fileData)) != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
|
dwSize += fileData.nFileSizeLow;
|
|
} while (FindNextFile(hFindFile, &fileData));
|
|
|
|
FindClose(hFindFile);
|
|
}
|
|
|
|
return dwSize;
|
|
}
|
|
|
|
HRESULT MySHFileOperation(SHFILEOPSTRUCT &shfStruc, LPDWORD lpdwSizeArray,
|
|
DWORD dwTotalSize, DWORD dwTicks)
|
|
{
|
|
LPCTSTR pFrom;
|
|
LPTSTR pTo;
|
|
TCHAR szTo[MAX_PATH];
|
|
DWORD dwBytesCopied = 0;
|
|
DWORD dwTickInterval = 0;
|
|
DWORD dwIndex = 0;
|
|
int i;
|
|
|
|
// create the directory(we assume all files are being copied to the same dir here)
|
|
|
|
PathCreatePath(shfStruc.pTo);
|
|
|
|
if (dwTicks)
|
|
{
|
|
dwIndex = 1;
|
|
|
|
// round up on the update interval
|
|
|
|
dwTickInterval = dwTotalSize / dwTicks +
|
|
((dwTotalSize % dwTicks == 0) ? 0 : 1);
|
|
}
|
|
|
|
StrCpy(szTo, shfStruc.pTo);
|
|
PathAddBackslash(szTo);
|
|
pTo = szTo + StrLen(szTo);
|
|
for (pFrom = shfStruc.pFrom, i = 0; *pFrom; pFrom += StrLen(pFrom) + 1, i++)
|
|
{
|
|
StrCpy(pTo, PathFindFileName(pFrom));
|
|
// set the file_normal attribute so we can overwrite existing files
|
|
SetFileAttributes(szTo, FILE_ATTRIBUTE_NORMAL);
|
|
|
|
if (!CopyFile(pFrom, szTo, FALSE))
|
|
return E_FAIL;
|
|
if (dwTicks)
|
|
{
|
|
dwBytesCopied += lpdwSizeArray[i];
|
|
if (dwBytesCopied > (dwTickInterval * dwIndex))
|
|
{
|
|
dwIndex++;
|
|
UpdateProgress(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dwTicks)
|
|
UpdateProgress(1);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT CopyFilesSrcToDest(LPCTSTR pszSrcPath, LPCTSTR pszSrcFilter, LPCTSTR pszDestPath,
|
|
DWORD dwTicks /* = 0 */)
|
|
{
|
|
HANDLE hFind;
|
|
WIN32_FIND_DATA wfdFind;
|
|
TCHAR szSrcFile[MAX_PATH];
|
|
DWORD dwTotalSize = 0;
|
|
LPTSTR lpszFrom;
|
|
LPDWORD lpdwSize = NULL;
|
|
int nFrom = 0;
|
|
int nFiles = 0;
|
|
HRESULT res = S_OK;
|
|
SHFILEOPSTRUCT shfStruc;
|
|
|
|
if(ISNULL(pszSrcPath))
|
|
return S_OK;
|
|
|
|
lpszFrom = (LPTSTR) LocalAlloc(LPTR, MAX_BUFFER_SIZE*sizeof(TCHAR));
|
|
if (!lpszFrom)
|
|
return E_FAIL;
|
|
|
|
if (dwTicks)
|
|
{
|
|
lpdwSize = (LPDWORD) LocalAlloc(LPTR, MAX_FILES * sizeof(DWORD));
|
|
if (!lpdwSize)
|
|
{
|
|
LocalFree(lpszFrom);
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
ZeroMemory(&shfStruc, sizeof(shfStruc));
|
|
shfStruc.hwnd = g_hWizard;
|
|
shfStruc.wFunc = FO_COPY;
|
|
|
|
// remove the trailing backslash character
|
|
TCHAR szBuffer[MAX_PATH];
|
|
|
|
StrCpy(szBuffer, pszSrcPath);
|
|
PathRemoveBackslash(szBuffer);
|
|
pszSrcPath = szBuffer;
|
|
|
|
PathCombine(szSrcFile, pszSrcPath, pszSrcFilter);
|
|
hFind = FindFirstFile(szSrcFile, &wfdFind);
|
|
if (hFind != INVALID_HANDLE_VALUE)
|
|
{
|
|
do
|
|
{
|
|
if (!(wfdFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
|
&& StrCmp(wfdFind.cFileName, TEXT("."))
|
|
&& StrCmp(wfdFind.cFileName, TEXT("..")))
|
|
{
|
|
PathCombine(szSrcFile, pszSrcPath, wfdFind.cFileName);
|
|
if (((nFrom + lstrlen(szSrcFile) + 1) < MAX_BUFFER_SIZE) &&
|
|
((!dwTicks) || (nFiles < MAX_FILES)))
|
|
{
|
|
StrCpy(lpszFrom + nFrom, szSrcFile);
|
|
nFrom += lstrlen(szSrcFile) + 1;
|
|
if (dwTicks)
|
|
{
|
|
dwTotalSize += (lpdwSize[nFiles] = wfdFind.nFileSizeLow);
|
|
nFiles++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
shfStruc.pFrom = lpszFrom;
|
|
shfStruc.pTo = pszDestPath;
|
|
shfStruc.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
|
|
|
|
res |= MySHFileOperation(shfStruc, lpdwSize, dwTotalSize, dwTicks);
|
|
|
|
ZeroMemory(lpszFrom, MAX_BUFFER_SIZE);
|
|
nFrom = 0;
|
|
dwTicks = 0;
|
|
|
|
StrCpy(lpszFrom + nFrom, szSrcFile);
|
|
nFrom += lstrlen(szSrcFile) + 1;
|
|
}
|
|
}
|
|
}while (FindNextFile( hFind, &wfdFind));
|
|
FindClose(hFind);
|
|
|
|
if(ISNONNULL(lpszFrom))
|
|
{
|
|
shfStruc.pFrom = lpszFrom;
|
|
shfStruc.pTo = pszDestPath;
|
|
shfStruc.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
|
|
|
|
res |= MySHFileOperation(shfStruc, lpdwSize, dwTotalSize, dwTicks);
|
|
}
|
|
}
|
|
LocalFree(lpszFrom);
|
|
if (dwTicks) LocalFree(lpdwSize);
|
|
return res;
|
|
}
|
|
|
|
void TooBig(HWND hWnd, WORD id)
|
|
{
|
|
TCHAR szTitle[MAX_PATH], szMsg[MAX_PATH];
|
|
|
|
LoadString(g_rvInfo.hInst, IDS_TITLE, szTitle, countof(szTitle));
|
|
LoadString(g_rvInfo.hInst, id, szMsg, countof(szMsg));
|
|
|
|
MessageBox(hWnd, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
|
|
SetWindowLongPtr(hWnd, DWLP_MSGRESULT, -1);
|
|
}
|
|
|
|
void SetWindowTextSmart(HWND hwnd, LPCTSTR pcszText)
|
|
{
|
|
TCHAR szCurrentText[INTERNET_MAX_URL_LENGTH];
|
|
|
|
if (GetWindowText(hwnd, szCurrentText, countof(szCurrentText)))
|
|
{
|
|
if (StrCmpI(pcszText, szCurrentText) == 0)
|
|
return;
|
|
}
|
|
|
|
SetWindowText(hwnd, pcszText);
|
|
}
|
|
|
|
DWORD ShellExecAndWait(SHELLEXECUTEINFO shInfo)
|
|
{
|
|
MSG msg;
|
|
DWORD dwRet;
|
|
|
|
if (!ShellExecuteEx(&shInfo))
|
|
return (DWORD)E_FAIL;
|
|
|
|
while (MsgWaitForMultipleObjects(1, &shInfo.hProcess, FALSE, INFINITE, QS_ALLINPUT) != WAIT_OBJECT_0)
|
|
{
|
|
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
GetExitCodeProcess(shInfo.hProcess, &dwRet);
|
|
CloseHandle(shInfo.hProcess);
|
|
return dwRet;
|
|
}
|
|
|
|
// equivalent of c run time strtok
|
|
|
|
LPTSTR StrTok(LPTSTR pcszToken, LPCTSTR pcszDelimit)
|
|
{
|
|
LPTSTR pszRet, pszCur;
|
|
int i;
|
|
|
|
pszCur = pcszToken;
|
|
|
|
while (*pszCur)
|
|
{
|
|
i = 0;
|
|
while(pcszDelimit[i])
|
|
{
|
|
if (*pszCur == pcszDelimit[i])
|
|
break;
|
|
i++;
|
|
}
|
|
if (!pcszDelimit[i])
|
|
break;
|
|
pszCur++;
|
|
}
|
|
|
|
pszRet = ((*pszCur) ? pszCur : NULL);
|
|
|
|
if (pszRet != NULL)
|
|
{
|
|
while (*pszCur)
|
|
{
|
|
i = 0;
|
|
while(pcszDelimit[i])
|
|
{
|
|
if (*pszCur == pcszDelimit[i])
|
|
break;
|
|
i++;
|
|
}
|
|
if (pcszDelimit[i])
|
|
break;
|
|
pszCur++;
|
|
}
|
|
|
|
if(*pszCur)
|
|
*pszCur = TEXT('\0');
|
|
}
|
|
|
|
return pszRet;
|
|
}
|
|
|
|
//**********************************************************************
|
|
// Automation HookIn : This function copies displayed item names from the
|
|
// LV into the Registry key "HKEY_LOCAL_MACHINE\Soft\MS\AutoTemp".
|
|
// Taken from setupwbv.cpp
|
|
//
|
|
//**********************************************************************
|
|
|
|
void LVGetItems(HWND hwndLV)
|
|
{
|
|
LV_ITEM lvi;
|
|
DWORD dwNumItems, dwIndex;
|
|
HKEY hKey;
|
|
DWORD dwDisp;
|
|
TCHAR szValueName[5];
|
|
TCHAR szDisplayName[MAX_PATH];
|
|
BOOL bOK = TRUE;
|
|
LONG lRet;
|
|
|
|
dwNumItems = ListView_GetItemCount(hwndLV);
|
|
|
|
// Create the new key. NOTE: Its volatile.
|
|
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\AutoTemp"), 0,
|
|
NULL, REG_OPTION_VOLATILE, KEY_READ|KEY_WRITE,
|
|
NULL, &hKey, &dwDisp);
|
|
bOK = (lRet == ERROR_SUCCESS);
|
|
if (bOK)
|
|
{
|
|
// If the key already existed, delete it so that old
|
|
// data does not carry-over by mistake.
|
|
if ( dwDisp == REG_OPENED_EXISTING_KEY )
|
|
{
|
|
RegCloseKey(hKey);
|
|
RegDeleteKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\AutoTemp"));
|
|
lRet = RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\AutoTemp"), 0,
|
|
NULL, REG_OPTION_VOLATILE, KEY_READ|KEY_WRITE,
|
|
NULL, &hKey, &dwDisp);
|
|
bOK = (lRet == ERROR_SUCCESS);
|
|
}
|
|
|
|
if (bOK)
|
|
{
|
|
for (dwIndex=0; dwIndex < dwNumItems && bOK; dwIndex++)
|
|
{
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.iItem = (int) dwIndex;
|
|
lvi.iSubItem = 0;
|
|
ZeroMemory(szDisplayName, sizeof(szDisplayName));
|
|
lvi.pszText = szDisplayName;
|
|
lvi.cchTextMax = countof(szDisplayName);
|
|
ListView_GetItem(hwndLV, &lvi);
|
|
|
|
// Write the Display name to the Registry.
|
|
wnsprintf(szValueName, countof(szValueName), TEXT("%03d"), dwIndex);
|
|
lRet = RegSetValueEx(hKey, szValueName, 0, REG_SZ,
|
|
(const BYTE *)szDisplayName, (lstrlen(szDisplayName)+1)*sizeof(TCHAR));
|
|
|
|
bOK = (lRet == ERROR_SUCCESS);
|
|
}
|
|
|
|
// Write the number of values for the automation people to readout.
|
|
RegSetValueEx(hKey, TEXT("Number"), 0, REG_DWORD,
|
|
(const BYTE *)&dwIndex, sizeof(dwIndex));
|
|
|
|
// Close the Reg key.
|
|
RegCloseKey(hKey);
|
|
}
|
|
}
|
|
}
|
|
|
|
LPTSTR GetOutputPlatformDir()
|
|
{
|
|
static TCHAR s_szOutPlatform[MAX_PATH];
|
|
|
|
if (ISNULL(s_szOutPlatform))
|
|
{
|
|
switch (g_dwPlatformId)
|
|
{
|
|
case PLATFORM_WIN32:
|
|
default:
|
|
StrCpy(s_szOutPlatform, TEXT("WIN32\\"));
|
|
break;
|
|
}
|
|
}
|
|
|
|
ASSERT(ISNONNULL(s_szOutPlatform));
|
|
return s_szOutPlatform;
|
|
}
|
|
|
|
int GetRole(BOOL g_fBranded, BOOL g_fIntranet)
|
|
{
|
|
int nRetVal = -1;
|
|
|
|
if (g_fBranded == FALSE && g_fIntranet == FALSE)
|
|
nRetVal = ROLE_ICP;
|
|
else if (g_fBranded == TRUE && g_fIntranet == FALSE)
|
|
nRetVal = ROLE_ISP;
|
|
else if (g_fBranded == TRUE && g_fIntranet == TRUE)
|
|
nRetVal = ROLE_CORP;
|
|
else
|
|
ASSERT(FALSE);
|
|
|
|
return nRetVal;
|
|
}
|
|
|
|
// Loop thru Favorites/Links under the section FavoritesEx/URL and check if it has any associated icon file.
|
|
BOOL IsIconsInFavs(LPCTSTR pcszSection, LPCTSTR pcszCustIns)
|
|
{
|
|
TCHAR szTemp[MAX_PATH];
|
|
TCHAR szNameKey[MAX_PATH];
|
|
TCHAR szIconKey[MAX_PATH];
|
|
TCHAR szNameFormat[MAX_PATH];
|
|
TCHAR szIconFormat[MAX_PATH];
|
|
|
|
if (StrCmpI(pcszSection, IS_FAVORITESEX) == 0)
|
|
{
|
|
StrCpy(szNameFormat, IK_TITLE_FMT);
|
|
StrCpy(szIconFormat, IK_ICON_FMT);
|
|
}
|
|
else // IS_URL
|
|
{
|
|
StrCpy(szNameFormat, IK_QUICKLINK_NAME);
|
|
StrCpy(szIconFormat, IK_QUICKLINK_ICON);
|
|
}
|
|
|
|
for(int nCount = 1; ; nCount++)
|
|
{
|
|
wnsprintf(szNameKey, countof(szNameKey), szNameFormat, nCount);
|
|
wnsprintf(szIconKey, countof(szIconKey), szIconFormat, nCount);
|
|
|
|
if (GetPrivateProfileString(pcszSection, szNameKey, TEXT(""), szTemp, countof(szTemp), pcszCustIns) != 0)
|
|
{
|
|
if (GetPrivateProfileString(pcszSection, szIconKey, TEXT(""), szTemp, countof(szTemp), pcszCustIns) != 0)
|
|
return TRUE;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|