1*9d5f5318SJohn Scipione/* 2*9d5f5318SJohn Scipione * Copyright 2002-2013 Haiku Inc. All rights reserved. 3*9d5f5318SJohn Scipione * Distributed under the terms of the MIT License. 4*9d5f5318SJohn Scipione * 5*9d5f5318SJohn Scipione * Authors: 6*9d5f5318SJohn Scipione * Tyler Dauwalder 7*9d5f5318SJohn Scipione * Vincent Dominguez 8*9d5f5318SJohn Scipione * John Scipione, jscipione@gmail.com 9*9d5f5318SJohn Scipione * Ingo Weinhold, bonefish@users.sf.net 10*9d5f5318SJohn Scipione * 11*9d5f5318SJohn Scipione * Corresponds to: 12*9d5f5318SJohn Scipione * headers/os/storage/Volume.h hrev45306 13*9d5f5318SJohn Scipione * src/kits/storage/Volume.cpp hrev45306 14*9d5f5318SJohn Scipione */ 15*9d5f5318SJohn Scipione 16*9d5f5318SJohn Scipione 17*9d5f5318SJohn Scipione/*! 18*9d5f5318SJohn Scipione \file Volume.h 19*9d5f5318SJohn Scipione \ingroup storage 20*9d5f5318SJohn Scipione \ingroup libbe 21*9d5f5318SJohn Scipione \brief Provides the BVolume class. 22*9d5f5318SJohn Scipione*/ 23*9d5f5318SJohn Scipione 24*9d5f5318SJohn Scipione 25*9d5f5318SJohn Scipione/*! 26*9d5f5318SJohn Scipione \class BVolume 27*9d5f5318SJohn Scipione \ingroup storage 28*9d5f5318SJohn Scipione \ingroup libbe 29*9d5f5318SJohn Scipione \brief Provides an interface for querying information about a volume. 30*9d5f5318SJohn Scipione 31*9d5f5318SJohn Scipione The class is a simple wrapper for a \c dev_t and the function 32*9d5f5318SJohn Scipione fs_stat_dev(). The sole exception is the SetName() method which 33*9d5f5318SJohn Scipione sets the name of the volume. 34*9d5f5318SJohn Scipione*/ 35*9d5f5318SJohn Scipione 36*9d5f5318SJohn Scipione 37*9d5f5318SJohn Scipione/*! 38*9d5f5318SJohn Scipione \fn BVolume::BVolume() 39*9d5f5318SJohn Scipione \brief Creates an uninitialized BVolume object. 40*9d5f5318SJohn Scipione 41*9d5f5318SJohn Scipione InitCheck() will return \c B_NO_INIT. 42*9d5f5318SJohn Scipione 43*9d5f5318SJohn Scipione \see SetTo() 44*9d5f5318SJohn Scipione*/ 45*9d5f5318SJohn Scipione 46*9d5f5318SJohn Scipione 47*9d5f5318SJohn Scipione/*! 48*9d5f5318SJohn Scipione \fn BVolume::BVolume(dev_t device) 49*9d5f5318SJohn Scipione \brief Creates a BVolume and initializes it to the volume specified 50*9d5f5318SJohn Scipione by the supplied device ID. 51*9d5f5318SJohn Scipione 52*9d5f5318SJohn Scipione InitCheck() should be called afterwards to check if initialization was 53*9d5f5318SJohn Scipione successful. 54*9d5f5318SJohn Scipione 55*9d5f5318SJohn Scipione \param device The device ID of the volume. 56*9d5f5318SJohn Scipione*/ 57*9d5f5318SJohn Scipione 58*9d5f5318SJohn Scipione 59*9d5f5318SJohn Scipione/*! 60*9d5f5318SJohn Scipione \fn BVolume::BVolume(const BVolume &volume) 61*9d5f5318SJohn Scipione \brief Creates a copy of the supplied BVolume object. 62*9d5f5318SJohn Scipione 63*9d5f5318SJohn Scipione Afterwards the object refers to the same device the supplied object 64*9d5f5318SJohn Scipione does. If the latter is not properly initialized, this result isn't 65*9d5f5318SJohn Scipione either. 66*9d5f5318SJohn Scipione 67*9d5f5318SJohn Scipione \param volume The volume object to be copied. 68*9d5f5318SJohn Scipione*/ 69*9d5f5318SJohn Scipione 70*9d5f5318SJohn Scipione 71*9d5f5318SJohn Scipione/*! 72*9d5f5318SJohn Scipione \fn BVolume::~BVolume() 73*9d5f5318SJohn Scipione \brief Destroys the object and frees all associated resources. 74*9d5f5318SJohn Scipione*/ 75*9d5f5318SJohn Scipione 76*9d5f5318SJohn Scipione 77*9d5f5318SJohn Scipione/*! 78*9d5f5318SJohn Scipione \name Constructor helper methods 79*9d5f5318SJohn Scipione*/ 80*9d5f5318SJohn Scipione 81*9d5f5318SJohn Scipione 82*9d5f5318SJohn Scipione//! @{ 83*9d5f5318SJohn Scipione 84*9d5f5318SJohn Scipione 85*9d5f5318SJohn Scipione/*! 86*9d5f5318SJohn Scipione \fn status_t BVolume::InitCheck(void) const 87*9d5f5318SJohn Scipione \brief Returns the initialization status. 88*9d5f5318SJohn Scipione 89*9d5f5318SJohn Scipione \return \c B_OK if the object was properly initialized, or an error code 90*9d5f5318SJohn Scipione otherwise. 91*9d5f5318SJohn Scipione*/ 92*9d5f5318SJohn Scipione 93*9d5f5318SJohn Scipione 94*9d5f5318SJohn Scipione/*! 95*9d5f5318SJohn Scipione \fn status_t BVolume::SetTo(dev_t device) 96*9d5f5318SJohn Scipione \brief Initializes the object to refer to the volume specified by 97*9d5f5318SJohn Scipione the supplied device ID. 98*9d5f5318SJohn Scipione 99*9d5f5318SJohn Scipione \param device The device ID of the volume to set. 100*9d5f5318SJohn Scipione \return \c B_OK if the object was properly initialized, or an error code 101*9d5f5318SJohn Scipione otherwise. 102*9d5f5318SJohn Scipione*/ 103*9d5f5318SJohn Scipione 104*9d5f5318SJohn Scipione 105*9d5f5318SJohn Scipione/*! 106*9d5f5318SJohn Scipione \fn void BVolume::Unset() 107*9d5f5318SJohn Scipione \brief Brings the BVolume object to an uninitialized state. 108*9d5f5318SJohn Scipione 109*9d5f5318SJohn Scipione InitCheck() will return \c B_NO_INIT. 110*9d5f5318SJohn Scipione*/ 111*9d5f5318SJohn Scipione 112*9d5f5318SJohn Scipione 113*9d5f5318SJohn Scipione//! @} 114*9d5f5318SJohn Scipione 115*9d5f5318SJohn Scipione 116*9d5f5318SJohn Scipione/*! 117*9d5f5318SJohn Scipione \name Volume information methods 118*9d5f5318SJohn Scipione*/ 119*9d5f5318SJohn Scipione 120*9d5f5318SJohn Scipione 121*9d5f5318SJohn Scipione//! @{ 122*9d5f5318SJohn Scipione 123*9d5f5318SJohn Scipione 124*9d5f5318SJohn Scipione/*! 125*9d5f5318SJohn Scipione \fn dev_t BVolume::Device() const 126*9d5f5318SJohn Scipione \brief Returns the device ID of the volume the object refers to. 127*9d5f5318SJohn Scipione 128*9d5f5318SJohn Scipione \return Returns the device ID of the volume the object refers to 129*9d5f5318SJohn Scipione or -1 if the object was not properly initialized. 130*9d5f5318SJohn Scipione*/ 131*9d5f5318SJohn Scipione 132*9d5f5318SJohn Scipione 133*9d5f5318SJohn Scipione/*! 134*9d5f5318SJohn Scipione \fn status_t BVolume::GetRootDirectory(BDirectory *directory) const 135*9d5f5318SJohn Scipione \brief Writes the root directory of the volume referred to by this 136*9d5f5318SJohn Scipione object into \a directory. 137*9d5f5318SJohn Scipione 138*9d5f5318SJohn Scipione \param directory A pointer to a pre-allocated BDirectory to be initialized 139*9d5f5318SJohn Scipione to the volume's root directory. 140*9d5f5318SJohn Scipione 141*9d5f5318SJohn Scipione \return A status code. 142*9d5f5318SJohn Scipione \retval B_OK Everything went fine. 143*9d5f5318SJohn Scipione \retval B_BAD_VALUE \a directory was \c NULL or the object was not properly 144*9d5f5318SJohn Scipione initialized. 145*9d5f5318SJohn Scipione*/ 146*9d5f5318SJohn Scipione 147*9d5f5318SJohn Scipione 148*9d5f5318SJohn Scipione/*! 149*9d5f5318SJohn Scipione \fn off_t BVolume::Capacity() const 150*9d5f5318SJohn Scipione \brief Returns the total storage capacity of the volume. 151*9d5f5318SJohn Scipione 152*9d5f5318SJohn Scipione \return The volume's total storage capacity (in bytes), or \c B_BAD_VALUE 153*9d5f5318SJohn Scipione if the object is not properly initialized. 154*9d5f5318SJohn Scipione*/ 155*9d5f5318SJohn Scipione 156*9d5f5318SJohn Scipione 157*9d5f5318SJohn Scipione/*! 158*9d5f5318SJohn Scipione \fn off_t BVolume::FreeBytes() const 159*9d5f5318SJohn Scipione \brief Returns the amount of unused space on the volume (in bytes). 160*9d5f5318SJohn Scipione 161*9d5f5318SJohn Scipione \return The amount of unused space on the volume (in bytes), or 162*9d5f5318SJohn Scipione \c B_BAD_VALUE if the object is not properly initialized. 163*9d5f5318SJohn Scipione*/ 164*9d5f5318SJohn Scipione 165*9d5f5318SJohn Scipione 166*9d5f5318SJohn Scipione/*! 167*9d5f5318SJohn Scipione \fn off_t BVolume::BlockSize() const 168*9d5f5318SJohn Scipione \brief Returns the size of one block (in bytes). The meaning of this 169*9d5f5318SJohn Scipione depends on the underlying file system. 170*9d5f5318SJohn Scipione 171*9d5f5318SJohn Scipione \return The block size in bytes, \c B_NO_INIT if the volume is not 172*9d5f5318SJohn Scipione initialized or other errors forwarded from the file system. 173*9d5f5318SJohn Scipione*/ 174*9d5f5318SJohn Scipione 175*9d5f5318SJohn Scipione 176*9d5f5318SJohn Scipione//! @} 177*9d5f5318SJohn Scipione 178*9d5f5318SJohn Scipione 179*9d5f5318SJohn Scipione/*! 180*9d5f5318SJohn Scipione \name Volume name methods 181*9d5f5318SJohn Scipione*/ 182*9d5f5318SJohn Scipione 183*9d5f5318SJohn Scipione 184*9d5f5318SJohn Scipione//! @{ 185*9d5f5318SJohn Scipione 186*9d5f5318SJohn Scipione 187*9d5f5318SJohn Scipione/*! 188*9d5f5318SJohn Scipione \fn status_t BVolume::GetName(char* name) const 189*9d5f5318SJohn Scipione \brief Writes the volume's name into the provided buffer. 190*9d5f5318SJohn Scipione 191*9d5f5318SJohn Scipione \param name A pointer to a pre-allocated character buffer of size 192*9d5f5318SJohn Scipione \c B_FILE_NAME_LENGTH or larger into which the name of the 193*9d5f5318SJohn Scipione volume is written. 194*9d5f5318SJohn Scipione 195*9d5f5318SJohn Scipione \return A status code. 196*9d5f5318SJohn Scipione \retval B_OK Everything went fine. 197*9d5f5318SJohn Scipione \retval B_BAD_VALUE \a name was \c NULL or the object was not properly 198*9d5f5318SJohn Scipione initialized. 199*9d5f5318SJohn Scipione*/ 200*9d5f5318SJohn Scipione 201*9d5f5318SJohn Scipione 202*9d5f5318SJohn Scipione/*! 203*9d5f5318SJohn Scipione \fn status_t BVolume::SetName(const char *name) 204*9d5f5318SJohn Scipione \brief Sets the volume's name to \a name. 205*9d5f5318SJohn Scipione 206*9d5f5318SJohn Scipione \note The R5 implementation checks if an entry with the volume's old name 207*9d5f5318SJohn Scipione exists in the root directory and renames that entry, if it is indeed 208*9d5f5318SJohn Scipione the mount point of the volume (or a link referring to it). In all 209*9d5f5318SJohn Scipione other cases, nothing is done (even if the mount point is named like 210*9d5f5318SJohn Scipione the volume, but lives in a different directory). We follow suit for 211*9d5f5318SJohn Scipione the time being. 212*9d5f5318SJohn Scipione 213*9d5f5318SJohn Scipione \warning If the volume name is set to "boot" this method tries to rename 214*9d5f5318SJohn Scipione it to /boot, but is prevented by the kernel. 215*9d5f5318SJohn Scipione 216*9d5f5318SJohn Scipione \param name The new name of the volume, must not be longer than 217*9d5f5318SJohn Scipione \c B_FILE_NAME_LENGTH (including the terminating \c NULL). 218*9d5f5318SJohn Scipione 219*9d5f5318SJohn Scipione \return A status code. 220*9d5f5318SJohn Scipione \retval B_OK Everything went fine. 221*9d5f5318SJohn Scipione \retval B_BAD_VALUE \a name was \c NULL or the object was not properly 222*9d5f5318SJohn Scipione initialized. 223*9d5f5318SJohn Scipione*/ 224*9d5f5318SJohn Scipione 225*9d5f5318SJohn Scipione 226*9d5f5318SJohn Scipione//! @} 227*9d5f5318SJohn Scipione 228*9d5f5318SJohn Scipione 229*9d5f5318SJohn Scipione/*! 230*9d5f5318SJohn Scipione \name Volume icon methods 231*9d5f5318SJohn Scipione*/ 232*9d5f5318SJohn Scipione 233*9d5f5318SJohn Scipione 234*9d5f5318SJohn Scipione//! @{ 235*9d5f5318SJohn Scipione 236*9d5f5318SJohn Scipione 237*9d5f5318SJohn Scipione/*! 238*9d5f5318SJohn Scipione \fn status_t BVolume::GetIcon(BBitmap *icon, icon_size which) const 239*9d5f5318SJohn Scipione \brief Writes the volume's icon into the supplied BBitmap. 240*9d5f5318SJohn Scipione 241*9d5f5318SJohn Scipione \param icon A pointer to a pre-allocated BBitmap of the correct dimension 242*9d5f5318SJohn Scipione to store the requested icon (16x16 for the mini and 32x32 for the 243*9d5f5318SJohn Scipione large icon). 244*9d5f5318SJohn Scipione 245*9d5f5318SJohn Scipione \param which The icon size to be retrieved: \c B_MINI_ICON for the mini or 246*9d5f5318SJohn Scipione \c B_LARGE_ICON for the large icon. 247*9d5f5318SJohn Scipione*/ 248*9d5f5318SJohn Scipione 249*9d5f5318SJohn Scipione 250*9d5f5318SJohn Scipione/*! 251*9d5f5318SJohn Scipione \fn status_t BVolume::GetIcon(uint8** _data, size_t* _size, 252*9d5f5318SJohn Scipione type_code* _type) const 253*9d5f5318SJohn Scipione \brief Writes the volume's icon data into the supplied \c uint8 array. 254*9d5f5318SJohn Scipione 255*9d5f5318SJohn Scipione \param _data A pointer to a pointer to a pre-allocated \c uint8 array of 256*9d5f5318SJohn Scipione the correct size to store the requested icon. 257*9d5f5318SJohn Scipione \param _size The size of the retrieved icon (in bytes). 258*9d5f5318SJohn Scipione \param _type The type code of the retrieve icon. 259*9d5f5318SJohn Scipione 260*9d5f5318SJohn Scipione \returns A status code. 261*9d5f5318SJohn Scipione \retval B_OK Everything went fine. 262*9d5f5318SJohn Scipione \retval B_NO_INIT Object was not properly initialized. 263*9d5f5318SJohn Scipione 264*9d5f5318SJohn Scipione \see fs_stat_dev() for more return codes. 265*9d5f5318SJohn Scipione \see get_device_icon() for more return codes. 266*9d5f5318SJohn Scipione*/ 267*9d5f5318SJohn Scipione 268*9d5f5318SJohn Scipione 269*9d5f5318SJohn Scipione//! @} 270*9d5f5318SJohn Scipione 271*9d5f5318SJohn Scipione 272*9d5f5318SJohn Scipione/*! 273*9d5f5318SJohn Scipione \name Volume capability methods 274*9d5f5318SJohn Scipione*/ 275*9d5f5318SJohn Scipione 276*9d5f5318SJohn Scipione 277*9d5f5318SJohn Scipione//! @{ 278*9d5f5318SJohn Scipione 279*9d5f5318SJohn Scipione 280*9d5f5318SJohn Scipione/*! 281*9d5f5318SJohn Scipione \fn bool BVolume::IsRemovable() const 282*9d5f5318SJohn Scipione \brief Returns whether or not the volume is removable. 283*9d5f5318SJohn Scipione 284*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and is removable, 285*9d5f5318SJohn Scipione \c false otherwise. 286*9d5f5318SJohn Scipione*/ 287*9d5f5318SJohn Scipione 288*9d5f5318SJohn Scipione 289*9d5f5318SJohn Scipione/*! 290*9d5f5318SJohn Scipione \fn bool BVolume::IsReadOnly(void) const 291*9d5f5318SJohn Scipione \brief Returns whether or not the volume is read-only. 292*9d5f5318SJohn Scipione 293*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and is read-only, 294*9d5f5318SJohn Scipione \c false otherwise. 295*9d5f5318SJohn Scipione*/ 296*9d5f5318SJohn Scipione 297*9d5f5318SJohn Scipione 298*9d5f5318SJohn Scipione/*! 299*9d5f5318SJohn Scipione \fn bool BVolume::IsPersistent(void) const 300*9d5f5318SJohn Scipione \brief Returns whether or not the volume is persistent. 301*9d5f5318SJohn Scipione 302*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and is persistent, 303*9d5f5318SJohn Scipione \c false otherwise. 304*9d5f5318SJohn Scipione*/ 305*9d5f5318SJohn Scipione 306*9d5f5318SJohn Scipione 307*9d5f5318SJohn Scipione/*! 308*9d5f5318SJohn Scipione \fn bool BVolume::IsShared(void) const 309*9d5f5318SJohn Scipione \brief Returns whether or not the volume is shared. 310*9d5f5318SJohn Scipione 311*9d5f5318SJohn Scipione return \c true, if the volume was properly initialized and is shared, 312*9d5f5318SJohn Scipione \c false otherwise. 313*9d5f5318SJohn Scipione*/ 314*9d5f5318SJohn Scipione 315*9d5f5318SJohn Scipione 316*9d5f5318SJohn Scipione/*! 317*9d5f5318SJohn Scipione \fn bool BVolume::KnowsMime(void) const 318*9d5f5318SJohn Scipione \brief Returns whether or not the volume supports MIME-types. 319*9d5f5318SJohn Scipione 320*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and supports 321*9d5f5318SJohn Scipione MIME-types, \c false otherwise. 322*9d5f5318SJohn Scipione*/ 323*9d5f5318SJohn Scipione 324*9d5f5318SJohn Scipione 325*9d5f5318SJohn Scipione/*! 326*9d5f5318SJohn Scipione \fn bool BVolume::KnowsAttr(void) const 327*9d5f5318SJohn Scipione \brief Returns whether or not the volume supports attributes. 328*9d5f5318SJohn Scipione 329*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and supports 330*9d5f5318SJohn Scipione attributes, \c false otherwise. 331*9d5f5318SJohn Scipione*/ 332*9d5f5318SJohn Scipione 333*9d5f5318SJohn Scipione 334*9d5f5318SJohn Scipione/*! 335*9d5f5318SJohn Scipione \fn bool BVolume::KnowsQuery(void) const 336*9d5f5318SJohn Scipione \brief Returns whether or not the volume supports queries. 337*9d5f5318SJohn Scipione 338*9d5f5318SJohn Scipione \return \c true, if the volume was properly initialized and supports 339*9d5f5318SJohn Scipione queries, \c false otherwise. 340*9d5f5318SJohn Scipione*/ 341*9d5f5318SJohn Scipione 342*9d5f5318SJohn Scipione 343*9d5f5318SJohn Scipione//! @} 344*9d5f5318SJohn Scipione 345*9d5f5318SJohn Scipione 346*9d5f5318SJohn Scipione/*! 347*9d5f5318SJohn Scipione \name Operator overload methods 348*9d5f5318SJohn Scipione*/ 349*9d5f5318SJohn Scipione 350*9d5f5318SJohn Scipione 351*9d5f5318SJohn Scipione//! @{ 352*9d5f5318SJohn Scipione 353*9d5f5318SJohn Scipione 354*9d5f5318SJohn Scipione/*! 355*9d5f5318SJohn Scipione \fn bool BVolume::operator==(const BVolume &volume) const 356*9d5f5318SJohn Scipione \brief Returns whether or not the supplied BVolume object is equal to this 357*9d5f5318SJohn Scipione object. 358*9d5f5318SJohn Scipione 359*9d5f5318SJohn Scipione Two volume objects are said to be equal if they are both uninitialized, 360*9d5f5318SJohn Scipione or they are both initialized and refer to the same volume. 361*9d5f5318SJohn Scipione 362*9d5f5318SJohn Scipione \param volume The volume to be tested for equality. 363*9d5f5318SJohn Scipione 364*9d5f5318SJohn Scipione \return \c true, if the objects are equal, \c false otherwise. 365*9d5f5318SJohn Scipione*/ 366*9d5f5318SJohn Scipione 367*9d5f5318SJohn Scipione 368*9d5f5318SJohn Scipione/*! 369*9d5f5318SJohn Scipione \fn bool BVolume::operator!=(const BVolume &volume) const 370*9d5f5318SJohn Scipione \brief Returns whether or not the supplied BVolume object is NOT equal to 371*9d5f5318SJohn Scipione this object. 372*9d5f5318SJohn Scipione 373*9d5f5318SJohn Scipione Two volume objects are said to be unequal if one is initialized and the 374*9d5f5318SJohn Scipione other is not or if they are both initialized and refer to the different 375*9d5f5318SJohn Scipione volumes. 376*9d5f5318SJohn Scipione 377*9d5f5318SJohn Scipione \param volume The volume to be tested for inequality. 378*9d5f5318SJohn Scipione 379*9d5f5318SJohn Scipione \return \c true, if the objects and unequal, \c false otherwise. 380*9d5f5318SJohn Scipione*/ 381*9d5f5318SJohn Scipione 382*9d5f5318SJohn Scipione 383*9d5f5318SJohn Scipione/*! 384*9d5f5318SJohn Scipione \fn BVolume& BVolume::operator=(const BVolume &volume) 385*9d5f5318SJohn Scipione \brief Assigns the supplied BVolume object to this volume, this object is 386*9d5f5318SJohn Scipione made to be an exact clone of the supplied one. 387*9d5f5318SJohn Scipione 388*9d5f5318SJohn Scipione \param volume The volume to be assigned. 389*9d5f5318SJohn Scipione 390*9d5f5318SJohn Scipione \return A reference to this object. 391*9d5f5318SJohn Scipione*/ 392*9d5f5318SJohn Scipione 393*9d5f5318SJohn Scipione 394*9d5f5318SJohn Scipione//! @} 395