windows-nt/Source/XPSP1/NT/multimedia/dshow/mfvideo/msdvdopt/pgcallbk.cpp
2020-09-26 16:20:57 +08:00

260 lines
8 KiB
C++

// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
/*************************************************************/
/* Name: pgcallbk.cpp
/* Description:
/*************************************************************/
#include "stdafx.h"
#include "password.h"
#include "COptDlg.h"
const TCHAR g_szPassword[] = TEXT("DVDAdmin.password");
const TCHAR g_szPlayerLevel[] = TEXT("DVDAdmin.rate");
const TCHAR g_szDisableParent[] = TEXT("DVDAdmin.disableParentalControl");
/*************************************************************/
/* Name: GetDvd
/* Description:
/*************************************************************/
HRESULT COptionsDlg::GetDvd(IMSWebDVD** ppDvd) {
return m_pDvd.CopyTo(ppDvd);
}
/*************************************************************/
/* Name: GetDvdAdm
/* Description: Use CComPtr to receive the returned interface,
/* so that reference count will be added and released accordingly
/*************************************************************/
HRESULT COptionsDlg::GetDvdAdm(LPVOID* ppAdmin){
*ppAdmin = NULL;
IDispatch* pDvdAdmDisp;
HRESULT hr = m_pDvd->get_DVDAdm(&pDvdAdmDisp);
if (FAILED(hr)) return NULL;
hr = pDvdAdmDisp->QueryInterface(IID_IMSDVDAdm, (LPVOID*) ppAdmin);
pDvdAdmDisp->Release();
return(hr);
}/* end of function GetDvdAdm */
/*************************************************************/
/* Name: pg_GetLevel
/* Description: return the parental level number
/*************************************************************/
long COptionsDlg::pg_GetLevel(LPTSTR szRate)
{
long lLevel = LEVEL_ADULT;
LPTSTR csStr = LoadStringFromRes(IDS_INI_RATE_G);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_G;
delete[] csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_PG);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_PG;
delete[] csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_PG13);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_PG13;
delete[] csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_R);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_R;
delete[] csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_NC17);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_NC17;
delete[] csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_ADULT);
if(lstrcmp(szRate, csStr) == 0)
lLevel = LEVEL_ADULT;
delete[] csStr;
return lLevel;
}
/*************************************************************/
/* Name: pg_InitRateList
/* Description: Initialize parental level combo list
/*************************************************************/
HRESULT COptionsDlg::pg_InitRateList(HWND ctlList, long level)
{
::SendMessage(ctlList, CB_RESETCONTENT, 0, 0);
LPTSTR csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_G);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_PG);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_PG13);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_R);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_NC17);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
csStr = LoadStringFromRes(IDS_INI_RATE_ADULT);
::SendMessage(ctlList, CB_INSERTSTRING, (UINT)-1, (LPARAM) csStr);
delete csStr;
switch (level) {
case LEVEL_G:
case LEVEL_G_PG:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 0, 0);
break;
case LEVEL_PG:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 1, 0);
break;
case LEVEL_PG13:
case LEVEL_PG_R:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 2, 0);
break;
case LEVEL_R:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 3, 0);
break;
case LEVEL_NC17:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 4, 0);
break;
case LEVEL_ADULT:
default:
SendMessage(ctlList, CB_SETCURSEL, (WPARAM) 5, 0);
break;
}
return S_OK;
}
/*************************************************************/
/* Name: pg_OnInitDialog
/* Description: OnInitDialog for the parental control page
/*************************************************************/
HRESULT COptionsDlg::pg_OnInitDialog(HWND hwndDlg)
{
HWND ctlList = ::GetDlgItem(hwndDlg, IDC_COMBO_RATE);
HWND checkBox = ::GetDlgItem(hwndDlg, IDC_DISABLE_PARENT);
if (!IDC_COMBO_RATE || !checkBox)
return S_FALSE;
HRESULT hr = S_OK;
CComPtr<IMSDVDAdm> pDvdAdm;
hr = GetDvdAdm((LPVOID*) &pDvdAdm);
if (FAILED(hr) || !pDvdAdm) return S_FALSE;
long level = 0;
hr = pDvdAdm->GetParentalLevel(&level);
pg_InitRateList(ctlList, level);
BOOL fDisabled = (level == LEVEL_DISABLED);
::SendMessage(checkBox, BM_SETCHECK, fDisabled, 0);
::EnableWindow(ctlList, !fDisabled);
return S_OK;
}
/*************************************************************/
/* Name: pg_OnApply
/* Description: Apply the parental control setting changes
/*************************************************************/
HRESULT COptionsDlg::pg_OnApply(HWND hwndDlg)
{
USES_CONVERSION;
HWND ctlList = ::GetDlgItem(hwndDlg, IDC_COMBO_RATE);
HWND checkBox = ::GetDlgItem(hwndDlg, IDC_DISABLE_PARENT);
if (!IDC_COMBO_RATE || !checkBox)
return S_FALSE;
if (!m_pPasswordDlg)
return E_UNEXPECTED;
BOOL disableParent = (BOOL) ::SendMessage(checkBox, BM_GETCHECK, 0, 0);
HRESULT hr = S_OK;
CComPtr<IMSDVDAdm> pDvdAdm;
hr = GetDvdAdm((LPVOID*) &pDvdAdm);
if (FAILED(hr) || !pDvdAdm) return S_FALSE;
// Get the saved settings
long lLevelSaved;
pDvdAdm->GetParentalLevel(&lLevelSaved);
BOOL bChangePG = FALSE;
// Get the selected level in the rate list box
long level = (long) ::SendMessage(ctlList, CB_GETCURSEL, 0, 0) ;
TCHAR szRate[MAX_RATE];
::SendMessage(ctlList, CB_GETLBTEXT, level, (LPARAM)szRate);
long lLevel = pg_GetLevel(szRate);
// If a different parental level is selected from the saved level
if (!disableParent && lLevel!=lLevelSaved) {
bChangePG = TRUE;
}
// If the disable parental control option is changed from the saved setting
else if (disableParent && lLevelSaved != LEVEL_DISABLED) {
// Set parental level to -1 when parental control is disabled
lLevel = LEVEL_DISABLED;
bChangePG = TRUE;
}
// Get the verified password from the password dialog
LPTSTR szPassword = m_pPasswordDlg->GetPassword();
if (bChangePG) {
try {
HRESULT hr = pDvdAdm->SaveParentalLevel(lLevel, NULL, T2OLE(szPassword));
if (hr == E_ACCESSDENIED){
DVDMessageBox(hwndDlg, IDS_PASSWORD_INCORRECT);
pg_OnInitDialog(hwndDlg);
return hr;
}
// Actually setting the player level
hr = m_pDvd->GetPlayerParentalLevel(&lLevelSaved);
if (lLevel!=lLevelSaved) {
hr = m_pDvd->Stop();
if (FAILED(hr))
throw (hr);
hr = m_pDvd->SelectParentalLevel(lLevel, NULL, T2OLE(szPassword));
if (hr == E_ACCESSDENIED){
DVDMessageBox(hwndDlg, IDS_PASSWORD_INCORRECT);
pg_OnInitDialog(hwndDlg);
return hr;
}
if (FAILED(hr)) {
DVDMessageBox(hwndDlg, IDS_RATE_CHANGE_FAIL);
pg_OnInitDialog(hwndDlg);
return hr;
}
hr = m_pDvd->Play();
if (FAILED(hr))
throw hr;
}
}
catch (HRESULT hrTmp) {
DVDMessageBox(hwndDlg, IDS_STOP_PLAY_FAIL);
pg_OnInitDialog(hwndDlg);
hr = hrTmp;
}
}
return hr;
}