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.
 
 
 
 
 
 

251 lines
8.4 KiB

/****************************************************************************
* @doc INTERNAL VDEVICEP
*
* @module VDeviceP.cpp | Source file for the <c CVDeviceProperties>
* class used to implement a property page to test the <i ITVfwCaptureDialogs>,
* as well as <i ITAddress> and <ITStream> interfaces to select video
* capture devices.
***************************************************************************/
#include "Precomp.h"
extern HINSTANCE ghInst;
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc HPROPSHEETPAGE | CVDeviceProperties | OnCreate | This
* method creates a new page for a property sheet.
*
* @rdesc Returns the handle to the new property sheet if successful, or
* NULL otherwise.
***************************************************************************/
HPROPSHEETPAGE CVDeviceProperties::OnCreate()
{
PROPSHEETPAGE psp;
psp.dwSize = sizeof(psp);
psp.dwFlags = PSP_USEREFPARENT;
psp.hInstance = ghInst;
psp.pszTemplate = MAKEINTRESOURCE(IDD_CaptureDeviceProperties);
psp.pfnDlgProc = BaseDlgProc;
psp.pcRefParent = 0;
psp.pfnCallback = (LPFNPSPCALLBACK)NULL;
psp.lParam = (LPARAM)this;
return CreatePropertySheetPage(&psp);
}
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc void | CVDeviceProperties | CVDeviceProperties | This
* method is the constructor for the property page object. It simply
* calls the constructor of the property page base class.
*
* @rdesc Nada.
***************************************************************************/
CVDeviceProperties::CVDeviceProperties()
{
FX_ENTRY("CVDeviceProperties::CVDeviceProperties")
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
#if USE_VFW
m_pITVfwCaptureDialogs = NULL;
#endif
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
}
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc void | CVDeviceProperties | ~CVDeviceProperties | This
* method is the destructor for capture device property page. It
* simply calls the base class destructor.
*
* @rdesc Nada.
***************************************************************************/
CVDeviceProperties::~CVDeviceProperties()
{
FX_ENTRY("CVDeviceProperties::~CVDeviceProperties")
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
}
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc HRESULT | CVDeviceProperties | OnConnect | This
* method is called when the property page is connected to a TAPI object.
*
* @parm ITTerminal* | pITTerminal | Specifies a pointer to the <i ITTerminal>
* interface used to identify the capture device.
*
* @rdesc This method returns an HRESULT value that depends on the
* implementation of the interface. HRESULT can include one of the
* following standard constants, or other values not listed:
*
* @flag E_FAIL | Failure
* @flag E_POINTER | Null pointer argument
* @flag E_NOTIMPL | Method is not supported
* @flag NOERROR | No error
***************************************************************************/
HRESULT CVDeviceProperties::OnConnect(ITTerminal *pITTerminal)
{
HRESULT Hr = NOERROR;
FX_ENTRY("CVDeviceProperties::OnConnect")
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
// Validate input parameters
if (!pITTerminal)
{
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: ERROR: invalid input parameter"), _fx_));
Hr = E_POINTER;
goto MyExit;
}
#if USE_VFW
// Get the video VfW capture device interface
if (SUCCEEDED (Hr = pITTerminal->QueryInterface(&m_pITVfwCaptureDialogs)))
{
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: SUCCESS: m_pITVfwCaptureDialogs=0x%08lX"), _fx_, m_pITVfwCaptureDialogs));
}
else
{
m_pITVfwCaptureDialogs = NULL;
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: ERROR: IOCTL failed Hr=0x%08lX"), _fx_, Hr));
}
#endif
MyExit:
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
return Hr;
}
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc HRESULT | CVDeviceProperties | OnDisconnect | This
* method is called when the property page is disconnected from the owning
* filter.
*
* @rdesc This method returns an HRESULT value that depends on the
* implementation of the interface. HRESULT can include one of the
* following standard constants, or other values not listed:
*
* @flag NOERROR | No error
***************************************************************************/
HRESULT CVDeviceProperties::OnDisconnect()
{
FX_ENTRY("CVDeviceProperties::OnDisconnect")
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: begin"), _fx_));
#if USE_VFW
// Make sure the interface pointer is still valid
if (!m_pITVfwCaptureDialogs)
{
DbgLog((LOG_ERROR, DBG_LEVEL_TRACE_FAILURES, TEXT("%s: WARNING: already disconnected!"), _fx_));
}
else
{
// Release the interface
m_pITVfwCaptureDialogs->Release();
m_pITVfwCaptureDialogs = NULL;
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: SUCCESS: releasing m_pITVfwCaptureDialogs"), _fx_));
}
#endif
DbgLog((LOG_TRACE, DBG_LEVEL_TRACE_DETAILS, TEXT("%s: end"), _fx_));
return NOERROR;
}
/****************************************************************************
* @doc INTERNAL CVDEVICEPMETHOD
*
* @mfunc BOOL | CVDeviceProperties | BaseDlgProc | This
* method is called when a message is sent to the property page dialog box.
*
* @rdesc By default, returns the value returned by the Win32 DefWindowProc function.
***************************************************************************/
INT_PTR CALLBACK CVDeviceProperties::BaseDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CVDeviceProperties *pSV = (CVDeviceProperties*)GetWindowLong(hDlg, DWL_USER);
int iNotify = HIWORD (wParam);
int j;
switch (uMsg)
{
case WM_INITDIALOG:
{
LPPROPSHEETPAGE psp = (LPPROPSHEETPAGE)lParam;
pSV = (CVDeviceProperties*)psp->lParam;
pSV->m_hDlg = hDlg;
SetWindowLong(hDlg, DWL_USER, (LPARAM)pSV);
pSV->m_bInit = FALSE;
#if USE_VFW
EnableWindow(GetDlgItem(hDlg, IDC_Device_SourceDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Source) == S_OK));
EnableWindow(GetDlgItem(hDlg, IDC_Device_FormatDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Format) == S_OK));
EnableWindow(GetDlgItem(hDlg, IDC_Device_DisplayDlg), (BOOL)(pSV->m_pITVfwCaptureDialogs && pSV->m_pITVfwCaptureDialogs->HasDialog(VfwCaptureDialog_Display) == S_OK));
#endif
// Put some code here to enumerate the terminals and populate the dialog box
EnableWindow(GetDlgItem(hDlg, IDC_Device_Selection), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CONTROL_DEFAULT), FALSE);
pSV->m_bInit = TRUE;
return TRUE;
}
break;
case WM_COMMAND:
if (pSV && pSV->m_bInit)
{
switch (LOWORD(wParam))
{
#if USE_VFW
case IDC_Device_SourceDlg:
if (pSV->m_pITVfwCaptureDialogs)
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Source, hDlg);
break;
case IDC_Device_FormatDlg:
if (pSV->m_pITVfwCaptureDialogs)
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Format, hDlg);
break;
case IDC_Device_DisplayDlg:
if (pSV->m_pITVfwCaptureDialogs)
pSV->m_pITVfwCaptureDialogs->ShowDialog(VfwCaptureDialog_Display, hDlg);
break;
#endif
case IDC_Device_Selection:
if (HIWORD(wParam) == CBN_SELCHANGE)
{
// Put some code to select a new terminal on the stream
PropSheet_Changed(GetParent(hDlg), hDlg);
}
break;
default:
break;
}
}
default:
return FALSE;
}
return TRUE;
}