1*57696d54SAkhilesh Sanikop /* 2*57696d54SAkhilesh Sanikop * Implementation of GPTData class derivative with curses-based text-mode 3*57696d54SAkhilesh Sanikop * interaction 4*57696d54SAkhilesh Sanikop * Copyright (C) 2011-2018 Roderick W. Smith 5*57696d54SAkhilesh Sanikop * 6*57696d54SAkhilesh Sanikop * This program is free software; you can redistribute it and/or modify 7*57696d54SAkhilesh Sanikop * it under the terms of the GNU General Public License as published by 8*57696d54SAkhilesh Sanikop * the Free Software Foundation; either version 2 of the License, or 9*57696d54SAkhilesh Sanikop * (at your option) any later version. 10*57696d54SAkhilesh Sanikop * 11*57696d54SAkhilesh Sanikop * This program is distributed in the hope that it will be useful, 12*57696d54SAkhilesh Sanikop * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*57696d54SAkhilesh Sanikop * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*57696d54SAkhilesh Sanikop * GNU General Public License for more details. 15*57696d54SAkhilesh Sanikop * 16*57696d54SAkhilesh Sanikop * You should have received a copy of the GNU General Public License along 17*57696d54SAkhilesh Sanikop * with this program; if not, write to the Free Software Foundation, Inc., 18*57696d54SAkhilesh Sanikop * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19*57696d54SAkhilesh Sanikop * 20*57696d54SAkhilesh Sanikop */ 21*57696d54SAkhilesh Sanikop 22*57696d54SAkhilesh Sanikop #ifndef __GPT_CURSES 23*57696d54SAkhilesh Sanikop #define __GPT_CURSES 24*57696d54SAkhilesh Sanikop 25*57696d54SAkhilesh Sanikop #include <iostream> 26*57696d54SAkhilesh Sanikop #include <string> 27*57696d54SAkhilesh Sanikop #include "gptpart.h" 28*57696d54SAkhilesh Sanikop #include "gpt.h" 29*57696d54SAkhilesh Sanikop 30*57696d54SAkhilesh Sanikop struct MenuItem { 31*57696d54SAkhilesh Sanikop int key; // Keyboard shortcut 32*57696d54SAkhilesh Sanikop std::string name; // Item name; 8 characters 33*57696d54SAkhilesh Sanikop std::string desc; // Description 34*57696d54SAkhilesh Sanikop }; 35*57696d54SAkhilesh Sanikop 36*57696d54SAkhilesh Sanikop static struct MenuItem menuMain[] = { 37*57696d54SAkhilesh Sanikop { 'a', "Align ", "Set partition alignment policy" }, 38*57696d54SAkhilesh Sanikop { 'b', "Backup", "Back up the partition table" }, 39*57696d54SAkhilesh Sanikop { 'd', "Delete", "Delete the current partition" }, 40*57696d54SAkhilesh Sanikop { 'h', " Help ", "Print help screen" }, 41*57696d54SAkhilesh Sanikop { 'i', " Info ", "Display information about the partition" }, 42*57696d54SAkhilesh Sanikop { 'l', " Load ", "Load partition table backup from file" }, 43*57696d54SAkhilesh Sanikop { 'm', " naMe ", "Change the partition's name" }, 44*57696d54SAkhilesh Sanikop { 'n', " New ", "Create new partition from free space" }, 45*57696d54SAkhilesh Sanikop { 'q', " Quit ", "Quit program without writing partition table" }, 46*57696d54SAkhilesh Sanikop { 't', " Type ", "Change the filesystem type code GUID" }, 47*57696d54SAkhilesh Sanikop { 'v', "Verify", "Verify the integrity of the disk's data structures" }, 48*57696d54SAkhilesh Sanikop { 'w', "Write ", "Write partition table to disk (this might destroy data)" }, 49*57696d54SAkhilesh Sanikop { 0, "", "" } 50*57696d54SAkhilesh Sanikop }; 51*57696d54SAkhilesh Sanikop 52*57696d54SAkhilesh Sanikop #define EMPTY_SPACE_OPTIONS "abhlnqvw" 53*57696d54SAkhilesh Sanikop #define PARTITION_OPTIONS "abdhilmqtvw" 54*57696d54SAkhilesh Sanikop 55*57696d54SAkhilesh Sanikop // Constants for how to highlight a selected menu item 56*57696d54SAkhilesh Sanikop #define USE_CURSES 1 57*57696d54SAkhilesh Sanikop #define USE_ARROW 2 58*57696d54SAkhilesh Sanikop 59*57696d54SAkhilesh Sanikop // A "Space" is a partition or an unallocated chunk of disk space, maintained 60*57696d54SAkhilesh Sanikop // in a doubly-linked-list data structure to facilitate creating displays of 61*57696d54SAkhilesh Sanikop // partitions and unallocated chunks of space on the disk in the main 62*57696d54SAkhilesh Sanikop // cgdisk partition list. This list MUST be correctly maintained and in order, 63*57696d54SAkhilesh Sanikop // and the numSpaces variable in the main GPTDataCurses class must specify 64*57696d54SAkhilesh Sanikop // how many Spaces are in the main linked list of Spaces. 65*57696d54SAkhilesh Sanikop struct Space { 66*57696d54SAkhilesh Sanikop uint64_t firstLBA; 67*57696d54SAkhilesh Sanikop uint64_t lastLBA; 68*57696d54SAkhilesh Sanikop GPTPart *origPart; 69*57696d54SAkhilesh Sanikop int partNum; 70*57696d54SAkhilesh Sanikop Space *nextSpace; 71*57696d54SAkhilesh Sanikop Space *prevSpace; 72*57696d54SAkhilesh Sanikop }; 73*57696d54SAkhilesh Sanikop 74*57696d54SAkhilesh Sanikop class GPTDataCurses : public GPTData { 75*57696d54SAkhilesh Sanikop protected: 76*57696d54SAkhilesh Sanikop static int numInstances; 77*57696d54SAkhilesh Sanikop GPTPart emptySpace; 78*57696d54SAkhilesh Sanikop Space *firstSpace; 79*57696d54SAkhilesh Sanikop Space *lastSpace; 80*57696d54SAkhilesh Sanikop Space *currentSpace; 81*57696d54SAkhilesh Sanikop int currentSpaceNum; 82*57696d54SAkhilesh Sanikop std::string whichOptions; 83*57696d54SAkhilesh Sanikop char currentKey; 84*57696d54SAkhilesh Sanikop int numSpaces; 85*57696d54SAkhilesh Sanikop int displayType; 86*57696d54SAkhilesh Sanikop 87*57696d54SAkhilesh Sanikop // Functions relating to Spaces data structures 88*57696d54SAkhilesh Sanikop void EmptySpaces(void); 89*57696d54SAkhilesh Sanikop int MakeSpacesFromParts(void); 90*57696d54SAkhilesh Sanikop void AddEmptySpace(uint64_t firstLBA, uint64_t lastLBA); 91*57696d54SAkhilesh Sanikop int AddEmptySpaces(void); 92*57696d54SAkhilesh Sanikop void UnlinkSpace(Space *theSpace); 93*57696d54SAkhilesh Sanikop void LinkToEnd(Space *theSpace); 94*57696d54SAkhilesh Sanikop void SortSpaces(void); 95*57696d54SAkhilesh Sanikop void IdentifySpaces(void); 96*57696d54SAkhilesh Sanikop 97*57696d54SAkhilesh Sanikop // Data display functions 98*57696d54SAkhilesh Sanikop Space* ShowSpace(int spaceNum, int lineNum); 99*57696d54SAkhilesh Sanikop int DisplayParts(int selected); 100*57696d54SAkhilesh Sanikop public: 101*57696d54SAkhilesh Sanikop GPTDataCurses(void); 102*57696d54SAkhilesh Sanikop ~GPTDataCurses(void); 103*57696d54SAkhilesh Sanikop // Functions corresponding to main menu items 104*57696d54SAkhilesh Sanikop void DeletePartition(int partNum); 105*57696d54SAkhilesh Sanikop void ShowInfo(int partNum); 106*57696d54SAkhilesh Sanikop void ChangeName(int partNum); 107*57696d54SAkhilesh Sanikop void ChangeType(int partNum); 108*57696d54SAkhilesh Sanikop void SetAlignment(void); 109*57696d54SAkhilesh Sanikop void Verify(void); 110*57696d54SAkhilesh Sanikop void MakeNewPart(void); 111*57696d54SAkhilesh Sanikop void SaveData(void); 112*57696d54SAkhilesh Sanikop void Backup(void); 113*57696d54SAkhilesh Sanikop void LoadBackup(void); 114*57696d54SAkhilesh Sanikop void ShowHelp(void); 115*57696d54SAkhilesh Sanikop // User input and menuing functions SetDisplayType(int dt)116*57696d54SAkhilesh Sanikop void SetDisplayType(int dt) {displayType = dt;} 117*57696d54SAkhilesh Sanikop void ChangeSpaceSelection(int delta); 118*57696d54SAkhilesh Sanikop void MoveSelection(int delta); 119*57696d54SAkhilesh Sanikop void DisplayOptions(char selectedKey); 120*57696d54SAkhilesh Sanikop void AcceptInput(); 121*57696d54SAkhilesh Sanikop int Dispatch(char operation); 122*57696d54SAkhilesh Sanikop void DrawMenu(void); 123*57696d54SAkhilesh Sanikop int MainMenu(void); 124*57696d54SAkhilesh Sanikop }; // class GPTDataCurses 125*57696d54SAkhilesh Sanikop 126*57696d54SAkhilesh Sanikop // Non-class support functions (mostly to do simple curses stuff).... 127*57696d54SAkhilesh Sanikop 128*57696d54SAkhilesh Sanikop void ClearLine(int lineNum); 129*57696d54SAkhilesh Sanikop void ClearBottom(void); 130*57696d54SAkhilesh Sanikop void PromptToContinue(void); 131*57696d54SAkhilesh Sanikop void Report(std::string theText); 132*57696d54SAkhilesh Sanikop void ShowTypes(void); 133*57696d54SAkhilesh Sanikop 134*57696d54SAkhilesh Sanikop #endif 135