/*
    MBRPart class, part of GPT fdisk program family.
    Copyright (C) 2011  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 MBRPART_H
#define MBRPART_H

#include <stdint.h>

#define MAX_HEADS 255        /* numbered 0 - 254 */
#define MAX_SECSPERTRACK 63  /* numbered 1 - 63 */
#define MAX_CYLINDERS 1024   /* numbered 0 - 1023 */

#define NONE 0    /* don't include partition when writing */
#define PRIMARY 1 /* write partition as primary */
#define LOGICAL 2 /* write partition as logical */
#define EBR 4     /* sector is used as an EBR or MBR */
#define INVALID 8 /* sector number is too large for disk */

using namespace std;

// Data for a single MBR partition record
// Note that firstSector and lastSector are in CHS addressing, which
// splits the bits up in a weird way.
// On read or write of MBR entries, firstLBA is an absolute disk sector.
// On read of logical entries, it's relative to the EBR record for that
// partition. When writing EBR records, it's relative to the extended
// partition's start.
#pragma pack(1)
struct MBRRecord {
   uint8_t status;
   uint8_t firstSector[3];
   uint8_t partitionType;
   uint8_t lastSector[3];
   uint32_t firstLBA; // see above
   uint32_t lengthLBA;
}; // struct MBRRecord
#pragma pack ()

class MBRPart {
protected:
   uint8_t status;
   uint8_t firstSector[3];
   uint8_t partitionType;
   uint8_t lastSector[3];
   uint32_t firstLBA; // see above
   uint32_t lengthLBA;
   int includeAs; // PRIMARY, LOGICAL, or NONE
   int canBeLogical;
   int canBePrimary;
   static uint32_t numHeads;
   static uint32_t numSecspTrack;
   static uint64_t diskSize;
   static uint32_t blockSize;
   static int numInstances;

public:
    MBRPart();
    MBRPart(const MBRPart& other);
    virtual ~MBRPart();
    virtual MBRPart& operator=(const MBRPart& orig);
    virtual MBRPart& operator=(const struct MBRRecord& orig);
    bool operator<(const MBRPart &other) const;

    // Set information on partitions or disks...
    void SetGeometry(uint32_t heads, uint32_t sectors, uint64_t ds, uint32_t bs);
    void Empty(void);
    void SetStartLBA(uint64_t s);
    void SetLengthLBA(uint64_t l);
    void SetLocation(uint64_t start, uint64_t length);
    int SetType(uint8_t typeCode, int isExtended = 0);
    void SetStatus(uint8_t s) {status = s;}
    void SetInclusion(int status = PRIMARY) {includeAs = status;}
    void SetCanBeLogical(int c) {canBeLogical = c;}
    void SetCanBePrimary(int c) {canBePrimary = c;}
    void StoreInStruct(struct MBRRecord *theStruct);

    // Get information on partitions or disk....
    uint8_t GetType(void) {return partitionType;}
    uint8_t GetStatus(void) {return status;}
    uint64_t GetStartLBA(void) {return firstLBA;}
    uint64_t GetLengthLBA(void) {return lengthLBA;}
    uint64_t GetLastLBA(void) const;
    uint8_t GetInclusion(void) {return includeAs;}
    int CanBeLogical(void) {return canBeLogical;}
    int CanBePrimary(void) {return canBePrimary;}
    int DoTheyOverlap (const MBRPart& other);

    // Adjust information on partitions or disks...
    int RecomputeCHS(void);
    int LBAtoCHS(uint32_t lba, uint8_t * chs);
    void ReverseByteOrder(void);

    // User I/O...
    void ShowData(int isGpt);
}; // MBRPart

#endif // MBRPART_H
