windows-nt/Source/XPSP1/NT/net/rras/ras/ui/rassrvui/miscdb.c
2020-09-26 16:20:57 +08:00

350 lines
9.1 KiB
C

/*
File Miscdb.c
Implementation of the miscellaneous settings database.
Paul Mayfield, 10/8/97
*/
#include "rassrv.h"
#include "miscdb.h"
#include <stdlib.h>
// ===================================
// Definitions of the database objects
// ===================================
#define FLAG_MULTILINK 1
#define FLAG_SHOWICON 2
typedef struct _RASSRV_MISCDB {
BOOL bMultilinkEnabled;
BOOL bShowIcons;
BOOL bFlushOnClose;
BOOL bIsServer;
DWORD dwOrigFlags;
DWORD dwLogLevel;
BOOL bLogLevelDirty;
} RASSRV_MISCDB;
// Opens a handle to the database of general tab values
DWORD miscOpenDatabase(HANDLE * hMiscDatabase) {
RASSRV_MISCDB * This;
DWORD dwErr, i;
if (!hMiscDatabase)
return ERROR_INVALID_PARAMETER;
// Allocate the database cache
if ((This = RassrvAlloc (sizeof(RASSRV_MISCDB), TRUE)) == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
// Initialize the values from the system
miscReloadDatabase((HANDLE)This);
// Record the original flag state for efficiency
This->dwOrigFlags = 0;
if (This->bMultilinkEnabled)
This->dwOrigFlags |= FLAG_MULTILINK;
if (This->bShowIcons)
This->dwOrigFlags |= FLAG_SHOWICON;
// Return the handle
*hMiscDatabase = (HANDLE)This;
This->bFlushOnClose = FALSE;
return NO_ERROR;
}
// Closes the general database and flushes any changes
// to the system when bFlushOnClose is TRUE
DWORD miscCloseDatabase(HANDLE hMiscDatabase) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
// Flush if requested
if (This->bFlushOnClose)
miscFlushDatabase(hMiscDatabase);
// Free up the database cache
RassrvFree(This);
return NO_ERROR;
}
BOOL miscFlagsAreSame(BOOL bVal, DWORD dwFlags, DWORD dwFlag) {
if ((bVal != 0) && ((dwFlags & dwFlag) != 0))
return TRUE;
if ((bVal == 0) && ((dwFlags & dwFlag) == 0))
return TRUE;
return FALSE;
}
//for whistler bug 143344 gangz
//
DWORD
miscTrayNotifyIconChangeCleanUp(
IN OUT LPHNPMParams pInfo)
{
HnPMParamsConnectionCleanUp(pInfo);
return NO_ERROR;
}//miscTrayNotifyIconChangeCleanUp()
//Notify that the "Show Icon in Notification area" has changed
//Used by GenCommand() in GenTab.c
//
DWORD
miscTrayNotifyIconChange()
{
INetConnectionSysTray * pSysTray = NULL;
HNPMParams Info;
LPHNPMParams pInfo;
HRESULT hr;
DWORD dwErr = NO_ERROR, i;
static const CLSID CLSID_InboundConnection=
{0xBA126AD9,0x2166,0x11D1,{0xB1,0xD0,0x00,0x80,0x5F,0xC1,0x27,0x0E}};
TRACE("miscTrayNotifyIconChanged");
ZeroMemory(&Info, sizeof(Info));
pInfo = &Info;
do{
dwErr = HnPMConnectionEnum(pInfo);
if ( NO_ERROR != dwErr )
{
TRACE("miscTrayNotifyIconChange: HnPMConnectionEnum failed!");
break;
}
TRACE1("miscTrayNotifyIconChange: %l Connections detected", pInfo->ConnCount);
//Set up PortMapping for each connection
//
for ( i = 0; i < pInfo->ConnCount; i++ )
{
//won't do PortMapping for Incoming connections
//
if ( pInfo->ConnPropTable )
{
//define the class id for Incoming connections
// reference to /nt/net/config/shell/wanui/rasui.cpp
if( IsEqualCLSID(
&CLSID_InboundConnection,
&(pInfo->ConnPropTable[i].clsidThisObject) ) )
{
hr = INetConnection_QueryInterface(
pInfo->ConnArray[i],
&IID_INetConnectionSysTray,
&pSysTray);
ASSERT(pSysTray);
if ( !SUCCEEDED(hr))
{
TRACE("miscTrayNotifyIconChange: Query pSysTray failed!");
dwErr = ERROR_CAN_NOT_COMPLETE;
break;
}
if( !pSysTray )
{
TRACE("miscTrayNotifyIconChange: pSysTray get NULL pointer!");
dwErr = ERROR_CAN_NOT_COMPLETE;
break;
}
INetConnectionSysTray_IconStateChanged(pSysTray);
break;
}
}
}//end of for(;;)
if(pSysTray)
{
INetConnectionSysTray_Release(pSysTray);
}
}
while(FALSE);
miscTrayNotifyIconChangeCleanUp(pInfo);
return dwErr;
}//end of miscTrayNotifyIconChange()
// Commits any changes made to the general tab values
DWORD miscFlushDatabase(HANDLE hMiscDatabase) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
DWORD dwErr, dwRet = NO_ERROR;
// Flush out the multilink value
if (!miscFlagsAreSame(This->bMultilinkEnabled, This->dwOrigFlags, FLAG_MULTILINK)) {
dwErr = RasSrvSetMultilink(This->bMultilinkEnabled);
if (dwErr != NO_ERROR) {
DbgOutputTrace("miscFlushDatabase: Can't commit multilink 0x%08x", dwErr);
dwRet = dwErr;
}
}
// Flush the show icon setting
if (!miscFlagsAreSame(This->bShowIcons, This->dwOrigFlags, FLAG_SHOWICON))
{
DWORD dwErr = NO_ERROR;
dwErr = RasSrvSetIconShow(This->bShowIcons);
if (dwErr != NO_ERROR) {
DbgOutputTrace("miscFlushDatabase: Can't commit show icons 0x%08x", dwErr);
dwRet = dwErr;
}
//for whistler bug 143344 gangz
//update the tray icon on the taskbar
//This notification should be done after RasSrvSetIconShow()
//
dwErr = miscTrayNotifyIconChange();
TRACE1("miscFlushDatabase: %s", NO_ERROR == dwErr ?
"miscTrayNotifyIconChange succeeded!" :
"miscTrayNotifyIconChange failed!");
}
// Flush the log level setting as appropriate
if (This->bLogLevelDirty)
{
RasSrvSetLogLevel(This->dwLogLevel);
}
return dwRet;
}
// Rollsback any changes made to the general tab values
DWORD miscRollbackDatabase(HANDLE hMiscDatabase) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
This->bFlushOnClose = FALSE;
return NO_ERROR;
}
// Reloads any values for the general tab from disk
DWORD miscReloadDatabase(HANDLE hMiscDatabase) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
DWORD dwRet = NO_ERROR, dwErr, dwFlags = 0;
// Initialize the product type
dwErr = RasSrvGetMachineFlags (&dwFlags);
if (dwErr != NO_ERROR)
{
DbgOutputTrace("RasSrvGetMachineFlags: Failed %x", dwErr);
dwRet = dwErr;
}
// Initialize what we can from the flags
//
This->bIsServer = !!(dwFlags & RASSRVUI_MACHINE_F_Server);
// Initialize the show icons setting
//
dwErr = RasSrvGetIconShow(&This->bShowIcons);
if (dwErr != NO_ERROR)
{
DbgOutputTrace("miscReloadDatabase: Can't get iconshow 0x%08x", dwErr);
dwRet = dwErr;
}
// Initialize multilink setting
//
dwErr = RasSrvGetMultilink(&(This->bMultilinkEnabled));
if (dwErr != NO_ERROR)
{
DbgOutputTrace("miscReloadDatabase: Can't get encryption 0x%08x", dwErr);
dwRet = dwErr;
}
return dwRet;
}
// Gets the multilink enable status
DWORD miscGetMultilinkEnable(HANDLE hMiscDatabase, BOOL * pbEnabled) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This || !pbEnabled)
return ERROR_INVALID_PARAMETER;
if (!pbEnabled)
return ERROR_INVALID_HANDLE;
*pbEnabled = This->bMultilinkEnabled;
return NO_ERROR;
}
// Sets the multilink enable status
DWORD miscSetMultilinkEnable(HANDLE hMiscDatabase, BOOL bEnable) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This)
return ERROR_INVALID_PARAMETER;
This->bMultilinkEnabled = bEnable;
return NO_ERROR;
}
// Gets the enable status of the "Show icons in the task bar" check box
DWORD miscGetIconEnable(HANDLE hMiscDatabase, BOOL * pbEnabled) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This || !pbEnabled)
return ERROR_INVALID_PARAMETER;
*pbEnabled = This->bShowIcons;
return NO_ERROR;
}
// Sets the enable status of the "Show icons in the task bar" check box
DWORD miscSetIconEnable(HANDLE hMiscDatabase, BOOL bEnable) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This)
return ERROR_INVALID_PARAMETER;
This->bShowIcons = bEnable;
return NO_ERROR;
}
// Tells whether this is nt workstation or nt server
DWORD miscGetProductType(HANDLE hMiscDatabase, PBOOL pbIsServer) {
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This || !pbIsServer)
return ERROR_INVALID_PARAMETER;
*pbIsServer = This->bIsServer;
return NO_ERROR;
}
// Turns on ras error and warning logging
DWORD
miscSetRasLogLevel(
IN HANDLE hMiscDatabase,
IN DWORD dwLevel)
{
RASSRV_MISCDB * This = (RASSRV_MISCDB*)hMiscDatabase;
if (!This)
{
return ERROR_INVALID_PARAMETER;
}
This->dwLogLevel = dwLevel;
This->bLogLevelDirty = TRUE;
return NO_ERROR;
}