winamp/Src/Winamp/JSAPI2_SecurityPrompt.cpp

718 lines
20 KiB
C++

#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(&param, 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)&param);
}
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, &centerRect, 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, &centerRect, TRUE))
{
InflateRect(&centerRect, -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;
}