You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1324 lines
35 KiB
1324 lines
35 KiB
/*++ BUILD Version: 0000 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1999-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
event.c
|
|
|
|
Abstract:
|
|
|
|
Src module for tapi event filtering funcs
|
|
|
|
Author:
|
|
|
|
Xiaohai Zhang (xzhang) 24-Nov-1999
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "windows.h"
|
|
#include "tapi.h"
|
|
#include "tspi.h"
|
|
#include "client.h"
|
|
#include "loc_comn.h"
|
|
#include "server.h"
|
|
#include "private.h"
|
|
#include "tapihndl.h"
|
|
#include "utils.h"
|
|
|
|
extern BOOL gbNTServer;
|
|
|
|
//
|
|
// GetSubMaskIndex
|
|
// Description:
|
|
// Get the index into the submask array in vairous TAPI server object
|
|
// from the event mask, there should be one and only one bit set in
|
|
// ulEventMask
|
|
// Parameters:
|
|
// ulEventMask : the mask whose submask index to be returned
|
|
// Return Value:
|
|
// The index of the message mask in ulEventMask
|
|
//
|
|
|
|
DWORD
|
|
GetSubMaskIndex (ULONG64 ulEventMask)
|
|
{
|
|
DWORD dwSubMaskIndex;
|
|
|
|
// Assert that there is one and only one bit set in ulEventMask
|
|
ASSERT (ulEventMask !=0 && (ulEventMask & (ulEventMask - 1)) == 0);
|
|
|
|
dwSubMaskIndex = 0;
|
|
while (ulEventMask > 1)
|
|
{
|
|
ulEventMask >>= 1;
|
|
++dwSubMaskIndex;
|
|
}
|
|
|
|
return dwSubMaskIndex;
|
|
}
|
|
|
|
//
|
|
// GetMsgMask
|
|
// Description:
|
|
// Utility function to get corresponding msg mask and its submask index
|
|
// Parameters:
|
|
// Msg : whose mask and submask index to be returned
|
|
// pulMask : address to hold the returned mask
|
|
// pdwSubMaskIndex : address to hold the returned submask index
|
|
// Return Value:
|
|
// TRUE if there exists a mask defined for the Msg, otherwise FALSE
|
|
//
|
|
|
|
BOOL
|
|
GetMsgMask (DWORD Msg, ULONG64 * pulMask, DWORD *pdwSubMaskIndex)
|
|
{
|
|
ULONG64 ulMask;
|
|
DWORD dwSubMaskIndex;
|
|
|
|
if (NULL == pulMask ||
|
|
NULL == pdwSubMaskIndex)
|
|
{
|
|
ASSERT (0);
|
|
return FALSE;
|
|
}
|
|
|
|
switch (Msg)
|
|
{
|
|
case LINE_ADDRESSSTATE:
|
|
ulMask = EM_LINE_ADDRESSSTATE;
|
|
break;
|
|
case LINE_LINEDEVSTATE:
|
|
ulMask = EM_LINE_LINEDEVSTATE;
|
|
break;
|
|
case LINE_CALLINFO:
|
|
ulMask = EM_LINE_CALLINFO;
|
|
break;
|
|
case LINE_CALLSTATE:
|
|
ulMask = EM_LINE_CALLSTATE;
|
|
break;
|
|
case LINE_APPNEWCALL:
|
|
ulMask = EM_LINE_APPNEWCALL;
|
|
break;
|
|
case LINE_CREATE:
|
|
ulMask = EM_LINE_CREATE;
|
|
break;
|
|
case LINE_REMOVE:
|
|
ulMask = EM_LINE_REMOVE;
|
|
break;
|
|
case LINE_CLOSE:
|
|
ulMask = EM_LINE_CLOSE;
|
|
break;
|
|
// case LINE_PROXYREQUEST:
|
|
// ulMask = EM_LINE_PROXYREQUEST;
|
|
// break;
|
|
case LINE_DEVSPECIFIC:
|
|
ulMask = EM_LINE_DEVSPECIFIC;
|
|
break;
|
|
case LINE_DEVSPECIFICFEATURE:
|
|
ulMask = EM_LINE_DEVSPECIFICFEATURE;
|
|
break;
|
|
case LINE_AGENTSTATUS:
|
|
ulMask = EM_LINE_AGENTSTATUS;
|
|
break;
|
|
case LINE_AGENTSTATUSEX:
|
|
ulMask = EM_LINE_AGENTSTATUSEX;
|
|
break;
|
|
case LINE_AGENTSPECIFIC:
|
|
ulMask = EM_LINE_AGENTSPECIFIC;
|
|
break;
|
|
case LINE_AGENTSESSIONSTATUS:
|
|
ulMask = EM_LINE_AGENTSESSIONSTATUS;
|
|
break;
|
|
case LINE_QUEUESTATUS:
|
|
ulMask = EM_LINE_QUEUESTATUS;
|
|
break;
|
|
case LINE_GROUPSTATUS:
|
|
ulMask = EM_LINE_GROUPSTATUS;
|
|
break;
|
|
// case LINE_PROXYSTATUS:
|
|
// ulMask = EM_LINE_PROXYSTATUS;
|
|
// break;
|
|
case LINE_APPNEWCALLHUB:
|
|
ulMask = EM_LINE_APPNEWCALLHUB;
|
|
break;
|
|
case LINE_CALLHUBCLOSE:
|
|
ulMask = EM_LINE_CALLHUBCLOSE;
|
|
break;
|
|
case LINE_DEVSPECIFICEX:
|
|
ulMask = EM_LINE_DEVSPECIFICEX;
|
|
break;
|
|
case LINE_QOSINFO:
|
|
ulMask = EM_LINE_QOSINFO;
|
|
break;
|
|
case PHONE_CREATE:
|
|
ulMask = EM_PHONE_CREATE;
|
|
break;
|
|
case PHONE_REMOVE:
|
|
ulMask = EM_PHONE_REMOVE;
|
|
break;
|
|
case PHONE_CLOSE:
|
|
ulMask = EM_PHONE_CLOSE;
|
|
break;
|
|
case PHONE_STATE:
|
|
ulMask = EM_PHONE_STATE;
|
|
break;
|
|
case PHONE_DEVSPECIFIC:
|
|
ulMask = EM_PHONE_DEVSPECIFIC;
|
|
break;
|
|
case PHONE_BUTTON:
|
|
ulMask = EM_PHONE_BUTTONMODE;
|
|
break;
|
|
default:
|
|
ulMask = 0;
|
|
}
|
|
|
|
if (ulMask != 0)
|
|
{
|
|
*pulMask = ulMask;
|
|
*pdwSubMaskIndex = GetSubMaskIndex(ulMask);
|
|
}
|
|
|
|
return (ulMask ? TRUE : FALSE);
|
|
}
|
|
|
|
//
|
|
// FMsgDisabled
|
|
// Description:
|
|
// Utility function used throughout tapisrv to check if a message
|
|
// is allowed to be sent or not.
|
|
// Parameters:
|
|
// dwAPIVersion : the object API version
|
|
// adwEventSubMasks: the object submasks array
|
|
// Msg : the message to be checked
|
|
// dwParam1 : the sub message of Msg to be checked
|
|
// Return Value:
|
|
// TRUE if the message should NOT be sent, otherwise FALSE
|
|
//
|
|
|
|
BOOL
|
|
FMsgDisabled (
|
|
DWORD dwAPIVersion,
|
|
DWORD *adwEventSubMasks,
|
|
DWORD Msg,
|
|
DWORD dwParam1
|
|
)
|
|
{
|
|
BOOL fRet;
|
|
ULONG64 ulMsgMask;
|
|
DWORD dwSubMaskIndex;
|
|
|
|
if (dwAPIVersion <= TAPI_VERSION3_0)
|
|
{
|
|
LOG((TL_INFO, "FMsgDisbled: dwAPIVersion<= TAPI_VERSION3_0, msg will be enabled"));
|
|
fRet = FALSE;
|
|
goto ExitHere;
|
|
}
|
|
|
|
//
|
|
// The message is allowed to be sent if
|
|
// (1). No event mask defined for Msg, i.e LINE_REPLY
|
|
// (2). Msg is enabled for all submasks adwEventSubMasks[index] = (-1)
|
|
// (3). SubMask enabled: adwEventSubMask[index] & dwParam1 != 0
|
|
//
|
|
|
|
if (!GetMsgMask(Msg, &ulMsgMask, &dwSubMaskIndex) ||
|
|
adwEventSubMasks[dwSubMaskIndex] == (-1) ||
|
|
((adwEventSubMasks[dwSubMaskIndex] & dwParam1) != 0))
|
|
{
|
|
fRet = FALSE;
|
|
}
|
|
else
|
|
{
|
|
fRet = TRUE;
|
|
}
|
|
|
|
ExitHere:
|
|
LOG((TL_TRACE, "FMsgDisabled return %x", fRet));
|
|
return (fRet);
|
|
}
|
|
|
|
//
|
|
// SetEventMasksOrSubMasks
|
|
// Description:
|
|
// Utility function used to apply masks or submasks to a certain objects
|
|
// submasks array.
|
|
// Parameters:
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// adwEventSubMasks: the submasks array from the object
|
|
// Return Value:
|
|
// Always succeed.
|
|
//
|
|
|
|
LONG
|
|
SetEventMasksOrSubMasks (
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks,
|
|
DWORD *adwTargetSubMasks
|
|
)
|
|
{
|
|
ULONG64 ulMask = 1;
|
|
LONG lResult = S_OK;
|
|
DWORD dwIndex = 0;
|
|
|
|
if (NULL == adwTargetSubMasks)
|
|
{
|
|
ASSERT (0);
|
|
return LINEERR_INVALPOINTER;
|
|
}
|
|
|
|
if (fSubMask)
|
|
{
|
|
dwIndex = GetSubMaskIndex(ulEventMasks);
|
|
adwTargetSubMasks[dwIndex] = dwEventSubMasks;
|
|
}
|
|
else
|
|
{
|
|
for (dwIndex = 0; dwIndex < EM_NUM_MASKS; ++dwIndex)
|
|
{
|
|
adwTargetSubMasks[dwIndex] = ((ulMask & ulEventMasks) ? (-1) : 0);
|
|
ulMask <<= 1;
|
|
}
|
|
}
|
|
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettCallClientEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks on a call object.
|
|
// Parameters:
|
|
// ptCallClient : the call object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettCallClientEventMasks (
|
|
PTCALLCLIENT ptCallClient,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
BOOL bLocked = TRUE;
|
|
|
|
if (!WaitForExclusivetCallAccess (ptCallClient->ptCall, TCALL_KEY))
|
|
{
|
|
bLocked = FALSE;
|
|
lResult = LINEERR_OPERATIONFAILED;
|
|
goto ExitHere;
|
|
}
|
|
|
|
if (ptCallClient->ptLineClient->ptLineApp->dwAPIVersion <= TAPI_VERSION3_0)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptCallClient->adwEventSubMasks
|
|
);
|
|
|
|
|
|
ExitHere:
|
|
if (bLocked)
|
|
{
|
|
UNLOCKTCALL (ptCallClient->ptCall);
|
|
}
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettLineClientEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks on a tLineClient object.
|
|
// Parameters:
|
|
// ptLineClient : the line object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettLineClientEventMasks (
|
|
PTLINECLIENT ptLineClient,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
PTCALLCLIENT ptCallClient;
|
|
|
|
LOCKTLINECLIENT (ptLineClient);
|
|
if (ptLineClient->dwKey != TLINECLIENT_KEY)
|
|
{
|
|
lResult = LINEERR_OPERATIONFAILED;
|
|
goto ExitHere;
|
|
}
|
|
|
|
if (ptLineClient->ptLineApp->dwAPIVersion <= \
|
|
TAPI_VERSION3_0)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptLineClient->adwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
ptCallClient = ptLineClient->ptCallClients;
|
|
while (ptCallClient)
|
|
{
|
|
lResult = SettCallClientEventMasks (
|
|
ptCallClient,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptCallClient = ptCallClient->pNextSametLineClient;
|
|
}
|
|
|
|
ExitHere:
|
|
UNLOCKTLINECLIENT (ptLineClient);
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettLineAppEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks on a tLineApp object.
|
|
// Parameters:
|
|
// ptLineApp : the tLineApp object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettLineAppEventMasks (
|
|
PTLINEAPP ptLineApp,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
PTLINECLIENT ptLineClient;
|
|
LONG lResult = S_OK;
|
|
|
|
LOCKTLINEAPP (ptLineApp);
|
|
if (ptLineApp->dwKey != TLINEAPP_KEY)
|
|
{
|
|
lResult = LINEERR_OPERATIONFAILED;
|
|
goto ExitHere;
|
|
}
|
|
|
|
if (ptLineApp->dwAPIVersion <= TAPI_VERSION3_0)
|
|
{
|
|
lResult = LINEERR_OPERATIONUNAVAIL;
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptLineApp->adwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
ptLineClient = ptLineApp->ptLineClients;
|
|
while (ptLineClient)
|
|
{
|
|
lResult = SettLineClientEventMasks (
|
|
ptLineClient,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptLineClient = ptLineClient->pNextSametLineApp;
|
|
}
|
|
|
|
ExitHere:
|
|
UNLOCKTLINEAPP (ptLineApp);
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettPhoneClientEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks on a tPhoneClient object.
|
|
// Parameters:
|
|
// ptPhoneClient : the tPhoneClient object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettPhoneClientEventMasks (
|
|
PTPHONECLIENT ptPhoneClient,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
|
|
LOCKTPHONECLIENT (ptPhoneClient);
|
|
if (ptPhoneClient->dwKey != TPHONECLIENT_KEY)
|
|
{
|
|
lResult = PHONEERR_OPERATIONFAILED;
|
|
goto ExitHere;
|
|
}
|
|
|
|
if (ptPhoneClient->ptPhoneApp->dwAPIVersion <= TAPI_VERSION3_0)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptPhoneClient->adwEventSubMasks
|
|
);
|
|
|
|
|
|
ExitHere:
|
|
UNLOCKTPHONECLIENT (ptPhoneClient);
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettPhoneAppEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks on a tPhoneApp object.
|
|
// Parameters:
|
|
// ptPhoneApp : the tPhoneApp object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettPhoneAppEventMasks (
|
|
PTPHONEAPP ptPhoneApp,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
PTPHONECLIENT ptPhoneClient;
|
|
|
|
LOCKTPHONEAPP (ptPhoneApp);
|
|
if (ptPhoneApp->dwKey != TPHONEAPP_KEY)
|
|
{
|
|
lResult = PHONEERR_OPERATIONFAILED;
|
|
goto ExitHere;
|
|
}
|
|
|
|
if (ptPhoneApp->dwAPIVersion <= TAPI_VERSION3_0)
|
|
{
|
|
lResult = PHONEERR_OPERATIONUNAVAIL;
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptPhoneApp->adwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
ptPhoneClient = ptPhoneApp->ptPhoneClients;
|
|
while (ptPhoneClient)
|
|
{
|
|
lResult = SettPhoneClientEventMasks (
|
|
ptPhoneClient,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptPhoneClient = ptPhoneClient->pNextSametPhoneApp;
|
|
}
|
|
|
|
ExitHere:
|
|
UNLOCKTPHONEAPP (ptPhoneApp);
|
|
return lResult;
|
|
|
|
}
|
|
|
|
//
|
|
// SettClientEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks client wide.
|
|
// Parameters:
|
|
// ptClient : the client object to apply the masking
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SettClientEventMasks (
|
|
PTCLIENT ptClient,
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
PTLINEAPP ptLineApp;
|
|
PTPHONEAPP ptPhoneApp;
|
|
BOOL fLocked = TRUE;
|
|
|
|
if (!WaitForExclusiveClientAccess (ptClient))
|
|
{
|
|
lResult = LINEERR_OPERATIONFAILED;
|
|
fLocked = FALSE;
|
|
goto ExitHere;
|
|
}
|
|
|
|
lResult = SetEventMasksOrSubMasks (
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks,
|
|
ptClient->adwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
|
|
ptLineApp = ptClient->ptLineApps;
|
|
while (ptLineApp)
|
|
{
|
|
lResult = SettLineAppEventMasks (
|
|
ptLineApp,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptLineApp = ptLineApp->pNext;
|
|
}
|
|
|
|
ptPhoneApp = ptClient->ptPhoneApps;
|
|
while (ptPhoneApp)
|
|
{
|
|
lResult = SettPhoneAppEventMasks (
|
|
ptPhoneApp,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptPhoneApp = ptPhoneApp->pNext;
|
|
}
|
|
|
|
ExitHere:
|
|
if (fLocked)
|
|
{
|
|
UNLOCKTCLIENT (ptClient);
|
|
}
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// SettClientEventMasks
|
|
// Description:
|
|
// Apply the masks or submasks server wide.
|
|
// Parameters:
|
|
// fSubMask : this function is called for submasks
|
|
// ulEventMasks : the masks to be set if fSubMask is true or the mask
|
|
// whose submasks is to be set
|
|
// dwEventSubMasks : the submasks to be set, ignored if fSubMask is FALSE
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
SetGlobalEventMasks (
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasks,
|
|
DWORD dwEventSubMasks
|
|
)
|
|
{
|
|
LONG lResult = S_OK;
|
|
PTCLIENT ptClient;
|
|
|
|
TapiEnterCriticalSection (&TapiGlobals.CritSec);
|
|
|
|
ptClient = TapiGlobals.ptClients;
|
|
while (ptClient)
|
|
{
|
|
lResult = SettClientEventMasks (
|
|
ptClient,
|
|
fSubMask,
|
|
ulEventMasks,
|
|
dwEventSubMasks
|
|
);
|
|
if (lResult)
|
|
{
|
|
goto ExitHere;
|
|
}
|
|
ptClient = ptClient->pNext;
|
|
}
|
|
|
|
ExitHere:
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
return lResult;
|
|
}
|
|
|
|
//
|
|
// TSetEventMasksOrSubMasks
|
|
// Description:
|
|
// The RPC function used for seting Masks/SubMasks on various different
|
|
// types of objects
|
|
// Parameters:
|
|
// Return Value:
|
|
//
|
|
|
|
void
|
|
WINAPI
|
|
TSetEventMasksOrSubMasks (
|
|
PTCLIENT ptClient,
|
|
PTSETEVENTMASK_PARAMS pParams,
|
|
DWORD dwParamsBufferSize,
|
|
LPBYTE pDataBuf,
|
|
LPDWORD pdwNumBytesReturned
|
|
)
|
|
{
|
|
ULONG64 ulEventMasks;
|
|
|
|
// Assemble the two DWORD into 64 bit masks
|
|
ulEventMasks = pParams->dwHiMasks;
|
|
ulEventMasks <<= 32;
|
|
ulEventMasks |= pParams->dwLowMasks;
|
|
|
|
// Mask sure we do not violate the permissible mask setting
|
|
TapiEnterCriticalSection (&TapiGlobals.CritSec);
|
|
if (ulEventMasks & (~TapiGlobals.ulPermMasks))
|
|
{
|
|
pParams->lResult = LINEERR_INVALPARAM;
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
goto ExitHere;
|
|
}
|
|
|
|
// Call the corresponding function to apply masking on different
|
|
// type of objects
|
|
switch (pParams->dwObjType)
|
|
{
|
|
case TAPIOBJ_NULL:
|
|
{
|
|
pParams->lResult = (LONG) SettClientEventMasks (
|
|
ptClient,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
}
|
|
break;
|
|
case TAPIOBJ_HLINEAPP:
|
|
{
|
|
PTLINEAPP ptLineApp;
|
|
|
|
ptLineApp = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLineApp,
|
|
TLINEAPP_KEY
|
|
);
|
|
if (ptLineApp)
|
|
{
|
|
pParams->lResult = (LONG) SettLineAppEventMasks (
|
|
ptLineApp,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLineApp,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALAPPHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HPHONEAPP:
|
|
{
|
|
PTPHONEAPP ptPhoneApp;
|
|
|
|
ptPhoneApp = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhoneApp,
|
|
TPHONEAPP_KEY
|
|
);
|
|
if (ptPhoneApp)
|
|
{
|
|
pParams->lResult = (LONG) SettPhoneAppEventMasks (
|
|
ptPhoneApp,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhoneApp,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = PHONEERR_INVALAPPHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HLINE:
|
|
{
|
|
PTLINECLIENT ptLineClient;
|
|
|
|
ptLineClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLine,
|
|
TLINECLIENT_KEY
|
|
);
|
|
if (ptLineClient)
|
|
{
|
|
pParams->lResult = (LONG) SettLineClientEventMasks (
|
|
ptLineClient,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLine,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALLINEHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HCALL:
|
|
{
|
|
PTCALLCLIENT ptCallClient;
|
|
|
|
ptCallClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hCall,
|
|
TCALLCLIENT_KEY
|
|
);
|
|
if (ptCallClient)
|
|
{
|
|
pParams->lResult = (LONG) SettCallClientEventMasks (
|
|
ptCallClient,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hCall,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALCALLHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HPHONE:
|
|
{
|
|
PTPHONECLIENT ptPhoneClient;
|
|
|
|
ptPhoneClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhone,
|
|
TPHONECLIENT_KEY
|
|
);
|
|
if (ptPhoneClient)
|
|
{
|
|
pParams->lResult = (LONG) SettPhoneClientEventMasks (
|
|
ptPhoneClient,
|
|
pParams->fSubMask,
|
|
ulEventMasks,
|
|
pParams->dwEventSubMasks
|
|
);
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhone,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = PHONEERR_INVALPHONEHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
pParams->lResult = LINEERR_OPERATIONFAILED;
|
|
break;
|
|
}
|
|
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
|
|
ExitHere:
|
|
*pdwNumBytesReturned = sizeof (TSETEVENTMASK_PARAMS);
|
|
}
|
|
|
|
//
|
|
// GetEventsMasksOrSubMasks
|
|
// Description:
|
|
// Utility function used by TGetEventMasksOrSubMasks to retrieve
|
|
// Masks/SubMasks from various Tapisrv objects
|
|
// Parameters:
|
|
// fSubMask Masks or SubMasks are to be retrieved
|
|
// ulEventMasksIn Indicates which submask to get if fSubMask
|
|
// pulEventMasksOut Hold the returned masks if(!fSubMask),
|
|
// corresponding bit is set as long as at least
|
|
// one submask bit is set
|
|
// pdwEventSubMasksOut Hold the returned submask if(fSubMask)
|
|
// adwEventSubMasks the submasks array to work on
|
|
// Return Value:
|
|
//
|
|
|
|
LONG
|
|
GetEventMasksOrSubMasks (
|
|
BOOL fSubMask,
|
|
ULONG64 ulEventMasksIn, // Needs to be set if fSubMask
|
|
ULONG64 *pulEventMasksOut,
|
|
DWORD *pdwEventSubMasksOut,
|
|
DWORD *adwEventSubMasks
|
|
)
|
|
{
|
|
DWORD dwIndex;
|
|
ULONG64 ulMask;
|
|
|
|
if (NULL == adwEventSubMasks ||
|
|
NULL == pulEventMasksOut ||
|
|
NULL == pdwEventSubMasksOut)
|
|
{
|
|
ASSERT (0);
|
|
return LINEERR_INVALPOINTER;
|
|
}
|
|
|
|
if (fSubMask)
|
|
{
|
|
ASSERT (pdwEventSubMasksOut != NULL);
|
|
ASSERT (ulEventMasksIn != 0 &&
|
|
(ulEventMasksIn & (ulEventMasksIn - 1)) == 0);
|
|
*pdwEventSubMasksOut =
|
|
adwEventSubMasks[GetSubMaskIndex(ulEventMasksIn)];
|
|
}
|
|
else
|
|
{
|
|
ASSERT (pulEventMasksOut);
|
|
ulMask = 1;
|
|
*pulEventMasksOut = 0;
|
|
for (dwIndex = 0; dwIndex < EM_NUM_MASKS; ++dwIndex)
|
|
{
|
|
if (adwEventSubMasks[dwIndex])
|
|
{
|
|
*pulEventMasksOut |= ulMask;
|
|
}
|
|
ulMask <<= 1;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// TGetEventMasksOrSubMasks
|
|
// Description:
|
|
// The RPC function used for geting Masks/SubMasks on various different
|
|
// types of objects
|
|
// Parameters:
|
|
// Return Value:
|
|
//
|
|
|
|
void
|
|
WINAPI
|
|
TGetEventMasksOrSubMasks (
|
|
PTCLIENT ptClient,
|
|
PTGETEVENTMASK_PARAMS pParams,
|
|
DWORD dwParamsBufferSize,
|
|
LPBYTE pDataBuf,
|
|
LPDWORD pdwNumBytesReturned
|
|
)
|
|
{
|
|
ULONG64 ulEventMasksIn;
|
|
ULONG64 ulEventMasksOut;
|
|
|
|
// Assember the 64 bit mask from the two DWORD
|
|
if (pParams->fSubMask)
|
|
{
|
|
ulEventMasksIn = pParams->dwHiMasksIn;
|
|
ulEventMasksIn <<= 32;
|
|
ulEventMasksIn += pParams->dwLowMasksIn;
|
|
}
|
|
|
|
TapiEnterCriticalSection (&TapiGlobals.CritSec);
|
|
|
|
// Retrieve the masking from various objects by calling
|
|
// the corresponding functions
|
|
switch (pParams->dwObjType)
|
|
{
|
|
case TAPIOBJ_NULL:
|
|
{
|
|
|
|
if (WaitForExclusiveClientAccess (ptClient))
|
|
{
|
|
pParams->lResult = (LONG) GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptClient->adwEventSubMasks
|
|
);
|
|
UNLOCKTCLIENT (ptClient);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALPARAM;
|
|
}
|
|
|
|
}
|
|
break;
|
|
case TAPIOBJ_HLINEAPP:
|
|
{
|
|
PTLINEAPP ptLineApp;
|
|
|
|
ptLineApp = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLineApp,
|
|
TLINEAPP_KEY
|
|
);
|
|
if (ptLineApp && ptLineApp->dwKey == TLINEAPP_KEY)
|
|
{
|
|
LOCKTLINEAPP (ptLineApp);
|
|
|
|
pParams->lResult = GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptLineApp->adwEventSubMasks
|
|
);
|
|
|
|
UNLOCKTLINEAPP (ptLineApp);
|
|
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLineApp,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALAPPHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HPHONEAPP:
|
|
{
|
|
PTPHONEAPP ptPhoneApp;
|
|
|
|
ptPhoneApp = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhoneApp,
|
|
TPHONEAPP_KEY
|
|
);
|
|
if (ptPhoneApp && ptPhoneApp->dwKey == TPHONEAPP_KEY)
|
|
{
|
|
LOCKTPHONEAPP (ptPhoneApp);
|
|
|
|
pParams->lResult = GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptPhoneApp->adwEventSubMasks
|
|
);
|
|
|
|
UNLOCKTPHONEAPP (ptPhoneApp);
|
|
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhoneApp,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = PHONEERR_INVALAPPHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HLINE:
|
|
{
|
|
PTLINECLIENT ptLineClient;
|
|
|
|
ptLineClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLine,
|
|
TLINECLIENT_KEY
|
|
);
|
|
if (ptLineClient && ptLineClient->dwKey == TLINECLIENT_KEY)
|
|
{
|
|
LOCKTLINECLIENT (ptLineClient);
|
|
|
|
pParams->lResult = GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptLineClient->adwEventSubMasks
|
|
);
|
|
|
|
UNLOCKTLINECLIENT (ptLineClient);
|
|
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hLine,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALLINEHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HCALL:
|
|
{
|
|
PTCALLCLIENT ptCallClient;
|
|
|
|
ptCallClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hCall,
|
|
TCALLCLIENT_KEY
|
|
);
|
|
if (ptCallClient && ptCallClient->dwKey == TCALLCLIENT_KEY)
|
|
{
|
|
LOCKTLINECLIENT (ptCallClient);
|
|
|
|
pParams->lResult = GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptCallClient->adwEventSubMasks
|
|
);
|
|
|
|
UNLOCKTLINECLIENT (ptCallClient);
|
|
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hCall,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = LINEERR_INVALCALLHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
case TAPIOBJ_HPHONE:
|
|
{
|
|
PTPHONECLIENT ptPhoneClient;
|
|
|
|
ptPhoneClient = ReferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhone,
|
|
TPHONECLIENT_KEY
|
|
);
|
|
if (ptPhoneClient && ptPhoneClient->dwKey == TPHONECLIENT_KEY)
|
|
{
|
|
LOCKTPHONECLIENT (ptPhoneClient);
|
|
|
|
pParams->lResult = GetEventMasksOrSubMasks (
|
|
pParams->fSubMask,
|
|
ulEventMasksIn,
|
|
&ulEventMasksOut,
|
|
&pParams->dwEventSubMasks,
|
|
ptPhoneClient->adwEventSubMasks
|
|
);
|
|
|
|
UNLOCKTPHONECLIENT (ptPhoneClient);
|
|
|
|
DereferenceObject (
|
|
ghHandleTable,
|
|
pParams->hPhone,
|
|
1
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = PHONEERR_INVALPHONEHANDLE;
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
pParams->lResult = LINEERR_OPERATIONFAILED;
|
|
break;
|
|
}
|
|
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
|
|
// Seperating the returned 64 bit masks into two DWORD for RPC purpose
|
|
if (pParams->lResult == 0 && !pParams->fSubMask)
|
|
{
|
|
pParams->dwLowMasksOut = (DWORD)(ulEventMasksOut & 0xffffffff);
|
|
pParams->dwHiMasksOut = (DWORD)(ulEventMasksOut >> 32);
|
|
}
|
|
*pdwNumBytesReturned = sizeof (TGETEVENTMASK_PARAMS);
|
|
}
|
|
|
|
|
|
//
|
|
// TSetPermissibleMasks
|
|
// Description:
|
|
// Set the global PermissibleMasks, this operation is only
|
|
// allowed for admins
|
|
// Parameters:
|
|
// Return Value:
|
|
//
|
|
|
|
void
|
|
WINAPI
|
|
TSetPermissibleMasks (
|
|
PTCLIENT ptClient,
|
|
PTSETPERMMASKS_PARAMS pParams,
|
|
DWORD dwParamsBufferSize,
|
|
LPBYTE pDataBuf,
|
|
LPDWORD pdwNumBytesReturned
|
|
)
|
|
{
|
|
BOOL bAdmin;
|
|
ULONG64 ulPermMasks;
|
|
|
|
// Check the Admin status
|
|
LOCKTCLIENT (ptClient);
|
|
bAdmin = IS_FLAG_SET(ptClient->dwFlags, PTCLIENT_FLAG_ADMINISTRATOR);
|
|
UNLOCKTCLIENT (ptClient);
|
|
|
|
// Allow the operation to go ahead if the caller is an Admin or
|
|
// this machine is not configured to function as a server
|
|
if (!(TapiGlobals.dwFlags & TAPIGLOBALS_SERVER) || bAdmin)
|
|
{
|
|
ulPermMasks = pParams->dwHiMasks;
|
|
ulPermMasks <<= 32;
|
|
ulPermMasks += pParams->dwLowMasks;
|
|
|
|
TapiEnterCriticalSection (&TapiGlobals.CritSec);
|
|
TapiGlobals.ulPermMasks = ulPermMasks & EM_ALL;
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
|
|
pParams->lResult = (LONG) SetGlobalEventMasks (
|
|
FALSE,
|
|
ulPermMasks,
|
|
0
|
|
);
|
|
}
|
|
else
|
|
{
|
|
pParams->lResult = TAPIERR_NOTADMIN;
|
|
}
|
|
|
|
*pdwNumBytesReturned = sizeof (TSETPERMMASKS_PARAMS);
|
|
return;
|
|
}
|
|
|
|
//
|
|
// TGetPermissibleMasks
|
|
// Description:
|
|
// Get the global PermissibleMasks
|
|
// Parameters:
|
|
// Return Value:
|
|
//
|
|
|
|
void
|
|
WINAPI
|
|
TGetPermissibleMasks (
|
|
PTCLIENT ptClient,
|
|
PTGETPERMMASKS_PARAMS pParams,
|
|
DWORD dwParamsBufferSize,
|
|
LPBYTE pDataBuf,
|
|
LPDWORD pdwNumBytesReturned
|
|
)
|
|
{
|
|
TapiEnterCriticalSection (&TapiGlobals.CritSec);
|
|
pParams->dwLowMasks = (DWORD)(TapiGlobals.ulPermMasks & 0xffffffff);
|
|
pParams->dwHiMasks = (DWORD)(TapiGlobals.ulPermMasks >> 32);
|
|
TapiLeaveCriticalSection (&TapiGlobals.CritSec);
|
|
*pdwNumBytesReturned = sizeof (TGETPERMMASKS_PARAMS);
|
|
}
|
|
|