#include <stdio.h>
#include "DisjList.h"
#include "Err.h"
#include "Rule.h"
using namespace BPrivate::Storage::Sniffer;
Rule::Rule()
:
fPriority(0.0),
fConjList(NULL)
{
}
Rule::~Rule()
{
Unset();
}
status_t
Rule::InitCheck() const
{
return fConjList ? B_OK : B_NO_INIT;
}
double
Rule::Priority() const
{
return fPriority;
}
bool
Rule::Sniff(const Data& data) const
{
if (InitCheck() != B_OK) {
return false;
} else {
bool result = true;
std::vector<DisjList*>::const_iterator i;
for (i = fConjList->begin(); i != fConjList->end(); i++) {
if (*i)
result &= (*i)->Sniff(data);
}
return result;
}
}
ssize_t
Rule::BytesNeeded() const
{
ssize_t result = InitCheck();
if (result == B_OK) {
result = 0;
std::vector<DisjList*>::const_iterator i;
for (i = fConjList->begin(); i != fConjList->end(); i++) {
if (*i) {
ssize_t bytes = (*i)->BytesNeeded();
if (bytes >= 0) {
if (bytes > result)
result = bytes;
} else {
result = bytes;
break;
}
}
}
}
return result;
}
void
Rule::Unset()
{
if (fConjList) {
delete fConjList;
fConjList = NULL;
}
}
void
Rule::SetTo(double priority, std::vector<DisjList*>* list)
{
Unset();
if (0.0 <= priority && priority <= 1.0)
fPriority = priority;
else
throw new Err("Sniffer pattern error: invalid priority", -1);
fConjList = list;
}