#include <errno.h>
#include <new>
#include <Bitmap.h>
#include <Directory.h>
#include <fs_info.h>
#include <Node.h>
#include <NodeMonitor.h>
#include <VolumeRoster.h>
static const char kBootVolumePath[] = "/boot";
using namespace std;
#ifdef USE_OPENBEOS_NAMESPACE
namespace OpenBeOS {
#endif
BVolumeRoster::BVolumeRoster()
: fCookie(0),
fTarget(NULL)
{
}
BVolumeRoster::~BVolumeRoster()
{
StopWatching();
}
status_t
BVolumeRoster::GetNextVolume(BVolume *volume)
{
status_t error = (volume ? B_OK : B_BAD_VALUE);
dev_t device;
if (error == B_OK) {
device = next_dev(&fCookie);
if (device < 0)
error = device;
}
if (error == B_OK)
error = volume->SetTo(device);
return error;
}
void
BVolumeRoster::Rewind()
{
fCookie = 0;
}
status_t
BVolumeRoster::GetBootVolume(BVolume *volume)
{
status_t error = (volume ? B_OK : B_BAD_VALUE);
dev_t device;
if (error == B_OK) {
device = dev_for_path(kBootVolumePath);
if (device < 0)
error = device;
}
if (error == B_OK)
error = volume->SetTo(device);
return error;
}
status_t
BVolumeRoster::StartWatching(BMessenger messenger)
{
StopWatching();
status_t error = (messenger.IsValid() ? B_OK : B_ERROR);
if (error == B_OK) {
fTarget = new(nothrow) BMessenger(messenger);
if (!fTarget)
error = B_NO_MEMORY;
}
if (error == B_OK)
error = watch_node(NULL, B_WATCH_MOUNT, messenger);
if (error != B_OK && fTarget) {
delete fTarget;
fTarget = NULL;
}
return error;
}
void
BVolumeRoster::StopWatching()
{
if (fTarget) {
stop_watching(*fTarget);
delete fTarget;
fTarget = NULL;
}
}
BMessenger
BVolumeRoster::Messenger() const
{
return (fTarget ? *fTarget : BMessenger());
}
void BVolumeRoster::_SeveredVRoster1() {}
void BVolumeRoster::_SeveredVRoster2() {}
#ifdef USE_OPENBEOS_NAMESPACE
}
#endif