1// ---------------------------------------------------------------------- 2// This software is part of the Haiku distribution and is covered 3// by the MIT License. 4// 5// File Name: VolumeRoster.cpp 6// 7// Description: BVolumeRoster class 8// ---------------------------------------------------------------------- 9 10 11#include <errno.h> 12#include <new> 13 14#include <Bitmap.h> 15#include <Directory.h> 16#include <fs_info.h> 17#include <Node.h> 18#include <NodeMonitor.h> 19#include <VolumeRoster.h> 20 21 22static const char kBootVolumePath[] = "/boot"; 23 24using namespace std; 25 26 27#ifdef USE_OPENBEOS_NAMESPACE 28namespace OpenBeOS { 29#endif 30 31 32BVolumeRoster::BVolumeRoster() 33 : fCookie(0), 34 fTarget(NULL) 35{ 36} 37 38 39// Deletes the volume roster and frees all associated resources. 40BVolumeRoster::~BVolumeRoster() 41{ 42 StopWatching(); 43} 44 45 46// Fills out the passed in BVolume object with the next available volume. 47status_t 48BVolumeRoster::GetNextVolume(BVolume *volume) 49{ 50 // check parameter 51 status_t error = (volume ? B_OK : B_BAD_VALUE); 52 // get next device 53 dev_t device; 54 if (error == B_OK) { 55 device = next_dev(&fCookie); 56 if (device < 0) 57 error = device; 58 } 59 // init volume 60 if (error == B_OK) 61 error = volume->SetTo(device); 62 return error; 63} 64 65 66// Rewinds the list of available volumes back to the first item. 67void 68BVolumeRoster::Rewind() 69{ 70 fCookie = 0; 71} 72 73 74// Fills out the passed in BVolume object with the boot volume. 75status_t 76BVolumeRoster::GetBootVolume(BVolume *volume) 77{ 78 // check parameter 79 status_t error = (volume ? B_OK : B_BAD_VALUE); 80 // get device 81 dev_t device; 82 if (error == B_OK) { 83 device = dev_for_path(kBootVolumePath); 84 if (device < 0) 85 error = device; 86 } 87 // init volume 88 if (error == B_OK) 89 error = volume->SetTo(device); 90 return error; 91} 92 93 94// Starts watching the available volumes for changes. 95status_t 96BVolumeRoster::StartWatching(BMessenger messenger) 97{ 98 StopWatching(); 99 status_t error = (messenger.IsValid() ? B_OK : B_ERROR); 100 // clone messenger 101 if (error == B_OK) { 102 fTarget = new(nothrow) BMessenger(messenger); 103 if (!fTarget) 104 error = B_NO_MEMORY; 105 } 106 // start watching 107 if (error == B_OK) 108 error = watch_node(NULL, B_WATCH_MOUNT, messenger); 109 // cleanup on failure 110 if (error != B_OK && fTarget) { 111 delete fTarget; 112 fTarget = NULL; 113 } 114 return error; 115} 116 117 118// Stops watching volumes initiated by StartWatching(). 119void 120BVolumeRoster::StopWatching() 121{ 122 if (fTarget) { 123 stop_watching(*fTarget); 124 delete fTarget; 125 fTarget = NULL; 126 } 127} 128 129 130// Returns the messenger currently watching the volume list. 131BMessenger 132BVolumeRoster::Messenger() const 133{ 134 return (fTarget ? *fTarget : BMessenger()); 135} 136 137 138// FBC 139void BVolumeRoster::_SeveredVRoster1() {} 140void BVolumeRoster::_SeveredVRoster2() {} 141 142 143#ifdef USE_OPENBEOS_NAMESPACE 144} 145#endif 146