2 Defines the Main Editor data type -
4 - Instances of the other objects of the editor
7 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved. <BR>
8 This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include "HexEditor.h"
19 #include "EditStatusBar.h"
20 #include "EditInputBar.h"
22 HEFI_EDITOR_COLOR_ATTRIBUTES HOriginalColors
;
26 // the first time editor launch
31 // it's time editor should exit
35 BOOLEAN HEditorMouseAction
;
37 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage
;
38 extern HEFI_EDITOR_BUFFER_IMAGE HBufferImageBackupVar
;
40 extern BOOLEAN HBufferImageMouseNeedRefresh
;
41 extern BOOLEAN HBufferImageNeedRefresh
;
42 extern BOOLEAN HBufferImageOnlyLineNeedRefresh
;
44 HEFI_EDITOR_GLOBAL_EDITOR HMainEditor
;
45 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorBackupVar
;
48 // basic initialization for MainEditor
50 HEFI_EDITOR_GLOBAL_EDITOR HMainEditorConst
= {
69 Help info that will be displayed.
71 EFI_STRING_ID HexMainMenuHelpInfo
[] = {
72 STRING_TOKEN(STR_HEXEDIT_HELP_TITLE
),
73 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
74 STRING_TOKEN(STR_HEXEDIT_HELP_LIST_TITLE
),
75 STRING_TOKEN(STR_HEXEDIT_HELP_DIV
),
76 STRING_TOKEN(STR_HEXEDIT_HELP_GO_TO_OFFSET
),
77 STRING_TOKEN(STR_HEXEDIT_HELP_SAVE_BUFFER
),
78 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT
),
79 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_START
),
80 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_END
),
81 STRING_TOKEN(STR_HEXEDIT_HELP_CUT
),
82 STRING_TOKEN(STR_HEXEDIT_HELP_PASTE
),
83 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_FILE
),
84 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_DISK
),
85 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_MEMORY
),
86 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
87 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT_HELP
),
88 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
89 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
90 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
91 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
92 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
93 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
94 STRING_TOKEN(STR_HEXEDIT_HELP_DIV
),
102 @retval EFI_SUCCESS The operation was successful.
105 HMainCommandDisplayHelp (
111 EFI_KEY_DATA KeyData
;
118 for (CurrentLine
= 0; 0 != HexMainMenuHelpInfo
[CurrentLine
]; CurrentLine
++) {
119 InfoString
= HiiGetString(gShellDebug1HiiHandle
, HexMainMenuHelpInfo
[CurrentLine
]
121 ShellPrintEx (0,CurrentLine
+1,L
"%E%s%N",InfoString
);
128 Status
= gBS
->WaitForEvent (1, &HMainEditor
.TextInputEx
->WaitForKeyEx
, &EventIndex
);
129 if (EFI_ERROR (Status
) || (EventIndex
!= 0)) {
132 Status
= HMainEditor
.TextInputEx
->ReadKeyStrokeEx (HMainEditor
.TextInputEx
, &KeyData
);
133 if (EFI_ERROR (Status
)) {
137 if ((KeyData
.KeyState
.KeyShiftState
& EFI_SHIFT_STATE_VALID
) == 0) {
139 // For consoles that don't support shift state reporting,
140 // CTRL+W is translated to L'W' - L'A' + 1.
142 if (KeyData
.Key
.UnicodeChar
== L
'W' - L
'A' + 1) {
145 } else if (((KeyData
.KeyState
.KeyShiftState
& (EFI_LEFT_CONTROL_PRESSED
| EFI_RIGHT_CONTROL_PRESSED
)) != 0) &&
146 ((KeyData
.KeyState
.KeyShiftState
& ~(EFI_SHIFT_STATE_VALID
| EFI_LEFT_CONTROL_PRESSED
| EFI_RIGHT_CONTROL_PRESSED
)) == 0)) {
148 // For consoles that supports shift state reporting,
149 // make sure that only CONTROL shift key is pressed.
151 if ((KeyData
.Key
.UnicodeChar
== 'w') || (KeyData
.Key
.UnicodeChar
== 'W')) {
157 // update screen with buffer's info
158 HBufferImageNeedRefresh
= TRUE
;
159 HBufferImageOnlyLineNeedRefresh
= FALSE
;
160 HBufferImageRefresh ();
166 Move cursor to specified lines.
168 @retval EFI_SUCCESS The operation was successful.
171 HMainCommandGoToOffset (
182 // variable initialization
192 Status
= InputBarSetPrompt (L
"Go To Offset: ");
193 if (EFI_ERROR (Status
)) {
197 Status
= InputBarSetStringSize (8);
198 if (EFI_ERROR (Status
)) {
203 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
208 if (Status
== EFI_NOT_READY
) {
213 // THE input string length should > 0
215 if (StrLen (InputBarGetString()) > 0) {
216 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
217 if (EFI_ERROR (Status
)) {
218 StatusBarSetStatusString (L
"Invalid Offset");
226 Size
= HBufferImageGetTotalSize ();
227 if (Offset
>= Size
) {
228 StatusBarSetStatusString (L
"Invalid Offset");
232 FRow
= (UINTN
)DivU64x32(Offset
, 0x10) + 1;
233 FCol
= (UINTN
)ModU64x32(Offset
, 0x10) + 1;
235 HBufferImageMovePosition (FRow
, FCol
, TRUE
);
237 HBufferImageNeedRefresh
= TRUE
;
238 HBufferImageOnlyLineNeedRefresh
= FALSE
;
239 HBufferImageMouseNeedRefresh
= TRUE
;
245 Save current opened buffer.
246 If is file buffer, you can save to current file name or
247 save to another file name.
249 @retval EFI_SUCCESS The operation was successful.
250 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
251 @retval EFI_LOAD_ERROR A load error occured.
254 HMainCommandSaveBuffer (
264 SHELL_FILE_HANDLE ShellFileHandle
;
266 if (HMainEditor
.BufferImage
->BufferType
!= FileTypeFileBuffer
) {
267 if (!HMainEditor
.BufferImage
->Modified
) {
271 Status
= InputBarSetPrompt (L
"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");
272 if (EFI_ERROR (Status
)) {
276 // the answer is just one character
278 Status
= InputBarSetStringSize (1);
279 if (EFI_ERROR (Status
)) {
283 // loop for user's answer
284 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
287 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
292 if (Status
== EFI_NOT_READY
) {
296 switch (InputBarGetString()[0]) {
300 // want to save this buffer first
302 Status
= HBufferImageSave (
304 HMainEditor
.BufferImage
->DiskImage
->Name
,
305 HMainEditor
.BufferImage
->DiskImage
->Offset
,
306 HMainEditor
.BufferImage
->DiskImage
->Size
,
307 HMainEditor
.BufferImage
->MemImage
->Offset
,
308 HMainEditor
.BufferImage
->MemImage
->Size
,
309 HMainEditor
.BufferImage
->BufferType
312 if (EFI_ERROR (Status
)) {
313 StatusBarSetStatusString (L
"BufferSave: Problems Writing");
322 // the file won't be saved
339 // ENDOF != FILEBUFFER
341 // This command will save currently opened file to disk.
342 // You can choose save to another file name or just save to
343 // current file name.
344 // Below is the scenario of Save File command: (
345 // Suppose the old file name is A )
346 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"
347 // IF user press ESC, Save File command ends .
348 // IF user press Enter, input file name will be A.
349 // IF user inputs a new file name B, input file name will be B.
351 // 2. IF input file name is A, go to do Step 3.
352 // IF input file name is B, go to do Step 4.
354 // 3. IF A is read only, Status Bar will show "Access Denied"
355 // and Save File commands ends.
356 // IF A is not read only, save file buffer to disk
357 // and remove Modified flag in Title Bar , then Save File command ends.
359 // 4. IF B does not exist, create this file and save file buffer to it.
361 // IF B exits, do Step 5.
363 // 5. An Input Bar will be prompted:
364 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"
365 // IF user press 'y' or 'Y', do Step 6.
366 // IF user press 'n' or 'N', Save File commands ends.
367 // IF user press 'c' or 'C' or ESC, Save File commands ends.
369 // 6. IF B is a read-only file, Status Bar will show "Access Denied"
370 // and Save File commands ends.
371 // IF B can be read and write, save file buffer to B.
373 // 7. Update File Name field in Title Bar to B
374 // and remove the Modified flag in Title Bar.
376 Str
= CatSPrint(NULL
,
377 L
"File to Save: [%s]",
378 HMainEditor
.BufferImage
->FileImage
->FileName
381 return EFI_OUT_OF_RESOURCES
;
384 if (StrLen (Str
) >= 50) {
386 // replace the long file name with "..."
395 Status
= InputBarSetPrompt (Str
);
396 if (EFI_ERROR (Status
)) {
400 Status
= InputBarSetStringSize (100);
401 if (EFI_ERROR (Status
)) {
407 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
410 // if user pressed ESC
412 if (Status
== EFI_NOT_READY
) {
413 SHELL_FREE_NON_NULL (Str
);
417 SHELL_FREE_NON_NULL (Str
);
420 // if just enter pressed, so think save to current file name
422 if (StrLen (InputBarGetString()) == 0) {
423 FileName
= CatSPrint(NULL
,
425 HMainEditor
.BufferImage
->FileImage
->FileName
428 FileName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
431 if (FileName
== NULL
) {
432 return EFI_OUT_OF_RESOURCES
;
435 if (!IsValidFileName (FileName
)) {
436 StatusBarSetStatusString (L
"Invalid File Name");
437 SHELL_FREE_NON_NULL (FileName
);
444 // save to the old file
446 if (StringNoCaseCompare (
448 &HMainEditor
.BufferImage
->FileImage
->FileName
455 // if the file is read only, so can not write back to it.
457 if (HMainEditor
.BufferImage
->FileImage
->ReadOnly
) {
458 StatusBarSetStatusString (L
"Access Denied");
459 SHELL_FREE_NON_NULL (FileName
);
463 Status
= ShellOpenFileByName (FileName
, &ShellFileHandle
, EFI_FILE_MODE_READ
, 0);
465 if (!EFI_ERROR (Status
)) {
467 Info
= ShellGetFileInfo(ShellFileHandle
);
469 ShellCloseFile(&ShellFileHandle
);
471 // check if read only
473 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
474 StatusBarSetStatusString (L
"Access Denied");
475 SHELL_FREE_NON_NULL (FileName
);
479 SHELL_FREE_NON_NULL(Info
);
481 // ask user whether to overwrite this file
483 Status
= InputBarSetPrompt (L
"File exists. Overwrite (Yes/No/Cancel) ? ");
484 if (EFI_ERROR (Status
)) {
485 SHELL_FREE_NON_NULL (FileName
);
489 Status
= InputBarSetStringSize (1);
490 if (EFI_ERROR (Status
)) {
491 SHELL_FREE_NON_NULL (FileName
);
497 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
499 if (Status
== EFI_NOT_READY
) {
500 SHELL_FREE_NON_NULL (FileName
);
504 switch (InputBarGetString()[0]) {
511 SHELL_FREE_NON_NULL (FileName
);
515 SHELL_FREE_NON_NULL (FileName
);
519 } // if opened existing file
523 // save file back to disk
525 Status
= HBufferImageSave (
527 HMainEditor
.BufferImage
->DiskImage
->Name
,
528 HMainEditor
.BufferImage
->DiskImage
->Offset
,
529 HMainEditor
.BufferImage
->DiskImage
->Size
,
530 HMainEditor
.BufferImage
->MemImage
->Offset
,
531 HMainEditor
.BufferImage
->MemImage
->Size
,
534 SHELL_FREE_NON_NULL (FileName
);
536 if (EFI_ERROR (Status
)) {
537 return EFI_LOAD_ERROR
;
544 Load a disk buffer editor.
546 @retval EFI_SUCCESS The operation was successful.
547 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
548 @retval EFI_LOAD_ERROR A load error occured.
551 HMainCommandSelectStart (
557 Start
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
562 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
563 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
564 StatusBarSetStatusString (L
"Invalid Block Start");
565 return EFI_LOAD_ERROR
;
569 if (HMainEditor
.SelectEnd
!= 0 && Start
> HMainEditor
.SelectEnd
) {
570 StatusBarSetStatusString (L
"Invalid Block Start");
571 return EFI_LOAD_ERROR
;
574 HMainEditor
.SelectStart
= Start
;
576 HBufferImageNeedRefresh
= TRUE
;
582 Load a disk buffer editor.
584 @retval EFI_SUCCESS The operation was successful.
585 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
586 @retval EFI_LOAD_ERROR A load error occured.
589 HMainCommandSelectEnd (
595 End
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
600 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
601 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
602 StatusBarSetStatusString (L
"Invalid Block End");
603 return EFI_LOAD_ERROR
;
607 if (HMainEditor
.SelectStart
!= 0 && End
< HMainEditor
.SelectStart
) {
608 StatusBarSetStatusString (L
"Invalid Block End");
612 HMainEditor
.SelectEnd
= End
;
614 HBufferImageNeedRefresh
= TRUE
;
620 Cut current line to clipboard.
622 @retval EFI_SUCCESS The operation was successful.
623 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
624 @retval EFI_LOAD_ERROR A load error occured.
637 // not select, so not allowed to cut
639 if (HMainEditor
.SelectStart
== 0) {
640 StatusBarSetStatusString (L
"No Block is Selected");
644 // not select, so not allowed to cut
646 if (HMainEditor
.SelectEnd
== 0) {
647 StatusBarSetStatusString (L
"No Block is Selected");
651 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
652 for (Index
= 0; Index
< (HMainEditor
.SelectEnd
- 1) / 0x10; Index
++) {
653 Link
= Link
->ForwardLink
;
656 Count
= HMainEditor
.SelectEnd
- HMainEditor
.SelectStart
+ 1;
657 Buffer
= AllocateZeroPool (Count
);
658 if (Buffer
== NULL
) {
659 return EFI_OUT_OF_RESOURCES
;
662 // cut the selected area
664 HBufferImageDeleteCharacterFromBuffer (
665 HMainEditor
.SelectStart
- 1,
673 HClipBoardSet (Buffer
, Count
);
675 HBufferImageNeedRefresh
= TRUE
;
676 HBufferImageOnlyLineNeedRefresh
= FALSE
;
678 if (!HMainEditor
.BufferImage
->Modified
) {
679 HMainEditor
.BufferImage
->Modified
= TRUE
;
683 // now no select area
685 HMainEditor
.SelectStart
= 0;
686 HMainEditor
.SelectEnd
= 0;
692 Paste line to file buffer.
694 @retval EFI_SUCCESS The operation was successful.
695 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
696 @retval EFI_LOAD_ERROR A load error occured.
704 BOOLEAN OnlyLineRefresh
;
705 HEFI_EDITOR_LINE
*Line
;
710 Count
= HClipBoardGet (&Buffer
);
711 if (Count
== 0 || Buffer
== NULL
) {
712 StatusBarSetStatusString (L
"Nothing to Paste");
716 Line
= HMainEditor
.BufferImage
->CurrentLine
;
718 OnlyLineRefresh
= FALSE
;
719 if (Line
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
&& Line
->Size
+ Count
< 0x10) {
721 // is at last line, and after paste will not exceed
722 // so only this line need to be refreshed
724 // if after add, the line is 0x10, then will append a new line
725 // so the whole page will need be refreshed
727 OnlyLineRefresh
= TRUE
;
731 FPos
= 0x10 * (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) + HMainEditor
.BufferImage
->BufferPosition
.Column
- 1;
733 HBufferImageAddCharacterToBuffer (FPos
, Count
, Buffer
);
735 if (OnlyLineRefresh
) {
736 HBufferImageNeedRefresh
= FALSE
;
737 HBufferImageOnlyLineNeedRefresh
= TRUE
;
739 HBufferImageNeedRefresh
= TRUE
;
740 HBufferImageOnlyLineNeedRefresh
= FALSE
;
743 if (!HMainEditor
.BufferImage
->Modified
) {
744 HMainEditor
.BufferImage
->Modified
= TRUE
;
754 @retval EFI_SUCCESS The operation was successful.
755 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
756 @retval EFI_LOAD_ERROR A load error occured.
766 // Below is the scenario of Exit command:
767 // 1. IF currently opened file is not modified, exit the editor and
768 // Exit command ends.
769 // IF currently opened file is modified, do Step 2
771 // 2. An Input Bar will be prompted:
772 // "File modified. Save ( Yes/No/Cancel )?"
773 // IF user press 'y' or 'Y', currently opened file will be saved and
775 // IF user press 'n' or 'N', currently opened file will not be saved
777 // IF user press 'c' or 'C' or ESC, Exit command ends.
780 // if file has been modified, so will prompt user
781 // whether to save the changes
783 if (HMainEditor
.BufferImage
->Modified
) {
785 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
786 if (EFI_ERROR (Status
)) {
790 Status
= InputBarSetStringSize (1);
791 if (EFI_ERROR (Status
)) {
796 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
801 if (Status
== EFI_NOT_READY
) {
805 switch (InputBarGetString()[0]) {
809 // write file back to disk
811 Status
= HBufferImageSave (
812 HMainEditor
.BufferImage
->FileImage
->FileName
,
813 HMainEditor
.BufferImage
->DiskImage
->Name
,
814 HMainEditor
.BufferImage
->DiskImage
->Offset
,
815 HMainEditor
.BufferImage
->DiskImage
->Size
,
816 HMainEditor
.BufferImage
->MemImage
->Offset
,
817 HMainEditor
.BufferImage
->MemImage
->Size
,
818 HMainEditor
.BufferImage
->BufferType
820 if (!EFI_ERROR (Status
)) {
845 Load a file from disk to editor.
847 @retval EFI_SUCCESS The operation was successful.
848 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
849 @retval EFI_LOAD_ERROR A load error occured.
852 HMainCommandOpenFile (
858 EDIT_FILE_TYPE BufferType
;
860 BufferType
= HMainEditor
.BufferImage
->BufferType
;
863 // This command will open a file from current working directory.
864 // Read-only file can also be opened. But it can not be modified.
865 // Below is the scenario of Open File command:
866 // 1. IF currently opened file has not been modified, directly go to step .
867 // IF currently opened file has been modified, an Input Bar will be
869 // "File Modified. Save ( Yes/No/Cancel) ?"
870 // IF user press 'y' or 'Y', currently opened file will be saved.
871 // IF user press 'n' or 'N', currently opened file will
873 // IF user press 'c' or 'C' or ESC, Open File command ends and
874 // currently opened file is still opened.
876 // 2. An Input Bar will be prompted as : "File Name to Open: "
877 // IF user press ESC, Open File command ends and
878 // currently opened file is still opened.
879 // Any other inputs with a Return will cause
880 // currently opened file close.
882 // 3. IF user input file name is an existing file ,
883 // this file will be read and opened.
884 // IF user input file name is a new file, this file will be created
885 // and opened. This file's type ( UNICODE or ASCII ) is the same with
889 // if current file is modified, so you need to choose whether to
892 if (HMainEditor
.BufferImage
->Modified
) {
894 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
895 if (EFI_ERROR (Status
)) {
899 // the answer is just one character
901 Status
= InputBarSetStringSize (1);
902 if (EFI_ERROR (Status
)) {
906 // loop for user's answer
907 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
911 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
916 if (Status
== EFI_NOT_READY
) {
920 switch (InputBarGetString()[0]) {
924 // want to save this buffer first
926 Status
= HBufferImageSave (
927 HMainEditor
.BufferImage
->FileImage
->FileName
,
928 HMainEditor
.BufferImage
->DiskImage
->Name
,
929 HMainEditor
.BufferImage
->DiskImage
->Offset
,
930 HMainEditor
.BufferImage
->DiskImage
->Size
,
931 HMainEditor
.BufferImage
->MemImage
->Offset
,
932 HMainEditor
.BufferImage
->MemImage
->Size
,
933 HMainEditor
.BufferImage
->BufferType
935 if (EFI_ERROR (Status
)) {
939 MainTitleBarRefresh (
940 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
941 HMainEditor
.BufferImage
->BufferType
,
942 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
944 HMainEditor
.ScreenSize
.Column
,
945 HMainEditor
.ScreenSize
.Row
,
946 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
947 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
955 // the file won't be saved
967 // TO get the open file name
969 Status
= InputBarSetPrompt (L
"File Name to Open: ");
970 if (EFI_ERROR (Status
)) {
972 HMainEditor
.BufferImage
->FileImage
->FileName
,
973 HMainEditor
.BufferImage
->DiskImage
->Name
,
974 HMainEditor
.BufferImage
->DiskImage
->Offset
,
975 HMainEditor
.BufferImage
->DiskImage
->Size
,
976 HMainEditor
.BufferImage
->MemImage
->Offset
,
977 HMainEditor
.BufferImage
->MemImage
->Size
,
984 Status
= InputBarSetStringSize (100);
985 if (EFI_ERROR (Status
)) {
986 Status
= HBufferImageRead (
987 HMainEditor
.BufferImage
->FileImage
->FileName
,
988 HMainEditor
.BufferImage
->DiskImage
->Name
,
989 HMainEditor
.BufferImage
->DiskImage
->Offset
,
990 HMainEditor
.BufferImage
->DiskImage
->Size
,
991 HMainEditor
.BufferImage
->MemImage
->Offset
,
992 HMainEditor
.BufferImage
->MemImage
->Size
,
1000 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1005 if (Status
== EFI_NOT_READY
) {
1006 Status
= HBufferImageRead (
1007 HMainEditor
.BufferImage
->FileImage
->FileName
,
1008 HMainEditor
.BufferImage
->DiskImage
->Name
,
1009 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1010 HMainEditor
.BufferImage
->DiskImage
->Size
,
1011 HMainEditor
.BufferImage
->MemImage
->Offset
,
1012 HMainEditor
.BufferImage
->MemImage
->Size
,
1020 // THE input string length should > 0
1022 if (StrLen (InputBarGetString()) > 0) {
1024 // CHECK if filename's valid
1026 if (!IsValidFileName (InputBarGetString())) {
1028 HMainEditor
.BufferImage
->FileImage
->FileName
,
1029 HMainEditor
.BufferImage
->DiskImage
->Name
,
1030 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1031 HMainEditor
.BufferImage
->DiskImage
->Size
,
1032 HMainEditor
.BufferImage
->MemImage
->Offset
,
1033 HMainEditor
.BufferImage
->MemImage
->Size
,
1038 StatusBarSetStatusString (L
"Invalid File Name");
1048 Status
= HBufferImageRead (
1049 InputBarGetString(),
1050 HMainEditor
.BufferImage
->DiskImage
->Name
,
1051 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1052 HMainEditor
.BufferImage
->DiskImage
->Size
,
1053 HMainEditor
.BufferImage
->MemImage
->Offset
,
1054 HMainEditor
.BufferImage
->MemImage
->Size
,
1059 if (EFI_ERROR (Status
)) {
1061 HMainEditor
.BufferImage
->FileImage
->FileName
,
1062 HMainEditor
.BufferImage
->DiskImage
->Name
,
1063 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1064 HMainEditor
.BufferImage
->DiskImage
->Size
,
1065 HMainEditor
.BufferImage
->MemImage
->Offset
,
1066 HMainEditor
.BufferImage
->MemImage
->Size
,
1071 return EFI_LOAD_ERROR
;
1078 Load a disk buffer editor.
1080 @retval EFI_SUCCESS The operation was successful.
1081 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1082 @retval EFI_LOAD_ERROR A load error occured.
1083 @retval EFI_NOT_FOUND The disk was not found.
1086 HMainCommandOpenDisk (
1096 EDIT_FILE_TYPE BufferType
;
1099 // variable initialization
1103 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1106 // if current file is modified, so you need to choose
1107 // whether to save it first.
1109 if (HMainEditor
.BufferImage
->Modified
) {
1111 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1112 if (EFI_ERROR (Status
)) {
1116 // the answer is just one character
1118 Status
= InputBarSetStringSize (1);
1119 if (EFI_ERROR (Status
)) {
1123 // loop for user's answer
1124 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1128 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1133 if (Status
== EFI_NOT_READY
) {
1137 switch (InputBarGetString()[0]) {
1141 // want to save this buffer first
1143 Status
= HBufferImageSave (
1144 HMainEditor
.BufferImage
->FileImage
->FileName
,
1145 HMainEditor
.BufferImage
->DiskImage
->Name
,
1146 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1147 HMainEditor
.BufferImage
->DiskImage
->Size
,
1148 HMainEditor
.BufferImage
->MemImage
->Offset
,
1149 HMainEditor
.BufferImage
->MemImage
->Size
,
1152 if (EFI_ERROR (Status
)) {
1156 MainTitleBarRefresh (
1157 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1158 HMainEditor
.BufferImage
->BufferType
,
1159 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1161 HMainEditor
.ScreenSize
.Column
,
1162 HMainEditor
.ScreenSize
.Row
,
1163 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1164 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1172 // the file won't be saved
1184 // get disk block device name
1186 Status
= InputBarSetPrompt (L
"Block Device to Open: ");
1187 if (EFI_ERROR (Status
)) {
1191 Status
= InputBarSetStringSize (100);
1192 if (EFI_ERROR (Status
)) {
1197 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1202 if (Status
== EFI_NOT_READY
) {
1207 // THE input string length should > 0
1209 if (StrLen (InputBarGetString()) > 0) {
1214 DeviceName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
1215 if (DeviceName
== NULL
) {
1216 return EFI_OUT_OF_RESOURCES
;
1219 // get starting offset
1221 Status
= InputBarSetPrompt (L
"First Block No.: ");
1222 if (EFI_ERROR (Status
)) {
1226 Status
= InputBarSetStringSize (16);
1227 if (EFI_ERROR (Status
)) {
1232 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1237 if (Status
== EFI_NOT_READY
) {
1242 // THE input string length should > 0
1244 if (StrLen (InputBarGetString()) > 0) {
1245 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1246 if (EFI_ERROR (Status
)) {
1254 // get Number of Blocks:
1256 Status
= InputBarSetPrompt (L
"Number of Blocks: ");
1257 if (EFI_ERROR (Status
)) {
1261 Status
= InputBarSetStringSize (8);
1262 if (EFI_ERROR (Status
)) {
1267 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1272 if (Status
== EFI_NOT_READY
) {
1277 // THE input string length should > 0
1279 if (StrLen (InputBarGetString()) > 0) {
1280 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1281 if (EFI_ERROR (Status
)) {
1293 Status
= HBufferImageRead (
1304 if (EFI_ERROR (Status
)) {
1307 HMainEditor
.BufferImage
->FileImage
->FileName
,
1308 HMainEditor
.BufferImage
->DiskImage
->Name
,
1309 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1310 HMainEditor
.BufferImage
->DiskImage
->Size
,
1311 HMainEditor
.BufferImage
->MemImage
->Offset
,
1312 HMainEditor
.BufferImage
->MemImage
->Size
,
1316 return EFI_NOT_FOUND
;
1323 Load memory content to editor
1325 @retval EFI_SUCCESS The operation was successful.
1326 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1327 @retval EFI_LOAD_ERROR A load error occured.
1328 @retval EFI_NOT_FOUND The disk was not found.
1331 HMainCommandOpenMemory (
1339 EDIT_FILE_TYPE BufferType
;
1342 // variable initialization
1346 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1349 // if current buffer is modified, so you need to choose
1350 // whether to save it first.
1352 if (HMainEditor
.BufferImage
->Modified
) {
1354 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1355 if (EFI_ERROR (Status
)) {
1359 // the answer is just one character
1361 Status
= InputBarSetStringSize (1);
1362 if (EFI_ERROR (Status
)) {
1366 // loop for user's answer
1367 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1371 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1376 if (Status
== EFI_NOT_READY
) {
1380 switch (InputBarGetString()[0]) {
1384 // want to save this buffer first
1386 Status
= HBufferImageSave (
1387 HMainEditor
.BufferImage
->FileImage
->FileName
,
1388 HMainEditor
.BufferImage
->DiskImage
->Name
,
1389 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1390 HMainEditor
.BufferImage
->DiskImage
->Size
,
1391 HMainEditor
.BufferImage
->MemImage
->Offset
,
1392 HMainEditor
.BufferImage
->MemImage
->Size
,
1395 if (EFI_ERROR (Status
)) {
1399 MainTitleBarRefresh (
1400 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1401 HMainEditor
.BufferImage
->BufferType
,
1402 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1404 HMainEditor
.ScreenSize
.Column
,
1405 HMainEditor
.ScreenSize
.Row
,
1406 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1407 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1415 // the file won't be saved
1427 // get starting offset
1429 Status
= InputBarSetPrompt (L
"Starting Offset: ");
1430 if (EFI_ERROR (Status
)) {
1434 Status
= InputBarSetStringSize (8);
1435 if (EFI_ERROR (Status
)) {
1440 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1445 if (Status
== EFI_NOT_READY
) {
1450 // THE input string length should > 0
1452 if (StrLen (InputBarGetString()) > 0) {
1453 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1454 if (EFI_ERROR (Status
)) {
1462 // get Number of Blocks:
1464 Status
= InputBarSetPrompt (L
"Buffer Size: ");
1465 if (EFI_ERROR (Status
)) {
1469 Status
= InputBarSetStringSize (8);
1470 if (EFI_ERROR (Status
)) {
1475 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1480 if (Status
== EFI_NOT_READY
) {
1485 // THE input string length should > 0
1487 if (StrLen (InputBarGetString()) > 0) {
1488 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1489 if (EFI_ERROR (Status
)) {
1501 if ((Offset
+ Size
- 1)> 0xffffffff) {
1502 StatusBarSetStatusString (L
"Invalid parameter");
1503 return EFI_LOAD_ERROR
;
1506 Status
= HBufferImageRead (
1517 if (EFI_ERROR (Status
)) {
1518 StatusBarSetStatusString (L
"Read Device Error!");
1520 HMainEditor
.BufferImage
->FileImage
->FileName
,
1521 HMainEditor
.BufferImage
->DiskImage
->Name
,
1522 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1523 HMainEditor
.BufferImage
->DiskImage
->Size
,
1524 HMainEditor
.BufferImage
->MemImage
->Offset
,
1525 HMainEditor
.BufferImage
->MemImage
->Size
,
1529 return EFI_NOT_FOUND
;
1535 MENU_ITEM_FUNCTION HexMainControlBasedMenuFunctions
[] = {
1537 NULL
, /* Ctrl - A */
1538 NULL
, /* Ctrl - B */
1539 NULL
, /* Ctrl - C */
1540 HMainCommandSelectEnd
, /* Ctrl - D */
1541 HMainCommandDisplayHelp
, /* Ctrl - E */
1542 NULL
, /* Ctrl - F */
1543 HMainCommandGoToOffset
, /* Ctrl - G */
1544 NULL
, /* Ctrl - H */
1545 HMainCommandOpenDisk
, /* Ctrl - I */
1546 NULL
, /* Ctrl - J */
1547 NULL
, /* Ctrl - K */
1548 NULL
, /* Ctrl - L */
1549 HMainCommandOpenMemory
, /* Ctrl - M */
1550 NULL
, /* Ctrl - N */
1551 HMainCommandOpenFile
, /* Ctrl - O */
1552 NULL
, /* Ctrl - P */
1553 HMainCommandExit
, /* Ctrl - Q */
1554 NULL
, /* Ctrl - R */
1555 HMainCommandSaveBuffer
, /* Ctrl - S */
1556 HMainCommandSelectStart
, /* Ctrl - T */
1557 NULL
, /* Ctrl - U */
1558 HMainCommandPaste
, /* Ctrl - V */
1559 NULL
, /* Ctrl - W */
1560 HMainCommandCut
, /* Ctrl - X */
1561 NULL
, /* Ctrl - Y */
1562 NULL
, /* Ctrl - Z */
1565 CONST EDITOR_MENU_ITEM HexEditorMenuItems
[] = {
1567 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET
),
1568 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1
),
1569 HMainCommandGoToOffset
1572 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER
),
1573 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2
),
1574 HMainCommandSaveBuffer
1577 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT
),
1578 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3
),
1583 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START
),
1584 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4
),
1585 HMainCommandSelectStart
1588 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END
),
1589 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5
),
1590 HMainCommandSelectEnd
1593 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT
),
1594 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6
),
1598 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE
),
1599 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7
),
1604 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE
),
1605 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8
),
1606 HMainCommandOpenFile
1609 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK
),
1610 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9
),
1611 HMainCommandOpenDisk
1614 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY
),
1615 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10
),
1616 HMainCommandOpenMemory
1627 Init function for MainEditor
1629 @retval EFI_SUCCESS The operation was successful.
1630 @retval EFI_LOAD_ERROR A load error occured.
1638 EFI_HANDLE
*HandleBuffer
;
1643 // basic initialization
1645 CopyMem (&HMainEditor
, &HMainEditorConst
, sizeof (HMainEditor
));
1648 // set screen attributes
1650 HMainEditor
.ColorAttributes
.Colors
.Foreground
= gST
->ConOut
->Mode
->Attribute
& 0x000000ff;
1652 HMainEditor
.ColorAttributes
.Colors
.Background
= (UINT8
) (gST
->ConOut
->Mode
->Attribute
>> 4);
1654 HOriginalColors
= HMainEditor
.ColorAttributes
.Colors
;
1656 HOriginalMode
= gST
->ConOut
->Mode
->Mode
;
1659 // query screen size
1661 gST
->ConOut
->QueryMode (
1663 gST
->ConOut
->Mode
->Mode
,
1664 &(HMainEditor
.ScreenSize
.Column
),
1665 &(HMainEditor
.ScreenSize
.Row
)
1669 // Find TextInEx in System Table ConsoleInHandle
1670 // Per UEFI Spec, TextInEx is required for a console capable platform.
1672 Status
= gBS
->HandleProtocol (
1673 gST
->ConsoleInHandle
,
1674 &gEfiSimpleTextInputExProtocolGuid
,
1675 (VOID
**)&HMainEditor
.TextInputEx
1677 if (EFI_ERROR (Status
)) {
1682 // Find mouse in System Table ConsoleInHandle
1684 Status
= gBS
->HandleProtocol (
1685 gST
->ConsoleInHandle
,
1686 &gEfiSimplePointerProtocolGuid
,
1687 (VOID
**)&HMainEditor
.MouseInterface
1689 if (EFI_ERROR (Status
)) {
1691 // If there is no Simple Pointer Protocol on System Table
1693 HandleBuffer
= NULL
;
1694 HMainEditor
.MouseInterface
= NULL
;
1695 Status
= gBS
->LocateHandleBuffer (
1697 &gEfiSimplePointerProtocolGuid
,
1702 if (!EFI_ERROR (Status
) && HandleCount
> 0) {
1704 // Try to find the first available mouse device
1706 for (Index
= 0; Index
< HandleCount
; Index
++) {
1707 Status
= gBS
->HandleProtocol (
1708 HandleBuffer
[Index
],
1709 &gEfiSimplePointerProtocolGuid
,
1710 (VOID
**)&HMainEditor
.MouseInterface
1712 if (!EFI_ERROR (Status
)) {
1717 if (HandleBuffer
!= NULL
) {
1718 FreePool (HandleBuffer
);
1722 if (!EFI_ERROR (Status
) && HMainEditor
.MouseInterface
!= NULL
) {
1723 HMainEditor
.MouseAccumulatorX
= 0;
1724 HMainEditor
.MouseAccumulatorY
= 0;
1725 HMainEditor
.MouseSupported
= TRUE
;
1729 // below will call the five components' init function
1731 Status
= MainTitleBarInit (L
"UEFI HEXEDIT");
1732 if (EFI_ERROR (Status
)) {
1733 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE
), gShellDebug1HiiHandle
);
1734 return EFI_LOAD_ERROR
;
1737 Status
= ControlHotKeyInit (HexMainControlBasedMenuFunctions
);
1738 if (EFI_ERROR (Status
)) {
1739 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1740 return EFI_LOAD_ERROR
;
1742 Status
= MenuBarInit (HexEditorMenuItems
);
1743 if (EFI_ERROR (Status
)) {
1744 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1745 return EFI_LOAD_ERROR
;
1748 Status
= StatusBarInit ();
1749 if (EFI_ERROR (Status
)) {
1750 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS
), gShellDebug1HiiHandle
);
1751 return EFI_LOAD_ERROR
;
1754 InputBarInit (HMainEditor
.TextInputEx
);
1756 Status
= HBufferImageInit ();
1757 if (EFI_ERROR (Status
)) {
1758 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE
), gShellDebug1HiiHandle
);
1759 return EFI_LOAD_ERROR
;
1762 Status
= HClipBoardInit ();
1763 if (EFI_ERROR (Status
)) {
1764 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD
), gShellDebug1HiiHandle
);
1765 return EFI_LOAD_ERROR
;
1768 // clear whole screen and enable cursor
1770 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1771 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1774 // initialize EditorFirst and EditorExit
1776 HEditorFirst
= TRUE
;
1777 HEditorExit
= FALSE
;
1778 HEditorMouseAction
= FALSE
;
1784 Cleanup function for MainEditor.
1786 @retval EFI_SUCCESS The operation was successful.
1787 @retval EFI_LOAD_ERROR A load error occured.
1790 HMainEditorCleanup (
1797 // call the five components' cleanup function
1799 MainTitleBarCleanup ();
1803 StatusBarCleanup ();
1807 Status
= HBufferImageCleanup ();
1808 if (EFI_ERROR (Status
)) {
1809 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN
), gShellDebug1HiiHandle
);
1812 Status
= HClipBoardCleanup ();
1813 if (EFI_ERROR (Status
)) {
1814 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN
), gShellDebug1HiiHandle
);
1819 if (HOriginalMode
!= gST
->ConOut
->Mode
->Mode
) {
1820 gST
->ConOut
->SetMode (gST
->ConOut
, HOriginalMode
);
1823 gST
->ConOut
->SetAttribute (
1825 EFI_TEXT_ATTR (HOriginalColors
.Foreground
, HOriginalColors
.Background
)
1827 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1833 Refresh function for MainEditor.
1835 @retval EFI_SUCCESS The operation was successful.
1838 HMainEditorRefresh (
1848 if (HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
) {
1849 if (HMainEditor
.BufferImage
->DiskImage
!= NULL
&&
1850 HBufferImageBackupVar
.DiskImage
!= NULL
&&
1851 (HMainEditor
.BufferImage
->DiskImage
->Offset
!= HBufferImageBackupVar
.DiskImage
->Offset
||
1852 HMainEditor
.BufferImage
->DiskImage
->Size
!= HBufferImageBackupVar
.DiskImage
->Size
) ){
1855 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
) {
1856 if (HMainEditor
.BufferImage
->MemImage
!= NULL
&&
1857 HBufferImageBackupVar
.MemImage
!= NULL
&&
1858 (HMainEditor
.BufferImage
->MemImage
->Offset
!= HBufferImageBackupVar
.MemImage
->Offset
||
1859 HMainEditor
.BufferImage
->MemImage
->Size
!= HBufferImageBackupVar
.MemImage
->Size
) ){
1862 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
) {
1863 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1864 HMainEditor
.BufferImage
->FileImage
->FileName
!= NULL
&&
1865 HBufferImageBackupVar
.FileImage
!= NULL
&&
1866 HBufferImageBackupVar
.FileImage
->FileName
!= NULL
&&
1867 StrCmp (HMainEditor
.BufferImage
->FileImage
->FileName
, HBufferImageBackupVar
.FileImage
->FileName
) != 0 ) {
1871 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1872 HBufferImageBackupVar
.FileImage
!= NULL
&&
1873 HMainEditor
.BufferImage
->FileImage
->ReadOnly
!= HBufferImageBackupVar
.FileImage
->ReadOnly
) {
1878 // to aVOID screen flicker
1879 // the stall value is from experience
1884 // call the components refresh function
1888 || HMainEditor
.BufferImage
->BufferType
!= HBufferImageBackupVar
.BufferType
1889 || HBufferImageBackupVar
.Modified
!= HMainEditor
.BufferImage
->Modified
1892 MainTitleBarRefresh (
1893 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
&&HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1894 HMainEditor
.BufferImage
->BufferType
,
1895 (BOOLEAN
)(HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->ReadOnly
:FALSE
),
1896 HMainEditor
.BufferImage
->Modified
,
1897 HMainEditor
.ScreenSize
.Column
,
1898 HMainEditor
.ScreenSize
.Row
,
1899 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
&&HMainEditor
.BufferImage
->MemImage
!=NULL
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1900 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
&&HMainEditor
.BufferImage
->DiskImage
!=NULL
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
&&HMainEditor
.BufferImage
->MemImage
!=NULL
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1902 HBufferImageRefresh ();
1905 || HBufferImageBackupVar
.DisplayPosition
.Row
!= HMainEditor
.BufferImage
->DisplayPosition
.Row
1906 || HBufferImageBackupVar
.DisplayPosition
.Column
!= HMainEditor
.BufferImage
->DisplayPosition
.Column
1907 || StatusBarGetRefresh()) {
1911 HMainEditor
.ScreenSize
.Row
,
1912 HMainEditor
.ScreenSize
.Column
,
1917 HBufferImageRefresh ();
1921 HBufferImageRefresh ();
1925 // EditorFirst is now set to FALSE
1927 HEditorFirst
= FALSE
;
1933 Handle the mouse input.
1935 @param[in] MouseState The current mouse state.
1936 @param[out] BeforeLeftButtonDown helps with selections.
1938 @retval EFI_SUCCESS The operation was successful.
1939 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1940 @retval EFI_LOAD_ERROR A load error occured.
1941 @retval EFI_NOT_FOUND The disk was not found.
1944 HMainEditorHandleMouseInput (
1945 IN EFI_SIMPLE_POINTER_STATE MouseState
,
1946 OUT BOOLEAN
*BeforeLeftButtonDown
1956 HEFI_EDITOR_LINE
*Line
;
1963 // have mouse movement
1965 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
1969 TextX
= HGetTextX (MouseState
.RelativeMovementX
);
1970 TextY
= HGetTextY (MouseState
.RelativeMovementY
);
1972 HBufferImageAdjustMousePosition (TextX
, TextY
);
1978 if (MouseState
.LeftButton
) {
1979 HighBits
= HBufferImageIsAtHighBits (
1980 HMainEditor
.BufferImage
->MousePosition
.Column
,
1985 // not at an movable place
1989 // now just move mouse pointer to legal position
1992 // move mouse position to legal position
1994 HMainEditor
.BufferImage
->MousePosition
.Column
-= 10;
1995 if (HMainEditor
.BufferImage
->MousePosition
.Column
> 24) {
1996 HMainEditor
.BufferImage
->MousePosition
.Column
--;
1997 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1999 if (HMainEditor
.BufferImage
->MousePosition
.Column
< 24) {
2000 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
2013 FRow
= HMainEditor
.BufferImage
->BufferPosition
.Row
+
2014 HMainEditor
.BufferImage
->MousePosition
.Row
-
2015 HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2017 if (HMainEditor
.BufferImage
->NumLines
< FRow
) {
2022 // now just move mouse pointer to legal position
2024 FRow
= HMainEditor
.BufferImage
->NumLines
;
2028 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
2029 for (Index
= 0; Index
< FRow
- 1; Index
++) {
2030 Link
= Link
->ForwardLink
;
2033 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
2039 // now just move mouse pointer to legal position
2041 if (FCol
> Line
->Size
) {
2042 if (*BeforeLeftButtonDown
) {
2045 if (Line
->Size
== 0) {
2058 FCol
= Line
->Size
+ 1;
2063 HBufferImageMovePosition (FRow
, FCol
, HighBits
);
2065 HMainEditor
.BufferImage
->MousePosition
.Row
= HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2067 HMainEditor
.BufferImage
->MousePosition
.Column
= HMainEditor
.BufferImage
->DisplayPosition
.Column
;
2069 *BeforeLeftButtonDown
= TRUE
;
2074 // else of if LButton
2078 if (*BeforeLeftButtonDown
) {
2084 *BeforeLeftButtonDown
= FALSE
;
2091 return EFI_NOT_FOUND
;
2095 Handle user key input. will route it to other components handle function.
2097 @retval EFI_SUCCESS The operation was successful.
2098 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
2099 @retval EFI_LOAD_ERROR A load error occured.
2102 HMainEditorKeyInput (
2106 EFI_KEY_DATA KeyData
;
2108 EFI_SIMPLE_POINTER_STATE MouseState
;
2110 BOOLEAN NoShiftState
;
2111 BOOLEAN LengthChange
;
2114 BOOLEAN BeforeMouseIsDown
;
2115 BOOLEAN MouseIsDown
;
2120 UINTN SelectStartBackup
;
2121 UINTN SelectEndBackup
;
2124 // variable initialization
2129 LengthChange
= FALSE
;
2131 MouseIsDown
= FALSE
;
2137 Status
= EFI_SUCCESS
;
2139 HEditorMouseAction
= FALSE
;
2142 // backup some key elements, so that can aVOID some refresh work
2144 HMainEditorBackup ();
2147 // wait for user key input
2150 // change priority of checking mouse/keyboard activity dynamically
2151 // so prevent starvation of keyboard.
2152 // if last time, mouse moves then this time check keyboard
2154 if (HMainEditor
.MouseSupported
) {
2155 Status
= HMainEditor
.MouseInterface
->GetState (
2156 HMainEditor
.MouseInterface
,
2159 if (!EFI_ERROR (Status
)) {
2161 BeforeMouseIsDown
= MouseIsDown
;
2163 Status
= HMainEditorHandleMouseInput (MouseState
, &MouseIsDown
);
2165 if (!EFI_ERROR (Status
)) {
2166 if (!BeforeMouseIsDown
) {
2171 FRow
= HBufferImage
.BufferPosition
.Row
;
2172 FCol
= HBufferImage
.BufferPosition
.Column
;
2173 SelectStartBackup
= HMainEditor
.SelectStart
;
2174 SelectEndBackup
= HMainEditor
.SelectEnd
;
2180 SelectStartBackup
= HMainEditor
.SelectStart
;
2181 SelectEndBackup
= HMainEditor
.SelectEnd
;
2188 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
2189 HMainEditor
.SelectStart
= 0;
2190 HMainEditor
.SelectEnd
= 0;
2191 HMainEditor
.SelectStart
= (FRow
- 1) * 0x10 + FCol
;
2198 (HBufferImage
.BufferPosition
.Row
- 1) *
2200 HBufferImage
.BufferPosition
.Column
2201 ) >= HMainEditor
.SelectStart
2203 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2205 HBufferImage
.BufferPosition
.Column
;
2207 HMainEditor
.SelectEnd
= 0;
2211 // end of if RelativeX/Y
2218 if (HBufferImageGetTotalSize () == 0) {
2219 HMainEditor
.SelectStart
= 0;
2220 HMainEditor
.SelectEnd
= 0;
2226 (HBufferImage
.BufferPosition
.Row
- 1) *
2228 HBufferImage
.BufferPosition
.Column
2229 ) >= HMainEditor
.SelectStart
2231 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2233 HBufferImage
.BufferPosition
.Column
;
2235 HMainEditor
.SelectEnd
= 0;
2238 if (HMainEditor
.SelectEnd
== 0) {
2239 HMainEditor
.SelectStart
= 0;
2247 if (SelectStartBackup
!= HMainEditor
.SelectStart
|| SelectEndBackup
!= HMainEditor
.SelectEnd
) {
2248 if ((SelectStartBackup
- 1) / 0x10 != (HMainEditor
.SelectStart
- 1) / 0x10) {
2249 HBufferImageNeedRefresh
= TRUE
;
2251 if ((SelectEndBackup
- 1) / 0x10 != (HMainEditor
.SelectEnd
- 1) / 0x10) {
2252 HBufferImageNeedRefresh
= TRUE
;
2254 HBufferImageOnlyLineNeedRefresh
= TRUE
;
2260 HEditorMouseAction
= TRUE
;
2261 HBufferImageMouseNeedRefresh
= TRUE
;
2263 } else if (Status
== EFI_LOAD_ERROR
) {
2264 StatusBarSetStatusString (L
"Invalid Mouse Movement ");
2269 Status
= gBS
->WaitForEvent (1, &HMainEditor
.TextInputEx
->WaitForKeyEx
, &EventIndex
);
2270 if (!EFI_ERROR (Status
) && EventIndex
== 0) {
2271 Status
= HMainEditor
.TextInputEx
->ReadKeyStrokeEx (HMainEditor
.TextInputEx
, &KeyData
);
2272 if (!EFI_ERROR (Status
)) {
2274 // dispatch to different components' key handling function
2275 // so not everywhere has to set this variable
2277 HBufferImageMouseNeedRefresh
= TRUE
;
2280 // clear previous status string
2282 StatusBarSetRefresh();
2284 // NoShiftState: TRUE when no shift key is pressed.
2286 NoShiftState
= ((KeyData
.KeyState
.KeyShiftState
& EFI_SHIFT_STATE_VALID
) == 0) || (KeyData
.KeyState
.KeyShiftState
== EFI_SHIFT_STATE_VALID
);
2288 // dispatch to different components' key handling function
2290 if (EFI_SUCCESS
== MenuBarDispatchControlHotKey(&KeyData
)) {
2291 Status
= EFI_SUCCESS
;
2292 } else if (NoShiftState
&& KeyData
.Key
.ScanCode
== SCAN_NULL
) {
2293 Status
= HBufferImageHandleInput (&KeyData
.Key
);
2294 } else if (NoShiftState
&& ((KeyData
.Key
.ScanCode
>= SCAN_UP
) && (KeyData
.Key
.ScanCode
<= SCAN_PAGE_DOWN
))) {
2295 Status
= HBufferImageHandleInput (&KeyData
.Key
);
2296 } else if (NoShiftState
&& ((KeyData
.Key
.ScanCode
>= SCAN_F1
) && KeyData
.Key
.ScanCode
<= SCAN_F12
)) {
2297 Status
= MenuBarDispatchFunctionKey (&KeyData
.Key
);
2299 StatusBarSetStatusString (L
"Unknown Command");
2301 HBufferImageMouseNeedRefresh
= FALSE
;
2304 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_OUT_OF_RESOURCES
) {
2306 // not already has some error status
2308 if (StrCmp (L
"", StatusBarGetString()) == 0) {
2309 StatusBarSetStatusString (L
"Disk Error. Try Again");
2314 // decide if has to set length warning
2316 if (HBufferImage
.BufferType
!= HBufferImageBackupVar
.BufferType
) {
2317 LengthChange
= FALSE
;
2320 // still the old buffer
2322 if (HBufferImage
.BufferType
!= FileTypeFileBuffer
) {
2323 Size
= HBufferImageGetTotalSize ();
2325 switch (HBufferImage
.BufferType
) {
2326 case FileTypeDiskBuffer
:
2327 OldSize
= HBufferImage
.DiskImage
->Size
* HBufferImage
.DiskImage
->BlockSize
;
2330 case FileTypeMemBuffer
:
2331 OldSize
= HBufferImage
.MemImage
->Size
;
2339 if (!LengthChange
) {
2340 if (OldSize
!= Size
) {
2341 StatusBarSetStatusString (L
"Disk/Mem Buffer Length should not be changed");
2345 if (OldSize
!= Size
) {
2346 LengthChange
= TRUE
;
2348 LengthChange
= FALSE
;
2353 // after handling, refresh editor
2355 HMainEditorRefresh ();
2358 } while (Status
!= EFI_OUT_OF_RESOURCES
&& !HEditorExit
);
2364 Backup function for MainEditor.
2371 HMainEditorBackupVar
.SelectStart
= HMainEditor
.SelectStart
;
2372 HMainEditorBackupVar
.SelectEnd
= HMainEditor
.SelectEnd
;
2373 HBufferImageBackup ();