xref: /haiku/src/kits/storage/mime/DatabaseDirectory.cpp (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /*
2  * Copyright 2013, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Ingo Weinhold <ingo_weinhold@gmx.de>
7  */
8 
9 
10 #include <mime/DatabaseDirectory.h>
11 
12 #include <fs_attr.h>
13 #include <Node.h>
14 #include <StringList.h>
15 
16 #include <mime/database_support.h>
17 #include <mime/DatabaseLocation.h>
18 
19 
20 namespace BPrivate {
21 namespace Storage {
22 namespace Mime {
23 
24 
25 DatabaseDirectory::DatabaseDirectory()
26 	:
27 	BMergedDirectory(B_COMPARE)
28 {
29 }
30 
31 
32 DatabaseDirectory::~DatabaseDirectory()
33 {
34 }
35 
36 
37 status_t
38 DatabaseDirectory::Init(DatabaseLocation* databaseLocation,
39 	const char* superType)
40 {
41 	status_t error = BMergedDirectory::Init();
42 	if (error != B_OK)
43 		return error;
44 
45 	const BStringList& directories = databaseLocation->Directories();
46 	int32 count = directories.CountStrings();
47 	for (int32 i = 0; i < count; i++) {
48 		BString directory = directories.StringAt(i);
49 		if (superType != NULL)
50 			directory << '/' << superType;
51 
52 		AddDirectory(directory);
53 	}
54 
55 	return B_OK;
56 }
57 
58 
59 bool
60 DatabaseDirectory::ShallPreferFirstEntry(const entry_ref& entry1, int32 index1,
61 	const entry_ref& entry2, int32 index2)
62 {
63 	return _IsValidMimeTypeEntry(entry1) || !_IsValidMimeTypeEntry(entry2);
64 }
65 
66 
67 bool
68 DatabaseDirectory::_IsValidMimeTypeEntry(const entry_ref& entry)
69 {
70 	// check whether the MIME:TYPE attribute exists
71 	BNode node;
72 	attr_info info;
73 	return node.SetTo(&entry) == B_OK
74 		&& node.GetAttrInfo(BPrivate::Storage::Mime::kTypeAttr, &info) == B_OK;
75 }
76 
77 
78 } // namespace Mime
79 } // namespace Storage
80 } // namespace BPrivate
81