Added a KPartition listener mechanism and made use of it to keep shadow partitions with the corresponding physical ones in sync.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4848 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -3,10 +3,9 @@
|
||||
#ifndef _K_DISK_DEVICE_PARTITION_H
|
||||
#define _K_DISK_DEVICE_PARTITION_H
|
||||
|
||||
#include <disk_device_manager.h>
|
||||
#include <Vector.h>
|
||||
|
||||
#include "disk_device_manager.h"
|
||||
|
||||
struct user_partition_data;
|
||||
|
||||
namespace BPrivate {
|
||||
@@ -16,6 +15,7 @@ class UserDataWriter;
|
||||
|
||||
class KDiskDevice;
|
||||
class KDiskSystem;
|
||||
class KPartitionListener;
|
||||
class KPartitionVisitor;
|
||||
class KPhysicalPartition;
|
||||
class KShadowPartition;
|
||||
@@ -164,6 +164,11 @@ public:
|
||||
void SetContentCookie(void *cookie);
|
||||
void *ContentCookie() const;
|
||||
|
||||
// Listener Support
|
||||
|
||||
bool AddListener(KPartitionListener *listener);
|
||||
bool RemoveListener(KPartitionListener *listener);
|
||||
|
||||
// Change Tracking
|
||||
|
||||
void Changed(uint32 flags, uint32 clearFlags = 0);
|
||||
@@ -181,18 +186,42 @@ public:
|
||||
|
||||
virtual void Dump(bool deep, int32 level);
|
||||
|
||||
protected:
|
||||
void FireOffsetChanged(off_t offset);
|
||||
void FireSizeChanged(off_t size);
|
||||
void FireContentSizeChanged(off_t size);
|
||||
void FireBlockSizeChanged(uint32 blockSize);
|
||||
void FireIndexChanged(int32 index);
|
||||
void FireStatusChanged(uint32 status);
|
||||
void FireFlagsChanged(uint32 flags);
|
||||
void FireNameChanged(const char *name);
|
||||
void FireContentNameChanged(const char *name);
|
||||
void FireTypeChanged(const char *type);
|
||||
void FireIDChanged(partition_id id);
|
||||
void FireVolumeIDChanged(dev_t volumeID);
|
||||
void FireMountCookieChanged(void *cookie);
|
||||
void FireParametersChanged(const char *parameters);
|
||||
void FireContentParametersChanged(const char *parameters);
|
||||
void FireChildAdded(KPartition *child, int32 index);
|
||||
void FireChildRemoved(KPartition *child, int32 index);
|
||||
void FireDiskSystemChanged(KDiskSystem *diskSystem);
|
||||
void FireCookieChanged(void *cookie);
|
||||
void FireContentCookieChanged(void *cookie);
|
||||
|
||||
private:
|
||||
void _UpdateChildIndices(int32 index);
|
||||
static int32 _NextID();
|
||||
|
||||
protected:
|
||||
typedef Vector<KPartition*> PartitionVector;
|
||||
struct ListenerSet;
|
||||
|
||||
partition_data fPartitionData;
|
||||
PartitionVector fChildren;
|
||||
KDiskDevice *fDevice;
|
||||
KPartition *fParent;
|
||||
KDiskSystem *fDiskSystem;
|
||||
ListenerSet *fListeners;
|
||||
uint32 fChangeFlags;
|
||||
int32 fChangeCounter;
|
||||
uint32 fAlgorithmData;
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
// KPartitionListener.h
|
||||
|
||||
#ifndef _K_DISK_DEVICE_PARTITION_LISTENER_H
|
||||
#define _K_DISK_DEVICE_PARTITION_LISTENER_H
|
||||
|
||||
#include "disk_device_manager.h"
|
||||
|
||||
namespace BPrivate {
|
||||
namespace DiskDevice {
|
||||
|
||||
class KDiskSystem;
|
||||
class KPartition;
|
||||
|
||||
class KPartitionListener {
|
||||
public:
|
||||
KPartitionListener();
|
||||
virtual ~KPartitionListener();
|
||||
|
||||
virtual void OffsetChanged(KPartition *partition, off_t offset);
|
||||
virtual void SizeChanged(KPartition *partition, off_t size);
|
||||
virtual void ContentSizeChanged(KPartition *partition, off_t size);
|
||||
virtual void BlockSizeChanged(KPartition *partition, uint32 blockSize);
|
||||
virtual void IndexChanged(KPartition *partition, int32 index);
|
||||
virtual void StatusChanged(KPartition *partition, uint32 status);
|
||||
virtual void FlagsChanged(KPartition *partition, uint32 flags);
|
||||
virtual void NameChanged(KPartition *partition, const char *name);
|
||||
virtual void ContentNameChanged(KPartition *partition, const char *name);
|
||||
virtual void TypeChanged(KPartition *partition, const char *type);
|
||||
virtual void IDChanged(KPartition *partition, partition_id id);
|
||||
virtual void VolumeIDChanged(KPartition *partition, dev_t volumeID);
|
||||
virtual void MountCookieChanged(KPartition *partition, void *cookie);
|
||||
virtual void ParametersChanged(KPartition *partition,
|
||||
const char *parameters);
|
||||
virtual void ContentParametersChanged(KPartition *partition,
|
||||
const char *parameters);
|
||||
virtual void ChildAdded(KPartition *partition, KPartition *child,
|
||||
int32 index);
|
||||
virtual void ChildRemoved(KPartition *partition, KPartition *child,
|
||||
int32 index);
|
||||
virtual void DiskSystemChanged(KPartition *partition,
|
||||
KDiskSystem *diskSystem);
|
||||
virtual void CookieChanged(KPartition *partition, void *cookie);
|
||||
virtual void ContentCookieChanged(KPartition *partition, void *cookie);
|
||||
};
|
||||
|
||||
} // namespace DiskDevice
|
||||
} // namespace BPrivate
|
||||
|
||||
using BPrivate::DiskDevice::KPartitionListener;
|
||||
|
||||
#endif // _K_DISK_DEVICE_PARTITION_LISTENER_H
|
||||
@@ -3,14 +3,15 @@
|
||||
#ifndef _K_DISK_DEVICE_SHADOW_PARTITION_H
|
||||
#define _K_DISK_DEVICE_SHADOW_PARTITION_H
|
||||
|
||||
#include "KPartition.h"
|
||||
#include <KPartition.h>
|
||||
#include <KPartitionListener.h>
|
||||
|
||||
namespace BPrivate {
|
||||
namespace DiskDevice {
|
||||
|
||||
class KPhysicalPartition;
|
||||
|
||||
class KShadowPartition : public KPartition {
|
||||
class KShadowPartition : public KPartition, private KPartitionListener {
|
||||
public:
|
||||
KShadowPartition(KPhysicalPartition *physicalPartition);
|
||||
virtual ~KShadowPartition();
|
||||
@@ -34,8 +35,36 @@ public:
|
||||
|
||||
virtual void Dump(bool deep, int32 level);
|
||||
|
||||
protected:
|
||||
private:
|
||||
virtual void OffsetChanged(KPartition *partition, off_t offset);
|
||||
virtual void SizeChanged(KPartition *partition, off_t size);
|
||||
virtual void ContentSizeChanged(KPartition *partition, off_t size);
|
||||
virtual void BlockSizeChanged(KPartition *partition, uint32 blockSize);
|
||||
virtual void IndexChanged(KPartition *partition, int32 index);
|
||||
virtual void StatusChanged(KPartition *partition, uint32 status);
|
||||
virtual void FlagsChanged(KPartition *partition, uint32 flags);
|
||||
virtual void NameChanged(KPartition *partition, const char *name);
|
||||
virtual void ContentNameChanged(KPartition *partition, const char *name);
|
||||
virtual void TypeChanged(KPartition *partition, const char *type);
|
||||
virtual void IDChanged(KPartition *partition, partition_id id);
|
||||
virtual void VolumeIDChanged(KPartition *partition, dev_t volumeID);
|
||||
virtual void MountCookieChanged(KPartition *partition, void *cookie);
|
||||
virtual void ParametersChanged(KPartition *partition,
|
||||
const char *parameters);
|
||||
virtual void ContentParametersChanged(KPartition *partition,
|
||||
const char *parameters);
|
||||
virtual void ChildAdded(KPartition *partition, KPartition *child,
|
||||
int32 index);
|
||||
virtual void ChildRemoved(KPartition *partition, KPartition *child,
|
||||
int32 index);
|
||||
virtual void DiskSystemChanged(KPartition *partition,
|
||||
KDiskSystem *diskSystem);
|
||||
virtual void CookieChanged(KPartition *partition, void *cookie);
|
||||
virtual void ContentCookieChanged(KPartition *partition, void *cookie);
|
||||
|
||||
private:
|
||||
KPhysicalPartition *fPhysicalPartition;
|
||||
|
||||
};
|
||||
|
||||
} // namespace DiskDevice
|
||||
|
||||
Reference in New Issue
Block a user