|
|
/**MOD+**********************************************************************/ /* Module: advset.cpp */ /* */ /* Class : CMstscAdvSettings */ /* */ /* Purpose: Implements advanced settings for RDP ActiveX control */ /* */ /* Copyright(C) Microsoft Corporation 1999-2000 */ /* */ /* Author : Nadim Abdo (nadima) */ /****************************************************************************/
#include "stdafx.h"
#include "advset.h"
#include "atlwarn.h"
#include "securedset.h"
BEGIN_EXTERN_C #define TRC_GROUP TRC_GROUP_UI
#define TRC_FILE "advset"
#include <atrcapi.h>
END_EXTERN_C
CMstscAdvSettings::CMstscAdvSettings() { m_pUI=NULL; m_bLockedForWrite=FALSE; _pAxControl = NULL; //
// Default is to make self safe for scripting
//
m_bMakeSafeForScripting = TRUE; }
CMstscAdvSettings::~CMstscAdvSettings() { }
BOOL CMstscAdvSettings::SetUI(CUI* pUI) { ATLASSERT(pUI); if(!pUI) { return FALSE; } m_pUI = pUI; return TRUE; }
//
// SmoothScroll property
//
STDMETHODIMP CMstscAdvSettings::put_SmoothScroll(LONG smoothScroll) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.smoothScrolling = smoothScroll != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_SmoothScroll(LONG* psmoothScroll) { ATLASSERT(m_pUI); if(!psmoothScroll) { return E_POINTER; }
*psmoothScroll = m_pUI->_UI.smoothScrolling; return S_OK; }
//
// AcceleratorPassthrough property
//
STDMETHODIMP CMstscAdvSettings::put_AcceleratorPassthrough(LONG acceleratorPassthrough) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.acceleratorCheckState = acceleratorPassthrough != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_AcceleratorPassthrough(LONG* pacceleratorPassthrough) { ATLASSERT(m_pUI); if(!pacceleratorPassthrough) { return E_POINTER; }
*pacceleratorPassthrough = m_pUI->_UI.acceleratorCheckState; return S_OK; }
//
// ShadowBitmap property
//
STDMETHODIMP CMstscAdvSettings::put_ShadowBitmap(LONG shadowBitmap) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.shadowBitmapEnabled = shadowBitmap != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_ShadowBitmap(LONG* pshadowBitmap) { ATLASSERT(m_pUI); if(!pshadowBitmap) { return E_POINTER; }
*pshadowBitmap = m_pUI->_UI.shadowBitmapEnabled; return S_OK; }
//
// TransportType property
//
STDMETHODIMP CMstscAdvSettings::put_TransportType(LONG transportType) { HRESULT hr = E_FAIL; if(GetLockedForWrite()) { return E_FAIL; }
//
// Validate - property is redundant today because we only have
// one allowed transport but we keep it for future extensibility
//
if (transportType == UI_TRANSPORT_TYPE_TCP) { m_pUI->_UI.transportType = (DCUINT16)transportType; hr = S_OK; } else { hr = E_INVALIDARG; }
return hr; }
STDMETHODIMP CMstscAdvSettings::get_TransportType(LONG* ptransportType) { ATLASSERT(m_pUI); if(!ptransportType) { return E_POINTER; }
*ptransportType = m_pUI->_UI.transportType; return S_OK; }
//
// SasSequence property
//
STDMETHODIMP CMstscAdvSettings::put_SasSequence(LONG sasSequence) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.sasSequence = (DCUINT16)sasSequence; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_SasSequence(LONG* psasSequence) { ATLASSERT(m_pUI); if(!psasSequence) { return E_POINTER; }
*psasSequence = m_pUI->_UI.sasSequence; return S_OK; }
//
// EncryptionEnabled property
//
STDMETHODIMP CMstscAdvSettings::put_EncryptionEnabled(LONG encryptionEnabled) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.encryptionEnabled = encryptionEnabled != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_EncryptionEnabled(LONG* pencryptionEnabled) { ATLASSERT(m_pUI); if(!pencryptionEnabled) { return E_POINTER; }
*pencryptionEnabled = m_pUI->_UI.encryptionEnabled; return S_OK; }
//
// DedicatedTerminal property
//
STDMETHODIMP CMstscAdvSettings::put_DedicatedTerminal(LONG dedicatedTerminal) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.dedicatedTerminal = dedicatedTerminal != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_DedicatedTerminal(LONG* pdedicatedTerminal) { ATLASSERT(m_pUI); if(!pdedicatedTerminal) { return E_POINTER; }
*pdedicatedTerminal = m_pUI->_UI.dedicatedTerminal; return S_OK; }
//
// MCSPort property
//
STDMETHODIMP CMstscAdvSettings::put_RDPPort(LONG RDPPort) { if(GetLockedForWrite()) { return E_FAIL; }
if(RDPPort < 0 || RDPPort > 65535) { return E_INVALIDARG; }
m_pUI->_UI.MCSPort = (DCUINT16)RDPPort; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_RDPPort(LONG* pRDPPort) { if(!pRDPPort) { return E_POINTER; }
*pRDPPort = m_pUI->_UI.MCSPort; return S_OK; }
//
// EnableMouse property
//
STDMETHODIMP CMstscAdvSettings::put_EnableMouse(LONG enableMouse) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_EnableMouse(LONG* penableMouse) { //
// Deprecated
//
return S_FALSE; }
//
// DisableCtrlAltDel property
//
STDMETHODIMP CMstscAdvSettings::put_DisableCtrlAltDel(LONG disableCtrlAltDel) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.fDisableCtrlAltDel = disableCtrlAltDel != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_DisableCtrlAltDel(LONG* pdisableCtrlAltDel) { ATLASSERT(m_pUI); if(!pdisableCtrlAltDel) { return E_POINTER; }
*pdisableCtrlAltDel = m_pUI->_UI.fDisableCtrlAltDel; return S_OK; }
//
// EnableWindowsKey property
//
STDMETHODIMP CMstscAdvSettings::put_EnableWindowsKey(LONG enableWindowsKey) { if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.fEnableWindowsKey = enableWindowsKey != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_EnableWindowsKey(LONG* penableWindowsKey) { ATLASSERT(m_pUI); if(!penableWindowsKey) { return E_POINTER; }
*penableWindowsKey = m_pUI->_UI.fEnableWindowsKey; return S_OK; }
//
// DoubleClickDetect property
//
STDMETHODIMP CMstscAdvSettings::put_DoubleClickDetect(LONG doubleClickDetect) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.fDoubleClickDetect = doubleClickDetect != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_DoubleClickDetect(LONG* pdoubleClickDetect) { ATLASSERT(m_pUI); if(!pdoubleClickDetect) { return E_POINTER; }
*pdoubleClickDetect = m_pUI->_UI.fDoubleClickDetect; return S_OK; }
//
// MaximizeShell property
//
STDMETHODIMP CMstscAdvSettings::put_MaximizeShell(LONG maximizeShell) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.fMaximizeShell = maximizeShell != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_MaximizeShell(LONG* pmaximizeShell) { ATLASSERT(m_pUI); if(!pmaximizeShell) { return E_POINTER; }
*pmaximizeShell = m_pUI->_UI.fMaximizeShell; return S_OK; }
//
// HotKeyFullScreen property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyFullScreen(LONG hotKeyFullScreen) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.fullScreen = hotKeyFullScreen; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyFullScreen(LONG* photKeyFullScreen) { ATLASSERT(m_pUI); if(!photKeyFullScreen) { return E_POINTER; }
*photKeyFullScreen = m_pUI->_UI.hotKey.fullScreen; return S_OK; }
//
// HotKeyCtrlEsc property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyCtrlEsc(LONG hotKeyCtrlEsc) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.ctrlEsc = hotKeyCtrlEsc; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyCtrlEsc(LONG* photKeyCtrlEsc) { ATLASSERT(m_pUI); if(!photKeyCtrlEsc) { return E_POINTER; }
*photKeyCtrlEsc = m_pUI->_UI.hotKey.ctrlEsc; return S_OK; }
//
// HotKeyAltEsc property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyAltEsc(LONG hotKeyAltEsc) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.altEsc = hotKeyAltEsc; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyAltEsc(LONG* photKeyAltEsc) { ATLASSERT(m_pUI); if(!photKeyAltEsc) { return E_POINTER; }
*photKeyAltEsc = m_pUI->_UI.hotKey.altEsc; return S_OK; }
//
// HotKeyAltTab property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyAltTab(LONG hotKeyAltTab) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.altTab = hotKeyAltTab; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyAltTab(LONG* photKeyAltTab) { ATLASSERT(m_pUI); if(!photKeyAltTab) { return E_POINTER; }
*photKeyAltTab = m_pUI->_UI.hotKey.altTab; return S_OK; }
//
// HotKeyAltShiftTab property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyAltShiftTab(LONG hotKeyAltShiftTab) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.altShifttab = hotKeyAltShiftTab; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyAltShiftTab(LONG* photKeyAltShiftTab) { ATLASSERT(m_pUI); if(!photKeyAltShiftTab) { return E_POINTER; }
*photKeyAltShiftTab = m_pUI->_UI.hotKey.altShifttab; return S_OK; }
//
// HotKeyAltSpace property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyAltSpace(LONG hotKeyAltSpace) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.altSpace = hotKeyAltSpace; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyAltSpace(LONG* photKeyAltSpace) { ATLASSERT(m_pUI); if(!photKeyAltSpace) { return E_POINTER; }
*photKeyAltSpace = m_pUI->_UI.hotKey.altSpace; return S_OK; }
//
// HotKeyCtrlAltDel property
//
STDMETHODIMP CMstscAdvSettings::put_HotKeyCtrlAltDel(LONG hotKeyCtrlAltDel) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.hotKey.ctlrAltdel = hotKeyCtrlAltDel; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_HotKeyCtrlAltDel(LONG* photKeyCtrlAltDel) { ATLASSERT(m_pUI); if(!photKeyCtrlAltDel) { return E_POINTER; }
*photKeyCtrlAltDel = m_pUI->_UI.hotKey.ctlrAltdel; return S_OK; }
//
// Compress property
//
STDMETHODIMP CMstscAdvSettings::put_Compress(LONG compress) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->UI_SetCompress(compress != 0); return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_Compress(LONG* pcompress) { ATLASSERT(m_pUI); if(!pcompress) { return E_POINTER; }
*pcompress = m_pUI->UI_GetCompress(); return S_OK; }
//
// BitmapPeristence property
//
STDMETHODIMP CMstscAdvSettings::put_BitmapPeristence(LONG bitmapPeristence) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.fBitmapPersistence = (bitmapPeristence != 0); return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_BitmapPeristence(LONG* pbitmapPeristence) { ATLASSERT(m_pUI); if(!pbitmapPeristence) { return E_POINTER; }
*pbitmapPeristence = m_pUI->_UI.fBitmapPersistence; return S_OK; }
//
// BitmapPersistence property
//
STDMETHODIMP CMstscAdvSettings::put_BitmapPersistence(LONG bitmapPersistence) { //Call on older incorrectly spelled property
return put_BitmapPeristence(bitmapPersistence); }
STDMETHODIMP CMstscAdvSettings::get_BitmapPersistence(LONG* pbitmapPersistence) { //Call on older incorrectly spelled property
return get_BitmapPeristence(pbitmapPersistence); }
//
////////////////////////////////////////////////////////////////////////////////////
//
// orderDrawThreshold property
//
STDMETHODIMP CMstscAdvSettings::put_orderDrawThreshold(LONG orderDrawThreshold) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_orderDrawThreshold(LONG* porderDrawThreshold) { //
// Deprecated
//
return S_FALSE; }
//
// BitmapCacheSize property
//
STDMETHODIMP CMstscAdvSettings::put_BitmapCacheSize(LONG bitmapCacheSize) { if(GetLockedForWrite()) { return E_FAIL; }
#ifndef OS_WINCE
if (bitmapCacheSize > 0 && bitmapCacheSize <= TSC_MAX_BITMAPCACHESIZE) #else //bitmap cache size is measured in KB and TSC_MAX_BITMAPCACHESIZE is in MB
if (bitmapCacheSize > 0 && bitmapCacheSize <= TSC_MAX_BITMAPCACHESIZE*1024) #endif
{ m_pUI->_UI.RegBitmapCacheSize = bitmapCacheSize; return S_OK; } else { return E_INVALIDARG; } }
STDMETHODIMP CMstscAdvSettings::get_BitmapCacheSize(LONG* pbitmapCacheSize) { ATLASSERT(m_pUI); if(!pbitmapCacheSize) { return E_POINTER; }
*pbitmapCacheSize = m_pUI->_UI.RegBitmapCacheSize; return S_OK; }
//
// BitmapVirtualCacheSize property
//
// TSAC's v1.0 only property for cache file size.
// In whistler applies to 8bpp cache file
// See BitmapVirtualCache16BppSize/24BppSize methods
//
STDMETHODIMP CMstscAdvSettings::put_BitmapVirtualCacheSize( LONG bitmapVirtualCacheSize) { if(GetLockedForWrite()) { return E_FAIL; }
if (bitmapVirtualCacheSize > 0 && bitmapVirtualCacheSize <= TSC_MAX_BITMAPCACHESIZE) { m_pUI->_UI.RegBitmapVirtualCache8BppSize = bitmapVirtualCacheSize; } else { return E_INVALIDARG; } return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_BitmapVirtualCacheSize( LONG* pbitmapVirtualCacheSize) { if(!pbitmapVirtualCacheSize) { return E_POINTER; }
*pbitmapVirtualCacheSize = m_pUI->_UI.RegBitmapVirtualCache8BppSize; return S_OK; }
//
// ScaleBitmapCachesByBPP property
//
STDMETHODIMP CMstscAdvSettings::put_ScaleBitmapCachesByBPP(LONG bScale) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_ScaleBitmapCachesByBPP(LONG *pbScale) { //
// Deprecated
//
return S_FALSE; }
//
// NumBitmapCaches property
//
STDMETHODIMP CMstscAdvSettings::put_NumBitmapCaches(LONG numBitmapCaches) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_NumBitmapCaches(LONG* pnumBitmapCaches) { //
// Deprecated
//
return S_FALSE; }
//
// CachePersistenceActive property
//
STDMETHODIMP CMstscAdvSettings::put_CachePersistenceActive(LONG cachePersistenceActive) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.RegPersistenceActive = cachePersistenceActive != 0; return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_CachePersistenceActive(LONG* pcachePersistenceActive) { ATLASSERT(m_pUI); if(!pcachePersistenceActive) { return E_POINTER; }
*pcachePersistenceActive = m_pUI->_UI.RegPersistenceActive; return S_OK; }
//
// brushSupportLevel property
//
STDMETHODIMP CMstscAdvSettings::put_brushSupportLevel(LONG brushSupportLevel) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_brushSupportLevel(LONG* pbrushSupportLevel) { //
// Deprecated
//
return S_FALSE; }
//
// put_PersistCacheDirectory property (Set only)
//
STDMETHODIMP CMstscAdvSettings::put_PersistCacheDirectory(BSTR PersistCacheDirectory) { //
// Deprecated
//
return S_FALSE; }
//
// minInputSendInterval property
//
STDMETHODIMP CMstscAdvSettings::put_minInputSendInterval(LONG minInputSendInterval) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_minInputSendInterval(LONG* pminInputSendInterval) { //
// Deprecated
//
return S_FALSE; }
//
// InputEventsAtOnce property
//
STDMETHODIMP CMstscAdvSettings::put_InputEventsAtOnce(LONG inputEventsAtOnce) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_InputEventsAtOnce(LONG* pinputEventsAtOnce) { //
// Deprecated
//
return S_FALSE; }
//
// maxEventCount property
//
STDMETHODIMP CMstscAdvSettings::put_maxEventCount(LONG maxEventCount) { //
// Deprecated
//
return S_FALSE; }
STDMETHODIMP CMstscAdvSettings::get_maxEventCount(LONG* pmaxEventCount) { //
// Deprecated
//
return S_FALSE; }
//
// keepAliveInterval property
//
STDMETHODIMP CMstscAdvSettings::put_keepAliveInterval(LONG keepAliveInterval) { HRESULT hr; if(GetLockedForWrite()) { return E_FAIL; } if (keepAliveInterval >= MIN_KEEP_ALIVE_INTERVAL || KEEP_ALIVE_INTERVAL_OFF == keepAliveInterval) {
m_pUI->_UI.keepAliveInterval = keepAliveInterval; hr = S_OK;
} else { hr = E_INVALIDARG; } return hr; }
STDMETHODIMP CMstscAdvSettings::get_keepAliveInterval(LONG* pkeepAliveInterval) { ATLASSERT(m_pUI); if(!pkeepAliveInterval) { return E_POINTER; }
*pkeepAliveInterval = m_pUI->_UI.keepAliveInterval; return S_OK; }
//
// allowBackgroundInput property
//
STDMETHODIMP CMstscAdvSettings::put_allowBackgroundInput(LONG allowBackgroundInput) { if (!m_bMakeSafeForScripting) { if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.allowBackgroundInput = allowBackgroundInput != 0; return S_OK; } else { //
// Deprecated when SFS
//
return S_FALSE; } }
STDMETHODIMP CMstscAdvSettings::get_allowBackgroundInput(LONG* pallowBackgroundInput) { if (!m_bMakeSafeForScripting) { if(!pallowBackgroundInput) { return E_POINTER; } *pallowBackgroundInput = m_pUI->_UI.allowBackgroundInput; return S_OK; } else { //
// Deprecated when SFS
//
return S_FALSE; } }
//
// KeyBoardLayoutStr property (put only)
//
STDMETHODIMP CMstscAdvSettings::put_KeyBoardLayoutStr(BSTR KeyBoardLayoutStr) { HRESULT hr = E_FAIL; if(GetLockedForWrite()) { return E_FAIL; }
if (KeyBoardLayoutStr) { hr = CUT::StringPropPut(m_pUI->_UI.szKeyBoardLayoutStr, SIZE_TCHARS(m_pUI->_UI.szKeyBoardLayoutStr), KeyBoardLayoutStr); } else { m_pUI->_UI.szKeyBoardLayoutStr[0] = NULL; hr = S_OK; }
return hr; }
//
// shutdownTimeout property
//
STDMETHODIMP CMstscAdvSettings::put_shutdownTimeout(LONG shutdownTimeout) { HRESULT hr; if(GetLockedForWrite()) { return E_FAIL; }
if (shutdownTimeout < MAX_TIMEOUT_SECONDS) { m_pUI->_UI.shutdownTimeout = shutdownTimeout; hr = S_OK; } else { hr = E_INVALIDARG; } return hr; }
STDMETHODIMP CMstscAdvSettings::get_shutdownTimeout(LONG* pshutdownTimeout) { ATLASSERT(m_pUI); if(!pshutdownTimeout) { return E_POINTER; }
*pshutdownTimeout = m_pUI->_UI.shutdownTimeout; return S_OK; }
//
// overallConnectionTimeout property
//
STDMETHODIMP CMstscAdvSettings::put_overallConnectionTimeout(LONG overallConnectionTimeout) { HRESULT hr; if(GetLockedForWrite()) { return E_FAIL; }
if (overallConnectionTimeout < MAX_TIMEOUT_SECONDS) { m_pUI->_UI.connectionTimeOut = overallConnectionTimeout; hr = S_OK; } else { hr = E_INVALIDARG; } return hr; }
STDMETHODIMP CMstscAdvSettings::get_overallConnectionTimeout(LONG* poverallConnectionTimeout) { ATLASSERT(m_pUI); if(!poverallConnectionTimeout) { return E_POINTER; }
*poverallConnectionTimeout = m_pUI->_UI.connectionTimeOut; return S_OK; }
//
// singleConnectionTimeout property
//
STDMETHODIMP CMstscAdvSettings::put_singleConnectionTimeout(LONG singleConnectionTimeout) { HRESULT hr; if(GetLockedForWrite()) { return E_FAIL; }
if (singleConnectionTimeout < MAX_TIMEOUT_SECONDS) { m_pUI->_UI.singleTimeout = singleConnectionTimeout; hr = S_OK; } else { hr = E_INVALIDARG; } return hr;
}
STDMETHODIMP CMstscAdvSettings::get_singleConnectionTimeout(LONG* psingleConnectionTimeout) { ATLASSERT(m_pUI); if(!psingleConnectionTimeout) { return E_POINTER; }
*psingleConnectionTimeout = m_pUI->_UI.singleTimeout; return S_OK; }
//
// KeyboardType property
//
STDMETHODIMP CMstscAdvSettings::put_KeyboardType(LONG keyboardType) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(keyboardType); return E_NOTIMPL; #else
if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.winceKeyboardType = keyboardType; return S_OK; #endif
}
STDMETHODIMP CMstscAdvSettings::get_KeyboardType(LONG* pkeyboardType) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(pkeyboardType); return E_NOTIMPL; #else
if(!pkeyboardType) { return E_POINTER; } *pkeyboardType = m_pUI->_UI.winceKeyboardType; return S_OK; #endif
}
//
// KeyboardSubType property
//
STDMETHODIMP CMstscAdvSettings::put_KeyboardSubType(LONG keyboardSubType) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(keyboardSubType); return E_NOTIMPL; #else
if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.winceKeyboardSubType = keyboardSubType; return S_OK; #endif
}
STDMETHODIMP CMstscAdvSettings::get_KeyboardSubType(LONG* pkeyboardSubType) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(pkeyboardSubType); return E_NOTIMPL; #else
if(!pkeyboardSubType) { return E_POINTER; } *pkeyboardSubType = m_pUI->_UI.winceKeyboardSubType; return S_OK; #endif
}
//
// KeyboardFunctionKey property
//
STDMETHODIMP CMstscAdvSettings::put_KeyboardFunctionKey(LONG keyboardFunctionKey) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(keyboardFunctionKey); return E_NOTIMPL; #else
if(GetLockedForWrite()) { return E_FAIL; } m_pUI->_UI.winceKeyboardFunctionKey = keyboardFunctionKey; return S_OK; #endif
}
STDMETHODIMP CMstscAdvSettings::get_KeyboardFunctionKey(LONG* pkeyboardFunctionKey) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(pkeyboardFunctionKey); return E_NOTIMPL; #else
if(!pkeyboardFunctionKey) { return E_POINTER; } *pkeyboardFunctionKey = m_pUI->_UI.winceKeyboardFunctionKey; return S_OK; #endif
}
//
// WinceFixedPalette property
//
STDMETHODIMP CMstscAdvSettings::put_WinceFixedPalette(LONG WinceFixedPalette) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(WinceFixedPalette); return E_NOTIMPL; #else
//
// Fix for WINCE
//
return E_NOTIMPL; #endif
}
STDMETHODIMP CMstscAdvSettings::get_WinceFixedPalette(LONG* pWinceFixedPalette) { #ifndef OS_WINCE
UNREFERENCED_PARAMETER(pWinceFixedPalette); return E_NOTIMPL; #else
//
// Fix for WINCE
//
return E_NOTIMPL; #endif
}
//
// PluginDlls
//
STDMETHODIMP CMstscAdvSettings::put_PluginDlls(BSTR PluginDlls) { DC_BEGIN_FN("put_PluginDlls");
if(GetLockedForWrite()) { return E_FAIL; }
if (PluginDlls) { LPTSTR szPlugins = (LPTSTR)(PluginDlls); //
//SECURITY!!!
//If we are safe for scripting, the plugin list
//must be verified to ensure it contains just dll names (no paths)
//Then a system defined base path is prepended to each dll name
//
if(m_bMakeSafeForScripting) { BOOL bIsSecureDllList = IsSecureDllList(szPlugins); if(bIsSecureDllList) { LPTSTR szExplicitPathDllList = CreateExplicitPathList(szPlugins); if(szExplicitPathDllList) { m_pUI->UI_SetVChanAddinList(szExplicitPathDllList); LocalFree(szExplicitPathDllList); } else { //
// Unable to create an explicit path list
//
TRC_ERR((TB,_T("CreateExplicitPathList failed for %s"), szPlugins)); return E_FAIL; } } else { TRC_ERR((TB,_T("IsSecureDllList failed for %s"), szPlugins)); return E_FAIL; } } else { //
// Don't need to be safe for an untrusted caller
// just pass in the vcahn plugin list directly to the core
//
m_pUI->UI_SetVChanAddinList( szPlugins); } } else { m_pUI->UI_SetVChanAddinList(NULL); }
DC_END_FN();
return S_OK; }
//
// IsSecureDllList
// determines if the CSV list of dlls in szDllList is secure
// the criteria we use are
// only dll names can be specified. NO PATHS, NO NETWORK SHARES.
//
BOOL CMstscAdvSettings::IsSecureDllList(LPCTSTR szDllList) { ATLASSERT(szDllList); if(szDllList) { //
// The only allowed values are alphanumeric characters
// '.' and ','.
//
LPCTSTR psz = szDllList; while (*psz) { if (!(iswalnum(*psz) || *psz == _T(',') || *psz == _T('.'))) { return FALSE; } psz++; }
//
// Check for evil characters '/\%'
//
if(_tcspbrk( szDllList, TEXT("/\\%"))) { return FALSE; }
//
// Now check for '..'
//
if(_tcsstr( szDllList, TEXT(".."))) { return FALSE; }
return TRUE; } else { return FALSE; } }
#define TS_VDLLPATH_KEYNAME TEXT("SOFTWARE\\Microsoft\\Terminal Server Client")
#define TS_VDLLPATH TEXT("vdllpath")
//
// CreateExplicitPathList
// params:
// szDllList - CSV list of dll names
// returns:
// CSV list of Dlls with explicit paths. Or NULL on error.
// ******CALLER MUST FREE RETURN STRING****
//
// Path prefix is taken from registry, or default value of system32
// if no registry setting is specified
//
//
LPTSTR CMstscAdvSettings::CreateExplicitPathList(LPCTSTR szDllList) { HKEY hKey; LONG retVal; BOOL bGotPathPrefix = FALSE; int i; LPTSTR szExplicitPathList = NULL; LPTSTR szDllListTmp = NULL; HRESULT hr; TCHAR szPathPrefix[MAX_PATH];
if(!szDllList || !*szDllList) { return NULL; }
//
// Try to get a path prefix from the registry
//
retVal = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TS_VDLLPATH_KEYNAME, 0, KEY_READ, &hKey); if(ERROR_SUCCESS == retVal) { DWORD cbData = sizeof(szPathPrefix); DWORD dwType; retVal = RegQueryValueEx(hKey, TS_VDLLPATH, NULL, &dwType, (PBYTE)&szPathPrefix, &cbData); if(ERROR_SUCCESS == retVal && REG_SZ == dwType) { //
// validate that the vdllpath does not contain any '\\'
// we don't just check the first char because someone
// could just pad with whitespace.
// This is done because network shares are not allowed
// for the dll path prefix
//
if((cbData >= 2 * sizeof(TCHAR)) && (_tcsstr( szPathPrefix, TEXT("\\\\")))) { //security violation, return failure
return NULL; } else { bGotPathPrefix = TRUE; } } RegCloseKey(hKey); }
if(!bGotPathPrefix) { #ifndef OS_WINCE
//Use default value of the system32 directory
if(!GetSystemDirectory( szPathPrefix, sizeof(szPathPrefix)/sizeof(TCHAR))) { return NULL; } else { bGotPathPrefix = TRUE; } #else
//CE doesn't have a GetSystemDirectory directory
return NULL; #endif
}
int cbDllListLen = _tcslen(szDllList) * sizeof(TCHAR) + sizeof(TCHAR); szDllListTmp = (LPTSTR) LocalAlloc(LPTR, cbDllListLen); if(NULL == szDllListTmp) { return NULL; } //
// szDllListTmp is allocated large enough to hold
// the szDllList so no need to length validate the copy
//
hr = StringCbCopy(szDllListTmp, cbDllListLen, szDllList); if (FAILED(hr)) { LocalFree(szDllListTmp); return NULL; }
int countDlls = 0; LPTSTR DllNames[CHANNEL_MAX_COUNT]; for(i=0; i<CHANNEL_MAX_COUNT; i++) { DllNames[i] = NULL; }
//
// Create an array of dllnames
// pointers in DllNames point inplace to substrings in szDllListTmp
//
BOOL bCurCharIsStart = FALSE; DllNames[0] = szDllListTmp; countDlls = 1;
LPTSTR sz = szDllListTmp; while(*sz) { if(bCurCharIsStart) { DllNames[countDlls++] = sz; if(countDlls > CHANNEL_MAX_COUNT) { //ABORT
LocalFree(szDllListTmp); return NULL; } //Reset
bCurCharIsStart = FALSE; }
if(TCHAR(',') == *sz) { *sz = NULL; bCurCharIsStart = TRUE; } sz++; }
//
// bytes needed for the explicit path version
// is at most MAX_PATH * number of dlls (20 is added to give us extra space)
//
int cbExplicitPath = countDlls * (MAX_PATH + 20) * sizeof(TCHAR); szExplicitPathList = (LPTSTR) LocalAlloc(LPTR, cbExplicitPath); if(NULL == szExplicitPathList) { LocalFree(szDllListTmp); return NULL; } memset(szExplicitPathList, 0 , cbExplicitPath); //
// Construct the explicit path list
// by splatting in the prefix followed by '\' followed by the dll name
// ensure that none of the dll paths exceed MAX_PATH..If any do, return FAILURE
//
int lenPrefix = _tcslen(szPathPrefix); for(i=0; i<countDlls;i++) { int lenPath = lenPrefix; lenPath += _tcslen(DllNames[i]); lenPath += 1; // for '\'
if(lenPath >= MAX_PATH - 1) { LocalFree(szExplicitPathList); LocalFree(szDllListTmp); return NULL; }
hr = StringCbCat(szExplicitPathList, cbExplicitPath, szPathPrefix); if (SUCCEEDED(hr)) { hr = StringCbCat(szExplicitPathList, cbExplicitPath, _T("\\")); if (SUCCEEDED(hr)) { hr = StringCbCat(szExplicitPathList, cbExplicitPath, DllNames[i]); if (SUCCEEDED(hr)) { if (i != (countDlls -1)) { //Last DLL, no trailing ","
hr = StringCbCat(szExplicitPathList, cbExplicitPath, _T(","));
} } } }
if (FAILED(hr)) { LocalFree(szExplicitPathList); LocalFree(szDllListTmp); return NULL; } }
LocalFree(szDllListTmp);
//caller must free
return szExplicitPathList; }
//
// IconFile
//
STDMETHODIMP CMstscAdvSettings::put_IconFile(BSTR IconFile) { HRESULT hr = E_FAIL; //
// Don't allow this property to be set in the web control case
// for attack surface reduction as we don't want to allow a script
// caller access to the local file system.
//
#if (defined(OS_WINCE) || defined(REDIST_CONTROL))
return S_FALSE; #else
if(GetLockedForWrite()) { return E_FAIL; }
if (IconFile) { hr = CUT::StringPropPut(m_pUI->_UI.szIconFile, SIZE_TCHARS(m_pUI->_UI.szIconFile), (LPTSTR)IconFile); } else { m_pUI->_UI.szIconFile[0] = NULL; hr = S_OK; } return hr; #endif
}
//
// Icon Index
//
STDMETHODIMP CMstscAdvSettings::put_IconIndex(LONG IconIndex) { //
// Don't allow this property to be set in the web control case
// for attack surface reduction as we don't want to allow a script
// caller access to the local file system.
//
#if (defined(OS_WINCE) || defined(REDIST_CONTROL))
return S_FALSE; #else
if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->_UI.iconIndex = IconIndex; return S_OK; #endif
}
//
// Container handled full screen mode
//
STDMETHODIMP CMstscAdvSettings::put_ContainerHandledFullScreen(BOOL ContainerHandledFullScreen) { HRESULT hr = E_FAIL;
DC_BEGIN_FN("put_ContainerHandledFullScreen");
if(GetLockedForWrite()) { return E_FAIL; }
if (!m_bMakeSafeForScripting) { m_pUI->_UI.fContainerHandlesFullScreenToggle = (ContainerHandledFullScreen != 0); hr = S_OK; } else { hr = S_FALSE; }
DC_END_FN(); return hr; }
STDMETHODIMP CMstscAdvSettings::get_ContainerHandledFullScreen(BOOL* pContainerHandledFullScreen) { HRESULT hr = E_FAIL;
DC_BEGIN_FN("get_ContainerHandledFullScreen");
if(!pContainerHandledFullScreen) { return E_INVALIDARG; }
if (!m_bMakeSafeForScripting) { *pContainerHandledFullScreen = m_pUI->_UI.fContainerHandlesFullScreenToggle ? VB_TRUE : VB_FALSE; hr = S_OK; } else { hr = S_FALSE; }
DC_END_FN(); return hr; }
//
// Disable loading RDPDR on first initialization
//
STDMETHODIMP CMstscAdvSettings::put_DisableRdpdr(BOOL DisableRdpdr) { if(!GetLockedForWrite()) { if(!m_pUI->UI_IsCoreInitialized()) { m_pUI->_UI.fDisableInternalRdpDr = (DisableRdpdr != 0); return S_OK; } else { return E_FAIL; } } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::get_DisableRdpdr(BOOL* pDisableRdpdr) { if( pDisableRdpdr ) { *pDisableRdpdr = m_pUI->_UI.fDisableInternalRdpDr ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::put_ConnectToServerConsole(VARIANT_BOOL connectToConsole) { if(!GetLockedForWrite()) { m_pUI->UI_SetConnectToServerConsole(connectToConsole != 0); return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::get_ConnectToServerConsole(VARIANT_BOOL* pConnectToConsole) { if(pConnectToConsole) { *pConnectToConsole = (m_pUI->UI_GetConnectToServerConsole() ? VB_TRUE : VB_FALSE); return S_OK; } else { return E_INVALIDARG; } }
STDMETHODIMP CMstscAdvSettings::put_MinutesToIdleTimeout( LONG minutesToIdleTimeout) { DC_BEGIN_FN("put_MinutesToIdleTimeout"); if(!GetLockedForWrite()) { if(minutesToIdleTimeout > MAX_MINS_TOIDLETIMEOUT) { TRC_ERR((TB,_T("idle timeout out of range: %d"), minutesToIdleTimeout)); return E_INVALIDARG; }
if(m_pUI->UI_SetMinsToIdleTimeout( minutesToIdleTimeout )) { return S_OK; } else { return E_FAIL; } } else { return E_FAIL; } DC_END_FN(); }
STDMETHODIMP CMstscAdvSettings::get_MinutesToIdleTimeout( LONG* pminutesToIdleTimeout) { DC_BEGIN_FN("get_MinutesToIdleTimeout"); if(pminutesToIdleTimeout) { *pminutesToIdleTimeout = m_pUI->UI_GetMinsToIdleTimeout(); return S_OK; } else { return E_INVALIDARG; } DC_END_FN(); }
#ifdef SMART_SIZING
/**PROC+*********************************************************************/ /* Name: get_SmartSize
/*
/* Purpose: get smart sizing property
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::get_SmartSizing(VARIANT_BOOL* pfSmartSize) { ATLASSERT(m_pUI);
if(!pfSmartSize) { return E_INVALIDARG; }
*pfSmartSize = m_pUI->UI_GetSmartSizing() ? VB_TRUE : VB_FALSE; return S_OK; }
/**PROC+*********************************************************************/ /* Name: put_SmartSize
/*
/* Purpose: put smart sizing property
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::put_SmartSizing(VARIANT_BOOL fSmartSize) { OSVERSIONINFOA OsVer; memset(&OsVer, 0x0, sizeof(OSVERSIONINFOA)); OsVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); GetVersionExA(&OsVer); HRESULT hr = S_OK;
if ((VER_PLATFORM_WIN32_NT != OsVer.dwPlatformId) && fSmartSize) {
//
// Win9x doesn't support halftoning, so no smart sizing for them!
//
return E_NOTIMPL; }
//no, these lines of code are not as bad as they look
//vb's true is 0xFFFFFFF so don't just blindy assign
hr = m_pUI->UI_SetSmartSizing( fSmartSize != 0); return hr; } #endif // SMART_SIZING
//
// Pass in the local printing doc name string to RDPDR
// this method's main purpose is so we don't need to add
// a localizable string to the control. There is a default
// english string built into the control, a container can
// pass in any replacement (i.e localized) string it pleases
//
STDMETHODIMP CMstscAdvSettings::put_RdpdrLocalPrintingDocName( BSTR RdpdrLocalPrintingDocName) { DC_BEGIN_FN("put_RdpdrLocalPrintingDocName");
DC_END_FN(); return S_FALSE; //deprecated
}
//
// Return the currently selected string
// for the local printing doc name. This is just a string
// RDPDR uses but we want to avoid localizing the control
// so the string is passed in from the container.
//
STDMETHODIMP CMstscAdvSettings::get_RdpdrLocalPrintingDocName( BSTR *pRdpdrLocalPrintingDocName) { DC_BEGIN_FN("get_RdpdrLocalPrintingDocName");
DC_END_FN(); return S_FALSE; //deprecated
}
STDMETHODIMP CMstscAdvSettings::put_RdpdrClipCleanTempDirString( BSTR RdpdrClipCleanTempDirString) { DC_BEGIN_FN("put_RdpdrClipCleanTempDirString");
DC_END_FN(); return S_FALSE; //deprecated
}
STDMETHODIMP CMstscAdvSettings::get_RdpdrClipCleanTempDirString( BSTR *pRdpdrClipCleanTempDirString) { DC_BEGIN_FN("get_RdpdrClipCleanTempDirString");
DC_END_FN(); return S_FALSE; //deprecated
}
STDMETHODIMP CMstscAdvSettings::put_RdpdrClipPasteInfoString( BSTR RdpdrClipPasteInfoString) { DC_BEGIN_FN("put_RdpdrClipPasteInfoString");
DC_END_FN(); return S_FALSE; //deprecated
}
STDMETHODIMP CMstscAdvSettings::get_RdpdrClipPasteInfoString( BSTR *pRdpdrClipPasteInfoString) { DC_BEGIN_FN("get_RdpdrClipPasteInfoString");
DC_END_FN(); return S_FALSE; //deprecated
}
//
// New Whistler scriptable access to password API
// this just delegates to the non-scriptable API from TSAC
//
STDMETHODIMP CMstscAdvSettings::put_ClearTextPassword(BSTR clearTextPassword) { DC_BEGIN_FN("put_ClearTextPassword");
TRC_ASSERT(_pAxControl, (TB,_T("_pAxControl is NULL")));
if(!GetLockedForWrite() && _pAxControl) { if(clearTextPassword) { return _pAxControl->put_ClearTextPassword( clearTextPassword ); } else { return E_INVALIDARG; } } else { return E_FAIL; }
DC_END_FN(); }
/**PROC+*********************************************************************/ /* Name: put_DisplayConnectionBar
/*
/* Purpose: Set display connection bar prop
/* cannot be set in web control (it is always true there)
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::put_DisplayConnectionBar( VARIANT_BOOL fDisplayConnectionBar) { ATLASSERT(m_pUI);
#if (!defined (OS_WINCE)) || (!defined (WINCE_SDKBUILD))
if(!m_bMakeSafeForScripting && !GetLockedForWrite()) { m_pUI->UI_SetEnableBBar( fDisplayConnectionBar != 0); } else { //
// Not allowed to toggle this
// if need to be safe for scripting as the bbar
// prevents spoofing attacks because people
// can always realize this is a TS session.
//
return E_FAIL; }
return S_OK; #else
return E_NOTIMPL; #endif
}
/**PROC+*********************************************************************/ /* Name: get_DisplayConnectionBar
/*
/* Purpose: put start connected property
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::get_DisplayConnectionBar( VARIANT_BOOL* pfDisplayConnectionBar) { #if (!defined (OS_WINCE)) || (!defined (WINCE_SDKBUILD))
if(pfDisplayConnectionBar) { *pfDisplayConnectionBar = m_pUI->UI_GetEnableBBar() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } #else
return E_NOTIMPL; #endif
}
/**PROC+*********************************************************************/ /* Name: put_PinConnectionBar
/*
/* Purpose: Set Pin connection bar prop
/* cannot be set in web control (it is always true there)
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::put_PinConnectionBar( VARIANT_BOOL fPinConnectionBar) { #if (!defined (OS_WINCE)) || (!defined (WINCE_SDKBUILD))
if (!m_bMakeSafeForScripting) { if (!GetLockedForWrite()) { m_pUI->UI_SetBBarPinned( fPinConnectionBar != 0); } else { //
// Not allowed to toggle this
// if need to be safe for scripting as the bbar
// prevents spoofing attacks because people
// can always realize this is a TS session.
//
return E_FAIL; } return S_OK; } else { return E_NOTIMPL; } #else
return E_NOTIMPL; #endif
}
/**PROC+*********************************************************************/ /* Name: get_PinConnectionBar
/*
/* Purpose: put start connected property
/*
/**PROC-*********************************************************************/ STDMETHODIMP CMstscAdvSettings::get_PinConnectionBar( VARIANT_BOOL* pfPinConnectionBar) { #if (!defined (OS_WINCE)) || (!defined (WINCE_SDKBUILD))
if (!m_bMakeSafeForScripting) { if(pfPinConnectionBar) { *pfPinConnectionBar = m_pUI->UI_GetBBarPinned() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } } else { return E_NOTIMPL; } #else
return E_NOTIMPL; #endif
}
//
// GrabFocusOnConnect (defaults to true)
// can turn this off to allow containers to control
// when the client gets the focus (e.g the MMC snapin)
// needs to manage this for multiple instances
//
STDMETHODIMP CMstscAdvSettings::put_GrabFocusOnConnect( VARIANT_BOOL fGrabFocusOnConnect) { DC_BEGIN_FN("put_GrabFocusOnConnect");
ATLASSERT(m_pUI);
if(!GetLockedForWrite()) { m_pUI->UI_SetGrabFocusOnConnect( fGrabFocusOnConnect != 0); return S_OK; } else { return E_FAIL; }
DC_END_FN(); }
STDMETHODIMP CMstscAdvSettings::get_GrabFocusOnConnect( VARIANT_BOOL* pfGrabFocusOnConnect) { DC_BEGIN_FN("get_GrabFocusOnConnect");
if(pfGrabFocusOnConnect) { *pfGrabFocusOnConnect = m_pUI->UI_GetGrabFocusOnConnect() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; }
DC_END_FN(); }
//
// Name: put_LoadBalanceInfo
//
// Purpose: LoadBalance info property input function.
//
#define LBINFO_MAX_LENGTH 256
STDMETHODIMP CMstscAdvSettings::put_LoadBalanceInfo(BSTR newLBInfo) { DC_BEGIN_FN("put_LoadBalanceInfo"); if(!GetLockedForWrite()) { if (newLBInfo) { if (SysStringByteLen(newLBInfo) <= LBINFO_MAX_LENGTH) m_pUI->UI_SetLBInfo((PBYTE)newLBInfo, SysStringByteLen(newLBInfo)); else return E_INVALIDARG; } else { m_pUI->UI_SetLBInfo(NULL, 0); } } else { return E_FAIL; }
DC_END_FN();
return S_OK; }
//
// Name: get_LoadBalanceInfo
//
// Purpose: LoadBalance info property get function.
//
STDMETHODIMP CMstscAdvSettings::get_LoadBalanceInfo(BSTR* pLBInfo) { DC_BEGIN_FN("get_LoadBalanceInfo"); if(!pLBInfo) { return E_INVALIDARG; }
*pLBInfo = SysAllocStringByteLen((LPCSTR)(m_pUI->_UI.bstrScriptedLBInfo), SysStringByteLen(m_pUI->_UI.bstrScriptedLBInfo));
if(!*pLBInfo) { return E_OUTOFMEMORY; }
return S_OK; }
STDMETHODIMP CMstscAdvSettings::put_RedirectDrives(VARIANT_BOOL redirectDrives) { DC_BEGIN_FN("put_RedirectDrives");
if(!GetLockedForWrite()) { if (CMsTscSecuredSettings::IsDriveRedirGloballyDisabled()) { m_pUI->UI_SetDriveRedirectionEnabled(FALSE); return S_FALSE; } else { m_pUI->UI_SetDriveRedirectionEnabled( (redirectDrives != 0)); return S_OK; } } else { return E_FAIL; }
DC_END_FN(); }
STDMETHODIMP CMstscAdvSettings::get_RedirectDrives(VARIANT_BOOL *pRedirectDrives) { if(pRedirectDrives) { *pRedirectDrives = m_pUI->UI_GetDriveRedirectionEnabled() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } }
STDMETHODIMP CMstscAdvSettings::put_RedirectPrinters(VARIANT_BOOL redirectPrinters) { if(!GetLockedForWrite()) { m_pUI->UI_SetPrinterRedirectionEnabled( (redirectPrinters != 0)); return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::get_RedirectPrinters(VARIANT_BOOL *pRedirectPrinters) { if(pRedirectPrinters) { *pRedirectPrinters = m_pUI->UI_GetPrinterRedirectionEnabled() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } }
STDMETHODIMP CMstscAdvSettings::put_RedirectPorts(VARIANT_BOOL redirectPorts) { if(!GetLockedForWrite()) { m_pUI->UI_SetPortRedirectionEnabled( (redirectPorts != 0)); return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::get_RedirectPorts(VARIANT_BOOL *pRedirectPorts) { if(pRedirectPorts) { *pRedirectPorts = m_pUI->UI_GetPortRedirectionEnabled() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } }
STDMETHODIMP CMstscAdvSettings::put_RedirectSmartCards(VARIANT_BOOL redirectScard) { if(!GetLockedForWrite()) { m_pUI->UI_SetSCardRedirectionEnabled(redirectScard != 0); return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CMstscAdvSettings::get_RedirectSmartCards(VARIANT_BOOL *pRedirectScard) { if(pRedirectScard) { *pRedirectScard = m_pUI->UI_GetSCardRedirectionEnabled() ? VB_TRUE : VB_FALSE; return S_OK; } else { return E_INVALIDARG; } }
//
// BitmapVirtualCache16BppSize property
//
// Applies to 15/16Bpp cache file size
//
STDMETHODIMP CMstscAdvSettings::put_BitmapVirtualCache16BppSize( LONG bitmapVirtualCache16BppSize) { if(GetLockedForWrite()) { return E_FAIL; }
if (bitmapVirtualCache16BppSize > 0 && bitmapVirtualCache16BppSize <= TSC_MAX_BITMAPCACHESIZE) { m_pUI->_UI.RegBitmapVirtualCache16BppSize = bitmapVirtualCache16BppSize; } else { return E_INVALIDARG; } return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_BitmapVirtualCache16BppSize( LONG* pbitmapVirtualCache16BppSize) { if(!pbitmapVirtualCache16BppSize) { return E_POINTER; }
*pbitmapVirtualCache16BppSize = m_pUI->_UI.RegBitmapVirtualCache16BppSize; return S_OK; }
//
// BitmapVirtualCache24BppSize property
//
// Applies to 24Bpp cache file size
//
STDMETHODIMP CMstscAdvSettings::put_BitmapVirtualCache24BppSize( LONG bitmapVirtualCache24BppSize) { if(GetLockedForWrite()) { return E_FAIL; }
if (bitmapVirtualCache24BppSize > 0 && bitmapVirtualCache24BppSize <= TSC_MAX_BITMAPCACHESIZE) { m_pUI->_UI.RegBitmapVirtualCache24BppSize = bitmapVirtualCache24BppSize; } else { return E_INVALIDARG; } return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_BitmapVirtualCache24BppSize( LONG* pbitmapVirtualCache24BppSize) { if(!pbitmapVirtualCache24BppSize) { return E_POINTER; }
*pbitmapVirtualCache24BppSize = m_pUI->_UI.RegBitmapVirtualCache24BppSize; return S_OK; }
//
// Sets the disabled feature list (for perf reasons can disable
// certain features at the server e.g wallpaper)
//
STDMETHODIMP CMstscAdvSettings::put_PerformanceFlags( LONG DisableFeatList) { DC_BEGIN_FN("put_PerformanceFlags");
if(GetLockedForWrite()) { return E_FAIL; }
m_pUI->UI_SetPerformanceFlags((DWORD)DisableFeatList); DC_END_FN(); return S_OK; }
STDMETHODIMP CMstscAdvSettings::get_PerformanceFlags( LONG* pDisableFeatList) { DC_BEGIN_FN("get_PerformanceFlags");
if(!pDisableFeatList) { return E_POINTER; }
*pDisableFeatList = (LONG) m_pUI->UI_GetPerformanceFlags();
DC_END_FN(); return S_OK; }
/*****************************************************************************/ /* Purpose : This is Remote Assistance specific call to support reverse */ /* connection pcHealth must have invoke necessary routine in Salem *
/* to connection with TermSrv and then instruct Salem to pass this */ /* connection to ActiveX control to begin login sequence */ /* */ /* Param : IN pConnectionEndPoint - Connected socket */ /*****************************************************************************/ STDMETHODIMP CMstscAdvSettings::put_ConnectWithEndpoint( VARIANT* pConnectionEndpoint ) { #if REDIST_CONTROL
return E_NOTIMPL;
#else
HRESULT hr = S_OK;
DC_BEGIN_FN( "ConnectionEndpoint" );
if( pConnectionEndpoint->vt != VT_BYREF ) { hr = E_HANDLE; } else { hr = _pAxControl->SetConnectWithEndpoint( (SOCKET)pConnectionEndpoint->byref ); }
DC_END_FN();
return hr;
#endif
}
/*****************************************************************************/ /* Purpose : This is Remote Assistance specific call to notify TS public */ /* key uses in generate session encryption key. */ /* */ /* Param : IN fNotify - TRUE to notify public key, FALSE otherwise */ /*****************************************************************************/ STDMETHODIMP CMstscAdvSettings::put_NotifyTSPublicKey( VARIANT_BOOL fNotify ) { #if REDIST_CONTROL
return E_NOTIMPL;
#else
#ifndef OS_WINCE
HRESULT hr; #endif
if(GetLockedForWrite()) { return E_FAIL; } m_pUI->UI_SetNotifyTSPublicKey( fNotify );
return S_OK;
#endif
}
/*****************************************************************************/ /* Purpose : Get current setting on whether ActiveX control will notify */ /* container when it received TS public key */ /* */ /* Returns : TRUE to notify public key, FALSE otherwise */ /*****************************************************************************/ STDMETHODIMP CMstscAdvSettings::get_NotifyTSPublicKey( VARIANT_BOOL* pfNotifyTSPublicKey ) { #if REDIST_CONTROL
return E_NOTIMPL;
#else
BOOL fNotify;
if(!pfNotifyTSPublicKey) { return E_POINTER; }
fNotify = m_pUI->UI_GetNotifyTSPublicKey(); return S_OK;
#endif
}
//
// Retrieves VARIANT_TRUE if we can autoreconnect
// i.e. the core has received an autoreconnect cookie
// from the server from a previous connection and the
// server has not been changed
//
STDMETHODIMP CMstscAdvSettings::get_CanAutoReconnect( VARIANT_BOOL* pfCanAutoReconnect ) { HRESULT hr; DC_BEGIN_FN("get_CanAutoReconnect");
if (pfCanAutoReconnect) { *pfCanAutoReconnect = m_pUI->UI_CanAutoReconnect() ? VB_TRUE : VB_FALSE; hr = S_OK; } else { hr = E_INVALIDARG; }
DC_END_FN(); return hr; }
//
// Sets w/not any autoreconnection information
// will be used for the next connection. Also specifies
// if we should store any autoreconnection information
// the server sends down.
//
STDMETHODIMP CMstscAdvSettings::put_EnableAutoReconnect( VARIANT_BOOL fEnableAutoReconnect ) { HRESULT hr; DC_BEGIN_FN("put_EnableAutoReconnect");
if (!GetLockedForWrite() && m_pUI) { m_pUI->UI_SetEnableAutoReconnect(fEnableAutoReconnect != 0); hr = S_OK; } else { hr = E_FAIL; }
DC_END_FN(); return hr; }
//
// Retrieves state of w/not we should use autoreconnection
//
//
STDMETHODIMP CMstscAdvSettings::get_EnableAutoReconnect( VARIANT_BOOL* pfEnableAutoReconnect ) { HRESULT hr; DC_BEGIN_FN("get_EnableAutoReconnect");
if (pfEnableAutoReconnect) { *pfEnableAutoReconnect = m_pUI->UI_GetEnableAutoReconnect() ? VB_TRUE : VB_FALSE; hr = S_OK; } else { hr = E_INVALIDARG; }
DC_END_FN(); return hr; }
//
// Specify the max number of ARC retries
//
STDMETHODIMP CMstscAdvSettings::put_MaxReconnectAttempts( LONG MaxReconnectAttempts ) { HRESULT hr; DC_BEGIN_FN("put_MaxReconnectAttempts");
if (!GetLockedForWrite() && m_pUI) { if (MaxReconnectAttempts > 200) { MaxReconnectAttempts = 200; } else if (MaxReconnectAttempts < 0) { MaxReconnectAttempts = 0; } m_pUI->UI_SetMaxArcAttempts(MaxReconnectAttempts); hr = S_OK; } else { hr = E_FAIL; }
DC_END_FN(); return hr; }
//
// Retrieves state of w/not we should use autoreconnection
//
//
STDMETHODIMP CMstscAdvSettings::get_MaxReconnectAttempts( LONG* pMaxReconnectAttempts ) { HRESULT hr; DC_BEGIN_FN("get_MaxReconnectAttempts");
if (pMaxReconnectAttempts) { *pMaxReconnectAttempts = m_pUI->UI_GetMaxArcAttempts(); hr = S_OK; } else { hr = E_INVALIDARG; }
DC_END_FN(); return hr; }
//
// Display BBar minimize button
//
STDMETHODIMP CMstscAdvSettings::put_ConnectionBarShowMinimizeButton( VARIANT_BOOL fShowMinimizeButton ) { HRESULT hr; DC_BEGIN_FN("put_EnableAutoReconnect");
if (!GetLockedForWrite() && m_pUI) { m_pUI->UI_SetBBarShowMinimize(fShowMinimizeButton != 0); hr = S_OK; } else { hr = E_FAIL; }
DC_END_FN(); return hr; }
//
// get display bbar minimize button
//
STDMETHODIMP CMstscAdvSettings::get_ConnectionBarShowMinimizeButton( VARIANT_BOOL* pfShowMinimizeButton ) { HRESULT hr; DC_BEGIN_FN("get_ConnectionBarShowMinimizeButton");
if (pfShowMinimizeButton) { *pfShowMinimizeButton = m_pUI->UI_GetBBarShowMinimize() ? VB_TRUE : VB_FALSE; hr = S_OK; } else { hr = E_INVALIDARG; }
DC_END_FN(); return hr; }
//
// set bbar restore button
//
STDMETHODIMP CMstscAdvSettings::put_ConnectionBarShowRestoreButton( VARIANT_BOOL fShowRestoreButton ) { HRESULT hr; DC_BEGIN_FN("put_EnableAutoReconnect");
if (!GetLockedForWrite() && m_pUI) { m_pUI->UI_SetBBarShowRestore(fShowRestoreButton != 0); hr = S_OK; } else { hr = E_FAIL; }
DC_END_FN(); return hr; }
//
// get bbar restore button
//
STDMETHODIMP CMstscAdvSettings::get_ConnectionBarShowRestoreButton( VARIANT_BOOL* pfShowRestoreButton ) { HRESULT hr; DC_BEGIN_FN("get_ConnectionBarShowRestoreButton");
if (pfShowRestoreButton) { *pfShowRestoreButton = m_pUI->UI_GetBBarShowRestore() ? VB_TRUE : VB_FALSE; hr = S_OK; } else { hr = E_INVALIDARG; }
DC_END_FN(); return hr; }
|