xref: /haiku/src/apps/musiccollection/FileMonitor.h (revision 08c9600ab9427c3023d0999fea557dd51343170c)
1*08c9600aSClemens Zeidler /*
2*08c9600aSClemens Zeidler  * Copyright 2011, Haiku, Inc. All rights reserved.
3*08c9600aSClemens Zeidler  * Distributed under the terms of the MIT License.
4*08c9600aSClemens Zeidler  *
5*08c9600aSClemens Zeidler  * Authors:
6*08c9600aSClemens Zeidler  *		Clemens Zeidler <haiku@clemens-zeidler.de>
7*08c9600aSClemens Zeidler  */
8*08c9600aSClemens Zeidler #ifndef FILE_MONITOR_H
9*08c9600aSClemens Zeidler #define FILE_MONITOR_H
10*08c9600aSClemens Zeidler 
11*08c9600aSClemens Zeidler 
12*08c9600aSClemens Zeidler #include <map>
13*08c9600aSClemens Zeidler #include <vector>
14*08c9600aSClemens Zeidler 
15*08c9600aSClemens Zeidler #include <Entry.h>
16*08c9600aSClemens Zeidler #include <Node.h>
17*08c9600aSClemens Zeidler 
18*08c9600aSClemens Zeidler #include "NodeMonitorHandler.h"
19*08c9600aSClemens Zeidler 
20*08c9600aSClemens Zeidler 
21*08c9600aSClemens Zeidler struct WatchedFile {
22*08c9600aSClemens Zeidler 	entry_ref		entry;
23*08c9600aSClemens Zeidler 	node_ref		node;
24*08c9600aSClemens Zeidler 	/*! Don't use it as the primary cookie storage. To be set in EntryCreated
25*08c9600aSClemens Zeidler 	in EntryViewInterface. */
26*08c9600aSClemens Zeidler 	void*			cookie;
27*08c9600aSClemens Zeidler };
28*08c9600aSClemens Zeidler 
29*08c9600aSClemens Zeidler 
30*08c9600aSClemens Zeidler class NodeRefComp {
31*08c9600aSClemens Zeidler public:
32*08c9600aSClemens Zeidler 	bool
33*08c9600aSClemens Zeidler 	operator()(const node_ref& a, const node_ref& b)
34*08c9600aSClemens Zeidler 	{
35*08c9600aSClemens Zeidler 		return a.node < b.node;
36*08c9600aSClemens Zeidler 	}
37*08c9600aSClemens Zeidler };
38*08c9600aSClemens Zeidler 
39*08c9600aSClemens Zeidler 
40*08c9600aSClemens Zeidler typedef std::map<node_ref, WatchedFile, NodeRefComp> WatchedFileList;
41*08c9600aSClemens Zeidler 
42*08c9600aSClemens Zeidler 
43*08c9600aSClemens Zeidler class EntryViewInterface {
44*08c9600aSClemens Zeidler public:
45*08c9600aSClemens Zeidler 	virtual						~EntryViewInterface() {};
46*08c9600aSClemens Zeidler 
47*08c9600aSClemens Zeidler 	virtual void				EntryCreated(WatchedFile* file) {};
48*08c9600aSClemens Zeidler 	virtual void				EntryRemoved(WatchedFile* file) {};
49*08c9600aSClemens Zeidler 	virtual void				EntryMoved(WatchedFile* file) {};
50*08c9600aSClemens Zeidler 	virtual void				StatChanged(WatchedFile* file) {};
51*08c9600aSClemens Zeidler 	virtual void				AttrChanged(WatchedFile* file) {};
52*08c9600aSClemens Zeidler 
53*08c9600aSClemens Zeidler 	virtual void				EntriesCleared() {};
54*08c9600aSClemens Zeidler };
55*08c9600aSClemens Zeidler 
56*08c9600aSClemens Zeidler 
57*08c9600aSClemens Zeidler const uint32 kMsgAddRefs = '&adr';
58*08c9600aSClemens Zeidler const uint32 kMsgCleared = '&clr';
59*08c9600aSClemens Zeidler 
60*08c9600aSClemens Zeidler 
61*08c9600aSClemens Zeidler typedef std::vector<entry_ref> RefList;
62*08c9600aSClemens Zeidler 
63*08c9600aSClemens Zeidler 
64*08c9600aSClemens Zeidler class ReadThread;
65*08c9600aSClemens Zeidler 
66*08c9600aSClemens Zeidler 
67*08c9600aSClemens Zeidler class FileMonitor : public NodeMonitorHandler {
68*08c9600aSClemens Zeidler public:
69*08c9600aSClemens Zeidler 								FileMonitor(EntryViewInterface* listener);
70*08c9600aSClemens Zeidler 								~FileMonitor();
71*08c9600aSClemens Zeidler 
72*08c9600aSClemens Zeidler 			void				SetReadThread(ReadThread* readThread);
73*08c9600aSClemens Zeidler 
74*08c9600aSClemens Zeidler 			void				Reset();
75*08c9600aSClemens Zeidler 
76*08c9600aSClemens Zeidler 	virtual	void				MessageReceived(BMessage* message);
77*08c9600aSClemens Zeidler 
78*08c9600aSClemens Zeidler 	virtual void				EntryCreated(const char *name, ino_t directory,
79*08c9600aSClemens Zeidler 									dev_t device, ino_t node);
80*08c9600aSClemens Zeidler 	virtual void				EntryRemoved(const char *name, ino_t directory,
81*08c9600aSClemens Zeidler 									dev_t device, ino_t node);
82*08c9600aSClemens Zeidler 	virtual void				EntryMoved(const char *name,
83*08c9600aSClemens Zeidler 									const char *fromName, ino_t fromDirectory,
84*08c9600aSClemens Zeidler 									ino_t toDirectory, dev_t device,
85*08c9600aSClemens Zeidler 									ino_t node, dev_t nodeDevice);
86*08c9600aSClemens Zeidler 	virtual void				StatChanged(ino_t node, dev_t device,
87*08c9600aSClemens Zeidler 									int32 statFields);
88*08c9600aSClemens Zeidler 	virtual void				AttrChanged(ino_t node, dev_t device);
89*08c9600aSClemens Zeidler 
90*08c9600aSClemens Zeidler private:
91*08c9600aSClemens Zeidler 			WatchedFile*		_FindFile(dev_t device, ino_t node);
92*08c9600aSClemens Zeidler 
93*08c9600aSClemens Zeidler 			EntryViewInterface*	fListener;
94*08c9600aSClemens Zeidler 			WatchedFileList		fWatchedFileList;
95*08c9600aSClemens Zeidler 
96*08c9600aSClemens Zeidler 			ReadThread*			fReadThread;
97*08c9600aSClemens Zeidler 			RefList*			fCurrentReadList;
98*08c9600aSClemens Zeidler 			uint32				fCurrentReadIndex;
99*08c9600aSClemens Zeidler };
100*08c9600aSClemens Zeidler 
101*08c9600aSClemens Zeidler 
102*08c9600aSClemens Zeidler class ReadThread {
103*08c9600aSClemens Zeidler public:
104*08c9600aSClemens Zeidler 								ReadThread(FileMonitor* target);
105*08c9600aSClemens Zeidler 	virtual						~ReadThread() {}
106*08c9600aSClemens Zeidler 
107*08c9600aSClemens Zeidler 			status_t			Run();
108*08c9600aSClemens Zeidler 			bool				Running();
109*08c9600aSClemens Zeidler 			status_t			Wait();
110*08c9600aSClemens Zeidler 
111*08c9600aSClemens Zeidler 			void				Stop();
112*08c9600aSClemens Zeidler 			bool				Stopped();
113*08c9600aSClemens Zeidler 
114*08c9600aSClemens Zeidler 			RefList*			ReadRefList();
115*08c9600aSClemens Zeidler 			void				ReadDone();
116*08c9600aSClemens Zeidler 
117*08c9600aSClemens Zeidler protected:
118*08c9600aSClemens Zeidler 	virtual	bool				ReadNextEntry(entry_ref& entry) = 0;
119*08c9600aSClemens Zeidler 
120*08c9600aSClemens Zeidler 			int32				Process();
121*08c9600aSClemens Zeidler 
122*08c9600aSClemens Zeidler 	friend	int32 ReadThreadFunction(void *data);
123*08c9600aSClemens Zeidler 
124*08c9600aSClemens Zeidler 			BHandler*			fTarget;
125*08c9600aSClemens Zeidler 
126*08c9600aSClemens Zeidler 			RefList				fRefList1;
127*08c9600aSClemens Zeidler 			RefList				fRefList2;
128*08c9600aSClemens Zeidler 			RefList*			fWriteRefList;
129*08c9600aSClemens Zeidler 			RefList*			fReadRefList;
130*08c9600aSClemens Zeidler 			bool				fReading;
131*08c9600aSClemens Zeidler 
132*08c9600aSClemens Zeidler private:
133*08c9600aSClemens Zeidler 			void				_SwapLists();
134*08c9600aSClemens Zeidler 	inline	void				_PublishEntrys(BMessenger& messenger);
135*08c9600aSClemens Zeidler 
136*08c9600aSClemens Zeidler 			bool				fStopped;
137*08c9600aSClemens Zeidler 			thread_id			fThreadId;
138*08c9600aSClemens Zeidler 
139*08c9600aSClemens Zeidler 			int16				fNReaded;
140*08c9600aSClemens Zeidler 			bool				fRunning;
141*08c9600aSClemens Zeidler };
142*08c9600aSClemens Zeidler 
143*08c9600aSClemens Zeidler 
144*08c9600aSClemens Zeidler #endif // FILE_MONITOR_H
145