2 Defines the Main Editor data type -
4 - Instances of the other objects of the editor
7 Copyright (c) 2005 - 2012, 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
= {
68 Help info that will be displayed.
70 EFI_STRING_ID HexMainMenuHelpInfo
[] = {
71 STRING_TOKEN(STR_HEXEDIT_HELP_TITLE
),
72 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
73 STRING_TOKEN(STR_HEXEDIT_HELP_LIST_TITLE
),
74 STRING_TOKEN(STR_HEXEDIT_HELP_DIV
),
75 STRING_TOKEN(STR_HEXEDIT_HELP_GO_TO_OFFSET
),
76 STRING_TOKEN(STR_HEXEDIT_HELP_SAVE_BUFFER
),
77 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT
),
78 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_START
),
79 STRING_TOKEN(STR_HEXEDIT_HELP_SELECT_END
),
80 STRING_TOKEN(STR_HEXEDIT_HELP_CUT
),
81 STRING_TOKEN(STR_HEXEDIT_HELP_PASTE
),
82 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_FILE
),
83 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_DISK
),
84 STRING_TOKEN(STR_HEXEDIT_HELP_OPEN_MEMORY
),
85 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
86 STRING_TOKEN(STR_HEXEDIT_HELP_EXIT_HELP
),
87 STRING_TOKEN(STR_HEXEDIT_HELP_BLANK
),
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_DIV
),
101 @retval EFI_SUCCESS The operation was successful.
104 HMainCommandDisplayHelp (
114 for (CurrentLine
= 0; 0 != HexMainMenuHelpInfo
[CurrentLine
]; CurrentLine
++) {
115 InfoString
= HiiGetString(gShellDebug1HiiHandle
, HexMainMenuHelpInfo
[CurrentLine
]
117 ShellPrintEx (0,CurrentLine
+1,L
"%E%s%N",InfoString
);
122 gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
123 } while(SCAN_CONTROL_W
!= Key
.UnicodeChar
);
125 // update screen with buffer's info
126 HBufferImageNeedRefresh
= TRUE
;
127 HBufferImageOnlyLineNeedRefresh
= FALSE
;
128 HBufferImageRefresh ();
134 Move cursor to specified lines.
136 @retval EFI_SUCCESS The operation was successful.
139 HMainCommandGoToOffset (
150 // variable initialization
160 Status
= InputBarSetPrompt (L
"Go To Offset: ");
161 if (EFI_ERROR (Status
)) {
165 Status
= InputBarSetStringSize (8);
166 if (EFI_ERROR (Status
)) {
171 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
176 if (Status
== EFI_NOT_READY
) {
181 // THE input string length should > 0
183 if (StrLen (InputBarGetString()) > 0) {
184 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
185 if (EFI_ERROR (Status
)) {
186 StatusBarSetStatusString (L
"Invalid Offset");
194 Size
= HBufferImageGetTotalSize ();
195 if (Offset
>= Size
) {
196 StatusBarSetStatusString (L
"Invalid Offset");
200 FRow
= (UINTN
)DivU64x32(Offset
, 0x10) + 1;
201 FCol
= (UINTN
)ModU64x32(Offset
, 0x10) + 1;
203 HBufferImageMovePosition (FRow
, FCol
, TRUE
);
205 HBufferImageNeedRefresh
= TRUE
;
206 HBufferImageOnlyLineNeedRefresh
= FALSE
;
207 HBufferImageMouseNeedRefresh
= TRUE
;
213 Save current opened buffer.
214 If is file buffer, you can save to current file name or
215 save to another file name.
217 @retval EFI_SUCCESS The operation was successful.
218 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
219 @retval EFI_LOAD_ERROR A load error occured.
222 HMainCommandSaveBuffer (
232 SHELL_FILE_HANDLE ShellFileHandle
;
234 if (HMainEditor
.BufferImage
->BufferType
!= FileTypeFileBuffer
) {
235 if (!HMainEditor
.BufferImage
->Modified
) {
239 Status
= InputBarSetPrompt (L
"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");
240 if (EFI_ERROR (Status
)) {
244 // the answer is just one character
246 Status
= InputBarSetStringSize (1);
247 if (EFI_ERROR (Status
)) {
251 // loop for user's answer
252 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
255 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
260 if (Status
== EFI_NOT_READY
) {
264 switch (InputBarGetString()[0]) {
268 // want to save this buffer first
270 Status
= HBufferImageSave (
272 HMainEditor
.BufferImage
->DiskImage
->Name
,
273 HMainEditor
.BufferImage
->DiskImage
->Offset
,
274 HMainEditor
.BufferImage
->DiskImage
->Size
,
275 HMainEditor
.BufferImage
->MemImage
->Offset
,
276 HMainEditor
.BufferImage
->MemImage
->Size
,
277 HMainEditor
.BufferImage
->BufferType
280 if (EFI_ERROR (Status
)) {
281 StatusBarSetStatusString (L
"BufferSave: Problems Writing");
290 // the file won't be saved
308 // ENDOF != FILEBUFFER
310 // This command will save currently opened file to disk.
311 // You can choose save to another file name or just save to
312 // current file name.
313 // Below is the scenario of Save File command: (
314 // Suppose the old file name is A )
315 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"
316 // IF user press ESC, Save File command ends .
317 // IF user press Enter, input file name will be A.
318 // IF user inputs a new file name B, input file name will be B.
320 // 2. IF input file name is A, go to do Step 3.
321 // IF input file name is B, go to do Step 4.
323 // 3. IF A is read only, Status Bar will show "Access Denied"
324 // and Save File commands ends.
325 // IF A is not read only, save file buffer to disk
326 // and remove Modified flag in Title Bar , then Save File command ends.
328 // 4. IF B does not exist, create this file and save file buffer to it.
330 // IF B exits, do Step 5.
332 // 5. An Input Bar will be prompted:
333 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"
334 // IF user press 'y' or 'Y', do Step 6.
335 // IF user press 'n' or 'N', Save File commands ends.
336 // IF user press 'c' or 'C' or ESC, Save File commands ends.
338 // 6. IF B is a read-only file, Status Bar will show "Access Denied"
339 // and Save File commands ends.
340 // IF B can be read and write, save file buffer to B.
342 // 7. Update File Name field in Title Bar to B
343 // and remove the Modified flag in Title Bar.
345 Str
= CatSPrint(NULL
,
346 L
"File to Save: [%s]",
347 HMainEditor
.BufferImage
->FileImage
->FileName
350 return EFI_OUT_OF_RESOURCES
;
353 if (StrLen (Str
) >= 50) {
355 // replace the long file name with "..."
364 Status
= InputBarSetPrompt (Str
);
365 if (EFI_ERROR (Status
)) {
369 Status
= InputBarSetStringSize (100);
370 if (EFI_ERROR (Status
)) {
376 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
379 // if user pressed ESC
381 if (Status
== EFI_NOT_READY
) {
382 SHELL_FREE_NON_NULL (Str
);
386 SHELL_FREE_NON_NULL (Str
);
389 // if just enter pressed, so think save to current file name
391 if (StrLen (InputBarGetString()) == 0) {
392 FileName
= CatSPrint(NULL
,
394 HMainEditor
.BufferImage
->FileImage
->FileName
397 FileName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
400 if (FileName
== NULL
) {
401 return EFI_OUT_OF_RESOURCES
;
404 if (!IsValidFileName (FileName
)) {
405 StatusBarSetStatusString (L
"Invalid File Name");
406 SHELL_FREE_NON_NULL (FileName
);
413 // save to the old file
415 if (StringNoCaseCompare (
417 &HMainEditor
.BufferImage
->FileImage
->FileName
424 // if the file is read only, so can not write back to it.
426 if (HMainEditor
.BufferImage
->FileImage
->ReadOnly
) {
427 StatusBarSetStatusString (L
"Access Denied");
428 SHELL_FREE_NON_NULL (FileName
);
432 Status
= ShellOpenFileByName (FileName
, &ShellFileHandle
, EFI_FILE_MODE_READ
, 0);
434 if (!EFI_ERROR (Status
)) {
436 Info
= ShellGetFileInfo(ShellFileHandle
);
438 ShellCloseFile(&ShellFileHandle
);
440 // check if read only
442 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
443 StatusBarSetStatusString (L
"Access Denied");
444 SHELL_FREE_NON_NULL (FileName
);
448 SHELL_FREE_NON_NULL(Info
);
450 // ask user whether to overwrite this file
452 Status
= InputBarSetPrompt (L
"File exists. Overwrite (Yes/No/Cancel) ? ");
453 if (EFI_ERROR (Status
)) {
454 SHELL_FREE_NON_NULL (FileName
);
458 Status
= InputBarSetStringSize (1);
459 if (EFI_ERROR (Status
)) {
460 SHELL_FREE_NON_NULL (FileName
);
466 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
468 if (Status
== EFI_NOT_READY
) {
469 SHELL_FREE_NON_NULL (FileName
);
473 switch (InputBarGetString()[0]) {
480 SHELL_FREE_NON_NULL (FileName
);
484 SHELL_FREE_NON_NULL (FileName
);
488 } // if opened existing file
492 // save file back to disk
494 Status
= HBufferImageSave (
496 HMainEditor
.BufferImage
->DiskImage
->Name
,
497 HMainEditor
.BufferImage
->DiskImage
->Offset
,
498 HMainEditor
.BufferImage
->DiskImage
->Size
,
499 HMainEditor
.BufferImage
->MemImage
->Offset
,
500 HMainEditor
.BufferImage
->MemImage
->Size
,
503 SHELL_FREE_NON_NULL (FileName
);
505 if (EFI_ERROR (Status
)) {
506 return EFI_LOAD_ERROR
;
513 Load a disk buffer editor.
515 @retval EFI_SUCCESS The operation was successful.
516 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
517 @retval EFI_LOAD_ERROR A load error occured.
520 HMainCommandSelectStart (
526 Start
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
531 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
532 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
533 StatusBarSetStatusString (L
"Invalid Block Start");
534 return EFI_LOAD_ERROR
;
538 if (HMainEditor
.SelectEnd
!= 0 && Start
> HMainEditor
.SelectEnd
) {
539 StatusBarSetStatusString (L
"Invalid Block Start");
540 return EFI_LOAD_ERROR
;
543 HMainEditor
.SelectStart
= Start
;
545 HBufferImageNeedRefresh
= TRUE
;
551 Load a disk buffer editor.
553 @retval EFI_SUCCESS The operation was successful.
554 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
555 @retval EFI_LOAD_ERROR A load error occured.
558 HMainCommandSelectEnd (
564 End
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
569 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
570 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
571 StatusBarSetStatusString (L
"Invalid Block End");
572 return EFI_LOAD_ERROR
;
576 if (HMainEditor
.SelectStart
!= 0 && End
< HMainEditor
.SelectStart
) {
577 StatusBarSetStatusString (L
"Invalid Block End");
581 HMainEditor
.SelectEnd
= End
;
583 HBufferImageNeedRefresh
= TRUE
;
589 Cut current line to clipboard.
591 @retval EFI_SUCCESS The operation was successful.
592 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
593 @retval EFI_LOAD_ERROR A load error occured.
606 // not select, so not allowed to cut
608 if (HMainEditor
.SelectStart
== 0) {
609 StatusBarSetStatusString (L
"No Block is Selected");
613 // not select, so not allowed to cut
615 if (HMainEditor
.SelectEnd
== 0) {
616 StatusBarSetStatusString (L
"No Block is Selected");
620 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
621 for (Index
= 0; Index
< (HMainEditor
.SelectEnd
- 1) / 0x10; Index
++) {
622 Link
= Link
->ForwardLink
;
625 Count
= HMainEditor
.SelectEnd
- HMainEditor
.SelectStart
+ 1;
626 Buffer
= AllocateZeroPool (Count
);
627 if (Buffer
== NULL
) {
628 return EFI_OUT_OF_RESOURCES
;
631 // cut the selected area
633 HBufferImageDeleteCharacterFromBuffer (
634 HMainEditor
.SelectStart
- 1,
642 HClipBoardSet (Buffer
, Count
);
644 HBufferImageNeedRefresh
= TRUE
;
645 HBufferImageOnlyLineNeedRefresh
= FALSE
;
647 if (!HMainEditor
.BufferImage
->Modified
) {
648 HMainEditor
.BufferImage
->Modified
= TRUE
;
652 // now no select area
654 HMainEditor
.SelectStart
= 0;
655 HMainEditor
.SelectEnd
= 0;
661 Paste line to file buffer.
663 @retval EFI_SUCCESS The operation was successful.
664 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
665 @retval EFI_LOAD_ERROR A load error occured.
673 BOOLEAN OnlyLineRefresh
;
674 HEFI_EDITOR_LINE
*Line
;
679 Count
= HClipBoardGet (&Buffer
);
680 if (Count
== 0 || Buffer
== NULL
) {
681 StatusBarSetStatusString (L
"Nothing to Paste");
685 Line
= HMainEditor
.BufferImage
->CurrentLine
;
687 OnlyLineRefresh
= FALSE
;
688 if (Line
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
&& Line
->Size
+ Count
< 0x10) {
690 // is at last line, and after paste will not exceed
691 // so only this line need to be refreshed
693 // if after add, the line is 0x10, then will append a new line
694 // so the whole page will need be refreshed
696 OnlyLineRefresh
= TRUE
;
700 FPos
= 0x10 * (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) + HMainEditor
.BufferImage
->BufferPosition
.Column
- 1;
702 HBufferImageAddCharacterToBuffer (FPos
, Count
, Buffer
);
704 if (OnlyLineRefresh
) {
705 HBufferImageNeedRefresh
= FALSE
;
706 HBufferImageOnlyLineNeedRefresh
= TRUE
;
708 HBufferImageNeedRefresh
= TRUE
;
709 HBufferImageOnlyLineNeedRefresh
= FALSE
;
712 if (!HMainEditor
.BufferImage
->Modified
) {
713 HMainEditor
.BufferImage
->Modified
= TRUE
;
723 @retval EFI_SUCCESS The operation was successful.
724 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
725 @retval EFI_LOAD_ERROR A load error occured.
735 // Below is the scenario of Exit command:
736 // 1. IF currently opened file is not modified, exit the editor and
737 // Exit command ends.
738 // IF currently opened file is modified, do Step 2
740 // 2. An Input Bar will be prompted:
741 // "File modified. Save ( Yes/No/Cancel )?"
742 // IF user press 'y' or 'Y', currently opened file will be saved and
744 // IF user press 'n' or 'N', currently opened file will not be saved
746 // IF user press 'c' or 'C' or ESC, Exit command ends.
749 // if file has been modified, so will prompt user
750 // whether to save the changes
752 if (HMainEditor
.BufferImage
->Modified
) {
754 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
755 if (EFI_ERROR (Status
)) {
759 Status
= InputBarSetStringSize (1);
760 if (EFI_ERROR (Status
)) {
765 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
770 if (Status
== EFI_NOT_READY
) {
774 switch (InputBarGetString()[0]) {
778 // write file back to disk
780 Status
= HBufferImageSave (
781 HMainEditor
.BufferImage
->FileImage
->FileName
,
782 HMainEditor
.BufferImage
->DiskImage
->Name
,
783 HMainEditor
.BufferImage
->DiskImage
->Offset
,
784 HMainEditor
.BufferImage
->DiskImage
->Size
,
785 HMainEditor
.BufferImage
->MemImage
->Offset
,
786 HMainEditor
.BufferImage
->MemImage
->Size
,
787 HMainEditor
.BufferImage
->BufferType
789 if (!EFI_ERROR (Status
)) {
814 Load a file from disk to editor.
816 @retval EFI_SUCCESS The operation was successful.
817 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
818 @retval EFI_LOAD_ERROR A load error occured.
821 HMainCommandOpenFile (
827 EDIT_FILE_TYPE BufferType
;
829 BufferType
= HMainEditor
.BufferImage
->BufferType
;
832 // This command will open a file from current working directory.
833 // Read-only file can also be opened. But it can not be modified.
834 // Below is the scenario of Open File command:
835 // 1. IF currently opened file has not been modified, directly go to step .
836 // IF currently opened file has been modified, an Input Bar will be
838 // "File Modified. Save ( Yes/No/Cancel) ?"
839 // IF user press 'y' or 'Y', currently opened file will be saved.
840 // IF user press 'n' or 'N', currently opened file will
842 // IF user press 'c' or 'C' or ESC, Open File command ends and
843 // currently opened file is still opened.
845 // 2. An Input Bar will be prompted as : "File Name to Open: "
846 // IF user press ESC, Open File command ends and
847 // currently opened file is still opened.
848 // Any other inputs with a Return will cause
849 // currently opened file close.
851 // 3. IF user input file name is an existing file ,
852 // this file will be read and opened.
853 // IF user input file name is a new file, this file will be created
854 // and opened. This file's type ( UNICODE or ASCII ) is the same with
858 // if current file is modified, so you need to choose whether to
861 if (HMainEditor
.BufferImage
->Modified
) {
863 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
864 if (EFI_ERROR (Status
)) {
868 // the answer is just one character
870 Status
= InputBarSetStringSize (1);
871 if (EFI_ERROR (Status
)) {
875 // loop for user's answer
876 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
880 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
885 if (Status
== EFI_NOT_READY
) {
889 switch (InputBarGetString()[0]) {
893 // want to save this buffer first
895 Status
= HBufferImageSave (
896 HMainEditor
.BufferImage
->FileImage
->FileName
,
897 HMainEditor
.BufferImage
->DiskImage
->Name
,
898 HMainEditor
.BufferImage
->DiskImage
->Offset
,
899 HMainEditor
.BufferImage
->DiskImage
->Size
,
900 HMainEditor
.BufferImage
->MemImage
->Offset
,
901 HMainEditor
.BufferImage
->MemImage
->Size
,
902 HMainEditor
.BufferImage
->BufferType
904 if (EFI_ERROR (Status
)) {
908 MainTitleBarRefresh (
909 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
910 HMainEditor
.BufferImage
->BufferType
,
911 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
913 HMainEditor
.ScreenSize
.Column
,
914 HMainEditor
.ScreenSize
.Row
,
915 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
916 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
924 // the file won't be saved
936 // TO get the open file name
938 Status
= InputBarSetPrompt (L
"File Name to Open: ");
939 if (EFI_ERROR (Status
)) {
941 HMainEditor
.BufferImage
->FileImage
->FileName
,
942 HMainEditor
.BufferImage
->DiskImage
->Name
,
943 HMainEditor
.BufferImage
->DiskImage
->Offset
,
944 HMainEditor
.BufferImage
->DiskImage
->Size
,
945 HMainEditor
.BufferImage
->MemImage
->Offset
,
946 HMainEditor
.BufferImage
->MemImage
->Size
,
953 Status
= InputBarSetStringSize (100);
954 if (EFI_ERROR (Status
)) {
955 Status
= HBufferImageRead (
956 HMainEditor
.BufferImage
->FileImage
->FileName
,
957 HMainEditor
.BufferImage
->DiskImage
->Name
,
958 HMainEditor
.BufferImage
->DiskImage
->Offset
,
959 HMainEditor
.BufferImage
->DiskImage
->Size
,
960 HMainEditor
.BufferImage
->MemImage
->Offset
,
961 HMainEditor
.BufferImage
->MemImage
->Size
,
969 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
974 if (Status
== EFI_NOT_READY
) {
975 Status
= HBufferImageRead (
976 HMainEditor
.BufferImage
->FileImage
->FileName
,
977 HMainEditor
.BufferImage
->DiskImage
->Name
,
978 HMainEditor
.BufferImage
->DiskImage
->Offset
,
979 HMainEditor
.BufferImage
->DiskImage
->Size
,
980 HMainEditor
.BufferImage
->MemImage
->Offset
,
981 HMainEditor
.BufferImage
->MemImage
->Size
,
989 // THE input string length should > 0
991 if (StrLen (InputBarGetString()) > 0) {
993 // CHECK if filename's valid
995 if (!IsValidFileName (InputBarGetString())) {
997 HMainEditor
.BufferImage
->FileImage
->FileName
,
998 HMainEditor
.BufferImage
->DiskImage
->Name
,
999 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1000 HMainEditor
.BufferImage
->DiskImage
->Size
,
1001 HMainEditor
.BufferImage
->MemImage
->Offset
,
1002 HMainEditor
.BufferImage
->MemImage
->Size
,
1007 StatusBarSetStatusString (L
"Invalid File Name");
1017 Status
= HBufferImageRead (
1018 InputBarGetString(),
1019 HMainEditor
.BufferImage
->DiskImage
->Name
,
1020 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1021 HMainEditor
.BufferImage
->DiskImage
->Size
,
1022 HMainEditor
.BufferImage
->MemImage
->Offset
,
1023 HMainEditor
.BufferImage
->MemImage
->Size
,
1028 if (EFI_ERROR (Status
)) {
1030 HMainEditor
.BufferImage
->FileImage
->FileName
,
1031 HMainEditor
.BufferImage
->DiskImage
->Name
,
1032 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1033 HMainEditor
.BufferImage
->DiskImage
->Size
,
1034 HMainEditor
.BufferImage
->MemImage
->Offset
,
1035 HMainEditor
.BufferImage
->MemImage
->Size
,
1040 return EFI_LOAD_ERROR
;
1047 Load a disk buffer editor.
1049 @retval EFI_SUCCESS The operation was successful.
1050 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1051 @retval EFI_LOAD_ERROR A load error occured.
1052 @retval EFI_NOT_FOUND The disk was not found.
1055 HMainCommandOpenDisk (
1065 EDIT_FILE_TYPE BufferType
;
1068 // variable initialization
1072 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1075 // if current file is modified, so you need to choose
1076 // whether to save it first.
1078 if (HMainEditor
.BufferImage
->Modified
) {
1080 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1081 if (EFI_ERROR (Status
)) {
1085 // the answer is just one character
1087 Status
= InputBarSetStringSize (1);
1088 if (EFI_ERROR (Status
)) {
1092 // loop for user's answer
1093 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1097 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1102 if (Status
== EFI_NOT_READY
) {
1106 switch (InputBarGetString()[0]) {
1110 // want to save this buffer first
1112 Status
= HBufferImageSave (
1113 HMainEditor
.BufferImage
->FileImage
->FileName
,
1114 HMainEditor
.BufferImage
->DiskImage
->Name
,
1115 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1116 HMainEditor
.BufferImage
->DiskImage
->Size
,
1117 HMainEditor
.BufferImage
->MemImage
->Offset
,
1118 HMainEditor
.BufferImage
->MemImage
->Size
,
1121 if (EFI_ERROR (Status
)) {
1125 MainTitleBarRefresh (
1126 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1127 HMainEditor
.BufferImage
->BufferType
,
1128 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1130 HMainEditor
.ScreenSize
.Column
,
1131 HMainEditor
.ScreenSize
.Row
,
1132 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1133 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1141 // the file won't be saved
1153 // get disk block device name
1155 Status
= InputBarSetPrompt (L
"Block Device to Open: ");
1156 if (EFI_ERROR (Status
)) {
1160 Status
= InputBarSetStringSize (100);
1161 if (EFI_ERROR (Status
)) {
1166 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1171 if (Status
== EFI_NOT_READY
) {
1176 // THE input string length should > 0
1178 if (StrLen (InputBarGetString()) > 0) {
1183 DeviceName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
1184 if (DeviceName
== NULL
) {
1185 return EFI_OUT_OF_RESOURCES
;
1188 // get starting offset
1190 Status
= InputBarSetPrompt (L
"First Block No.: ");
1191 if (EFI_ERROR (Status
)) {
1195 Status
= InputBarSetStringSize (16);
1196 if (EFI_ERROR (Status
)) {
1201 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1206 if (Status
== EFI_NOT_READY
) {
1211 // THE input string length should > 0
1213 if (StrLen (InputBarGetString()) > 0) {
1214 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1215 if (EFI_ERROR (Status
)) {
1223 // get Number of Blocks:
1225 Status
= InputBarSetPrompt (L
"Number of Blocks: ");
1226 if (EFI_ERROR (Status
)) {
1230 Status
= InputBarSetStringSize (8);
1231 if (EFI_ERROR (Status
)) {
1236 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1241 if (Status
== EFI_NOT_READY
) {
1246 // THE input string length should > 0
1248 if (StrLen (InputBarGetString()) > 0) {
1249 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1250 if (EFI_ERROR (Status
)) {
1262 Status
= HBufferImageRead (
1273 if (EFI_ERROR (Status
)) {
1276 HMainEditor
.BufferImage
->FileImage
->FileName
,
1277 HMainEditor
.BufferImage
->DiskImage
->Name
,
1278 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1279 HMainEditor
.BufferImage
->DiskImage
->Size
,
1280 HMainEditor
.BufferImage
->MemImage
->Offset
,
1281 HMainEditor
.BufferImage
->MemImage
->Size
,
1285 return EFI_NOT_FOUND
;
1292 Load memory content to editor
1294 @retval EFI_SUCCESS The operation was successful.
1295 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1296 @retval EFI_LOAD_ERROR A load error occured.
1297 @retval EFI_NOT_FOUND The disk was not found.
1300 HMainCommandOpenMemory (
1308 EDIT_FILE_TYPE BufferType
;
1311 // variable initialization
1315 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1318 // if current buffer is modified, so you need to choose
1319 // whether to save it first.
1321 if (HMainEditor
.BufferImage
->Modified
) {
1323 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1324 if (EFI_ERROR (Status
)) {
1328 // the answer is just one character
1330 Status
= InputBarSetStringSize (1);
1331 if (EFI_ERROR (Status
)) {
1335 // loop for user's answer
1336 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1340 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1345 if (Status
== EFI_NOT_READY
) {
1349 switch (InputBarGetString()[0]) {
1353 // want to save this buffer first
1355 Status
= HBufferImageSave (
1356 HMainEditor
.BufferImage
->FileImage
->FileName
,
1357 HMainEditor
.BufferImage
->DiskImage
->Name
,
1358 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1359 HMainEditor
.BufferImage
->DiskImage
->Size
,
1360 HMainEditor
.BufferImage
->MemImage
->Offset
,
1361 HMainEditor
.BufferImage
->MemImage
->Size
,
1364 if (EFI_ERROR (Status
)) {
1368 MainTitleBarRefresh (
1369 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1370 HMainEditor
.BufferImage
->BufferType
,
1371 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1373 HMainEditor
.ScreenSize
.Column
,
1374 HMainEditor
.ScreenSize
.Row
,
1375 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1376 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1384 // the file won't be saved
1396 // get starting offset
1398 Status
= InputBarSetPrompt (L
"Starting Offset: ");
1399 if (EFI_ERROR (Status
)) {
1403 Status
= InputBarSetStringSize (8);
1404 if (EFI_ERROR (Status
)) {
1409 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1414 if (Status
== EFI_NOT_READY
) {
1419 // THE input string length should > 0
1421 if (StrLen (InputBarGetString()) > 0) {
1422 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1423 if (EFI_ERROR (Status
)) {
1431 // get Number of Blocks:
1433 Status
= InputBarSetPrompt (L
"Buffer Size: ");
1434 if (EFI_ERROR (Status
)) {
1438 Status
= InputBarSetStringSize (8);
1439 if (EFI_ERROR (Status
)) {
1444 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1449 if (Status
== EFI_NOT_READY
) {
1454 // THE input string length should > 0
1456 if (StrLen (InputBarGetString()) > 0) {
1457 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1458 if (EFI_ERROR (Status
)) {
1470 if ((Offset
+ Size
- 1)> 0xffffffff) {
1471 StatusBarSetStatusString (L
"Invalid parameter");
1472 return EFI_LOAD_ERROR
;
1475 Status
= HBufferImageRead (
1486 if (EFI_ERROR (Status
)) {
1487 StatusBarSetStatusString (L
"Read Device Error!");
1489 HMainEditor
.BufferImage
->FileImage
->FileName
,
1490 HMainEditor
.BufferImage
->DiskImage
->Name
,
1491 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1492 HMainEditor
.BufferImage
->DiskImage
->Size
,
1493 HMainEditor
.BufferImage
->MemImage
->Offset
,
1494 HMainEditor
.BufferImage
->MemImage
->Size
,
1498 return EFI_NOT_FOUND
;
1504 MENU_ITEM_FUNCTION HexMainControlBasedMenuFunctions
[] = {
1506 NULL
, /* Ctrl - A */
1507 NULL
, /* Ctrl - B */
1508 NULL
, /* Ctrl - C */
1509 HMainCommandSelectEnd
, /* Ctrl - D */
1510 HMainCommandDisplayHelp
, /* Ctrl - E */
1511 NULL
, /* Ctrl - F */
1512 HMainCommandGoToOffset
, /* Ctrl - G */
1513 NULL
, /* Ctrl - H */
1514 HMainCommandOpenDisk
, /* Ctrl - I */
1515 NULL
, /* Ctrl - J */
1516 NULL
, /* Ctrl - K */
1517 NULL
, /* Ctrl - L */
1518 HMainCommandOpenMemory
, /* Ctrl - M */
1519 NULL
, /* Ctrl - N */
1520 HMainCommandOpenFile
, /* Ctrl - O */
1521 NULL
, /* Ctrl - P */
1522 HMainCommandExit
, /* Ctrl - Q */
1523 NULL
, /* Ctrl - R */
1524 HMainCommandSaveBuffer
, /* Ctrl - S */
1525 HMainCommandSelectStart
, /* Ctrl - T */
1526 NULL
, /* Ctrl - U */
1527 HMainCommandPaste
, /* Ctrl - V */
1528 NULL
, /* Ctrl - W */
1529 HMainCommandCut
, /* Ctrl - X */
1530 NULL
, /* Ctrl - Y */
1531 NULL
, /* Ctrl - Z */
1534 CONST EDITOR_MENU_ITEM HexEditorMenuItems
[] = {
1536 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET
),
1537 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1
),
1538 HMainCommandGoToOffset
1541 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER
),
1542 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2
),
1543 HMainCommandSaveBuffer
1546 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT
),
1547 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3
),
1552 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START
),
1553 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4
),
1554 HMainCommandSelectStart
1557 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END
),
1558 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5
),
1559 HMainCommandSelectEnd
1562 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT
),
1563 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6
),
1567 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE
),
1568 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7
),
1573 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE
),
1574 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8
),
1575 HMainCommandOpenFile
1578 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK
),
1579 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9
),
1580 HMainCommandOpenDisk
1583 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY
),
1584 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10
),
1585 HMainCommandOpenMemory
1596 Init function for MainEditor
1598 @retval EFI_SUCCESS The operation was successful.
1599 @retval EFI_LOAD_ERROR A load error occured.
1607 EFI_HANDLE
*HandleBuffer
;
1612 // basic initialization
1614 CopyMem (&HMainEditor
, &HMainEditorConst
, sizeof (HMainEditor
));
1617 // set screen attributes
1619 HMainEditor
.ColorAttributes
.Colors
.Foreground
= gST
->ConOut
->Mode
->Attribute
& 0x000000ff;
1621 HMainEditor
.ColorAttributes
.Colors
.Background
= (UINT8
) (gST
->ConOut
->Mode
->Attribute
>> 4);
1623 HOriginalColors
= HMainEditor
.ColorAttributes
.Colors
;
1625 HOriginalMode
= gST
->ConOut
->Mode
->Mode
;
1628 // query screen size
1630 gST
->ConOut
->QueryMode (
1632 gST
->ConOut
->Mode
->Mode
,
1633 &(HMainEditor
.ScreenSize
.Column
),
1634 &(HMainEditor
.ScreenSize
.Row
)
1638 // Find mouse in System Table ConsoleInHandle
1640 Status
= gBS
->HandleProtocol (
1642 &gEfiSimplePointerProtocolGuid
,
1643 (VOID
**)&HMainEditor
.MouseInterface
1645 if (EFI_ERROR (Status
)) {
1647 // If there is no Simple Pointer Protocol on System Table
1649 HandleBuffer
= NULL
;
1650 HMainEditor
.MouseInterface
= NULL
;
1651 Status
= gBS
->LocateHandleBuffer (
1653 &gEfiSimplePointerProtocolGuid
,
1658 if (!EFI_ERROR (Status
) && HandleCount
> 0) {
1660 // Try to find the first available mouse device
1662 for (Index
= 0; Index
< HandleCount
; Index
++) {
1663 Status
= gBS
->HandleProtocol (
1664 HandleBuffer
[Index
],
1665 &gEfiSimplePointerProtocolGuid
,
1666 (VOID
**)&HMainEditor
.MouseInterface
1668 if (!EFI_ERROR (Status
)) {
1673 if (HandleBuffer
!= NULL
) {
1674 FreePool (HandleBuffer
);
1678 if (!EFI_ERROR (Status
) && HMainEditor
.MouseInterface
!= NULL
) {
1679 HMainEditor
.MouseAccumulatorX
= 0;
1680 HMainEditor
.MouseAccumulatorY
= 0;
1681 HMainEditor
.MouseSupported
= TRUE
;
1685 // below will call the five components' init function
1687 Status
= MainTitleBarInit (L
"UEFI HEXEDIT");
1688 if (EFI_ERROR (Status
)) {
1689 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE
), gShellDebug1HiiHandle
);
1690 return EFI_LOAD_ERROR
;
1693 Status
= ControlHotKeyInit (HexMainControlBasedMenuFunctions
);
1694 if (EFI_ERROR (Status
)) {
1695 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1696 return EFI_LOAD_ERROR
;
1698 Status
= MenuBarInit (HexEditorMenuItems
);
1699 if (EFI_ERROR (Status
)) {
1700 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1701 return EFI_LOAD_ERROR
;
1704 Status
= StatusBarInit ();
1705 if (EFI_ERROR (Status
)) {
1706 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS
), gShellDebug1HiiHandle
);
1707 return EFI_LOAD_ERROR
;
1712 Status
= HBufferImageInit ();
1713 if (EFI_ERROR (Status
)) {
1714 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE
), gShellDebug1HiiHandle
);
1715 return EFI_LOAD_ERROR
;
1718 Status
= HClipBoardInit ();
1719 if (EFI_ERROR (Status
)) {
1720 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD
), gShellDebug1HiiHandle
);
1721 return EFI_LOAD_ERROR
;
1724 // clear whole screen and enable cursor
1726 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1727 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1730 // initialize EditorFirst and EditorExit
1732 HEditorFirst
= TRUE
;
1733 HEditorExit
= FALSE
;
1734 HEditorMouseAction
= FALSE
;
1740 Cleanup function for MainEditor.
1742 @retval EFI_SUCCESS The operation was successful.
1743 @retval EFI_LOAD_ERROR A load error occured.
1746 HMainEditorCleanup (
1753 // call the five components' cleanup function
1755 MainTitleBarCleanup ();
1759 StatusBarCleanup ();
1763 Status
= HBufferImageCleanup ();
1764 if (EFI_ERROR (Status
)) {
1765 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN
), gShellDebug1HiiHandle
);
1768 Status
= HClipBoardCleanup ();
1769 if (EFI_ERROR (Status
)) {
1770 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN
), gShellDebug1HiiHandle
);
1775 if (HOriginalMode
!= gST
->ConOut
->Mode
->Mode
) {
1776 gST
->ConOut
->SetMode (gST
->ConOut
, HOriginalMode
);
1779 gST
->ConOut
->SetAttribute (
1781 EFI_TEXT_ATTR (HOriginalColors
.Foreground
, HOriginalColors
.Background
)
1783 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1789 Refresh function for MainEditor.
1791 @retval EFI_SUCCESS The operation was successful.
1794 HMainEditorRefresh (
1804 if (HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
) {
1805 if (HMainEditor
.BufferImage
->DiskImage
!= NULL
&&
1806 HBufferImageBackupVar
.DiskImage
!= NULL
&&
1807 (HMainEditor
.BufferImage
->DiskImage
->Offset
!= HBufferImageBackupVar
.DiskImage
->Offset
||
1808 HMainEditor
.BufferImage
->DiskImage
->Size
!= HBufferImageBackupVar
.DiskImage
->Size
) ){
1811 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
) {
1812 if (HMainEditor
.BufferImage
->MemImage
!= NULL
&&
1813 HBufferImageBackupVar
.MemImage
!= NULL
&&
1814 (HMainEditor
.BufferImage
->MemImage
->Offset
!= HBufferImageBackupVar
.MemImage
->Offset
||
1815 HMainEditor
.BufferImage
->MemImage
->Size
!= HBufferImageBackupVar
.MemImage
->Size
) ){
1818 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
) {
1819 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1820 HMainEditor
.BufferImage
->FileImage
->FileName
!= NULL
&&
1821 HBufferImageBackupVar
.FileImage
!= NULL
&&
1822 HBufferImageBackupVar
.FileImage
->FileName
!= NULL
&&
1823 StrCmp (HMainEditor
.BufferImage
->FileImage
->FileName
, HBufferImageBackupVar
.FileImage
->FileName
) != 0 ) {
1827 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1828 HBufferImageBackupVar
.FileImage
!= NULL
&&
1829 HMainEditor
.BufferImage
->FileImage
->ReadOnly
!= HBufferImageBackupVar
.FileImage
->ReadOnly
) {
1834 // to aVOID screen flicker
1835 // the stall value is from experience
1840 // call the components refresh function
1844 || HMainEditor
.BufferImage
->BufferType
!= HBufferImageBackupVar
.BufferType
1845 || HBufferImageBackupVar
.Modified
!= HMainEditor
.BufferImage
->Modified
1848 MainTitleBarRefresh (
1849 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
,
1850 HMainEditor
.BufferImage
->BufferType
,
1851 (BOOLEAN
)(HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->ReadOnly
:FALSE
),
1852 HMainEditor
.BufferImage
->Modified
,
1853 HMainEditor
.ScreenSize
.Column
,
1854 HMainEditor
.ScreenSize
.Row
,
1855 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,
1856 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
1858 HBufferImageRefresh ();
1861 || HBufferImageBackupVar
.DisplayPosition
.Row
!= HMainEditor
.BufferImage
->DisplayPosition
.Row
1862 || HBufferImageBackupVar
.DisplayPosition
.Column
!= HMainEditor
.BufferImage
->DisplayPosition
.Column
1863 || StatusBarGetRefresh()) {
1867 HMainEditor
.ScreenSize
.Row
,
1868 HMainEditor
.ScreenSize
.Column
,
1873 HBufferImageRefresh ();
1877 HBufferImageRefresh ();
1881 // EditorFirst is now set to FALSE
1883 HEditorFirst
= FALSE
;
1889 Handle the mouse input.
1891 @param[in] MouseState The current mouse state.
1892 @param[out] BeforeLeftButtonDown helps with selections.
1894 @retval EFI_SUCCESS The operation was successful.
1895 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1896 @retval EFI_LOAD_ERROR A load error occured.
1897 @retval EFI_NOT_FOUND The disk was not found.
1900 HMainEditorHandleMouseInput (
1901 IN EFI_SIMPLE_POINTER_STATE MouseState
,
1902 OUT BOOLEAN
*BeforeLeftButtonDown
1912 HEFI_EDITOR_LINE
*Line
;
1919 // have mouse movement
1921 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
1925 TextX
= HGetTextX (MouseState
.RelativeMovementX
);
1926 TextY
= HGetTextY (MouseState
.RelativeMovementY
);
1928 HBufferImageAdjustMousePosition (TextX
, TextY
);
1934 if (MouseState
.LeftButton
) {
1935 HighBits
= HBufferImageIsAtHighBits (
1936 HMainEditor
.BufferImage
->MousePosition
.Column
,
1941 // not at an movable place
1945 // now just move mouse pointer to legal position
1948 // move mouse position to legal position
1950 HMainEditor
.BufferImage
->MousePosition
.Column
-= 10;
1951 if (HMainEditor
.BufferImage
->MousePosition
.Column
> 24) {
1952 HMainEditor
.BufferImage
->MousePosition
.Column
--;
1953 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1955 if (HMainEditor
.BufferImage
->MousePosition
.Column
< 24) {
1956 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1969 FRow
= HMainEditor
.BufferImage
->BufferPosition
.Row
+
1970 HMainEditor
.BufferImage
->MousePosition
.Row
-
1971 HMainEditor
.BufferImage
->DisplayPosition
.Row
;
1973 if (HMainEditor
.BufferImage
->NumLines
< FRow
) {
1978 // now just move mouse pointer to legal position
1980 FRow
= HMainEditor
.BufferImage
->NumLines
;
1984 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
1985 for (Index
= 0; Index
< FRow
- 1; Index
++) {
1986 Link
= Link
->ForwardLink
;
1989 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
1995 // now just move mouse pointer to legal position
1997 if (FCol
> Line
->Size
) {
1998 if (*BeforeLeftButtonDown
) {
2001 if (Line
->Size
== 0) {
2014 FCol
= Line
->Size
+ 1;
2019 HBufferImageMovePosition (FRow
, FCol
, HighBits
);
2021 HMainEditor
.BufferImage
->MousePosition
.Row
= HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2023 HMainEditor
.BufferImage
->MousePosition
.Column
= HMainEditor
.BufferImage
->DisplayPosition
.Column
;
2025 *BeforeLeftButtonDown
= TRUE
;
2030 // else of if LButton
2034 if (*BeforeLeftButtonDown
) {
2040 *BeforeLeftButtonDown
= FALSE
;
2047 return EFI_NOT_FOUND
;
2051 Handle user key input. will route it to other components handle function.
2053 @retval EFI_SUCCESS The operation was successful.
2054 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
2055 @retval EFI_LOAD_ERROR A load error occured.
2058 HMainEditorKeyInput (
2064 EFI_SIMPLE_POINTER_STATE MouseState
;
2065 BOOLEAN LengthChange
;
2068 BOOLEAN BeforeMouseIsDown
;
2069 BOOLEAN MouseIsDown
;
2074 UINTN SelectStartBackup
;
2075 UINTN SelectEndBackup
;
2078 // variable initialization
2083 LengthChange
= FALSE
;
2085 MouseIsDown
= FALSE
;
2091 Status
= EFI_SUCCESS
;
2093 HEditorMouseAction
= FALSE
;
2096 // backup some key elements, so that can aVOID some refresh work
2098 HMainEditorBackup ();
2101 // wait for user key input
2104 // change priority of checking mouse/keyboard activity dynamically
2105 // so prevent starvation of keyboard.
2106 // if last time, mouse moves then this time check keyboard
2108 if (HMainEditor
.MouseSupported
) {
2109 Status
= HMainEditor
.MouseInterface
->GetState (
2110 HMainEditor
.MouseInterface
,
2113 if (!EFI_ERROR (Status
)) {
2115 BeforeMouseIsDown
= MouseIsDown
;
2117 Status
= HMainEditorHandleMouseInput (MouseState
, &MouseIsDown
);
2119 if (!EFI_ERROR (Status
)) {
2120 if (!BeforeMouseIsDown
) {
2125 FRow
= HBufferImage
.BufferPosition
.Row
;
2126 FCol
= HBufferImage
.BufferPosition
.Column
;
2127 SelectStartBackup
= HMainEditor
.SelectStart
;
2128 SelectEndBackup
= HMainEditor
.SelectEnd
;
2134 SelectStartBackup
= HMainEditor
.SelectStart
;
2135 SelectEndBackup
= HMainEditor
.SelectEnd
;
2142 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
2143 HMainEditor
.SelectStart
= 0;
2144 HMainEditor
.SelectEnd
= 0;
2145 HMainEditor
.SelectStart
= (FRow
- 1) * 0x10 + FCol
;
2152 (HBufferImage
.BufferPosition
.Row
- 1) *
2154 HBufferImage
.BufferPosition
.Column
2155 ) >= HMainEditor
.SelectStart
2157 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2159 HBufferImage
.BufferPosition
.Column
;
2161 HMainEditor
.SelectEnd
= 0;
2165 // end of if RelativeX/Y
2172 if (HBufferImageGetTotalSize () == 0) {
2173 HMainEditor
.SelectStart
= 0;
2174 HMainEditor
.SelectEnd
= 0;
2180 (HBufferImage
.BufferPosition
.Row
- 1) *
2182 HBufferImage
.BufferPosition
.Column
2183 ) >= HMainEditor
.SelectStart
2185 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2187 HBufferImage
.BufferPosition
.Column
;
2189 HMainEditor
.SelectEnd
= 0;
2192 if (HMainEditor
.SelectEnd
== 0) {
2193 HMainEditor
.SelectStart
= 0;
2201 if (SelectStartBackup
!= HMainEditor
.SelectStart
|| SelectEndBackup
!= HMainEditor
.SelectEnd
) {
2202 if ((SelectStartBackup
- 1) / 0x10 != (HMainEditor
.SelectStart
- 1) / 0x10) {
2203 HBufferImageNeedRefresh
= TRUE
;
2205 if ((SelectEndBackup
- 1) / 0x10 != (HMainEditor
.SelectEnd
- 1) / 0x10) {
2206 HBufferImageNeedRefresh
= TRUE
;
2208 HBufferImageOnlyLineNeedRefresh
= TRUE
;
2214 HEditorMouseAction
= TRUE
;
2215 HBufferImageMouseNeedRefresh
= TRUE
;
2217 } else if (Status
== EFI_LOAD_ERROR
) {
2218 StatusBarSetStatusString (L
"Invalid Mouse Movement ");
2223 Status
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
2224 if (!EFI_ERROR (Status
)) {
2226 // dispatch to different components' key handling function
2227 // so not everywhere has to set this variable
2229 HBufferImageMouseNeedRefresh
= TRUE
;
2232 // clear previous status string
2234 StatusBarSetRefresh();
2235 if (EFI_SUCCESS
== MenuBarDispatchControlHotKey(&Key
)) {
2236 Status
= EFI_SUCCESS
;
2237 } else if (Key
.ScanCode
== SCAN_NULL
) {
2238 Status
= HBufferImageHandleInput (&Key
);
2239 } else if (((Key
.ScanCode
>= SCAN_UP
) && (Key
.ScanCode
<= SCAN_PAGE_DOWN
))) {
2240 Status
= HBufferImageHandleInput (&Key
);
2241 } else if (((Key
.ScanCode
>= SCAN_F1
) && Key
.ScanCode
<= (SCAN_F12
))) {
2242 Status
= MenuBarDispatchFunctionKey (&Key
);
2244 StatusBarSetStatusString (L
"Unknown Command");
2246 HBufferImageMouseNeedRefresh
= FALSE
;
2249 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_OUT_OF_RESOURCES
) {
2251 // not already has some error status
2253 if (StrCmp (L
"", StatusBarGetString()) == 0) {
2254 StatusBarSetStatusString (L
"Disk Error. Try Again");
2259 // decide if has to set length warning
2261 if (HBufferImage
.BufferType
!= HBufferImageBackupVar
.BufferType
) {
2262 LengthChange
= FALSE
;
2265 // still the old buffer
2267 if (HBufferImage
.BufferType
!= FileTypeFileBuffer
) {
2268 Size
= HBufferImageGetTotalSize ();
2270 switch (HBufferImage
.BufferType
) {
2271 case FileTypeDiskBuffer
:
2272 OldSize
= HBufferImage
.DiskImage
->Size
* HBufferImage
.DiskImage
->BlockSize
;
2275 case FileTypeMemBuffer
:
2276 OldSize
= HBufferImage
.MemImage
->Size
;
2284 if (!LengthChange
) {
2285 if (OldSize
!= Size
) {
2286 StatusBarSetStatusString (L
"Disk/Mem Buffer Length should not be changed");
2290 if (OldSize
!= Size
) {
2291 LengthChange
= TRUE
;
2293 LengthChange
= FALSE
;
2298 // after handling, refresh editor
2300 HMainEditorRefresh ();
2302 } while (Status
!= EFI_OUT_OF_RESOURCES
&& !HEditorExit
);
2308 Backup function for MainEditor.
2316 HMainEditorBackupVar
.SelectStart
= HMainEditor
.SelectStart
;
2317 HMainEditorBackupVar
.SelectEnd
= HMainEditor
.SelectEnd
;
2318 HBufferImageBackup ();