root/headers/private/kernel/disk_device_manager/KDiskDevice.h
/*
 * Copyright 2003-2007, Ingo Weinhold, bonefish@cs.tu-berlin.de. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _K_DISK_DEVICE_H
#define _K_DISK_DEVICE_H


#include <OS.h>

#include <lock.h>

#include "KPartition.h"


namespace BPrivate {
namespace DiskDevice {


class UserDataWriter;


class KDiskDevice : public KPartition {
public:
        KDiskDevice(partition_id id = -1);
        virtual ~KDiskDevice();

        status_t SetTo(const char *path);
        void Unset();

        // A read lock owner can be sure that the device (incl. all of its
        // partitions won't be changed).
        // A write lock owner is moreover allowed to make changes.
        // The hierarchy is additionally protected by the disk device manager's
        // lock -- only a device write lock owner is allowed to change it, but
        // manager lock owners can be sure, that it won't change.
        bool ReadLock();
        void ReadUnlock();
        bool WriteLock();
        void WriteUnlock();

        virtual void SetID(partition_id id);

        virtual status_t PublishDevice();
        virtual status_t UnpublishDevice();
        virtual status_t RepublishDevice();

        void SetDeviceFlags(uint32 flags);      // comprises the ones below
        uint32 DeviceFlags() const;
        bool IsReadOnlyMedia() const;
        bool IsWriteOnce() const;
        bool IsRemovable() const;
        bool HasMedia() const;
        bool MediaChanged() const;

        void UpdateMediaStatusIfNeeded();
        void UninitializeMedia();

        void UpdateGeometry();

        const char *Path() const;
        virtual status_t GetFileName(char* buffer, size_t size) const;
        virtual status_t GetPath(KPath *path) const;

        // File descriptor: valid only for kernel threads.
        int FD() const;

        // access to C style device data
        disk_device_data *DeviceData();
        const disk_device_data *DeviceData() const;

        virtual void WriteUserData(UserDataWriter &writer,
                user_partition_data *data);
        void WriteUserData(UserDataWriter &writer);

        virtual void Dump(bool deep = true, int32 level = 0);

protected:
        virtual status_t GetMediaStatus(status_t *mediaStatus);
        virtual status_t GetGeometry(device_geometry *geometry);

private:
        void _ResetGeometry();
        void _InitPartitionData();
        void _UpdateDeviceFlags();

        disk_device_data        fDeviceData;
        rw_lock                         fLocker;
        int                                     fFD;
        status_t                        fMediaStatus;
};


} // namespace DiskDevice
} // namespace BPrivate


using BPrivate::DiskDevice::KDiskDevice;


#endif  // _K_DISK_DEVICE_H