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