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

294 lines
7.6 KiB
C++

// Copyright (c) 1999 Microsoft Corporation. All Rights Reserved.
// dvdopt.cpp : Implementation of Cdvdopt
#include "stdafx.h"
#include "Msdvdopt.h"
#include "dvdopt.h"
#include "COptDlg.h"
#include "override.h"
extern LPTSTR LoadStringFromRes(DWORD redId);
/////////////////////////////////////////////////////////////////////////////
// Cdvdopt
/*************************************************************/
/* Name: Cdvdopt
/* Description: Constructor
/*************************************************************/
Cdvdopt::Cdvdopt()
{
m_pDlgOpt = NULL;
m_pDvd = NULL;
m_hParentWnd = NULL;
}
/*************************************************************/
/* Name: ~Cdvdopt
/* Description: destructor
/*************************************************************/
Cdvdopt::~Cdvdopt(){
ATLTRACE(TEXT("In the destructor of the CDVDOPT !\n"));
CleanUp();
#ifdef _DEBUG
m_pDvd.Release();
#endif
}/* end of function Cdvdopt */
/*************************************************************/
/* Name: CleanUp
/* Description: Delete all dialogs
/*************************************************************/
void Cdvdopt::CleanUp()
{
if (m_pDlgOpt) {
delete m_pDlgOpt;
m_pDlgOpt = NULL;
}
}
/*************************************************************/
/* Name: get_WebDVD
/* Description: Get IDispatch of the IMSWebDVD that the options
/* dialog is controling
/*************************************************************/
STDMETHODIMP Cdvdopt::get_WebDVD(IDispatch **pVal){
HRESULT hr = E_FAIL;
if(!m_pDvd){
return(hr);
}/* end of if statement */
hr = m_pDvd->QueryInterface(IID_IDispatch, (LPVOID*) pVal);
return hr;
}
/*************************************************************/
/* Name: put_WebDVD
/* Description: Set IDispatch of a IMSWebDVD that the options
/* dialog is going to control
/*************************************************************/
STDMETHODIMP Cdvdopt::put_WebDVD(IDispatch *newVal){
HRESULT hr = newVal->QueryInterface(IID_IMSWebDVD, (LPVOID*) &m_pDvd);
#ifdef _DEBUG2
IFilterGraph* pGraph = NULL;
hr = pDvd->QueryInterface(IID_IFilterGraph, (LPVOID*) &pGraph);
ATLASSERT(SUCCEEDED(hr));
if (SUCCEEDED(hr))
pGraph->Release();
#endif
CleanUp();
m_pDlgOpt = new COptionsDlg(m_pDvd);
m_pDlgOpt->SetDvdOpt(this);
return S_OK;
}
/*************************************************************/
/* Name: get_ParentWindow
/* Description: Get parent window of the options dialog
/*************************************************************/
STDMETHODIMP Cdvdopt::get_ParentWindow(VARIANT *pVal)
{
if (NULL == pVal)
return E_POINTER;
/*
* BUGBUG: If pVal was a properly initialized variant, we should
* call VariantClear to free any pointers. If it wasn't initialized
* VariantInit is the right thing to call instead. I prefer a leak
* to a crash so I'll use VariantInit below
*/
VariantInit(pVal);
#ifdef _WIN64
pVal->vt = VT_I8;
pVal->llVal = (LONG_PTR)m_hParentWnd;
#else
pVal->vt = VT_I4;
pVal->lVal = (LONG_PTR)m_hParentWnd;
#endif
return S_OK;
}
/*************************************************************/
/* Name: put_ParentWindow
/* Description: Set parent window of the options dialog
/*************************************************************/
STDMETHODIMP Cdvdopt::put_ParentWindow(VARIANT newVal)
{
VARIANT dest;
VariantInit(&dest);
HRESULT hr = S_OK;
#ifdef _WIN64
hr = VariantChangeTypeEx(&dest, &newVal, 0, 0, VT_I8);
if (FAILED(hr))
return hr;
m_hParentWnd = (HWND) dest.llVal;
#else
hr = VariantChangeTypeEx(&dest, &newVal, 0, 0, VT_I4);
if (FAILED(hr))
return hr;
m_hParentWnd = (HWND) dest.lVal;
#endif
return hr;
}
/*************************************************************/
/* Name: Show
/* Description: Show the options dialog
/*************************************************************/
STDMETHODIMP Cdvdopt::Show()
{
m_pDlgOpt->DoModal(m_hParentWnd);
return S_OK;
}
/*************************************************************/
/* Name: Close
/* Description: Close the options dialog
/*************************************************************/
STDMETHODIMP Cdvdopt::Close()
{
m_pDlgOpt->EndDialog(0);
return S_OK;
}
/*************************************************************/
/* Name: Power
/* Description: Raise a number to a power
/*************************************************************/
double Power(LONG n, LONG p)
{
double result = 1;
if (p==0) return result;
if (p>0) {
while (p--)
result *= n;
return result;
}
else {
while (p++)
result *= n;
return 1/result;
}
}
/*************************************************************/
/* Name: get_ForwardScanSpeed
/* Description: return the forward scan speed
/*************************************************************/
STDMETHODIMP Cdvdopt::get_ForwardScanSpeed(double *pVal)
{
*pVal = m_pDlgOpt->m_dFFSpeed;
return S_OK;
}
/*************************************************************/
/* Name: put_ForwardScanSpeed
/* Description: return the forward scan speed
/*************************************************************/
STDMETHODIMP Cdvdopt::put_ForwardScanSpeed(double newVal)
{
m_pDlgOpt->m_dFFSpeed = newVal;
return S_OK;
}
/*************************************************************/
/* Name: get_BackwardScanSpeed
/* Description: return backward scan speed
/*************************************************************/
STDMETHODIMP Cdvdopt::get_BackwardScanSpeed(double *pVal)
{
*pVal = m_pDlgOpt->m_dBWSpeed;
return S_OK;
}
/*************************************************************/
/* Name: put_BackwardScanSpeed
/* Description: return play speed
/*************************************************************/
STDMETHODIMP Cdvdopt::put_BackwardScanSpeed(double newVal)
{
m_pDlgOpt->m_dBWSpeed = newVal;
return S_OK;
}
/*************************************************************/
/* Name: get_PlaySpeed
/* Description: return play speed
/*************************************************************/
STDMETHODIMP Cdvdopt::get_PlaySpeed(double *pVal)
{
*pVal = m_pDlgOpt->m_dPlaySpeed;
return S_OK;
}
/*************************************************************/
/* Name: put_PlaySpeed
/* Description: return play speed
/*************************************************************/
STDMETHODIMP Cdvdopt::put_PlaySpeed(double newVal)
{
m_pDlgOpt->m_dPlaySpeed = newVal;
return S_OK;
}
/*************************************************************/
/* Name: ParentalLevelOverride
/* Description:
/*************************************************************/
STDMETHODIMP Cdvdopt::ParentalLevelOverride(PG_OVERRIDE_REASON reason)
{
COverrideDlg dlg(m_pDvd);
dlg.SetReason(reason);
dlg.DoModal();
return S_OK;
}
int DVDMessageBox(HWND hWnd, LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType)
{
LPTSTR csCaption;
if(lpszCaption == NULL)
{
csCaption = LoadStringFromRes(IDS_MSGBOX_TITLE);
MessageBox(hWnd, lpszText, csCaption, nType );
delete[] csCaption;
return 0;
}
else
return MessageBox(hWnd, lpszText, lpszCaption, nType );
}
int DVDMessageBox(HWND hWnd, UINT nID, LPCTSTR lpszCaption, UINT nType)
{
LPTSTR csMsgString, csCaption;
csMsgString = LoadStringFromRes(nID);
if(lpszCaption == NULL)
{
csCaption = LoadStringFromRes(IDS_MSGBOX_TITLE);
MessageBox(hWnd, csMsgString, csCaption, nType );
delete[] csCaption;
}
else {
MessageBox(hWnd, csMsgString, lpszCaption, nType );
}
delete[] csMsgString;
return 0;
}