// File: syspol.cpp
//
// System policies
//
// This class tries to be efficient by only opening the key once
// and using KEY_QUERY_VALUE.
//
// Normally the policy keys don't exist, so the default setting is very important.

#include "precomp.h"
#include "syspol.h"

HKEY SysPol::m_hkey = NULL;


/*  F  E N S U R E  K E Y  O P E N  */
/*-------------------------------------------------------------------------
    %%Function: FEnsureKeyOpen
    
-------------------------------------------------------------------------*/
bool SysPol::FEnsureKeyOpen(void)
{
	if (NULL == m_hkey)
	{
		long lErr = ::RegOpenKeyEx(HKEY_CURRENT_USER, POLICIES_KEY, 0, KEY_QUERY_VALUE, &m_hkey);
		if (ERROR_SUCCESS != lErr)
		{
			WARNING_OUT(("FEnsureKeyOpen: problem opening system policy key. Err=%08X", lErr));
			return false;
		}
	}

	return true;
}

void SysPol::CloseKey(void)
{
	if (NULL != m_hkey)
	{
		::RegCloseKey(m_hkey);
		m_hkey = NULL;
	}
}


/*  G E T  N U M B E R  */
/*-------------------------------------------------------------------------
    %%Function: GetNumber
    
-------------------------------------------------------------------------*/
DWORD SysPol::GetNumber(LPCTSTR pszName, DWORD dwDefault)
{
	if (FEnsureKeyOpen())
	{
		DWORD dwType = REG_BINARY;
		DWORD dwValue = 0L;
		DWORD dwSize = sizeof(dwValue);
		long  lErr = ::RegQueryValueEx(m_hkey, pszName, 0, &dwType, (LPBYTE)&dwValue, &dwSize);
	
		if ((lErr == ERROR_SUCCESS) &&
		   ((REG_DWORD == dwType) ||  ((REG_BINARY == dwType) && (sizeof(dwValue) == dwSize))) )
		{
			dwDefault = dwValue;
		}
	}

	return dwDefault;
}


//////////////////////
// Positive Settings

bool SysPol::AllowDirectoryServices(void)
{
	return (0 == GetNumber(REGVAL_POL_NO_DIRECTORY_SERVICES, DEFAULT_POL_NO_DIRECTORY_SERVICES));
}

bool SysPol::AllowAddingServers(void)
{
	if (!AllowDirectoryServices())
		return FALSE;

	return (0 == GetNumber(REGVAL_POL_NO_ADDING_NEW_ULS, DEFAULT_POL_NO_ADDING_NEW_ULS));
}


//////////////////////
// Negative Settings


bool SysPol::NoAudio(void)
{
	return (0 != GetNumber(REGVAL_POL_NO_AUDIO, DEFAULT_POL_NO_AUDIO));
}

bool SysPol::NoVideoSend(void)
{
	return (0 != GetNumber(REGVAL_POL_NO_VIDEO_SEND, DEFAULT_POL_NO_VIDEO_SEND));
}

bool SysPol::NoVideoReceive(void)
{
	return (0 != GetNumber(REGVAL_POL_NO_VIDEO_RECEIVE, DEFAULT_POL_NO_VIDEO_RECEIVE));
}



UINT SysPol::GetMaximumBandwidth()
{
	UINT uRet;

	RegEntry re(POLICIES_KEY, HKEY_CURRENT_USER, FALSE);
	uRet = re.GetNumberIniStyle(REGVAL_POL_MAX_BANDWIDTH, 0);

	return uRet;
}