Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

507 lines
13 KiB

#include "stdafx.h"
#include "T30PropSheetExt.h"
#include "T30Config.h"
#include <t30ext.h>
#include <faxutil.h>
#include <faxreg.h>
#include <faxres.h>
#include <faxuiconstants.h>
/////////////////////////////////////////////////////////////////////////////
// CT30ConfigComponentData
static const GUID CT30ConfigExtGUID_NODETYPE = FAXSRV_DEVICE_NODETYPE_GUID;
//{ 0x3115a19a, 0x6251, 0x46ac, { 0x94, 0x25, 0x14, 0x78, 0x28, 0x58, 0xb8, 0xc9 } };
const GUID* CT30ConfigExtData::m_NODETYPE = &CT30ConfigExtGUID_NODETYPE;
const OLECHAR* CT30ConfigExtData::m_SZNODETYPE = FAXSRV_DEVICE_NODETYPE_GUID_STR;
//OLESTR("3115A19A-6251-46ac-9425-14782858B8C9");
const OLECHAR* CT30ConfigExtData::m_SZDISPLAY_NAME = OLESTR("T30Config");
const CLSID* CT30ConfigExtData::m_SNAPIN_CLASSID = &CLSID_T30Config;
void DisplayRpcErrorMessage(DWORD ec, HWND hWnd);
void DisplayErrorMessage(UINT uMsgId, HWND hWnd, BOOL bCommon = FALSE);
HRESULT GetDWORDFromDataObject(
IDataObject * lpDataObject,
CLIPFORMAT uFormat,
LPDWORD lpdwValue
);
HRESULT GetStringFromDataObject(
IDataObject * lpDataObject,
CLIPFORMAT uFormat,
LPWSTR lpwstrBuf,
DWORD dwBufLen
);
HRESULT CT30ConfigExtData::QueryPagesFor(DATA_OBJECT_TYPES type)
{
DEBUG_FUNCTION_NAME(TEXT("CT30ConfigExtData::QueryPagesFor"));
if (type == CCT_SCOPE || type == CCT_RESULT)
{
WCHAR szFSPGuid[FAXSRV_MAX_GUID_LEN + 1];
HRESULT hr;
hr = GetStringFromDataObject(m_pDataObject,m_CCF_FSP_GUID, szFSPGuid,sizeof(szFSPGuid)/sizeof(WCHAR));
if (FAILED(hr))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetFSPGUIDFromDataObject failed. hr = 0x%08X"),
hr);
return hr;
}
if (CSTR_EQUAL == CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
szFSPGuid,
-1,
REGVAL_T30_PROVIDER_GUID_STRING,
-1))
{
return S_OK;
}
else
{
return S_FALSE;
}
}
return S_FALSE;
}
HRESULT CT30ConfigExtData::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle,
IUnknown* pUnk,
DATA_OBJECT_TYPES type)
{
DEBUG_FUNCTION_NAME(TEXT("CT30ConfigExtData::CreatePropertyPages"));
WCHAR szFSPGuid[FAXSRV_MAX_GUID_LEN + 1];
WCHAR szServer[FAXSRV_MAX_SERVER_NAME + 1];
DWORD dwDeviceId;
HRESULT hr;
hr = GetStringFromDataObject(m_pDataObject,m_CCF_FSP_GUID, szFSPGuid,sizeof(szFSPGuid)/sizeof(WCHAR));
if (FAILED(hr))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetFSPGUIDFromDataObject for m_CCF_FSP_GUID failed. hr = 0x%08X"),
hr);
return hr;
}
if (CSTR_EQUAL != CompareString(LOCALE_INVARIANT,
NORM_IGNORECASE,
szFSPGuid,
-1,
REGVAL_T30_PROVIDER_GUID_STRING,
-1))
{
return E_UNEXPECTED;
}
hr = GetStringFromDataObject(m_pDataObject,m_CCF_SERVER_NAME, szServer,sizeof(szServer)/sizeof(WCHAR));
if (FAILED(hr))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetFSPGUIDFromDataObject for m_CCF_SERVER_NAME failed. hr = 0x%08X"),
hr);
return hr;
}
hr = GetDWORDFromDataObject(m_pDataObject,m_CCF_FSP_DEVICE_ID,&dwDeviceId);
if (FAILED(hr))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetDeviceIdFromDataObject failed. hr = 0x%08X"),
hr);
return hr;
}
CComBSTR bstrPageTitle;
bstrPageTitle.LoadString(IDS_T30PAGE_TITLE);
if (!bstrPageTitle)
{
return E_UNEXPECTED;
}
CT30ConfigPage* pPage = new CT30ConfigPage(handle, true, bstrPageTitle); // true = only one page
if (!pPage)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Failed to allocate CT30ConfigPage")
);
return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
}
hr = pPage->Init(szServer, dwDeviceId);
if (SUCCEEDED(hr))
{
lpProvider->AddPage(pPage->Create());
}
else
{
return E_UNEXPECTED;
}
return S_OK;
}
HRESULT CT30ConfigPage::Init(LPCTSTR lpctstrServerName, DWORD dwDeviceId)
{
DEBUG_FUNCTION_NAME(TEXT("CT30ConfigPage::Init"));
LPT30_EXTENSION_DATA lpExtData = NULL;
DWORD dwDataSize = 0;
DWORD ec = ERROR_SUCCESS;
m_dwDeviceId = dwDeviceId;
m_bstrServerName = lpctstrServerName;
if (!m_bstrServerName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Out of memory while copying server name (ec: %ld)")
);
ec = ERROR_NOT_ENOUGH_MEMORY;
DisplayRpcErrorMessage(ERROR_NOT_ENOUGH_MEMORY, m_hWnd);
goto exit;
}
if (!FaxConnectFaxServer(lpctstrServerName,&m_hFax))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxConnectFaxServer failed (ec: %ld)"),
ec);
DisplayRpcErrorMessage(ec, m_hWnd);
goto exit;
}
if(!FaxGetExtensionData(
m_hFax,
m_dwDeviceId,
GUID_T30_EXTENSION_DATA,
(PVOID *)&lpExtData,
&dwDataSize
))
{
ec = GetLastError();
lpExtData = NULL;
if (ERROR_FILE_NOT_FOUND == ec)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("T30 Data not found. Device: 0x%08X, GUID: %s"),
m_dwDeviceId,
GUID_T30_EXTENSION_DATA);
ec = ERROR_SUCCESS;
m_bAdaptiveAnsweringEnabled = FALSE;
}
else
{
DebugPrintEx(
DEBUG_ERR,
TEXT("T30 FaxGetExtensionData() failed. GUID = %s (ec: %ld)"),
GUID_T30_EXTENSION_DATA,
ec);
DisplayRpcErrorMessage(ec, m_hWnd);
}
goto exit;
}
if (dwDataSize != sizeof(T30_EXTENSION_DATA))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("T30 FaxGetExtensionData() returned mismatched data size (%ld)"),
dwDataSize);
ec = ERROR_BAD_FORMAT;
DisplayErrorMessage(IDS_ERR_BAD_T30_CONFIGURATION, m_hWnd);
goto exit;
}
m_bAdaptiveAnsweringEnabled = lpExtData->bAdaptiveAnsweringEnabled;
Assert(ERROR_SUCCESS == ec);
exit:
if ((ERROR_SUCCESS != ec) && m_hFax)
{
if (!FaxClose(m_hFax))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxClose() failed on fax handle (0x%08X : %s). (ec: %ld)"),
m_hFax,
m_bstrServerName,
GetLastError());
}
m_hFax = NULL;
}
if (lpExtData)
{
FaxFreeBuffer(lpExtData);
lpExtData = NULL;
}
return HRESULT_FROM_WIN32(ec);
}
LRESULT CT30ConfigPage::OnInitDialog(
UINT uiMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& fHandled )
{
DEBUG_FUNCTION_NAME( _T("CT30ConfigPage::OnInitDialog"));
m_btnAdaptiveEnabled.Attach(GetDlgItem(IDC_ADAPTIVE_ANSWERING));
m_btnAdaptiveEnabled.SetCheck(m_bAdaptiveAnsweringEnabled ? BST_CHECKED : BST_UNCHECKED);
return 1;
}
BOOL CT30ConfigPage::OnApply()
{
DEBUG_FUNCTION_NAME(TEXT("CT30ConfigPage::OnApply"));
BOOL bRet = FALSE;
T30_EXTENSION_DATA ExtData;
memset(&ExtData,0,sizeof(ExtData));
ExtData.bAdaptiveAnsweringEnabled = (BST_CHECKED == m_btnAdaptiveEnabled.GetCheck());
if(!FaxSetExtensionData(
m_hFax,
m_dwDeviceId,
GUID_T30_EXTENSION_DATA,
(LPVOID)&ExtData,
sizeof(ExtData)
))
{
DWORD ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
TEXT("T30 FaxGetExtensionData() failed. GUID = %s (ec: %ld)"),
GUID_T30_EXTENSION_DATA,
ec);
DisplayRpcErrorMessage(ec, m_hWnd);
}
else
{
bRet = TRUE;
}
return bRet;
}
HRESULT GetDWORDFromDataObject(
IDataObject * lpDataObject,
CLIPFORMAT uFormat,
LPDWORD lpdwValue
)
{
DEBUG_FUNCTION_NAME(TEXT("GetDWORDFromDataObject"));
Assert(lpdwValue);
Assert(0 != uFormat);
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
FORMATETC formatetc = {
uFormat,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
stgmedium.hGlobal = GlobalAlloc(0, sizeof(DWORD));
if (stgmedium.hGlobal == NULL)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GlobalAlloc() failed. (ec: %ld)"),
GetLastError());
return E_OUTOFMEMORY;
}
HRESULT hr = lpDataObject->GetDataHere(&formatetc, &stgmedium);
if (SUCCEEDED(hr))
{
*lpdwValue = *((LPDWORD)stgmedium.hGlobal);
}
else
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetDataHere() failed. (hr = 0x%08X)"),
hr);
}
GlobalFree(stgmedium.hGlobal);
return hr;
}
HRESULT GetStringFromDataObject(
IDataObject * lpDataObject,
CLIPFORMAT uFormat,
LPWSTR lpwstrBuf,
DWORD dwBufLen
)
{
DEBUG_FUNCTION_NAME(TEXT("GetStringFromDataObject"));
Assert(lpDataObject);
Assert(lpwstrBuf);
Assert(dwBufLen>0);
STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL };
FORMATETC formatetc =
{
uFormat,
NULL,
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL
};
stgmedium.hGlobal = GlobalAlloc(0, dwBufLen*sizeof(WCHAR));
if (stgmedium.hGlobal == NULL)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GlobalAlloc() failed. (ec: %ld)"),
GetLastError());
return E_OUTOFMEMORY;
}
HRESULT hr = lpDataObject->GetDataHere(&formatetc, &stgmedium);
if (SUCCEEDED(hr))
{
lstrcpyn(lpwstrBuf,(LPWSTR)stgmedium.hGlobal,dwBufLen);
lpwstrBuf[dwBufLen-1]=L'\0';
}
else
{
DebugPrintEx(
DEBUG_ERR,
TEXT("GetDataHere() failed. (hr = 0x%08X)"),
hr);
}
GlobalFree(stgmedium.hGlobal);
return hr;
}
void DisplayRpcErrorMessage(DWORD ec, HWND hWnd)
{
UINT uMsgId;
uMsgId = GetErrorStringId(ec);
DisplayErrorMessage(uMsgId, hWnd, TRUE); // use the common error messages DLL
}
void DisplayErrorMessage(UINT uMsgId, HWND hWnd, BOOL bCommon)
{
static CComBSTR bstrCaption = TEXT("");
CComBSTR bstrMsg;
if (!lstrcmp(bstrCaption.m_str,TEXT("")))
{
bstrCaption.LoadString(IDS_T30PAGE_TITLE);
if (!bstrCaption)
{
bstrCaption = TEXT("");
return;
}
}
if (bCommon)
{
bstrMsg.LoadString(_Module.GetResourceInstance(), uMsgId);
}
else
{
bstrMsg.LoadString(uMsgId);
}
if (bstrMsg)
{
AlignedMessageBox(hWnd, bstrMsg, bstrCaption, MB_OK|MB_ICONEXCLAMATION);
}
}
//////////////////////////////////////////////////////////////////////////////
/*++
CppFaxServerOutbox::OnHelpRequest
This is called in response to the WM_HELP Notify
message and to the WM_CONTEXTMENU Notify message.
WM_HELP Notify message.
This message is sent when the user presses F1 or <Shift>-F1
over an item or when the user clicks on the ? icon and then
presses the mouse over an item.
WM_CONTEXTMENU Notify message.
This message is sent when the user right clicks over an item
and then clicks "What's this?"
--*/
/////////////////////////////////////////////////////////////////////////////
LRESULT
CT30ConfigPage::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
DEBUG_FUNCTION_NAME(_T("CT30ConfigPage::OnHelpRequest"));
ULONG_PTR dwHelpId = 0;
if(WM_HELP == uMsg)
{
dwHelpId = ((LPHELPINFO)lParam)->dwContextId;
}
else if(WM_CONTEXTMENU == uMsg)
{
dwHelpId = ::GetWindowContextHelpId((HWND)wParam);
}
if(dwHelpId)
{
::WinHelp(m_hWnd,
FXS_ADMIN_HLP_FILE,
HELP_CONTEXTPOPUP,
dwHelpId);
}
return TRUE;
}