windows-nt/Source/XPSP1/NT/enduser/netmeeting/ui/conf/vidwiz.cpp
2020-09-26 16:20:57 +08:00

391 lines
8.6 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// File: vidwiz.cpp
#include "precomp.h"
#include "dcap.h"
#include "vidinout.h"
#include "vidwiz.h"
#include "confcpl.h"
static HINSTANCE g_hDcapLib;
typedef int (WINAPI *GNCD)();
typedef BOOL (WINAPI *FFCD)(FINDCAPTUREDEVICE*, char *);
typedef BOOL (WINAPI *FFCDBI)(FINDCAPTUREDEVICE*, int);
// implementations in DCAP32.DLL
static FFCD DLL_FindFirstCaptureDevice = NULL;
static FFCDBI DLL_FindFirstCaptureDeviceByIndex = NULL;
static GNCD DLL_GetNumCaptureDevices = NULL;
// Defined in wizard.cpp
extern UINT_PTR GetPageBeforeVideoWiz();
extern UINT_PTR GetPageAfterVideo();
// index number of the user's selection on the combo box
static int g_nCurrentSelection = 0;
// set to true only if the user hit's back or next
static BOOL g_bCurrentValid = FALSE;
// was the user prompted to select a video device
static BOOL g_bPrompted = FALSE;
static char *BuildCaptureDeviceInfoString(FINDCAPTUREDEVICE *pCaptureDeviceInfo, char *szOut);
BOOL InitVidWiz()
{
// initialize locals
g_hDcapLib = NULL;
DLL_FindFirstCaptureDevice = NULL;
DLL_FindFirstCaptureDeviceByIndex = NULL;
DLL_GetNumCaptureDevices = NULL;
g_nCurrentSelection = 0;
g_bCurrentValid = FALSE;
g_bPrompted = FALSE;
g_hDcapLib = NmLoadLibrary("dcap32.dll");
if (g_hDcapLib == NULL)
return FALSE;
DLL_FindFirstCaptureDevice = (FFCD)GetProcAddress(g_hDcapLib, "FindFirstCaptureDevice");
DLL_FindFirstCaptureDeviceByIndex = (FFCDBI)GetProcAddress(g_hDcapLib, "FindFirstCaptureDeviceByIndex");
DLL_GetNumCaptureDevices = (GNCD)GetProcAddress(g_hDcapLib, "GetNumCaptureDevices");
return TRUE;
}
// returns TRUE if the capture device id in the registry corresponds with
// the driver description string.
static BOOL IsVideoRegistryValid()
{
RegEntry re(VIDEO_KEY);
char szDriverDesc[200];
char *szDriverDescReg;
int numVideoDevices, nID;
FINDCAPTUREDEVICE CaptureDeviceInfo;
BOOL fRet;
// just in case InitVidWiz wasn't called
if (NULL == g_hDcapLib)
return FALSE;
numVideoDevices = DLL_GetNumCaptureDevices();
nID = re.GetNumber(REGVAL_CAPTUREDEVICEID, -1);
szDriverDescReg = re.GetString(REGVAL_CAPTUREDEVICENAME);
// no video devices and no registry entry is valid
if ((numVideoDevices == 0) && (nID == -1))
{
return TRUE;
}
if ((numVideoDevices == 0) && (nID != -1))
{
return FALSE;
}
// TRUE == (numVideoDevice >= 1)
// installed video devices but no registry entry is invalid
if (nID == -1)
{
return FALSE;
}
CaptureDeviceInfo.dwSize = sizeof(FINDCAPTUREDEVICE);
fRet = DLL_FindFirstCaptureDeviceByIndex(&CaptureDeviceInfo, nID);
if (fRet == FALSE)
{
return FALSE;
}
BuildCaptureDeviceInfoString(&CaptureDeviceInfo, szDriverDesc);
if (0 == lstrcmp(szDriverDescReg, szDriverDesc))
{
return TRUE;
}
return FALSE;
}
BOOL UnInitVidWiz()
{
if (g_hDcapLib)
FreeLibrary(g_hDcapLib);
g_hDcapLib = NULL;
return TRUE;
}
static char *BuildCaptureDeviceInfoString(FINDCAPTUREDEVICE *pCaptureDeviceInfo, char *szOut)
{
if (pCaptureDeviceInfo->szDeviceDescription[0] != '\0')
{
lstrcpy(szOut, pCaptureDeviceInfo->szDeviceDescription);
}
else
{
lstrcpy(szOut, pCaptureDeviceInfo->szDeviceName);
}
if (pCaptureDeviceInfo->szDeviceVersion[0] != '\0')
{
lstrcat(szOut, _T(", "));
lstrcat(szOut, pCaptureDeviceInfo->szDeviceVersion);
}
return szOut;
}
void UpdateVidConfigRegistry()
{
FINDCAPTUREDEVICE CaptureDeviceInfo, *CaptureDevTable;
RegEntry re(VIDEO_KEY);
BOOL bRet;
char strNameDesc[MAX_CAPDEV_NAME+MAX_CAPDEV_VERSION];
int numVideoDevices, index, enum_index;
// just in case InitVidWiz wasn't called
if (NULL == g_hDcapLib)
return;
numVideoDevices = DLL_GetNumCaptureDevices();
// no devices - delete the registry entries
if (numVideoDevices == 0)
{
re.DeleteValue(REGVAL_CAPTUREDEVICEID);
re.DeleteValue(REGVAL_CAPTUREDEVICENAME);
return;
}
// build a table of all the devices
CaptureDevTable = (FINDCAPTUREDEVICE *)LocalAlloc(LPTR, numVideoDevices*sizeof(FINDCAPTUREDEVICE));
if (NULL == CaptureDevTable)
{
ERROR_OUT(("UpdateVidConfigRegistry: Out of memory"));
return;
}
index = 0;
for (enum_index=0; enum_index < MAXVIDEODRIVERS; enum_index++)
{
CaptureDevTable[index].dwSize = sizeof(FINDCAPTUREDEVICE);
bRet = DLL_FindFirstCaptureDeviceByIndex(&CaptureDevTable[index], enum_index);
if (bRet == TRUE)
index++;
if (index == numVideoDevices)
break;
}
if (index != numVideoDevices)
{
ERROR_OUT(("UpdateVidConfigReg: Device Enumeration Failure"));
LocalFree(CaptureDevTable);
return;
}
// if only one capture device:
// don't bother to see if the previous entry was valid
// just update the registry with the current default
if (numVideoDevices == 1)
{
BuildCaptureDeviceInfoString(&CaptureDevTable[0], strNameDesc);
re.SetValue(REGVAL_CAPTUREDEVICEID, CaptureDevTable[0].nDeviceIndex);
re.SetValue(REGVAL_CAPTUREDEVICENAME, strNameDesc);
LocalFree(CaptureDevTable);
return;
}
// TRUE == (numVideoDevices >= 2)
// user wasn't prompted - he must of had a valid registry to start with
if (g_bPrompted == FALSE)
{
LocalFree(CaptureDevTable);
return;
}
// the user pressed CANCEL during setup
if (g_bCurrentValid == FALSE)
{
if (IsVideoRegistryValid() == TRUE)
{
LocalFree(CaptureDevTable);
return;
}
else
g_nCurrentSelection = 0;
}
CaptureDeviceInfo = CaptureDevTable[g_nCurrentSelection];
BuildCaptureDeviceInfoString(&CaptureDeviceInfo, strNameDesc);
re.SetValue(REGVAL_CAPTUREDEVICEID, CaptureDeviceInfo.nDeviceIndex);
re.SetValue(REGVAL_CAPTUREDEVICENAME, strNameDesc);
LocalFree(CaptureDevTable);
return;
}
// if <= 1 video capture device, return false
// if 2 or more video devices and the Wizard is in force mode, return true
// if 2 or more video devices and a MATCHING registry entry, return false
// otherwise something is fishy - return true
BOOL NeedVideoPropPage(BOOL fForce)
{
// just in case InitVidWiz wasn't called
if (NULL == g_hDcapLib)
return FALSE;
// check the system policies for sending video
if (_Module.IsSDKCallerRTC() || SysPol::NoVideoSend())
{
WARNING_OUT(("Video is disabled by system policies key\r\n"));
return FALSE;
}
// count how many devices we have
int numCaptureDevices = DLL_GetNumCaptureDevices();
if (numCaptureDevices <= 1)
{
return FALSE;
}
// TRUE == (numCaptureDevice >= 2)
if (fForce)
{
g_bPrompted = TRUE;
return TRUE;
}
if (IsVideoRegistryValid() == TRUE)
{
return FALSE;
}
g_bPrompted = TRUE;
return TRUE;
}
// Message handler for property page
INT_PTR APIENTRY VidWizDlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hwndCB; // handle to the dialog box
int index;
char szDriverNameDesc[MAX_CAPDEV_NAME+MAX_CAPDEV_VERSION];
static LONG_PTR button_mask;
FINDCAPTUREDEVICE CaptureDeviceInfo;
hwndCB = GetDlgItem(hDlg, IDC_VWCOMBO);
switch(message)
{
case(WM_INITDIALOG) :
button_mask = ((PROPSHEETPAGE *)lParam)->lParam;
if (g_hDcapLib == NULL) break;
for (index = 0; index < MAXVIDEODRIVERS; index++)
{
CaptureDeviceInfo.dwSize = sizeof(FINDCAPTUREDEVICE);
if (DLL_FindFirstCaptureDeviceByIndex(&CaptureDeviceInfo, index))
{
BuildCaptureDeviceInfoString(&CaptureDeviceInfo, szDriverNameDesc);
ComboBox_AddString(hwndCB, szDriverNameDesc);
}
}
ComboBox_SetCurSel(hwndCB, g_nCurrentSelection);
break;
case(WM_NOTIFY) :
switch (((NMHDR *)lParam)->code)
{
case PSN_WIZBACK:
{
UINT_PTR iPrev = GetPageBeforeVideoWiz();
ASSERT( iPrev );
::SetWindowLongPtr(hDlg, DWLP_MSGRESULT, iPrev);
g_bCurrentValid = TRUE;
return TRUE;
}
case PSN_WIZNEXT:
{
UINT_PTR iNext = GetPageAfterVideo();
ASSERT( iNext );
::SetWindowLongPtr(hDlg, DWLP_MSGRESULT, iNext);
g_bCurrentValid = TRUE;
return TRUE;
}
case PSN_WIZFINISH:
case PSN_KILLACTIVE:
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE);
g_bCurrentValid = TRUE;
break;
case PSN_SETACTIVE:
if (g_fSilentWizard)
{
PropSheet_PressButton(GetParent(hDlg), (button_mask & PSWIZB_NEXT) ? PSBTN_NEXT : PSBTN_FINISH);
}
else
{
PropSheet_SetWizButtons(GetParent(hDlg), button_mask);
}
break;
case PSN_RESET:
// psn_reset get's received even if user presses
// cancel on another dialog.
g_bCurrentValid = FALSE;
break;
default:
return FALSE;
}
break;
// combox box messages get sent here.
// only one we need is when the user selects something
case(WM_COMMAND) :
if (HIWORD(wParam) == CBN_SELCHANGE)
{
g_nCurrentSelection = ComboBox_GetCurSel(hwndCB);
break;
}
else
{
return FALSE;
}
break;
default:
return FALSE;
}
return TRUE;
}