windows-nt/Source/XPSP1/NT/shell/cpls/inetcpl/unixstuff.cpp
2020-09-26 16:20:57 +08:00

463 lines
12 KiB
C++

#ifdef unix
#include <tchar.h>
#include "inetcplp.h"
#include <shsemip.h>
#include <mluisupp.h>
#include <mainwin.h> // _MAX_FNAME
#include <unistd.h>
#define UNIX_EDITOR_ENV TEXT("EDITOR")
#define UNIX_EDITOR_REG TEXT("command")
//
// Private Functions and Structures
//
BOOL ProgramsDlgInit( HWND hDlg);
typedef struct {
HWND hDlg; // dialog windows handle
HWND hwndMail; // Mail dropdown
HWND hwndNews; // News dropdown
HWND hwndCalendar; // Calendar dropdown
HWND hwndContact; // Contact dropdown
HWND hwndCall; // Internet call dropdown
BOOL bAssociationCheck; // Is IE the default browser?
int iMail;
int iNews;
int iCalendar;
int iContact;
int iCall;
BOOL fChanged;
} PROGRAMSPAGE, *LPPROGRAMSPAGE;
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
#ifdef WALLET
typedef int (*PFN_DISPLAYWALLETPAYDIALOG_PROC)(HWND, HINSTANCE, LPTSTR, int);
typedef int (*PFN_DISPLAYWALLETADDRDIALOG_PROC)(HWND, HINSTANCE, LPTSTR, int);
#endif
void FindEditClient(LPTSTR szProtocol, HWND hwndDlg, int nIDDlgItem, LPTSTR szPath)
{
TCHAR szCurrent[MAX_PATH];
TCHAR szMsg[MAX_PATH];
HKEY hkey;
DWORD dw;
HWND hwnd;
// get the name of the new client
if (hwnd = GetDlgItem(hwndDlg, nIDDlgItem))
{
Edit_GetText(hwnd, szCurrent, MAX_PATH);
if (RegCreateKeyEx(HKEY_CURRENT_USER, szPath,
0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &hkey, &dw) == ERROR_SUCCESS)
{
DWORD cb;
cb = (lstrlen(szCurrent)+1)*sizeof(TCHAR);
RegSetValueEx(hkey, REGSTR_PATH_CURRENT, NULL, REG_SZ, (LPBYTE)szCurrent, cb);
// close the keys
RegCloseKey(hkey);
} // if RegCreateKeyEx()
}
} // FindEditClient()
BOOL FoundProgram(HWND hwndDlg, int nIDDlgItem)
{
TCHAR szCurrent[MAX_PATH];
CHAR szCurrentA[MAX_PATH];
TCHAR szMsg[MAX_PATH];
HWND hwnd;
DWORD dwCurChar;
BOOL bPath = FALSE;
// get the name of the new client
if (hwnd = GetDlgItem(hwndDlg, nIDDlgItem))
{
if (!IsWindowEnabled(hwnd))
return TRUE;
Edit_GetText(hwnd, szCurrent, MAX_PATH);
for (dwCurChar = 0; dwCurChar < lstrlen(szCurrent); dwCurChar++)
{
if (szCurrent[dwCurChar] == TEXT('/'))
{
bPath = TRUE;
break;
}
}
if (!bPath) // if it's file name with no path we assume it's in the user's PATH
return TRUE;
#ifdef UNICODE
WideCharToMultiByte(CP_ACP, 0, szCurrent, -1, szCurrentA, MAX_PATH, NULL, NULL);
if (access(szCurrentA, X_OK) == 0)
#else
if (access(szCurrent, X_OK) == 0)
#endif
return TRUE;
}
return FALSE;
} // FoundProgram()
HRESULT ViewScript(TCHAR *lpszPath)
{
HRESULT hr = S_OK;
TCHAR tszPath[MAX_PATH];
TCHAR tszCommand[INTERNET_MAX_URL_LENGTH];
TCHAR tszExpandedCommand[INTERNET_MAX_URL_LENGTH];
UINT nCommandSize;
int i;
HKEY hkey;
DWORD dw;
TCHAR *pchPos;
BOOL bMailed;
STARTUPINFO stInfo;
_tcscpy(tszPath, lpszPath);
hr = RegCreateKeyEx(HKEY_CURRENT_USER, REGSTR_PATH_VSOURCECLIENTS, 0, NULL, 0, KEY_READ, NULL, &hkey, &dw);
if (hr != ERROR_SUCCESS)
goto Cleanup;
dw = INTERNET_MAX_URL_LENGTH;
hr = RegQueryValueEx(hkey, REGSTR_PATH_CURRENT, NULL, NULL, (LPBYTE)tszCommand, &dw);
if (hr != ERROR_SUCCESS)
{
RegCloseKey(hkey);
goto Cleanup;
}
dw = ExpandEnvironmentStrings(tszCommand, tszExpandedCommand, INTERNET_MAX_URL_LENGTH);
if (!dw)
{
_tcscpy(tszExpandedCommand, tszCommand);
}
_tcscat(tszCommand, tszExpandedCommand);
for (i = _tcslen(tszCommand); i > 0; i--)
if (tszCommand[i] == TEXT('/'))
{
tszCommand[i] = TEXT('\0');
break;
}
_tcscat(tszCommand, TEXT(" "));
_tcscat(tszCommand, tszPath);
memset(&stInfo, 0, sizeof(stInfo));
stInfo.cb = sizeof(stInfo);
stInfo.wShowWindow= SW_SHOWNORMAL;
bMailed = CreateProcess(tszExpandedCommand, tszCommand, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &stInfo, NULL);
Cleanup:
return hr;
}
BOOL EditScript(HKEY hkeyProtocol)
{
HKEY hKey;
TCHAR tszCurrent[MAX_PATH];
TCHAR tszScript[MAX_PATH];
DWORD dw;
dw = MAX_PATH;
if (RegQueryValueEx(hkeyProtocol, REGSTR_PATH_CURRENT, NULL, NULL, (LPBYTE)tszCurrent, &dw)
!= ERROR_SUCCESS)
{
return FALSE;
}
ExpandEnvironmentStrings(tszCurrent, tszScript, INTERNET_MAX_URL_LENGTH);
return ViewScript(tszScript);
}
BOOL FindScript(HWND hwndLabel, HKEY hkeyProtocol)
{
TCHAR tszCurrent[2*MAX_PATH + 1 ];
TCHAR tszScript[2*MAX_PATH + 1];
TCHAR tszFilter[5];
DWORD dw;
OPENFILENAME ofn;
dw = MAX_PATH;
if (RegQueryValueEx(hkeyProtocol, REGSTR_PATH_CURRENT, NULL, NULL, (LPBYTE)tszCurrent, &dw)
!= ERROR_SUCCESS)
{
return FALSE;
}
tszCurrent[MAX_PATH] = TEXT('\0');
ExpandEnvironmentStrings(tszCurrent, tszScript, INTERNET_MAX_URL_LENGTH);
_tcscpy(tszCurrent, tszScript);
BOOL bDirFound = FALSE;
int i;
for (i = _tcslen(tszCurrent) - 1; i>=0; i--)
if (tszCurrent[i] == TEXT('/') )
{
tszCurrent[i] = TEXT('\0');
bDirFound = TRUE;
break;
}
if( !bDirFound )
tszCurrent[0] = TEXT('\0');
else
_tcscpy( tszScript, tszCurrent+i+1 );
tszScript[ _MAX_FNAME - 1 ] = TEXT('\0');
memset((void*)&tszFilter, 0, 5 * sizeof(TCHAR));
tszFilter[0] = TEXT('*');
tszFilter[2] = TEXT('*');
memset((void*)&ofn, 0, sizeof(ofn));
ofn.lpstrFilter = tszFilter;
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndLabel;
ofn.lpstrFile = tszScript;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrInitialDir = tszCurrent;
ofn.Flags = OFN_HIDEREADONLY;
if (GetOpenFileName(&ofn))
{
SendMessage(hwndLabel, EM_SETSEL, 0, -1);
SendMessage(hwndLabel, EM_REPLACESEL, 0, (LPARAM)tszScript);
}
return TRUE;
}
#endif
// Function used to determine if the given file exists in the directory
// that the current process is running from
BOOL LocalFileCheck(LPCTSTR aszFileName)
{
// Determinate the base path of the current process binary
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL, szPath, sizeof(szPath)/sizeof(szPath[0]));
// Find the final element separator if there is one
#ifdef UNICODE
LPTSTR szPathName = _tcsrchr(szPath, FILENAME_SEPARATOR_W);
#else
LPTSTR szPathName = _tcsrchr(szPath, FILENAME_SEPARATOR);
#endif
DWORD dwPathLength;
if (szPathName)
{
szPathName[1] = TEXT('\0');
dwPathLength = szPathName-szPath+1;
}
else
{
dwPathLength = _tcslen(szPath)+1;
#ifdef UNICODE
_tcsncat(szPath, FILENAME_SEPARATOR_STR_W, sizeof(szPath)/
#else
_tcsncat(szPath, FILENAME_SEPARATOR_STR, sizeof(szPath)/
#endif
sizeof(szPath[0])-dwPathLength);
}
// Append the target file name to the base path (make sure
// the new string can't overflow the buffer)
_tcsncat(szPath, aszFileName, sizeof(szPath)/sizeof(szPath[0])-
dwPathLength-1);
// Look for the given file without trying to open it
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile(szPath, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
return TRUE;
}
else
{
FindClose(hFind);
return(FALSE);
}
}
UINT RegPopulateEditText(HWND hwndCB, HKEY hkeyProtocol)
{
TCHAR szCurrent [MAX_PATH];
TCHAR szExpanded [MAX_PATH];
FILETIME ftLastWriteTime;
DWORD cb;
cb = sizeof(szCurrent);
if (RegQueryValueEx(hkeyProtocol, REGSTR_PATH_CURRENT, NULL, NULL, (LPBYTE)szCurrent, &cb)
!= ERROR_SUCCESS)
{
szCurrent[0]=TEXT('\0');
}
ExpandEnvironmentStrings(szCurrent, szExpanded, MAX_PATH);
SendMessage(hwndCB, EM_REPLACESEL, (WPARAM) 0, (LPARAM) szExpanded);
return 0;
} // RegPopulateEditText()
static const CHAR szCacheLockStatus[] = "unixGetWininetCacheLockStatus";
static const TCHAR szCacheLockStatusDll[] = TEXT("WININET.DLL");
typedef void (WINAPI *LPCACHELOCKSTATUS)(BOOL *pBoolReadOnly, TCHAR **ppszLockingHost);
BOOL IsCacheReadOnly()
{
HINSTANCE hCacheLockStatusDll = NULL;
LPCACHELOCKSTATUS fnCacheLockStatus;
BOOL bReadOnlyCacheLockStatus;
hCacheLockStatusDll = LoadLibrary(szCacheLockStatusDll);
if (hCacheLockStatusDll)
{
fnCacheLockStatus = (LPCACHELOCKSTATUS)GetProcAddress(hCacheLockStatusDll, szCacheLockStatus);
FreeLibrary(hCacheLockStatusDll);
}
if (fnCacheLockStatus)
fnCacheLockStatus(&bReadOnlyCacheLockStatus, NULL);
return bReadOnlyCacheLockStatus;
}
BOOL CALLBACK FontUpdDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hProg = GetDlgItem(hDlg, IDC_FONTUPD_PROG);
UINT nTimer = 1;
switch (uMsg)
{
case WM_INITDIALOG:
HCURSOR hOldCursor = NULL;
HCURSOR hNewCursor = NULL;
hNewCursor = LoadCursor(NULL, IDC_WAIT);
if (hNewCursor)
hOldCursor = SetCursor(hNewCursor);
SendMessage(hProg, PBM_SETRANGE, 0, MAKELPARAM(0, FONT_UPDATE_TICK));
SendMessage(hProg, PBM_SETSTEP, 1, 0);
SetTimer(hDlg, nTimer, 600, NULL);
break;
case WM_TIMER:
KillTimer(hDlg, nTimer);
MwFontCacheUpdate(TRUE, FontUpdateFeedBack, FONT_UPDATE_TICK, (void*)hDlg);
break;
case WM_CLOSE:
EndDialog(hDlg, 0);
case PBM_SETRANGE:
SendMessage(hProg, PBM_SETRANGE, wParam, lParam);
break;
case PBM_SETSTEP:
SendMessage(hProg, PBM_SETSTEP, wParam, lParam);
break;
case PBM_STEPIT:
SendMessage(hProg, PBM_STEPIT, wParam, lParam);
break;
default:
return FALSE;
}
return TRUE;
}
void FontUpdateFeedBack(int nTick, void *pvParam)
{
HWND hDlg = (HWND)pvParam;
MSG msg;
int iMsg = 0;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) && iMsg++ < 20)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (hDlg)
SendMessage(hDlg, PBM_STEPIT, 0, 0);
if (nTick == FONT_UPDATE_TICK - 1)
SendMessage(hDlg, WM_CLOSE, 0, 0);
}
VOID DrawXFontButton(HWND hDlg, LPDRAWITEMSTRUCT lpdis)
{
SIZE thin = { GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER) };
RECT rc = lpdis->rcItem;
HDC hdc = lpdis->hDC;
BOOL bFocus = ((lpdis->itemState & ODS_FOCUS) && !(lpdis->itemState & ODS_DISABLED));
if (!thin.cx) thin.cx = 1;
if (!thin.cy) thin.cy = 1;
FillRect(hdc, &rc, GetSysColorBrush(COLOR_3DFACE));
//Draw Icon
HICON hXFIcon;
if (hXFIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_FONT)))
{
DrawIcon(hdc, (rc.right + rc.left) / 2 - 8, (rc.top + rc.bottom / 2) / 2 - 8, hXFIcon);
}
// Draw any caption
TCHAR szCaption[80];
int cyText = (rc.bottom + rc.top)/2;
if (GetWindowText(lpdis->hwndItem, szCaption, ARRAYSIZE(szCaption)))
{
COLORREF crText;
RECT rcText = rc;
rcText.top = cyText;
int nOldMode = SetBkMode(hdc, TRANSPARENT);
if (lpdis->itemState & ODS_DISABLED)
{
// Draw disabled text using the embossed look
crText = SetTextColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT));
RECT rcOffset = rcText;
OffsetRect(&rcOffset, 1, 1);
DrawText(hdc, szCaption, -1, &rcOffset, DT_VCENTER|DT_SINGLELINE);
SetTextColor(hdc, GetSysColor(COLOR_BTNSHADOW));
}
else
{
crText = SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
}
DrawText(hdc, szCaption, -1, &rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
SetTextColor(hdc, crText);
SetBkMode(hdc, nOldMode);
}
// Draw the button portion
if (lpdis->itemState & ODS_SELECTED)
{
DrawEdge(hdc, &rc, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
OffsetRect(&rc, 1, 1);
}
else
{
DrawEdge(hdc, &rc, EDGE_RAISED, BF_RECT | BF_ADJUST);
}
if (bFocus)
{
InflateRect(&rc, -thin.cx, -thin.cy);
DrawFocusRect(hdc, &rc);
InflateRect(&rc, thin.cx, thin.cy);
}
}