103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
/*
|
|
partnotes.h -- Class that takes notes on GPT partitions for purpose of MBR conversion
|
|
Copyright (C) 2010 Roderick W. Smith
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
*/
|
|
|
|
#ifndef __PARTNOTES_H
|
|
#define __PARTNOTES_H
|
|
|
|
#include "gpt.h"
|
|
#include "gptpart.h"
|
|
|
|
using namespace std;
|
|
|
|
#define WILL_NOT_CONVERT 0
|
|
#define PRIMARY 1
|
|
#define LOGICAL 2
|
|
|
|
// Data structure used in GPT-to-MBR conversions; holds pointer to GPT
|
|
// partition number, start and end sectors, and a few MBR-specific details
|
|
struct PartInfo {
|
|
int gptPartNum;
|
|
int spaceBefore; // boolean; if 1, can theoretically become a logical part.
|
|
int active; // boolean
|
|
int type; // WILL_NOT_CONVERT, PRIMARY, or LOGICAL
|
|
uint64_t firstLBA;
|
|
uint64_t lastLBA;
|
|
unsigned int hexCode;
|
|
struct PartInfo *next;
|
|
};
|
|
|
|
struct ExtendedInfo {
|
|
int startNum;
|
|
int numLogicals;
|
|
};
|
|
|
|
class PartNotes {
|
|
protected:
|
|
struct PartInfo dummyNote;
|
|
struct PartInfo *notes;
|
|
struct PartInfo *currentNote;
|
|
int currentIndex;
|
|
GPTPart *gptParts;
|
|
int gptTableSize;
|
|
int blockSize;
|
|
|
|
void DeleteNotes(void);
|
|
public:
|
|
PartNotes();
|
|
PartNotes(GPTPart *parts, GPTData *gpt, int num, int blockSize);
|
|
~PartNotes();
|
|
|
|
// Add partition notes (little or no error checking)
|
|
int PassPartitions(GPTPart *parts, GPTData *gpt, int num, int blockSize);
|
|
int AddToEnd(struct PartInfo* newOne);
|
|
int AddToStart(struct PartInfo* newOne);
|
|
void SetType(int partNum, int type); // type is PRIMARY, LOGICAL, or WILL_NOT_CONVERT
|
|
void SetMbrHexType(int i, uint8_t type);
|
|
void ToggleActiveStatus(int partNum);
|
|
|
|
// Retrieve data or metadata
|
|
void Rewind(void);
|
|
int GetNextInfo(struct PartInfo * info);
|
|
int GetNumParts();
|
|
int GetNumPrimary();
|
|
int GetNumExtended();
|
|
int GetNumLogical();
|
|
int GetType(int partNum);
|
|
uint8_t GetMbrHexType(int i);
|
|
int GetGptNum(int partNum);
|
|
int GetActiveStatus(int partNum);
|
|
int CanBeLogical(int partNum); // returns boolean
|
|
int FindExtended(int &start);
|
|
int IsSorted(void);
|
|
int IsLegal(void); // returns boolean
|
|
|
|
// Manipulate data or metadata
|
|
void RemoveDuplicates(void);
|
|
int MakeItLegal(void);
|
|
void TrimSmallestExtended(void);
|
|
|
|
// Interact with users, possibly changing data with error handling
|
|
void ShowSummary(void);
|
|
int MakeChange(int partNum);
|
|
int ChangeType(int partNum, int newType);
|
|
};
|
|
|
|
#endif // __PARTNOTES_H
|