Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

165 lines
3.6 KiB

//
// MODULE: SNIFF.CPP
//
// PURPOSE: sniffing class
//
// COMPANY: Saltmine Creative, Inc. (206)-284-7511 [email protected]
//
// AUTHOR: Oleg Kalosha
//
// ORIGINAL DATE: 12-11-98
//
// NOTES: This is base abstract class which performs sniffing
//
// Version Date By Comments
//--------------------------------------------------------------------
// V3.2 12-11-98 OK
//
#pragma warning(disable:4786)
#include "stdafx.h"
#include "Sniff.h"
#include "SniffConnector.h"
#include "SniffController.h"
#include "Topic.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// the problem is, that JavaScript returns 0xffffffff, but VBScript returns
// 0x0000ffff, so we define SNIFF_FAIL_MASK as 0x0000ffff and use it as mask to
// determine if sniffing was successful. Expression 0xffffffff & SNIFF_FAIL_MASK
// will have the same result as expression 0x0000ffff & SNIFF_FAIL_MASK.
// This define SHOULD NOT BE USED OUTSIDE THIS FILE!
#define SNIFF_FAIL_MASK 0x0000ffff
//////////////////////////////////////////////////////////////////////////////////////
// CSniff implementation
// called as public interface function when resniffing
bool CSniff::Resniff(CSniffedArr& arrSniffed)
{
bool ret = false;
LOCKOBJECT();
for (CSniffedArr::iterator i = arrSniffed.begin(); i < arrSniffed.end(); i++)
{
IST state = SNIFF_FAILURE_RESULT;
if (GetSniffController()->AllowResniff(i->nid()))
{
if (SniffNodeInternal(i->nid(), &state))
{
if (state != i->state())
{
*i = CNodeStatePair(i->nid(), state);
ret = true;
}
}
else
{
arrSniffed.erase(i);
i--;
ret = true;
}
}
}
UNLOCKOBJECT();
return ret;
}
// called as public interface function when sniffing on start up
bool CSniff::SniffAll(CSniffedArr& arrOut)
{
bool ret = false;
vector<NID> arrNodes;
vector<ESTDLBL> arrTypeExclude;
LOCKOBJECT();
arrTypeExclude.push_back(ESTDLBL_problem);
arrOut.clear();
if (GetTopic()->GetNodeArrayExcludeType(arrNodes, arrTypeExclude))
{
for (vector<NID>::iterator i = arrNodes.begin(); i < arrNodes.end(); i++)
{
if (GetSniffController()->AllowAutomaticOnStartSniffing(*i))
{
IST state = SNIFF_FAILURE_RESULT;
if (SniffNodeInternal(*i, &state))
{
arrOut.push_back(CNodeStatePair(*i, state));
ret = true;
}
}
}
}
UNLOCKOBJECT();
return ret;
}
// called as public interface function when sniffing on the fly
bool CSniff::SniffNode(NID numNodeID, IST* pnumNodeState)
{
bool ret = false;
LOCKOBJECT();
if (GetSniffController()->AllowAutomaticOnFlySniffing(numNodeID))
ret = SniffNodeInternal(numNodeID, pnumNodeState);
UNLOCKOBJECT();
return ret;
}
bool CSniff::SniffNodeInternal(NID numNodeID, IST* pnumNodeState)
{
CString strNodeName;
if (!GetTopic()->IsRead())
return false;
strNodeName = GetTopic()->GetNodeSymName(numNodeID);
if (strNodeName.IsEmpty())
return false;
long res = GetSniffConnector()->PerformSniffing(strNodeName, _T(""), _T(""));
if ((res & SNIFF_FAIL_MASK) == SNIFF_FAIL_MASK)
{
*pnumNodeState = SNIFF_FAILURE_RESULT;
return false;
}
*pnumNodeState = res;
return true;
}
void CSniff::SetAllowAutomaticSniffingPolicy(bool set)
{
GetSniffController()->SetAllowAutomaticSniffingPolicy(set);
}
void CSniff::SetAllowManualSniffingPolicy(bool set)
{
GetSniffController()->SetAllowManualSniffingPolicy(set);
}
bool CSniff::GetAllowAutomaticSniffingPolicy()
{
return GetSniffController()->GetAllowAutomaticSniffingPolicy();
}
bool CSniff::GetAllowManualSniffingPolicy()
{
return GetSniffController()->GetAllowManualSniffingPolicy();
}