blob: 9a14f7efe31f5f3c8d2e4edf33d98df19e903481 [file] [log] [blame]
srs56943860cbe2011-09-10 20:29:53 -04001/*
2 * Implementation of GPTData class derivative with curses-based text-mode
3 * interaction
Roderick W. Smithe3ee7332013-09-24 12:56:11 -04004 * Copyright (C) 2011-2013 Roderick W. Smith
srs5694d1b11e82011-09-18 21:12:28 -04005 *
srs56943860cbe2011-09-10 20:29:53 -04006 * 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.
srs5694d1b11e82011-09-18 21:12:28 -040010 *
srs56943860cbe2011-09-10 20:29:53 -040011 * 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.
srs5694d1b11e82011-09-18 21:12:28 -040015 *
srs56943860cbe2011-09-10 20:29:53 -040016 * 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.
srs5694d1b11e82011-09-18 21:12:28 -040019 *
srs56943860cbe2011-09-10 20:29:53 -040020 */
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
30using namespace std;
31
32struct MenuItem {
33 int key; // Keyboard shortcut
34 string name; // Item name; 8 characters
35 string desc; // Description
36};
37
38static 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
Roderick W. Smith1eea9b02013-07-06 22:52:58 -040057// Constants for how to highlight a selected menu item
58#define USE_CURSES 1
59#define USE_ARROW 2
srs56943860cbe2011-09-10 20:29:53 -040060
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.
67struct Space {
68 uint64_t firstLBA;
69 uint64_t lastLBA;
70 GPTPart *origPart;
71 int partNum;
72 Space *nextSpace;
73 Space *prevSpace;
74};
75
76class GPTDataCurses : public GPTData {
77protected:
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;
Roderick W. Smith1eea9b02013-07-06 22:52:58 -040087 int displayType;
srs5694d1b11e82011-09-18 21:12:28 -040088
srs56943860cbe2011-09-10 20:29:53 -040089 // 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);
srs5694d1b11e82011-09-18 21:12:28 -040098
srs56943860cbe2011-09-10 20:29:53 -040099 // Data display functions
100 Space* ShowSpace(int spaceNum, int lineNum);
101 int DisplayParts(int selected);
102public:
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
Roderick W. Smith1eea9b02013-07-06 22:52:58 -0400118 void SetDisplayType(int dt) {displayType = dt;}
srs56943860cbe2011-09-10 20:29:53 -0400119 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
130void ClearLine(int lineNum);
131void ClearBottom(void);
132void PromptToContinue(void);
133void Report(string theText);
134void ShowTypes(void);
135
136#endif