\file Rule.cpp
MIME sniffer rule implementation
*/
#include <sniffer/Err.h>
#include <sniffer/DisjList.h>
#include <sniffer/Rule.h>
#include <DataIO.h>
#include <stdio.h>
using namespace BPrivate::Storage::Sniffer;
must pass a pointer to the object to Sniffer::parse().
*/
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(BPositionIO *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;
}
}
or an error code if something goes wrong.
*/
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;
}