diff options
Diffstat (limited to 'Src/Winamp/JSAPI2_SecurityPrompt.cpp')
-rw-r--r-- | Src/Winamp/JSAPI2_SecurityPrompt.cpp | 718 |
1 files changed, 718 insertions, 0 deletions
diff --git a/Src/Winamp/JSAPI2_SecurityPrompt.cpp b/Src/Winamp/JSAPI2_SecurityPrompt.cpp new file mode 100644 index 00000000..cf16e013 --- /dev/null +++ b/Src/Winamp/JSAPI2_SecurityPrompt.cpp @@ -0,0 +1,718 @@ +#include "main.h" +#include "./resource.h" +#include "./api.h" +#include "./language.h" +#include "./jsapi2_svc_apicreator.h" +#include "./commandLink.h" + + +#include <strsafe.h> + + +#ifndef LONGX86 +#ifdef _WIN64 + #define LONGX86 LONG_PTR +#else /*_WIN64*/ + #define LONGX86 LONG +#endif /*_WIN64*/ +#endif // LONGX86 + +#ifdef WIN64 + #define MSGRESULT(__hwnd, __result) { SetWindowLongPtrW((__hwnd), DWLP_MSGRESULT, ((LONGX86)(LONG_PTR)(__result))); return TRUE; } +#else + #define MSGRESULT(__hwnd, __result) { SetWindowLongPtrW((__hwnd), DWL_MSGRESULT, ((LONGX86)(LONG_PTR)(__result))); return TRUE; } +#endif + +#ifdef __cplusplus + #define SENDMSG(__hwnd, __msgId, __wParam, __lParam) ::SendMessageW((__hwnd), (__msgId), (__wParam), (__lParam)) +#else + #define SENDMSG(__hwnd, __msgId, __wParam, __lParam) SendMessageW((__hwnd), (__msgId), (__wParam), (__lParam)) +#endif // __cplusplus + +#define SENDWAIPC(__ipcMsgId, __param) SENDMSG(hMainWindow, WM_WA_IPC, (WPARAM)(__param), (LPARAM)(__ipcMsgId)) + + +#ifndef OIC_WARNING +#define OIC_WARNING 32515 +#endif + +#define SECDLG_PROP L"SecurityPromptProp" + +#ifndef IDC_HELPLINK +#define IDC_HELPLINK 10000 +#endif + +typedef struct __SECDLGCREATEPARAM +{ + HWND hCenter; + LPCWSTR pszCaption; + LPCWSTR pszTitle; + LPCWSTR pszMessage; + UINT flags; +} SECDLGCREATEPARAM; + +typedef struct __SECDLG +{ + HFONT titleFont; + SIZE minSize; + SIZE maxSize; +} SECDLG; + +#define GetDialog(__hwnd) ((SECDLG*)GetPropW((__hwnd), SECDLG_PROP)) + +static INT_PTR CALLBACK SecurityPrompt_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + + +static HWND SecurityPrompt_GetPlayerWindow() +{ + return (NULL != g_dialog_box_parent) ? g_dialog_box_parent : hMainWindow; +} + +INT_PTR JSAPI2_SecurityPrompt(HWND hParent, LPCWSTR pszCaption, LPCWSTR pszTitle, LPCWSTR pszMessage, UINT flags) +{ + SECDLGCREATEPARAM param; + ZeroMemory(¶m, sizeof(SECDLGCREATEPARAM)); + param.hCenter = hParent; + param.flags = flags; + param.pszCaption = pszCaption; + param.pszTitle = pszTitle; + param.pszMessage = pszMessage; + + + if (NULL == hParent) + hParent = SecurityPrompt_GetPlayerWindow(); + + return LPDialogBoxParamW(IDD_JSAPI2_AUTHORIZATION2, hParent, SecurityPrompt_DialogProc, (LPARAM)¶m); +} + +static BOOL SecurityPrompt_GetCenterRect(HWND hCenter, RECT *centerRect, BOOL fUseMonitor) +{ + if (NULL == centerRect) + return FALSE; + + HWND hDesktop = GetDesktopWindow(); + HWND hTest = hCenter; + while(NULL != hTest) + { + DWORD windowStyle = GetWindowLongPtrW(hTest, GWL_STYLE); + if (WS_VISIBLE != ((WS_VISIBLE | WS_MINIMIZE) & windowStyle)) + { + hTest = NULL; + hCenter = NULL; + } + else + { + hTest = GetParent(hTest); + } + } + + if (FALSE != fUseMonitor || NULL == hCenter || !GetWindowRect(hCenter, centerRect)) + { + MONITORINFO mi; + mi.cbSize = sizeof(MONITORINFO); + if (NULL == hCenter) + { + hCenter = SecurityPrompt_GetPlayerWindow(); + if (NULL != hCenter) + { + DWORD windowStyle = GetWindowLongPtrW(hCenter, GWL_STYLE); + if (WS_VISIBLE != ((WS_VISIBLE | WS_MINIMIZE) & windowStyle)) + hCenter = NULL; + } + } + + HMONITOR hMonitor = MonitorFromWindow(hCenter, + (NULL != hCenter) ? MONITOR_DEFAULTTONEAREST : MONITOR_DEFAULTTOPRIMARY); + + + if (NULL != hMonitor && GetMonitorInfo(hMonitor, &mi)) + { + CopyRect(centerRect, &mi.rcWork); + } + else + { + if (NULL == hDesktop || !GetWindowRect(hDesktop, centerRect)) + return FALSE; + } + } + + return TRUE; +} + +static void SecurityPrompt_CenterDialog(HWND hwnd, HWND hCenter) +{ + if (NULL == hwnd) + return; + + RECT centerRect, windowRect; + if (!GetWindowRect(hwnd, &windowRect) || + !SecurityPrompt_GetCenterRect(hCenter, ¢erRect, FALSE)) + { + return; + } + + windowRect.left = centerRect.left + ((centerRect.right - centerRect.left) - (windowRect.right - windowRect.left))/2; + windowRect.top = centerRect.top + ((centerRect.bottom - centerRect.top) - (windowRect.bottom - windowRect.top))/2; + + SetWindowPos(hwnd, NULL, windowRect.left, windowRect.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); +} + +static void SecurityPrompt_CalculateMinMax(HWND hwnd, HWND hCenter) +{ + SECDLG *psd = GetDialog(hwnd); + if (NULL == hwnd || NULL == psd) return; + + RECT centerRect, windowRect; + if (GetWindowRect(hwnd, &windowRect)) + { + psd->minSize.cx = windowRect.right - windowRect.left; + psd->minSize.cy = windowRect.bottom - windowRect.top; + } + if (SecurityPrompt_GetCenterRect(hCenter, ¢erRect, TRUE)) + { + InflateRect(¢erRect, -16, -16); + psd->maxSize.cx = centerRect.right - centerRect.left; + psd->maxSize.cy = centerRect.bottom - centerRect.top; + + if (psd->maxSize.cx > 360) + psd->maxSize.cx = 360; + } +} + +static void SecurityPrompt_LoadIcon(HWND hwnd, HINSTANCE hInstance, LPCWSTR pszIcon) +{ + HWND hControl = GetDlgItem(hwnd, IDC_MESSAGEICON); + if (NULL == hControl) return; + + SendMessageW(hControl, WM_SETREDRAW, FALSE, 0L); + + HICON hIcon = (HICON)LoadImageW(hInstance, pszIcon, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_SHARED | LR_DEFAULTSIZE); + + HICON hPrevious = (HICON)SendMessageW(hControl, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); + if (NULL != hPrevious) + DeleteObject(hPrevious); + + if (NULL != hIcon) + { + hPrevious = (HICON)SendMessageW(hControl, STM_GETIMAGE, IMAGE_ICON, 0L); + if (hPrevious != hIcon) + DeleteObject(hIcon); + } + + SendMessageW(hControl, WM_SETREDRAW, TRUE, 0L); + + if (0 != ShowWindow(hControl, (NULL != hIcon) ? SW_SHOWNA : SW_HIDE)) + InvalidateRect(hControl, NULL, TRUE); + +} +static BOOL SecurityPrompt_GetWindowTextSize(HWND hwnd, SIZE *pSize, BOOL fMultiline, LONG lineWidth) +{ + if (NULL == pSize) return FALSE; + + INT cchLen = GetWindowTextLengthW(hwnd); + if (0 == cchLen) + { + ZeroMemory(pSize, sizeof(SIZE)); + return TRUE; + } + cchLen++; + LPWSTR pszText = NULL; + WCHAR szBuffer[1024] = {0}; + if (cchLen > ARRAYSIZE(szBuffer)) + { + pszText = (LPWSTR)calloc(cchLen, sizeof(WCHAR)); + if (NULL == pszText) return FALSE; + } + else + { + pszText = szBuffer; + cchLen = ARRAYSIZE(szBuffer); + } + + BOOL resultOk = FALSE; + cchLen = GetWindowTextW(hwnd, pszText, cchLen); + if (0 != cchLen) + { + HDC hdc = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_NORESETATTRS); + if (NULL != hdc) + { + HFONT hf = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); + HFONT originalFont = (HFONT)SelectObject(hdc, hf); + + if (FALSE == fMultiline) + { + resultOk = GetTextExtentPoint32W(hdc, pszText, cchLen, pSize); + } + else + { + RECT textRect; + SetRect(&textRect, 0, 0, lineWidth, 0); + INT h = DrawTextW(hdc, pszText, cchLen, &textRect, DT_CALCRECT | DT_NOPREFIX | DT_NOCLIP | DT_WORDBREAK); + resultOk = (0 != h); + if (resultOk) + { + pSize->cx = textRect.right - textRect.left; + pSize->cy = textRect.bottom - textRect.top; + } + + } + + SelectObject(hdc, originalFont); + ReleaseDC(hwnd, hdc); + } + } + + + if (pszText != szBuffer) + free(pszText); + + return resultOk; +} + +static LONG SecurityPrompt_CalculateFooterHeight(HWND hwnd, LONG marginCY) +{ + RECT rect; + HWND hControl; + + + LONG height = 0; + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_ALLOW)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + height += (rect.bottom - rect.top); + } + + + if (0 == height && + NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + height += (rect.bottom - rect.top); + } + + INT szCtrl[] = {IDC_APPLYTOALL, IDC_SEPARATOR, IDC_HELPTEXT, }; + for (INT i = 0; i < ARRAYSIZE(szCtrl); i++) + { + if (NULL != (hControl = GetDlgItem(hwnd, szCtrl[i])) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + LONG h = (rect.bottom - rect.top); + if (h > 0) + { + if (height > 0) height += marginCY; + height += h; + } + } + } + + if (0 != height) + height += 2*marginCY; + + return height; +} + +static void SecurityPrompt_UpdateLayout(HWND hwnd, BOOL fRedraw) +{ + SECDLG *psd = GetDialog(hwnd); + if (NULL == hwnd || NULL == psd) return; + + HWND hControl; + RECT rect; + LONG marginCX, marginCY; + SIZE clientSize, iconSize, titleSize, messageSize; + ZeroMemory(&clientSize, sizeof(SIZE)); + + SetRect(&rect, 6, 6, 6, 6); + if (MapDialogRect(hwnd, &rect)) + { + marginCX = rect.left; + marginCY = rect.top; + } + else + { + marginCX = 12; + marginCY = 12; + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGEICON)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2); + iconSize.cx = rect.right - rect.left; + iconSize.cy = rect.bottom - rect.top; + } + else + { + ZeroMemory(&iconSize, sizeof(SIZE)); + } + + if (NULL == (hControl = GetDlgItem(hwnd, IDC_TITLE)) || + 0 == (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) || + FALSE == SecurityPrompt_GetWindowTextSize(hControl, &titleSize, FALSE, 0)) + { + ZeroMemory(&titleSize, sizeof(SIZE)); + } + + if (NULL == (hControl = GetDlgItem(hwnd, IDC_MESSAGE)) || + 0 == (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) || + FALSE == SecurityPrompt_GetWindowTextSize(hControl, &messageSize, TRUE, psd->maxSize.cx - (iconSize.cx + marginCX * 3))) + { + ZeroMemory(&messageSize, sizeof(SIZE)); + } + + clientSize.cx = iconSize.cx; + if (messageSize.cx > 0) + { + clientSize.cx += messageSize.cx; + if (iconSize.cx > 0) clientSize.cx += marginCX; + } + if (titleSize.cx > clientSize.cx) + titleSize.cx = clientSize.cx; + clientSize.cx += 2*marginCX; + + clientSize.cy = titleSize.cy; + + LONG h1 = messageSize.cy; + if (h1 > 0) h1 += 2 * marginCY; + + LONG h2 = iconSize.cy; + if (h2 > 0) h2 += marginCY; + + clientSize.cy += (h1 > h2) ? h1 : h2; + if (clientSize.cy > 0) + { + if (clientSize.cy != titleSize.cy && 0 != titleSize.cy) + clientSize.cy += marginCY; + } + clientSize.cy += SecurityPrompt_CalculateFooterHeight(hwnd, marginCY); + + + DWORD windowStyle = GetWindowLongPtrW(hwnd, GWL_STYLE); + DWORD windowExStyle = GetWindowLongPtrW(hwnd, GWL_EXSTYLE); + + SetRect(&rect, 0, 0, clientSize.cx, clientSize.cy); + if (AdjustWindowRectEx(&rect, windowStyle, FALSE, windowExStyle)) + { + clientSize.cx = rect.right - rect.left; + clientSize.cy = rect.bottom - rect.top; + } + if (clientSize.cx < psd->minSize.cx) clientSize.cx = psd->minSize.cx; + if (clientSize.cy < psd->minSize.cy) clientSize.cy = psd->minSize.cy; + + + SetWindowPos(hwnd, NULL, 0, 0, clientSize.cx, clientSize.cy, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); + + RECT clientRect; + if (!GetClientRect(hwnd, &clientRect)) + SetRectEmpty(&clientRect); + else + InflateRect(&clientRect, -marginCX, -marginCY); + + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_TITLE))) + { + SetWindowPos(hControl, NULL, clientRect.left, clientRect.top, clientRect.right - clientRect.left, titleSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGEICON))) + { + LONG y = clientRect.top; + if (titleSize.cy > 0) y += (titleSize.cy + marginCY); + SetWindowPos(hControl, NULL, clientRect.left, y, iconSize.cx, iconSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGE))) + { + LONG x = clientRect.left; + if (iconSize.cx > 0) x += (iconSize.cx + marginCX); + LONG y = clientRect.top; + if (titleSize.cy > 0) y += (titleSize.cy + marginCY); + SetWindowPos(hControl, NULL, x, y, clientRect.right - x, messageSize.cy, SWP_NOZORDER | SWP_NOACTIVATE); + } + + + HWND hHelp; + hHelp = GetDlgItem(hwnd, IDC_HELPTEXT); + if (NULL == hHelp || !GetWindowRect(hHelp, &rect)) + SetRectEmpty(&rect); + else + MapWindowPoints(HWND_DESKTOP, hwnd, (POINT*)&rect, 2); + + SIZE linkSize; + LONG bottomLine = clientRect.bottom; + if (NULL != (hControl = GetDlgItem(hwnd, IDC_HELPLINK)) && + CommandLink_GetIdealSize(hControl, &linkSize)) + { + RECT margins; + + if (!CommandLink_GetMargins(hControl, &margins)) + SetRectEmpty(&margins); + + if (linkSize.cy > 0) + { + bottomLine -= (linkSize.cy - margins.bottom); + } + + SetWindowPos(hControl, NULL, clientRect.left - margins.left, bottomLine, linkSize.cx, linkSize.cy, SWP_NOACTIVATE | SWP_NOZORDER); + if (NULL != hHelp) + { + LONG x = clientRect.left + linkSize.cx - margins.right; + LONG cy = rect.bottom - rect.top; + SetWindowPos(hHelp, NULL, x, clientRect.bottom - cy, clientRect.right - x, cy, SWP_NOZORDER | SWP_NOACTIVATE); + } + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_SEPARATOR)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + bottomLine -= (marginCY + (rect.bottom - rect.top)); + SetWindowPos(hControl, NULL, 0, bottomLine, clientRect.right - clientRect.left + 2*marginCX + 2, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_APPLYTOALL)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + bottomLine -= (marginCY + (rect.bottom - rect.top)); + SetWindowPos(hControl, NULL, clientRect.left, bottomLine, clientRect.right - clientRect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); + } + + LONG buttonRight = clientRect.right; + if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + + SetWindowPos(hControl, NULL, buttonRight - (rect.right - rect.left), bottomLine - (marginCY + (rect.bottom - rect.top)), + rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); + if (rect.right > rect.left) + { + buttonRight -= ((rect.right - rect.left) + marginCX); + } + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_ALLOW)) && + 0 != (WS_VISIBLE & GetWindowLongPtrW(hControl, GWL_STYLE)) && + GetWindowRect(hControl, &rect)) + { + SetWindowPos(hControl, NULL, buttonRight - (rect.right - rect.left), bottomLine - (marginCY + (rect.bottom - rect.top)), + rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE); + } +} + +static HFONT SecurityPrompt_GetTitleFont(HWND hwnd) +{ + SECDLG *psd = GetDialog(hwnd); + if (NULL == psd) + return (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); + + if (NULL != psd->titleFont) + return psd->titleFont; + + + LOGFONTW lf; + ZeroMemory(&lf, sizeof(LOGFONTW)); + + HFONT hf = (HFONT)SendMessageW(hwnd, WM_GETFONT, 0, 0L); + + if (NULL != hf) + GetObjectW(hf, sizeof(LOGFONTW), &lf); + + if (L'\0' == lf.lfFaceName[0]) + { + if (!SystemParametersInfoW(SPI_GETICONTITLELOGFONT, sizeof(LOGFONTW), &lf, 0) || + FAILED(StringCchCopyW(lf.lfFaceName, ARRAYSIZE(lf.lfFaceName), L"MS Shell Dlg 2"))) + { + lf.lfFaceName[0] = L'\0'; + } + } + + if (L'\0' != lf.lfFaceName[0]) + { + lf.lfWeight = FW_SEMIBOLD; + psd->titleFont = CreateFontIndirectW(&lf); + } + + return psd->titleFont; +} + +static BOOL SecurityPrompt_ShowHelp(HWND hwnd) +{ + INT result = (INT)(INT_PTR)ShellExecuteW(hwnd, L"open", + L"https://help.winamp.com/hc/articles/8112753225364-Online-Services-Security", + NULL, NULL, SW_SHOWNORMAL); + return (result > 32); +} + +static INT_PTR SecurityPrompt_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM param) +{ + SECDLGCREATEPARAM *createParam = (SECDLGCREATEPARAM*)param; + if (NULL == createParam) return 0; + + SECDLG *psd = (SECDLG*)calloc(1, sizeof(SECDLG)); + if (NULL != psd) + { + if (!SetPropW(hwnd, SECDLG_PROP, psd)) + { + free(psd); + psd = NULL; + } + } + + HMENU hMenu = GetSystemMenu(hwnd, FALSE); + if (NULL != hMenu) + { + EnableMenuItem(hMenu, SC_CLOSE, MF_BYCOMMAND|MF_DISABLED); + DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND); + DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND); + } + + + SecurityPrompt_LoadIcon(hwnd, NULL, MAKEINTRESOURCEW(OIC_WARNING)); + + WCHAR szBuffer[4096] = {0}; + LPCWSTR pszText; + HWND hControl; + + SecurityPrompt_CalculateMinMax(hwnd, createParam->hCenter); + + if (NULL != (pszText = createParam->pszCaption) && IS_INTRESOURCE(pszText)) + pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); + + if (NULL != pszText && L'\0' != *pszText) + SetWindowTextW(hwnd, pszText); + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_TITLE))) + { + if (NULL != (pszText = createParam->pszTitle) && IS_INTRESOURCE(pszText)) + pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); + + HFONT hf = SecurityPrompt_GetTitleFont(hwnd); + if (NULL != hf) SendMessageW(hControl, WM_SETFONT, (WPARAM)hf, 0L); + + SetWindowTextW(hControl, pszText); + ShowWindow(hControl, (NULL != pszText && L'\0' != *pszText) ? SW_SHOWNA : SW_HIDE); + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_MESSAGE))) + { + if (NULL != (pszText = createParam->pszMessage) && IS_INTRESOURCE(pszText)) + pszText = getStringW((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer)); + SetWindowTextW(hControl, pszText); + ShowWindow(hControl, (NULL != pszText && L'\0' != *pszText) ? SW_SHOWNA : SW_HIDE); + } + + getStringW(IDS_CLICKHERE, szBuffer, ARRAYSIZE(szBuffer)); + + HWND hLink = CreateWindowExW(WS_EX_NOPARENTNOTIFY, NWC_COMMANDLINKW, szBuffer, + WS_VISIBLE | WS_CHILD | WS_TABSTOP | /*CLS_HOTTRACK | */CLS_DEFAULTCOLORS | CLS_ALWAYSUNDERLINE, + 0, 0, 0, 0, hwnd, (HMENU)IDC_HELPLINK, hMainInstance, NULL); + + if (NULL != hLink) + { + if (NULL != (hControl = GetDlgItem(hwnd, IDC_APPLYTOALL))) + SetWindowPos(hLink, hControl, 0, 0, 0, 0, SWP_NOACTIVATE |SWP_NOSIZE | SWP_NOMOVE); + + SendMessageW(hLink, WM_SETFONT, (WPARAM)SendMessageW(hwnd, WM_GETFONT, 0, 0L), 0L); + } + + CheckDlgButton(hwnd, IDC_APPLYTOALL, + (0 != (JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS_FOR_SERVICE &createParam->flags)) ? + BST_CHECKED : BST_UNCHECKED); + + SecurityPrompt_UpdateLayout(hwnd, FALSE); + + SecurityPrompt_CenterDialog(hwnd, createParam->hCenter); + SendMessageW(hwnd, DM_REPOSITION, 0, 0L); + + DWORD dialogThread = GetWindowThreadProcessId(hwnd, NULL); + DWORD parentThread = GetWindowThreadProcessId(GetParent(hwnd), NULL); + if (dialogThread != parentThread) + { + AttachThreadInput(parentThread, dialogThread, TRUE); + SetForegroundWindow(hwnd); + } + + if (NULL != (hControl = GetDlgItem(hwnd, IDC_BUTTON_DENY)) && + WS_VISIBLE == ((WS_VISIBLE | WS_DISABLED) & GetWindowLongPtrW(hControl, GWL_STYLE)) && + PostMessageW(hwnd, WM_NEXTDLGCTL, (WPARAM)hControl, TRUE)) + { + return TRUE; + } + + return FALSE; +} + +static void SecurityPrompt_OnDestroy(HWND hwnd) +{ + SECDLG *psd = GetDialog(hwnd); + RemovePropW(hwnd, SECDLG_PROP); + + DWORD dialogThread = GetWindowThreadProcessId(hwnd, NULL); + DWORD parentThread = GetWindowThreadProcessId(GetParent(hwnd), NULL); + if (dialogThread != parentThread) + { + AttachThreadInput(parentThread, dialogThread, FALSE); + } + + if (NULL == psd) return; + + if (NULL != psd->titleFont) + DeleteObject(psd->titleFont); + + free(psd); +} + +static void SecurityPrompt_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl) +{ + switch(commandId) + { + case IDC_BUTTON_ALLOW: + case IDC_BUTTON_DENY: + if(BN_CLICKED == eventId) + { + INT_PTR result = (IDC_BUTTON_ALLOW == commandId) ? + JSAPI2::svc_apicreator::AUTHORIZATION_ALLOW : + JSAPI2::svc_apicreator::AUTHORIZATION_DENY; + + result |= (BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_APPLYTOALL)) ? + JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS_FOR_SERVICE : + JSAPI2::svc_apicreator::AUTHORIZATION_FLAG_ALWAYS; + + EndDialog(hwnd, result); + } + break; + } +} + +static LRESULT SecurityPrompt_OnNotify(HWND hwnd, INT controlId, NMHDR *pnmh) +{ + switch(controlId) + { + case IDC_HELPLINK: + if (NM_CLICK == pnmh->code) + SecurityPrompt_ShowHelp(hwnd); + return TRUE; + } + return 0; +} +static INT_PTR CALLBACK SecurityPrompt_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG: return SecurityPrompt_OnInitDialog(hwnd, (HWND)wParam, lParam); + case WM_DESTROY: SecurityPrompt_OnDestroy(hwnd); break; + case WM_COMMAND: SecurityPrompt_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; + case WM_NOTIFY: MSGRESULT(hwnd, SecurityPrompt_OnNotify(hwnd, (INT)wParam, (NMHDR*)lParam)); + + } + + + return 0; +}
\ No newline at end of file |