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