xref: /haiku/src/servers/package/Root.h (revision 204dee708a999d5a71d0cb9497650ee7cef85d0a)
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 #ifndef ROOT_H
9 #define ROOT_H
10 
11 
12 #include <Locker.h>
13 #include <Node.h>
14 #include <ObjectList.h>
15 #include <OS.h>
16 #include <package/PackageDefs.h>
17 #include <String.h>
18 
19 #include <Referenceable.h>
20 
21 #include <package/packagefs.h>
22 
23 #include "JobQueue.h"
24 #include "Volume.h"
25 
26 
27 class Root : public BReferenceable, private Volume::Listener {
28 public:
29 								Root();
30 	virtual						~Root();
31 
32 			status_t			Init(const node_ref& nodeRef);
33 
34 			const node_ref&		NodeRef() const		{ return fNodeRef; }
35 			dev_t				DeviceID() const	{ return fNodeRef.device; }
36 			ino_t				NodeID() const		{ return fNodeRef.node; }
37 			const BString&		Path() const		{ return fPath; }
38 
39 			status_t			RegisterVolume(Volume* volume);
40 			void				UnregisterVolume(Volume* volume);
41 									// deletes the volume (eventually)
42 
43 			Volume*				FindVolume(dev_t deviceID) const;
44 
45 			void				HandleRequest(BMessage* message);
46 
47 private:
48 	// Volume::Listener
49 	virtual	void				VolumeNodeMonitorEventOccurred(Volume* volume);
50 
51 protected:
52 	virtual	void				LastReferenceReleased();
53 
54 private:
55 			struct VolumeJob;
56 			struct RequestJob;
57 
58 			friend struct RequestJob;
59 
60 private:
61 			Volume**			_GetVolume(PackageFSMountType mountType);
62 			Volume*				_GetVolume(
63 									BPackageInstallationLocation location);
64 			Volume*				_NextVolumeFor(Volume* volume);
65 
66 			void				_InitPackages(Volume* volume);
67 			void				_DeleteVolume(Volume* volume);
68 			void				_ProcessNodeMonitorEvents(Volume* volume);
69 			void				_HandleRequest(BMessage* message);
70 
71 			status_t			_QueueJob(Job* job);
72 
73 	static	status_t			_JobRunnerEntry(void* data);
74 			status_t			_JobRunner();
75 
76 private:
77 	mutable	BLocker				fLock;
78 			node_ref			fNodeRef;
79 			BString				fPath;
80 			Volume*				fSystemVolume;
81 			Volume*				fCommonVolume;
82 			Volume*				fHomeVolume;
83 			JobQueue			fJobQueue;
84 			thread_id			fJobRunner;
85 };
86 
87 
88 #endif	// ROOT_H
89