1cf200d32Sopenharmony_ci/* This program is copyright (c) 2009-2018 by Roderick W. Smith. It is distributed
2cf200d32Sopenharmony_ci  under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
3cf200d32Sopenharmony_ci
4cf200d32Sopenharmony_ci#ifndef __PARTITION_TYPES
5cf200d32Sopenharmony_ci#define __PARTITION_TYPES
6cf200d32Sopenharmony_ci
7cf200d32Sopenharmony_ci#include <stdint.h>
8cf200d32Sopenharmony_ci#include <stdlib.h>
9cf200d32Sopenharmony_ci#include <string>
10cf200d32Sopenharmony_ci#include "support.h"
11cf200d32Sopenharmony_ci#include "guid.h"
12cf200d32Sopenharmony_ci#ifdef USE_UTF16
13cf200d32Sopenharmony_ci#include <unicode/ustream.h>
14cf200d32Sopenharmony_ci#else
15cf200d32Sopenharmony_ci#define UnicodeString std::string
16cf200d32Sopenharmony_ci#endif
17cf200d32Sopenharmony_ci
18cf200d32Sopenharmony_ci// A partition type
19cf200d32Sopenharmony_cistruct AType {
20cf200d32Sopenharmony_ci   // I'm using a custom 16-bit extension of the original MBR 8-bit
21cf200d32Sopenharmony_ci   // type codes, so as to permit disambiguation and use of new
22cf200d32Sopenharmony_ci   // codes required by GPT
23cf200d32Sopenharmony_ci   uint16_t MBRType;
24cf200d32Sopenharmony_ci   GUIDData GUIDType;
25cf200d32Sopenharmony_ci   std::string name;
26cf200d32Sopenharmony_ci   int display; // 1 to show to users as available type, 0 not to
27cf200d32Sopenharmony_ci   AType* next;
28cf200d32Sopenharmony_ci}; // struct AType
29cf200d32Sopenharmony_ci
30cf200d32Sopenharmony_ciclass PartType : public GUIDData {
31cf200d32Sopenharmony_ciprotected:
32cf200d32Sopenharmony_ci   static int numInstances;
33cf200d32Sopenharmony_ci   static AType* allTypes; // Linked list holding all the data
34cf200d32Sopenharmony_ci   static AType* lastType; // Pointer to last entry in the list
35cf200d32Sopenharmony_ci   void AddAllTypes(void);
36cf200d32Sopenharmony_cipublic:
37cf200d32Sopenharmony_ci   // PartType with GUID "00000000-0000-0000-0000-000000000000"
38cf200d32Sopenharmony_ci   static const PartType unusedPartType;
39cf200d32Sopenharmony_ci
40cf200d32Sopenharmony_ci   PartType(void);
41cf200d32Sopenharmony_ci   PartType(const PartType & orig);
42cf200d32Sopenharmony_ci   PartType(const GUIDData & orig);
43cf200d32Sopenharmony_ci   ~PartType(void);
44cf200d32Sopenharmony_ci
45cf200d32Sopenharmony_ci   // Set up type information
46cf200d32Sopenharmony_ci   int AddType(uint16_t mbrType, const char * guidData, const char * name, int toDisplay = 1);
47cf200d32Sopenharmony_ci
48cf200d32Sopenharmony_ci   // New assignment operators....
49cf200d32Sopenharmony_ci   PartType & operator=(const std::string & orig);
50cf200d32Sopenharmony_ci   PartType & operator=(const char * orig);
51cf200d32Sopenharmony_ci
52cf200d32Sopenharmony_ci   // Assignment operators based on base class....
53cf200d32Sopenharmony_ci   GUIDData & operator=(const GUIDData & orig) {return GUIDData::operator=(orig);}
54cf200d32Sopenharmony_ci
55cf200d32Sopenharmony_ci   // New data assignment
56cf200d32Sopenharmony_ci   PartType & operator=(uint16_t ID); // Use MBR type code times 0x0100 to assign GUID
57cf200d32Sopenharmony_ci
58cf200d32Sopenharmony_ci   // Retrieve transformed GUID data based on type code matches
59cf200d32Sopenharmony_ci   std::string TypeName(void) const;
60cf200d32Sopenharmony_ci   UnicodeString UTypeName(void) const;
61cf200d32Sopenharmony_ci   uint16_t GetHexType() const;
62cf200d32Sopenharmony_ci
63cf200d32Sopenharmony_ci   // Information relating to all type data
64cf200d32Sopenharmony_ci   void ShowAllTypes(int maxLines = 21) const;
65cf200d32Sopenharmony_ci   int Valid(uint16_t code) const;
66cf200d32Sopenharmony_ci};
67cf200d32Sopenharmony_ci
68cf200d32Sopenharmony_ci#endif
69