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