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