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