1//----------------------------------------------------------------------
2//  This software is part of the Haiku distribution and is covered
3//  by the MIT License.
4//---------------------------------------------------------------------
5/*!
6	\file RPatternList.cpp
7	MIME sniffer rpattern list implementation
8*/
9
10#include <sniffer/Err.h>
11#include <sniffer/RPattern.h>
12#include <sniffer/RPatternList.h>
13#include <DataIO.h>
14#include <stdio.h>
15
16using namespace BPrivate::Storage::Sniffer;
17
18RPatternList::RPatternList()
19	: DisjList()
20{
21}
22
23RPatternList::~RPatternList() {
24	// Clear our rpattern list
25	std::vector<RPattern*>::iterator i;
26	for (i = fList.begin(); i != fList.end(); i++)
27		delete *i;
28}
29
30status_t
31RPatternList::InitCheck() const {
32	return B_OK;
33}
34
35Err*
36RPatternList::GetErr() const {
37	return NULL;
38}
39
40/*! Sniffs the given data stream, searching for a match
41	with any of the list's patterns. Each pattern is searched
42	over its own specified range.
43*/
44bool
45RPatternList::Sniff(BPositionIO *data) const {
46	if (InitCheck() != B_OK)
47		return false;
48	else {
49		bool result = false;
50		std::vector<RPattern*>::const_iterator i;
51		for (i = fList.begin(); i != fList.end(); i++) {
52			if (*i)
53				result |= (*i)->Sniff(data, fCaseInsensitive);
54		}
55		return result;
56	}
57}
58
59/*! \brief Returns the number of bytes needed to perform a complete sniff, or an error
60	code if something goes wrong.
61*/
62ssize_t
63RPatternList::BytesNeeded() const
64{
65	ssize_t result = InitCheck();
66
67	// Tally up the BytesNeeded() values for all the RPatterns and return the largest.
68	if (result == B_OK) {
69		result = 0; // Just to be safe...
70		std::vector<RPattern*>::const_iterator i;
71		for (i = fList.begin(); i != fList.end(); i++) {
72			if (*i) {
73				ssize_t bytes = (*i)->BytesNeeded();
74				if (bytes >= 0) {
75					if (bytes > result)
76						result = bytes;
77				} else {
78					result = bytes;
79					break;
80				}
81			}
82		}
83	}
84	return result;
85}
86
87void
88RPatternList::Add(RPattern *rpattern) {
89	if (rpattern)
90		fList.push_back(rpattern);
91}
92
93
94
95