1/*
2 * Copyright 2006-2015, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Author:
6 *		Axel D��rfler, axeld@pinc-software.de
7 */
8#ifndef TRANSLATOR_ROSTER_PRIVATE_H
9#define TRANSLATOR_ROSTER_PRIVATE_H
10
11#include <map>
12#include <set>
13#include <vector>
14
15#include <Entry.h>
16#include <Handler.h>
17#include <Locker.h>
18#include <Messenger.h>
19#include <TranslatorRoster.h>
20
21
22struct translator_data;
23
24
25struct translator_item {
26	BTranslator*	translator;
27	entry_ref		ref;
28	ino_t			node;
29	image_id		image;
30};
31
32typedef std::map<translator_id, translator_item> TranslatorMap;
33typedef std::vector<BMessenger> MessengerList;
34typedef std::vector<node_ref> NodeRefList;
35typedef std::set<entry_ref> EntryRefSet;
36typedef std::map<image_id, int32> ImageMap;
37typedef std::map<BTranslator*, image_id> TranslatorImageMap;
38
39
40class BTranslatorRoster::Private : public BHandler, public BLocker {
41public:
42								Private();
43	virtual						~Private();
44
45	virtual	void				MessageReceived(BMessage* message);
46
47			void				AddDefaultPaths();
48			status_t			AddPaths(const char* paths);
49			status_t			AddPath(const char* path, int32* _added = NULL);
50			status_t			AddTranslator(BTranslator* translator,
51									image_id image = -1,
52									const entry_ref* ref = NULL,
53									ino_t node = 0);
54
55			void				RemoveTranslators(entry_ref& ref);
56
57			BTranslator*		FindTranslator(translator_id id);
58
59			status_t			StoreTranslators(BMessage& archive);
60			status_t			Identify(BPositionIO* source,
61									BMessage* ioExtension, uint32 hintType,
62									const char* hintMIME, uint32 wantType,
63									translator_info* _info);
64
65			status_t			GetTranslators(BPositionIO* source,
66									BMessage* ioExtension, uint32 hintType,
67									const char* hintMIME, uint32 wantType,
68									translator_info** _info, int32* _numInfo);
69			status_t			GetAllTranslators(translator_id** _ids,
70									int32* _count);
71			status_t			GetRefFor(translator_id id, entry_ref& ref);
72
73			bool				IsActive() const { return Looper(); }
74
75			status_t			CreateTranslators(const entry_ref& ref,
76									int32& count, BMessage* update = NULL);
77			status_t			GetTranslatorData(image_id image,
78									translator_data& data);
79
80			status_t			StartWatching(BMessenger target);
81			status_t			StopWatching(BMessenger target);
82
83private:
84	static	int					_CompareSupport(const void* _a, const void* _b);
85
86			void				_RescanChanged();
87
88			const translation_format* _CheckHints(
89									const translation_format* formats,
90									int32 formatsCount, uint32 hintType,
91									const char* hintMIME);
92
93			const translator_item* _FindTranslator(translator_id id) const;
94			const translator_item* _FindTranslator(const char* name) const;
95			const translator_item* _FindTranslator(entry_ref& ref) const;
96			translator_item*	_FindTranslator(node_ref& nodeRef);
97
98			int32				_CompareTranslatorDirectoryPriority(
99									const entry_ref& a,
100									const entry_ref& b) const;
101			bool				_IsKnownDirectory(const node_ref& nodeRef)
102									const;
103
104			void				_RemoveTranslators(const node_ref* nodeRef,
105									const entry_ref* ref = NULL);
106			void				_EntryAdded(const node_ref& nodeRef,
107									const char* name);
108			void				_EntryAdded(const entry_ref& ref);
109			void				_NotifyListeners(BMessage& update) const;
110			void				_TranslatorDeleted(translator_id id,
111									BTranslator *self);
112
113			NodeRefList			fDirectories;
114			TranslatorMap		fTranslators;
115			MessengerList		fMessengers;
116			EntryRefSet			fRescanEntries;
117			ImageMap			fKnownImages;
118			TranslatorImageMap	fImageOrigins;
119			const char*			fABISubDirectory;
120			int32				fNextID;
121			bool				fLazyScanning;
122			bool				fSafeMode;
123};
124
125
126#endif	// TRANSLATOR_ROSTER_PRIVATE_H
127