1/*
2 * Copyright 2002-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _MIME_SNIFFER_RULES_H
6#define _MIME_SNIFFER_RULES_H
7
8
9#include <SupportDefs.h>
10
11#include <list>
12#include <string>
13
14class BFile;
15class BString;
16struct entry_ref;
17
18
19namespace BPrivate {
20namespace Storage {
21
22namespace Sniffer {
23	class Rule;
24}
25
26namespace Mime {
27
28
29class DatabaseLocation;
30class MimeSniffer;
31
32
33class SnifferRules {
34public:
35	SnifferRules(DatabaseLocation* databaseLocation, MimeSniffer* mimeSniffer);
36	~SnifferRules();
37
38	status_t GuessMimeType(const entry_ref *ref, BString *type);
39	status_t GuessMimeType(const void *buffer, int32 length, BString *type);
40
41	status_t SetSnifferRule(const char *type, const char *rule);
42	status_t DeleteSnifferRule(const char *type);
43
44	void PrintToStream() const;
45
46	struct sniffer_rule {
47		std::string type;							// The mime type that own the rule
48		std::string rule_string;					// The unparsed string version of the rule
49		BPrivate::Storage::Sniffer::Rule *rule;		// The parsed rule
50
51		sniffer_rule(BPrivate::Storage::Sniffer::Rule *rule = NULL);
52		~sniffer_rule();
53	};
54private:
55	status_t BuildRuleList();
56	status_t GuessMimeType(BFile* file, const void *buffer, int32 length,
57		BString *type);
58	ssize_t MaxBytesNeeded();
59	status_t ProcessType(const char *type, ssize_t *bytesNeeded);
60
61	std::list<sniffer_rule> fRuleList;
62
63private:
64	DatabaseLocation*	fDatabaseLocation;
65	MimeSniffer*		fMimeSniffer;
66	ssize_t				fMaxBytesNeeded;
67	bool				fHaveDoneFullBuild;
68};
69
70} // namespace Mime
71} // namespace Storage
72} // namespace BPrivate
73
74#endif	// _MIME_SNIFFER_H
75