Home | History | Annotate | Download | only in gptfdisk
      1 //
      2 // C++ Interface: gptpart
      3 //
      4 // Description: Class to implement a single GPT partition
      5 //
      6 //
      7 // Author: Rod Smith <rodsmith (at) rodsbooks.com>, (C) 2009
      8 //
      9 // Copyright: See COPYING file that comes with this distribution
     10 //
     11 //
     12 // This program is copyright (c) 2009 by Roderick W. Smith. It is distributed
     13 // under the terms of the GNU GPL version 2, as detailed in the COPYING file.
     14 
     15 #ifndef __GPTPART_H
     16 #define __GPTPART_H
     17 
     18 #include <stdint.h>
     19 #include <string>
     20 #include <sys/types.h>
     21 #include "support.h"
     22 #include "parttypes.h"
     23 #include "guid.h"
     24 #include "attributes.h"
     25 
     26 using namespace std;
     27 
     28 // Values returned by GPTPart::IsSizedForMBR()
     29 #define MBR_SIZED_GOOD 0 /* Whole partition under 2^32 sectors */
     30 #define MBR_SIZED_IFFY 1 /* Partition starts under 2^32 & is less than 2^32, but ends over 2^32 */
     31 #define MBR_SIZED_BAD  2 /* Partition starts over 2^32, is bigger than 2^32, or otherwise bad */
     32 
     33 /****************************************
     34  *                                      *
     35  * GPTPart class and related structures *
     36  *                                      *
     37  ****************************************/
     38 
     39 class GPTPart {
     40    protected:
     41       // Caution: The non-static data in GPTPart is precisely the right size
     42       // to enable easy loading of the data directly from disk. If any
     43       // non-static variables are added to the below, the data size will
     44       // change and the program will stop working. This can be corrected by
     45       // adjusting the data-load operation in GPTData::LoadMainTable() and
     46       // GPTData::LoadSecondTableAsMain() and then removing the GPTPart
     47       // size check in SizesOK() (in gpt.cc file).
     48       PartType partitionType;
     49       GUIDData uniqueGUID;
     50       uint64_t firstLBA;
     51       uint64_t lastLBA;
     52       Attributes attributes;
     53       uint16_t name[NAME_SIZE];
     54    public:
     55       GPTPart(void);
     56       ~GPTPart(void);
     57 
     58       // Simple data retrieval:
     59       PartType & GetType(void) {return partitionType;}
     60       uint16_t GetHexType(void) const;
     61       string GetTypeName(void);
     62       UnicodeString GetUTypeName(void);
     63       const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
     64       uint64_t GetFirstLBA(void) const {return firstLBA;}
     65       uint64_t GetLastLBA(void) const {return lastLBA;}
     66       uint64_t GetLengthLBA(void) const;
     67       Attributes GetAttributes(void) {return attributes;}
     68       void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);}
     69       UnicodeString GetDescription(void);
     70       int IsUsed(void);
     71       int IsSizedForMBR(void);
     72 
     73       // Simple data assignment:
     74       void SetType(PartType t);
     75       void SetType(uint16_t hex) {partitionType = hex;}
     76       void SetUniqueGUID(GUIDData u) {uniqueGUID = u;}
     77       void RandomizeUniqueGUID(void) {uniqueGUID.Randomize();}
     78       void SetFirstLBA(uint64_t f) {firstLBA = f;}
     79       void SetLastLBA(uint64_t l) {lastLBA = l;}
     80       void SetAttributes(uint64_t a) {attributes = a;}
     81       void SetAttributes(void) {attributes.ChangeAttributes();}
     82       void SetName(const string & theName);
     83 #ifdef USE_UTF16
     84       void SetName(const UnicodeString & theName);
     85 #endif
     86       void SetDefaultDescription(void);
     87 
     88       // Additional functions
     89       GPTPart & operator=(const GPTPart & orig);
     90       bool operator<(const GPTPart &other) const;
     91       void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line)
     92       void ShowDetails(uint32_t blockSize); // display detailed information (multi-line)
     93       void BlankPartition(void); // empty partition of data
     94       int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap
     95       void ReversePartBytes(void); // reverse byte order of all integer fields
     96 
     97       // Functions requiring user interaction
     98       void ChangeType(void); // Change the type code
     99 }; // struct GPTPart
    100 
    101 #endif
    102