xref: /aosp_15_r20/external/gptfdisk/gptcurses.h (revision 57696d54d05c64fd1b1787f8371dbcf104911cfb)
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