/* mbr.h -- MBR data structure definitions, types, and functions */

/* This program is copyright (c) 2009 by Roderick W. Smith. It is distributed
  under the terms of the GNU GPL version 2, as detailed in the COPYING file. */

#include <stdint.h>
#include <sys/types.h>
#include "gptpart.h"
//#include "partnotes.h"
#include "diskio.h"
#include "basicmbr.h"

#ifndef __MBRSTRUCTS
#define __MBRSTRUCTS

using namespace std;

/****************************************
 *                                      *
 * MBRData class and related structures *
 *                                      *
 ****************************************/

// Full data in tweaked MBR format
class MBRData : public BasicMBRData {
protected:
public:
   MBRData(void) {}
   MBRData(string deviceFilename) : BasicMBRData(deviceFilename) {}
   MBRData & operator=(const BasicMBRData & orig);

   // Functions to create, delete, or change partitions
   // Pass EmptyMBR 1 to clear the boot loader code, 0 to leave it intact
   void MakeProtectiveMBR(int clearBoot = 0);
   void OptimizeEESize(void);
   int DeleteByLocation(uint64_t start64, uint64_t length64);

   // Functions to extract data on specific partitions....
   GPTPart AsGPT(int i);
}; // struct MBRData

#endif
