1/*
2 *    Implementation of GPTData class derivative with curses-based text-mode
3 *    interaction
4 *    Copyright (C) 2011-2013 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
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
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.
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;
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);
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
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
130void ClearLine(int lineNum);
131void ClearBottom(void);
132void PromptToContinue(void);
133void Report(string theText);
134void ShowTypes(void);
135
136#endif
137