blob: e6467c1579addf35eefc9000bd03bc807d460e0c [file] [log] [blame]
srs5694a0eb11a2009-08-29 15:00:08 -04001//
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//
srs5694978041c2009-09-21 20:51:47 -040012// 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.
srs5694a0eb11a2009-08-29 15:00:08 -040014
15#ifndef __GPTPART_H
16#define __GPTPART_H
17
18#include <stdint.h>
srs5694546a9c72010-01-26 16:00:26 -050019#include <string>
srs5694a0eb11a2009-08-29 15:00:08 -040020#include <sys/types.h>
srs5694a0eb11a2009-08-29 15:00:08 -040021#include "support.h"
22#include "parttypes.h"
srs56946699b012010-02-04 00:55:30 -050023#include "guid.h"
srs5694a0eb11a2009-08-29 15:00:08 -040024
25using namespace std;
26
srs5694978041c2009-09-21 20:51:47 -040027/****************************************
28 * *
29 * GPTPart class and related structures *
30 * *
31 ****************************************/
srs5694a0eb11a2009-08-29 15:00:08 -040032
33class GPTPart {
34 protected:
srs5694ba00fed2010-01-12 18:18:36 -050035 // Caution: The non-static data in GPTPart is precisely the right size
srs5694a0eb11a2009-08-29 15:00:08 -040036 // to enable easy loading of the data directly from disk. If any
37 // non-static variables are added to the below, the data size will
38 // change and the program will stop working. This can be corrected by
39 // adjusting the data-load operation in GPTData::LoadMainTable() and
srs5694ba00fed2010-01-12 18:18:36 -050040 // GPTData::LoadSecondTableAsMain() and then removing the GPTPart
41 // size check in SizesOK() (in gpt.cc file).
srs56946699b012010-02-04 00:55:30 -050042 PartType partitionType;
43 GUIDData uniqueGUID;
srs5694a0eb11a2009-08-29 15:00:08 -040044 uint64_t firstLBA;
45 uint64_t lastLBA;
46 uint64_t attributes;
47 unsigned char name[NAME_SIZE];
srs5694a0eb11a2009-08-29 15:00:08 -040048 public:
49 GPTPart(void);
50 ~GPTPart(void);
51
52 // Simple data retrieval:
srs56946699b012010-02-04 00:55:30 -050053 PartType & GetType(void) {return partitionType;}
srs5694a0eb11a2009-08-29 15:00:08 -040054 uint16_t GetHexType(void);
srs56946699b012010-02-04 00:55:30 -050055 string GetTypeName(void);
56 GUIDData GetUniqueGUID(void) {return uniqueGUID;}
srs5694a0eb11a2009-08-29 15:00:08 -040057 uint64_t GetFirstLBA(void) {return firstLBA;}
58 uint64_t GetLastLBA(void) {return lastLBA;}
59 uint64_t GetLengthLBA(void);
60 uint64_t GetAttributes(void) {return attributes;}
srs56946699b012010-02-04 00:55:30 -050061 string GetDescription(void);
srs5694a0eb11a2009-08-29 15:00:08 -040062
63 // Simple data assignment:
srs56946699b012010-02-04 00:55:30 -050064 void SetType(PartType t);
65 void SetType(uint16_t hex) {partitionType = hex;}
66 void SetUniqueGUID(GUIDData u) {uniqueGUID = u;}
67 void RandomizeUniqueGUID(void) {uniqueGUID.Randomize();}
srs5694a0eb11a2009-08-29 15:00:08 -040068 void SetFirstLBA(uint64_t f) {firstLBA = f;}
69 void SetLastLBA(uint64_t l) {lastLBA = l;}
70 void SetAttributes(uint64_t a) {attributes = a;}
srs56940a697312010-01-28 21:10:52 -050071 void SetName(const string & n);
srs56946699b012010-02-04 00:55:30 -050072 void SetDefaultDescription(void);
srs5694a0eb11a2009-08-29 15:00:08 -040073
74 // Additional functions
75 GPTPart & operator=(const GPTPart & orig);
srs5694978041c2009-09-21 20:51:47 -040076 void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line)
srs5694a0eb11a2009-08-29 15:00:08 -040077 void ShowDetails(uint32_t blockSize); // display detailed information (multi-line)
78 void BlankPartition(void); // empty partition of data
srs56940a697312010-01-28 21:10:52 -050079 int DoTheyOverlap(const GPTPart & other); // returns 1 if there's overlap
srs5694a0eb11a2009-08-29 15:00:08 -040080 void ReversePartBytes(void); // reverse byte order of all integer fields
81
82 // Functions requiring user interaction
83 void ChangeType(void); // Change the type code
84}; // struct GPTPart
85
86// A support function that doesn't quite belong in the class....
87void QuickSortGPT(GPTPart* partitions, int start, int finish);
88
89#endif