Files
haiku-beta6/headers/private/storage/Partition.h
T
Augustin Cavalier cbfbbf6d4d Change BObjectList to take "owning" as a template parameter and adjust all consumers.
Since BObjectList is a template class, this only breaks ABI where
BObjectList was exposed in public methods, and even then it's only
a name mangling break and we should be able to add compatibility
methods if necessary.

(The old "bool owning" member variable is left intact for ABI
compatibility, for the moment, though it's otherwise unused now.)

Tracker's PoseList is the only remaining type that has a "bool owning"
switch in the constructor rather than template parameters.

This should significantly improve the output of static code analysis
tools that previously detected list operations as causing use-after-frees
and double-frees, as well as make code maintenance easier by making it
easier to determine what list owns (or does not own) an object.
It should also be a minor performance optimization, since the branches
for calls to delete/free should now be optimized out altogether.

Still boots to desktop and Tracker, Deskbar, Debugger all tested
and verified as working.

Change-Id: If2a24a6f0d22e7a506ef554fcfdd328907279ed4
Reviewed-on: https://review.haiku-os.org/c/haiku/+/8915
Reviewed-by: waddlesplash <[email protected]>
2025-02-06 00:06:32 +00:00

234 lines
6.8 KiB
C++

/*
* Copyright 2003-2007, Ingo Weinhold, [email protected].
* Copyright 2003, Tyler Akidau, [email protected].
* Distributed under the terms of the MIT License.
*/
#ifndef _PARTITION_H
#define _PARTITION_H
#include <DiskDeviceDefs.h>
#include <Messenger.h>
#include <Mime.h>
class BBitmap;
class BDiskDevice;
class BPartitionParameterEditor;
class BDiskDeviceVisitor;
class BDiskSystem;
class BMutablePartition;
template <class T, bool O> class BObjectList;
class BPartitioningInfo;
class BPath;
class BVolume;
struct user_partition_data;
namespace BPrivate {
class DiskDeviceJobGenerator;
}
class BPartition {
public:
// Partition Info
off_t Offset() const; // 0 for devices
off_t Size() const;
off_t ContentSize() const; // 0 if uninitialized
uint32 BlockSize() const;
uint32 PhysicalBlockSize() const;
int32 Index() const; // 0 for devices
uint32 Status() const;
bool ContainsFileSystem() const;
bool ContainsPartitioningSystem() const;
bool IsDevice() const;
bool IsReadOnly() const;
bool IsMounted() const;
bool IsBusy() const;
uint32 Flags() const;
const char* Name() const;
BString ContentName() const;
const char* RawContentName() const;
const char* Type() const; // See DiskDeviceTypes.h
const char* ContentType() const; // See DiskDeviceTypes.h
partition_id ID() const;
const char* Parameters() const;
const char* ContentParameters() const;
status_t GetDiskSystem(BDiskSystem* diskSystem) const;
virtual status_t GetPath(BPath* path) const;
status_t GetVolume(BVolume* volume) const;
status_t GetIcon(BBitmap* icon, icon_size which) const;
status_t GetIcon(uint8** _data, size_t* _size,
type_code* _type) const;
status_t GetMountPoint(BPath* mountPoint) const;
status_t Mount(const char* mountPoint = NULL,
uint32 mountFlags = 0,
const char* parameters = NULL);
status_t Unmount(uint32 unmountFlags = 0);
// Hierarchy Info
BDiskDevice* Device() const;
BPartition* Parent() const;
BPartition* ChildAt(int32 index) const;
int32 CountChildren() const;
int32 CountDescendants() const;
BPartition* FindDescendant(partition_id id) const;
status_t GetPartitioningInfo(
BPartitioningInfo* info) const;
BPartition* VisitEachChild(BDiskDeviceVisitor* visitor)
const;
virtual BPartition* VisitEachDescendant(
BDiskDeviceVisitor* visitor) const;
// Self Modification
bool CanDefragment(bool* whileMounted = NULL) const;
status_t Defragment() const;
bool CanRepair(bool checkOnly,
bool* whileMounted = NULL) const;
status_t Repair(bool checkOnly) const;
bool CanResize(bool* canResizeContents = NULL,
bool* whileMounted = NULL) const;
status_t ValidateResize(off_t* size) const;
status_t Resize(off_t size);
bool CanMove(BObjectList<BPartition, false>*
unmovableDescendants = NULL,
BObjectList<BPartition, false>*
movableOnlyIfUnmounted = NULL) const;
status_t ValidateMove(off_t* newOffset) const;
status_t Move(off_t newOffset);
bool CanSetName() const;
status_t ValidateSetName(BString* name) const;
// adjusts name to be suitable
status_t SetName(const char* name);
bool CanSetContentName(
bool* whileMounted = NULL) const;
status_t ValidateSetContentName(BString* name) const;
// adjusts name to be suitable
status_t SetContentName(const char* name);
bool CanSetType() const;
status_t ValidateSetType(const char* type) const;
// type must be one the parent disk system's
// GetNextSupportedType() returns.
status_t SetType(const char* type);
bool CanEditParameters() const;
status_t GetParameterEditor(
B_PARAMETER_EDITOR_TYPE type,
BPartitionParameterEditor** editor);
status_t SetParameters(const char* parameters);
bool CanEditContentParameters(
bool* whileMounted = NULL) const;
status_t SetContentParameters(const char* parameters);
status_t GetNextSupportedType(int32 *cookie,
BString* type) const;
// Returns all partition types for this
// partition supported by the parent disk
// system.
status_t GetNextSupportedChildType(int32 *cookie,
BString* type) const;
// Returns all partition types for a child
// of this partition supported by its disk
// system.
bool IsSubSystem(const char* diskSystem) const;
bool CanInitialize(const char* diskSystem) const;
status_t ValidateInitialize(const char* diskSystem,
BString* name, const char* parameters);
status_t Initialize(const char* diskSystem,
const char* name, const char* parameters);
status_t Uninitialize();
// Modification of child partitions
bool CanCreateChild() const;
status_t ValidateCreateChild(off_t* start, off_t* size,
const char* type, BString* name,
const char* parameters) const;
status_t CreateChild(off_t start, off_t size,
const char* type, const char* name,
const char* parameters,
BPartition** child = NULL);
bool CanDeleteChild(int32 index) const;
status_t DeleteChild(int32 index);
bool SupportsChildName() const;
private:
class Delegate;
BPartition();
BPartition(const BPartition&);
virtual ~BPartition();
BPartition& operator=(const BPartition&);
status_t _SetTo(BDiskDevice* device, BPartition* parent,
user_partition_data* data);
void _Unset();
status_t _RemoveObsoleteDescendants(
user_partition_data* data, bool* updated);
status_t _Update(user_partition_data* data,
bool* updated);
void _RemoveChild(int32 index);
BPartition* _ChildAt(int32 index) const;
int32 _CountChildren() const;
int32 _CountDescendants() const;
int32 _Level() const;
virtual bool _AcceptVisitor(BDiskDeviceVisitor* visitor,
int32 level);
BPartition* _VisitEachDescendant(
BDiskDeviceVisitor* visitor,
int32 level = -1);
const user_partition_data* _PartitionData() const;
bool _HasContent() const;
bool _SupportsOperation(uint32 flag,
uint32 whileMountedFlag,
bool* whileMounted) const;
bool _SupportsChildOperation(const BPartition* child,
uint32 flag) const;
status_t _CreateDelegates();
status_t _InitDelegates();
void _DeleteDelegates();
bool _IsModified() const;
friend class BDiskDevice;
friend class BDiskSystem;
friend class BMutablePartition;
friend class BPrivate::DiskDeviceJobGenerator;
BDiskDevice* fDevice;
BPartition* fParent;
user_partition_data* fPartitionData;
Delegate* fDelegate;
};
#endif // _PARTITION_H