|
|
#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); } }
|