windows-nt/Source/XPSP1/NT/net/tapi/skywalker/inc/scrpscrtdlg.h

334 lines
7.1 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
// DlgAddr.h : Declaration of the CScriptSecurityDialog
#ifndef __SCRIPTSECURITYDIALOG_H_
#define __SCRIPTSECURITYDIALOG_H_
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CScriptSecurityDialog
//
// this class is not thread safe
//
class CScriptSecurityDialog :
public CDialogImpl<CScriptSecurityDialog>
{
public:
CScriptSecurityDialog ()
:m_hModule(NULL),
m_psMessageText(NULL)
{
//
// the resource module is used to load the string and the dialog itself
// so keep it around as a data member
//
m_hModule = ::LoadLibrary(_T("tapiui.dll"));
}
~CScriptSecurityDialog ()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
m_hModule = NULL;
}
}
INT_PTR DoModalWithText(UINT uResourceID, HWND hWndParent = ::GetActiveWindow())
{
//
// this assertion could fail is if the class is used from
// a multithreaded app, and domodalX is called on two different threads
// the class is not thread safe and this should be caught during
// testing.
// another way this assert could fire is if the class itself is
// broken. this, too, is a test-time error.
//
_ASSERTE(NULL == m_psMessageText);
//
// load string from resource module
//
m_psMessageText = SafeLoadString(uResourceID);
//
// if failed, bail out now
//
if (NULL == m_psMessageText)
{
return -1;
}
//
// attempt to display the dialog box
// the string is used in OnInitDialog to set the dialog's text
//
INT_PTR rc = _DoModal(hWndParent);
//
// deallocate string
//
delete m_psMessageText;
m_psMessageText = NULL;
return rc;
}
INT_PTR DoModalWithText(LPTSTR psMessageText, HWND hWndParent = ::GetActiveWindow())
{
//
// this assertion could fail is if the class is used from
// a multithreaded app, and domodalX is called on two different threads
// the class is not thread safe and this should be caught during
// testing.
// another way this assert could fire is if the class itself is
// broken. this, too, is a test-time error.
//
_ASSERTE(NULL == m_psMessageText);
//
// the dialog is modal, so the lifetime of psMessageText is guaranteed
// to exceed the lifetime of the dialog.
//
m_psMessageText = psMessageText;
//
// attempt to display the dialog. the string will be used to set
// the message text in OnInitDialog
//
INT_PTR rc = _DoModal(hWndParent);
//
// no longer need the string + the string cannot be assumed
// valid after we return
//
m_psMessageText = NULL;
return rc;
}
enum { IDD = IDD_TAPI_SECURITY_DIALOG };
public:
BEGIN_MSG_MAP(CScriptSecurityDialog)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(ID_YES, OnYes)
COMMAND_ID_HANDLER(ID_NO, OnNo)
END_MSG_MAP()
//
// Attributes
//
private:
//
// the module where the resource is contained
// needed for the prompt string and for the dialog itself
//
HINSTANCE m_hModule;
//
// the prompt text
//
LPTSTR m_psMessageText;
protected:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//
// m_psMessageText must be set before _DoModal is called
// if m_psMessageText is null here, the error is in the class itself
// and this should be detected during testing
//
_ASSERTE(NULL != m_psMessageText);
//
// display the text that was passed into DoModalWithText as a string
// or a resources
//
SetDlgItemText(IDC_SECURITY_WARNING_TEXT, m_psMessageText);
return TRUE;
}
LRESULT OnYes(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
//
// see if do not ask in the future is set
//
if (IsDlgButtonChecked(IDC_DONOT_PROMPT_IN_THE_FUTURE))
wID = ID_YES_DONT_ASK_AGAIN;
EndDialog(wID);
return FALSE;
}
LRESULT OnNo(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
EndDialog(wID);
return FALSE;
}
private:
INT_PTR _DoModal(HWND hWndParent)
{
//
// if the resource dll failed to load, bail out
//
if (NULL == m_hModule)
{
return -1;
}
//
// otherwise, attempt to display the dialog box
//
_ASSERTE(m_hWnd == NULL);
_Module.AddCreateWndData(&m_thunk.cd, (CDialogImplBase*)this);
INT_PTR nRet = ::DialogBoxParam(m_hModule,
MAKEINTRESOURCE(CScriptSecurityDialog::IDD),
hWndParent,
(DLGPROC)CScriptSecurityDialog::StartDialogProc,
NULL);
m_hWnd = NULL;
return nRet;
}
private:
//
// Load string for this resource. Safe with respect to string size
//
TCHAR *SafeLoadString( UINT uResourceID )
{
TCHAR *pszTempString = NULL;
int nCurrentSizeInChars = 128;
int nCharsCopied = 0;
do
{
if ( NULL != pszTempString )
{
delete pszTempString;
pszTempString = NULL;
}
nCurrentSizeInChars *= 2;
pszTempString = new TCHAR[ nCurrentSizeInChars ];
if (NULL == pszTempString)
{
return NULL;
}
nCharsCopied = ::LoadString( m_hModule,
uResourceID,
pszTempString,
nCurrentSizeInChars
);
if ( 0 == nCharsCopied )
{
delete pszTempString;
return NULL;
}
//
// nCharsCopied does not include the null terminator
// so compare it to the size of the buffer - 1
// if the buffer was filled completely, retry with a bigger buffer
//
} while ( (nCharsCopied >= (nCurrentSizeInChars - 1) ) );
return pszTempString;
}
//
// private, not to be called. the dialog must be created with DoModalWithText
//
HWND Create(HWND hWndParent, LPCTSTR psMessageText = NULL)
{
// this dialog must be created as modal
_ASSERTE(FALSE);
return NULL;
}
//
// private, not to be called. the dialog must be created with DoModalWithText
//
INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow())
{
_ASSERTE(FALSE);
return -1;
}
};
#endif //__SCRIPTSECURITYDIALOG_H_