srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 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 | // |
srs5694 | 978041c | 2009-09-21 20:51:47 -0400 | [diff] [blame] | 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. |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 14 | |
| 15 | #ifndef __GPTPART_H |
| 16 | #define __GPTPART_H |
| 17 | |
| 18 | #include <stdint.h> |
srs5694 | 546a9c7 | 2010-01-26 16:00:26 -0500 | [diff] [blame] | 19 | #include <string> |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 20 | #include <sys/types.h> |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 21 | #include "support.h" |
| 22 | #include "parttypes.h" |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 23 | #include "guid.h" |
srs5694 | 0873e9d | 2010-10-07 13:00:45 -0400 | [diff] [blame] | 24 | #include "attributes.h" |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 25 | |
| 26 | using namespace std; |
| 27 | |
Roderick W. Smith | a345a92 | 2014-02-22 12:12:32 -0500 | [diff] [blame] | 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 | |
srs5694 | 978041c | 2009-09-21 20:51:47 -0400 | [diff] [blame] | 33 | /**************************************** |
| 34 | * * |
| 35 | * GPTPart class and related structures * |
| 36 | * * |
| 37 | ****************************************/ |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 38 | |
| 39 | class GPTPart { |
| 40 | protected: |
srs5694 | ba00fed | 2010-01-12 18:18:36 -0500 | [diff] [blame] | 41 | // Caution: The non-static data in GPTPart is precisely the right size |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 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 |
srs5694 | ba00fed | 2010-01-12 18:18:36 -0500 | [diff] [blame] | 46 | // GPTData::LoadSecondTableAsMain() and then removing the GPTPart |
| 47 | // size check in SizesOK() (in gpt.cc file). |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 48 | PartType partitionType; |
| 49 | GUIDData uniqueGUID; |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 50 | uint64_t firstLBA; |
| 51 | uint64_t lastLBA; |
srs5694 | 0873e9d | 2010-10-07 13:00:45 -0400 | [diff] [blame] | 52 | Attributes attributes; |
Roderick W. Smith | 84aaff6 | 2014-02-17 16:17:11 -0500 | [diff] [blame] | 53 | uint16_t name[NAME_SIZE]; |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 54 | public: |
| 55 | GPTPart(void); |
| 56 | ~GPTPart(void); |
| 57 | |
| 58 | // Simple data retrieval: |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 59 | PartType & GetType(void) {return partitionType;} |
srs5694 | bf8950c | 2011-03-12 01:23:12 -0500 | [diff] [blame] | 60 | uint16_t GetHexType(void) const; |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 61 | string GetTypeName(void); |
srs5694 | 5a60853 | 2011-03-17 13:53:01 -0400 | [diff] [blame] | 62 | UnicodeString GetUTypeName(void); |
srs5694 | 5a08175 | 2010-09-24 20:39:41 -0400 | [diff] [blame] | 63 | const GUIDData GetUniqueGUID(void) const {return uniqueGUID;} |
| 64 | uint64_t GetFirstLBA(void) const {return firstLBA;} |
| 65 | uint64_t GetLastLBA(void) const {return lastLBA;} |
srs5694 | bf8950c | 2011-03-12 01:23:12 -0500 | [diff] [blame] | 66 | uint64_t GetLengthLBA(void) const; |
srs5694 | 0873e9d | 2010-10-07 13:00:45 -0400 | [diff] [blame] | 67 | Attributes GetAttributes(void) {return attributes;} |
| 68 | void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);} |
srs5694 | 5a60853 | 2011-03-17 13:53:01 -0400 | [diff] [blame] | 69 | UnicodeString GetDescription(void); |
srs5694 | 08bb0da | 2010-02-19 17:19:55 -0500 | [diff] [blame] | 70 | int IsUsed(void); |
Roderick W. Smith | 9b338c5 | 2014-02-20 11:13:36 -0500 | [diff] [blame] | 71 | int IsSizedForMBR(void); |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 72 | |
| 73 | // Simple data assignment: |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 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();} |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 78 | void SetFirstLBA(uint64_t f) {firstLBA = f;} |
| 79 | void SetLastLBA(uint64_t l) {lastLBA = l;} |
| 80 | void SetAttributes(uint64_t a) {attributes = a;} |
srs5694 | 0873e9d | 2010-10-07 13:00:45 -0400 | [diff] [blame] | 81 | void SetAttributes(void) {attributes.ChangeAttributes();} |
srs5694 | 699941e | 2011-03-21 21:33:57 -0400 | [diff] [blame] | 82 | void SetName(const string & theName); |
srs5694 | 00b6d7a | 2011-06-26 22:40:06 -0400 | [diff] [blame] | 83 | #ifdef USE_UTF16 |
srs5694 | 699941e | 2011-03-21 21:33:57 -0400 | [diff] [blame] | 84 | void SetName(const UnicodeString & theName); |
| 85 | #endif |
srs5694 | 6699b01 | 2010-02-04 00:55:30 -0500 | [diff] [blame] | 86 | void SetDefaultDescription(void); |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 87 | |
| 88 | // Additional functions |
| 89 | GPTPart & operator=(const GPTPart & orig); |
srs5694 | 9a46b04 | 2011-03-15 00:34:10 -0400 | [diff] [blame] | 90 | bool operator<(const GPTPart &other) const; |
srs5694 | 978041c | 2009-09-21 20:51:47 -0400 | [diff] [blame] | 91 | void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line) |
Jeff Sharkey | d761ff5 | 2015-02-28 19:18:39 -0800 | [diff] [blame] | 92 | void ShowDetails(uint32_t blockSize); // display detailed information (multi-line) |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 93 | void BlankPartition(void); // empty partition of data |
srs5694 | 0a69731 | 2010-01-28 21:10:52 -0500 | [diff] [blame] | 94 | int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 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 | |
srs5694 | a0eb11a | 2009-08-29 15:00:08 -0400 | [diff] [blame] | 101 | #endif |