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