blob: 31b850c9ed43c89f7ac4697b282c07e120d79c21 [file] [log] [blame]
/*
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
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