www.pudn.com > STBIHOST.rar > rctlkeys.cpp


// 
// Copyright (c) Microsoft Corporation.  All rights reserved. 
// 
// 
// Use of this source code is subject to the terms of the Microsoft end-user 
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 
// If you did not accept the terms of the EULA, you are not authorized to use 
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your 
// install media. 
// 
/*++ 
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
PARTICULAR PURPOSE. 
 
Module Name:  rctlkeys.cpp 
 
Abstract:  Implements IRemoteControlKeys; see header file for more info. 
 
--*/ 
 
#include "stdafx.h" 
#include "stbihost.h" 
#include "mainwnd.h" 
#include "rctlkeys.h" 
 
#define RCTL_KEY_CASE(key, bit)	\ 
	case key:					\ 
		m_bmKeys |= bit;		\ 
		break 
 
// transaction constants 
#define TRANS_BEGIN	1 
#define TRANS_END	2 
#define TRANS_COMPLETE TRANS_BEGIN + TRANS_END 
 
 
// BeginRequest sets up the initial bitmask 
// EndRequest translates the final bitmask into a new 
//   accelerator table 
STDMETHODIMP CRCtlKeys::BeginRequest() 
{ 
	ASSERT(m_pMainWnd); 
 
	m_bytTrans = TRANS_BEGIN; 
 
	m_bmKeys = 0;	// reset bitmask 
 
	if (!m_pMainWnd->_hAccelTblNew) 
		return S_OK; 
 
	// enumerate the current accelerator table to set 
	// the state of each key (1 = key handler overridden, 
	// 0 = key handled by default handler in host) 
	for (int i = 0; i < m_pMainWnd->_cNewAccels; i++) 
	{ 
		switch (m_pMainWnd->_rgNewAccels[i].key) 
		{ 
			RCTL_KEY_CASE(VK_MEDIA_STOP, RCTL_BM_STOP); 
			RCTL_KEY_CASE(VK_PLAY, RCTL_BM_PLAY); 
			RCTL_KEY_CASE(VK_PAUSE, RCTL_BM_PAUSE); 
			RCTL_KEY_CASE(VK_MEDIA_PREV_TRACK, RCTL_BM_PREV); 
			RCTL_KEY_CASE(VK_MEDIA_NEXT_TRACK, RCTL_BM_NEXT); 
			RCTL_KEY_CASE(VK_PRIOR, RCTL_BM_BACK); 
			RCTL_KEY_CASE(VK_NEXT, RCTL_BM_FWD); 
			RCTL_KEY_CASE(VK_VOLUME_UP, RCTL_BM_VOLUP); 
			RCTL_KEY_CASE(VK_VOLUME_DOWN, RCTL_BM_VOLDN); 
			RCTL_KEY_CASE(VK_VOLUME_MUTE, RCTL_BM_MUTE); 
			RCTL_KEY_CASE(VK_LEFT, RCTL_BM_LEFT); 
			RCTL_KEY_CASE(VK_RIGHT, RCTL_BM_RIGHT); 
			RCTL_KEY_CASE(VK_UP, RCTL_BM_UP); 
			RCTL_KEY_CASE(VK_DOWN, RCTL_BM_DOWN); 
			RCTL_KEY_CASE(VK_RETURN, RCTL_BM_SELECT); 
			RCTL_KEY_CASE(VK_MENU, RCTL_BM_MENU); 
		} 
	} 
 
	return S_OK; 
} 
 
STDMETHODIMP CRCtlKeys::EndRequest() 
{ 
	BOOL fRet = m_pMainWnd->CreateAccelTbl(m_bmKeys); 
 
	if (fRet) 
	{ 
		m_bytTrans |= TRANS_END; 
	} 
	else 
	{ 
		ASSERT(FALSE); 
		return E_FAIL; 
	} 
 
	return S_OK; 
} 
 
STDMETHODIMP CRCtlKeys::ReleaseRequest() 
{ 
	if (TRANS_COMPLETE != m_bytTrans) 
	{ 
		ASSERT(FALSE); 
		return E_UNEXPECTED; 
	} 
 
	m_bytTrans = 0; 
 
	BOOL fRet = m_pMainWnd->DestroyAccelTbl(); 
	if (!fRet) 
	{ 
		ASSERT(FALSE); 
		return E_FAIL; 
	} 
 
	return S_OK; 
} 
 
#define RCTL_PROPDECL(name, bit)	\ 
	STDMETHODIMP CRCtlKeys::get_##name(/*[out, retval]*/ VARIANT_BOOL* pVal) {	\ 
		if (!pVal) {															\ 
			ASSERT(FALSE);														\ 
			return E_POINTER; }													\ 
		if (TRANS_BEGIN != m_bytTrans) {										\ 
			ASSERT(FALSE);														\ 
			return E_UNEXPECTED; }												\ 
		*pVal = (m_bmKeys & bit != 0 ? VARIANT_TRUE : VARIANT_FALSE);			\ 
		return S_OK; }															\ 
	STDMETHODIMP CRCtlKeys::put_##name(/*[in]*/ VARIANT_BOOL newVal) {			\ 
		if (TRANS_BEGIN != m_bytTrans) {										\ 
			ASSERT(FALSE);														\ 
			return E_UNEXPECTED; }												\ 
		if (VARIANT_TRUE == newVal) m_bmKeys |= bit;							\ 
		else m_bmKeys &= ~bit;													\ 
		DEBUGMSG(1, (TEXT("remote control key bitmask: %u\r\n"), m_bmKeys));	\ 
		return S_OK; } 
 
RCTL_PROPDECL(Stop, RCTL_BM_STOP) 
RCTL_PROPDECL(Play, RCTL_BM_PLAY) 
RCTL_PROPDECL(Previous, RCTL_BM_PREV) 
RCTL_PROPDECL(Next, RCTL_BM_NEXT) 
RCTL_PROPDECL(Forward, RCTL_BM_FWD) 
RCTL_PROPDECL(Backward, RCTL_BM_BACK) 
RCTL_PROPDECL(Pause, RCTL_BM_PAUSE) 
RCTL_PROPDECL(VolumeUp, RCTL_BM_VOLUP) 
RCTL_PROPDECL(VolumeDown, RCTL_BM_VOLDN) 
RCTL_PROPDECL(Mute, RCTL_BM_MUTE) 
RCTL_PROPDECL(Menu, RCTL_BM_MENU) 
RCTL_PROPDECL(Up, RCTL_BM_UP) 
RCTL_PROPDECL(Down, RCTL_BM_DOWN) 
RCTL_PROPDECL(Left, RCTL_BM_LEFT) 
RCTL_PROPDECL(Right, RCTL_BM_RIGHT) 
RCTL_PROPDECL(Select, RCTL_BM_SELECT)