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