]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/EditStatusBar.c
ShellPkg/Dp: Add null pointer check
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / EditStatusBar.c
1 /** @file
2 Implements statusbar interface functions.
3
4 Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved. <BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "EditStatusBar.h"
16 #include "UefiShellDebug1CommandsLib.h"
17
18 CHAR16 *StatusString;
19 BOOLEAN StatusBarNeedRefresh;
20 BOOLEAN StatusStringChanged;
21
22 /**
23 Initialization function for Status Bar.
24
25 @retval EFI_SUCCESS The operation was successful.
26 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
27 @sa StatusBarSetStatusString
28 **/
29 EFI_STATUS
30 StatusBarInit (
31 VOID
32 )
33 {
34 //
35 // initialize the statusbar
36 //
37 StatusString = NULL;
38 StatusBarNeedRefresh = TRUE;
39 StatusStringChanged = FALSE;
40
41 //
42 // status string set to ""
43 //
44 return (StatusBarSetStatusString (L""));
45 }
46
47 /**
48 Cleanup function for the status bar.
49 **/
50 VOID
51 StatusBarCleanup (
52 VOID
53 )
54 {
55 //
56 // free the status string and backvar's status string
57 //
58 SHELL_FREE_NON_NULL (StatusString);
59 }
60
61 typedef struct {
62 UINT32 Foreground : 4;
63 UINT32 Background : 3;
64 } STATUS_BAR_COLOR_ATTRIBUTES;
65
66 typedef union {
67 STATUS_BAR_COLOR_ATTRIBUTES Colors;
68 UINTN Data;
69 } STATUS_BAR_COLOR_UNION;
70
71 /**
72 Cause the status bar to refresh it's printing on the screen.
73
74 @param[in] EditorFirst TRUE to indicate the first launch of the editor.
75 FALSE otherwise.
76 @param[in] LastRow LastPrintable row.
77 @param[in] LastCol Last printable column.
78 @param[in] FileRow Row in the file.
79 @param[in] FileCol Column in the file.
80 @param[in] InsertMode TRUE to indicate InsertMode. FALSE otherwise.
81
82 @retval EFI_SUCCESS The operation was successful.
83 **/
84 EFI_STATUS
85 StatusBarRefresh (
86 IN BOOLEAN EditorFirst,
87 IN UINTN LastRow,
88 IN UINTN LastCol,
89 IN UINTN FileRow,
90 IN UINTN FileCol,
91 IN BOOLEAN InsertMode
92 )
93 {
94 STATUS_BAR_COLOR_UNION Orig;
95 STATUS_BAR_COLOR_UNION New;
96
97 if (!StatusStringChanged && StatusBarNeedRefresh) {
98 StatusBarSetStatusString (L"\0");
99 }
100 //
101 // when it's called first time after editor launch, so refresh is mandatory
102 //
103 if (!StatusBarNeedRefresh && !StatusStringChanged) {
104 return EFI_SUCCESS;
105 }
106
107 //
108 // back up the screen attributes
109 //
110 Orig.Data = gST->ConOut->Mode->Attribute;
111 New.Data = 0;
112 New.Colors.Foreground = Orig.Colors.Background & 0xF;
113 New.Colors.Background = Orig.Colors.Foreground & 0x7;
114
115 gST->ConOut->EnableCursor (gST->ConOut, FALSE);
116 gST->ConOut->SetAttribute (gST->ConOut, New.Data & 0x7F);
117
118 //
119 // clear status bar
120 //
121 EditorClearLine (LastRow, LastCol, LastRow);
122
123 //
124 // print row, column fields
125 //
126 if (FileRow != (UINTN)(-1) && FileCol != (UINTN)(-1)) {
127 ShellPrintEx (
128 0,
129 (INT32)(LastRow) - 1,
130 L" %d,%d %s",
131 FileRow,
132 FileCol,
133 StatusString
134 );
135 } else {
136 ShellPrintEx (
137 0,
138 (INT32)(LastRow) - 1,
139 L" %s",
140 StatusString
141 );
142 }
143
144 //
145 // print insert mode field
146 //
147 if (InsertMode) {
148 ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s| Help: Ctrl-E", L"INS");
149 } else {
150 ShellPrintEx ((INT32)(LastCol) - 21, (INT32)(LastRow) - 1, L"|%s| Help: Ctrl-E", L"OVR");
151 }
152 //
153 // restore the old screen attributes
154 //
155 gST->ConOut->SetAttribute (gST->ConOut, Orig.Data);
156
157 //
158 // restore position in edit area
159 //
160 gST->ConOut->EnableCursor (gST->ConOut, TRUE);
161
162 StatusBarNeedRefresh = FALSE;
163 StatusStringChanged = FALSE;
164
165 return EFI_SUCCESS;
166 }
167
168 /**
169 Set the status string text part.
170
171 @param[in] Str The string to use.
172
173 @retval EFI_SUCCESS The operation was successful.
174 @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
175 **/
176 EFI_STATUS
177 StatusBarSetStatusString (
178 IN CHAR16 *Str
179 )
180 {
181 StatusStringChanged = TRUE;
182
183 //
184 // free the old status string
185 //
186 SHELL_FREE_NON_NULL (StatusString);
187 StatusString = CatSPrint (NULL, L"%s", Str);
188 if (StatusString == NULL) {
189 return EFI_OUT_OF_RESOURCES;
190 }
191
192 return EFI_SUCCESS;
193 }
194
195 /**
196 Function to retrieve the current status string.
197
198 @return The string that is used.
199 **/
200 CONST CHAR16*
201 StatusBarGetString (
202 VOID
203 )
204 {
205 return (StatusString);
206 }
207
208 /**
209 Function to set the need refresh boolean to TRUE.
210 **/
211 VOID
212 StatusBarSetRefresh(
213 VOID
214 )
215 {
216 StatusBarNeedRefresh = TRUE;
217 }
218
219 /**
220 Function to get the need refresh boolean to TRUE.
221
222 @retval TRUE The status bar needs to be refreshed.
223 **/
224 BOOLEAN
225 StatusBarGetRefresh(
226 VOID
227 )
228 {
229 return (StatusBarNeedRefresh);
230 }