2 Defines the Main Editor data type -
4 - Instances of the other objects of the editor
7 Copyright (c) 2005 - 2011, 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 (
115 for (CurrentLine
= 0; 0 != HexMainMenuHelpInfo
[CurrentLine
]; CurrentLine
++) {
116 InfoString
= HiiGetString(gShellDebug1HiiHandle
, HexMainMenuHelpInfo
[CurrentLine
]
118 ShellPrintEx (0,CurrentLine
+1,L
"%E%s%N",InfoString
);
123 gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
124 } while(SCAN_CONTROL_W
!= Key
.UnicodeChar
);
126 // update screen with buffer's info
127 HBufferImageNeedRefresh
= TRUE
;
128 HBufferImageOnlyLineNeedRefresh
= FALSE
;
129 HBufferImageRefresh ();
135 Move cursor to specified lines.
137 @retval EFI_SUCCESS The operation was successful.
140 HMainCommandGoToOffset (
151 // variable initialization
161 Status
= InputBarSetPrompt (L
"Go To Offset: ");
162 if (EFI_ERROR (Status
)) {
166 Status
= InputBarSetStringSize (8);
167 if (EFI_ERROR (Status
)) {
172 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
177 if (Status
== EFI_NOT_READY
) {
182 // THE input string length should > 0
184 if (StrLen (InputBarGetString()) > 0) {
185 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
186 if (EFI_ERROR (Status
)) {
187 StatusBarSetStatusString (L
"Invalid Offset");
195 Size
= HBufferImageGetTotalSize ();
196 if (Offset
>= Size
) {
197 StatusBarSetStatusString (L
"Invalid Offset");
201 FRow
= (UINTN
)DivU64x32(Offset
, 0x10) + 1;
202 FCol
= (UINTN
)ModU64x32(Offset
, 0x10) + 1;
204 HBufferImageMovePosition (FRow
, FCol
, TRUE
);
206 HBufferImageNeedRefresh
= TRUE
;
207 HBufferImageOnlyLineNeedRefresh
= FALSE
;
208 HBufferImageMouseNeedRefresh
= TRUE
;
214 Save current opened buffer.
215 If is file buffer, you can save to current file name or
216 save to another file name.
218 @retval EFI_SUCCESS The operation was successful.
219 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
220 @retval EFI_LOAD_ERROR A load error occured.
223 HMainCommandSaveBuffer (
233 SHELL_FILE_HANDLE ShellFileHandle
;
235 if (HMainEditor
.BufferImage
->BufferType
!= FileTypeFileBuffer
) {
236 if (!HMainEditor
.BufferImage
->Modified
) {
240 Status
= InputBarSetPrompt (L
"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");
241 if (EFI_ERROR (Status
)) {
245 // the answer is just one character
247 Status
= InputBarSetStringSize (1);
248 if (EFI_ERROR (Status
)) {
252 // loop for user's answer
253 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
256 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
261 if (Status
== EFI_NOT_READY
) {
265 switch (InputBarGetString()[0]) {
269 // want to save this buffer first
271 Status
= HBufferImageSave (
273 HMainEditor
.BufferImage
->DiskImage
->Name
,
274 HMainEditor
.BufferImage
->DiskImage
->Offset
,
275 HMainEditor
.BufferImage
->DiskImage
->Size
,
276 HMainEditor
.BufferImage
->MemImage
->Offset
,
277 HMainEditor
.BufferImage
->MemImage
->Size
,
278 HMainEditor
.BufferImage
->BufferType
281 if (EFI_ERROR (Status
)) {
282 StatusBarSetStatusString (L
"BufferSave: Problems Writing");
291 // the file won't be saved
309 // ENDOF != FILEBUFFER
311 // This command will save currently opened file to disk.
312 // You can choose save to another file name or just save to
313 // current file name.
314 // Below is the scenario of Save File command: (
315 // Suppose the old file name is A )
316 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"
317 // IF user press ESC, Save File command ends .
318 // IF user press Enter, input file name will be A.
319 // IF user inputs a new file name B, input file name will be B.
321 // 2. IF input file name is A, go to do Step 3.
322 // IF input file name is B, go to do Step 4.
324 // 3. IF A is read only, Status Bar will show "Access Denied"
325 // and Save File commands ends.
326 // IF A is not read only, save file buffer to disk
327 // and remove Modified flag in Title Bar , then Save File command ends.
329 // 4. IF B does not exist, create this file and save file buffer to it.
331 // IF B exits, do Step 5.
333 // 5. An Input Bar will be prompted:
334 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"
335 // IF user press 'y' or 'Y', do Step 6.
336 // IF user press 'n' or 'N', Save File commands ends.
337 // IF user press 'c' or 'C' or ESC, Save File commands ends.
339 // 6. IF B is a read-only file, Status Bar will show "Access Denied"
340 // and Save File commands ends.
341 // IF B can be read and write, save file buffer to B.
343 // 7. Update File Name field in Title Bar to B
344 // and remove the Modified flag in Title Bar.
346 Str
= CatSPrint(NULL
,
347 L
"File to Save: [%s]",
348 HMainEditor
.BufferImage
->FileImage
->FileName
351 return EFI_OUT_OF_RESOURCES
;
354 if (StrLen (Str
) >= 50) {
356 // replace the long file name with "..."
365 Status
= InputBarSetPrompt (Str
);
366 if (EFI_ERROR (Status
)) {
370 Status
= InputBarSetStringSize (100);
371 if (EFI_ERROR (Status
)) {
377 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
380 // if user pressed ESC
382 if (Status
== EFI_NOT_READY
) {
383 SHELL_FREE_NON_NULL (Str
);
387 SHELL_FREE_NON_NULL (Str
);
390 // if just enter pressed, so think save to current file name
392 if (StrLen (InputBarGetString()) == 0) {
393 FileName
= CatSPrint(NULL
,
395 HMainEditor
.BufferImage
->FileImage
->FileName
398 FileName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
401 if (FileName
== NULL
) {
402 return EFI_OUT_OF_RESOURCES
;
405 if (!IsValidFileName (FileName
)) {
406 StatusBarSetStatusString (L
"Invalid File Name");
407 SHELL_FREE_NON_NULL (FileName
);
414 // save to the old file
416 if (StringNoCaseCompare (
418 &HMainEditor
.BufferImage
->FileImage
->FileName
425 // if the file is read only, so can not write back to it.
427 if (HMainEditor
.BufferImage
->FileImage
->ReadOnly
) {
428 StatusBarSetStatusString (L
"Access Denied");
429 SHELL_FREE_NON_NULL (FileName
);
433 Status
= ShellOpenFileByName (FileName
, &ShellFileHandle
, EFI_FILE_MODE_READ
, 0);
435 if (!EFI_ERROR (Status
)) {
437 Info
= ShellGetFileInfo(ShellFileHandle
);
439 ShellCloseFile(&ShellFileHandle
);
441 // check if read only
443 if (Info
->Attribute
& EFI_FILE_READ_ONLY
) {
444 StatusBarSetStatusString (L
"Access Denied");
445 SHELL_FREE_NON_NULL (FileName
);
449 SHELL_FREE_NON_NULL(Info
);
451 // ask user whether to overwrite this file
453 Status
= InputBarSetPrompt (L
"File exists. Overwrite (Yes/No/Cancel) ? ");
454 if (EFI_ERROR (Status
)) {
455 SHELL_FREE_NON_NULL (FileName
);
459 Status
= InputBarSetStringSize (1);
460 if (EFI_ERROR (Status
)) {
461 SHELL_FREE_NON_NULL (FileName
);
467 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
469 if (Status
== EFI_NOT_READY
) {
470 SHELL_FREE_NON_NULL (FileName
);
474 switch (InputBarGetString()[0]) {
481 SHELL_FREE_NON_NULL (FileName
);
485 SHELL_FREE_NON_NULL (FileName
);
489 } // if opened existing file
493 // save file back to disk
495 Status
= HBufferImageSave (
497 HMainEditor
.BufferImage
->DiskImage
->Name
,
498 HMainEditor
.BufferImage
->DiskImage
->Offset
,
499 HMainEditor
.BufferImage
->DiskImage
->Size
,
500 HMainEditor
.BufferImage
->MemImage
->Offset
,
501 HMainEditor
.BufferImage
->MemImage
->Size
,
504 SHELL_FREE_NON_NULL (FileName
);
506 if (EFI_ERROR (Status
)) {
507 return EFI_LOAD_ERROR
;
514 Load a disk buffer editor.
516 @retval EFI_SUCCESS The operation was successful.
517 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
518 @retval EFI_LOAD_ERROR A load error occured.
521 HMainCommandSelectStart (
527 Start
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
532 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
533 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
534 StatusBarSetStatusString (L
"Invalid Block Start");
535 return EFI_LOAD_ERROR
;
539 if (HMainEditor
.SelectEnd
!= 0 && Start
> HMainEditor
.SelectEnd
) {
540 StatusBarSetStatusString (L
"Invalid Block Start");
541 return EFI_LOAD_ERROR
;
544 HMainEditor
.SelectStart
= Start
;
546 HBufferImageNeedRefresh
= TRUE
;
552 Load a disk buffer editor.
554 @retval EFI_SUCCESS The operation was successful.
555 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
556 @retval EFI_LOAD_ERROR A load error occured.
559 HMainCommandSelectEnd (
565 End
= (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) * 0x10 + HMainEditor
.BufferImage
->BufferPosition
.Column
;
570 if (HMainEditor
.BufferImage
->CurrentLine
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
) {
571 if (HMainEditor
.BufferImage
->BufferPosition
.Column
> HMainEditor
.BufferImage
->CurrentLine
->Size
) {
572 StatusBarSetStatusString (L
"Invalid Block End");
573 return EFI_LOAD_ERROR
;
577 if (HMainEditor
.SelectStart
!= 0 && End
< HMainEditor
.SelectStart
) {
578 StatusBarSetStatusString (L
"Invalid Block End");
582 HMainEditor
.SelectEnd
= End
;
584 HBufferImageNeedRefresh
= TRUE
;
590 Cut current line to clipboard.
592 @retval EFI_SUCCESS The operation was successful.
593 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
594 @retval EFI_LOAD_ERROR A load error occured.
602 HEFI_EDITOR_LINE
*Line
;
608 // not select, so not allowed to cut
610 if (HMainEditor
.SelectStart
== 0) {
611 StatusBarSetStatusString (L
"No Block is Selected");
615 // not select, so not allowed to cut
617 if (HMainEditor
.SelectEnd
== 0) {
618 StatusBarSetStatusString (L
"No Block is Selected");
622 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
623 for (Index
= 0; Index
< (HMainEditor
.SelectEnd
- 1) / 0x10; Index
++) {
624 Link
= Link
->ForwardLink
;
627 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
629 Count
= HMainEditor
.SelectEnd
- HMainEditor
.SelectStart
+ 1;
630 Buffer
= AllocateZeroPool (Count
);
631 if (Buffer
== NULL
) {
632 return EFI_OUT_OF_RESOURCES
;
635 // cut the selected area
637 HBufferImageDeleteCharacterFromBuffer (
638 HMainEditor
.SelectStart
- 1,
646 HClipBoardSet (Buffer
, Count
);
648 HBufferImageNeedRefresh
= TRUE
;
649 HBufferImageOnlyLineNeedRefresh
= FALSE
;
651 if (!HMainEditor
.BufferImage
->Modified
) {
652 HMainEditor
.BufferImage
->Modified
= TRUE
;
656 // now no select area
658 HMainEditor
.SelectStart
= 0;
659 HMainEditor
.SelectEnd
= 0;
665 Paste line to file buffer.
667 @retval EFI_SUCCESS The operation was successful.
668 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
669 @retval EFI_LOAD_ERROR A load error occured.
677 BOOLEAN OnlyLineRefresh
;
678 HEFI_EDITOR_LINE
*Line
;
683 Count
= HClipBoardGet (&Buffer
);
684 if (Count
== 0 || Buffer
== NULL
) {
685 StatusBarSetStatusString (L
"Nothing to Paste");
689 Line
= HMainEditor
.BufferImage
->CurrentLine
;
691 OnlyLineRefresh
= FALSE
;
692 if (Line
->Link
.ForwardLink
== HMainEditor
.BufferImage
->ListHead
&& Line
->Size
+ Count
< 0x10) {
694 // is at last line, and after paste will not exceed
695 // so only this line need to be refreshed
697 // if after add, the line is 0x10, then will append a new line
698 // so the whole page will need be refreshed
700 OnlyLineRefresh
= TRUE
;
704 FPos
= 0x10 * (HMainEditor
.BufferImage
->BufferPosition
.Row
- 1) + HMainEditor
.BufferImage
->BufferPosition
.Column
- 1;
706 HBufferImageAddCharacterToBuffer (FPos
, Count
, Buffer
);
708 if (OnlyLineRefresh
) {
709 HBufferImageNeedRefresh
= FALSE
;
710 HBufferImageOnlyLineNeedRefresh
= TRUE
;
712 HBufferImageNeedRefresh
= TRUE
;
713 HBufferImageOnlyLineNeedRefresh
= FALSE
;
716 if (!HMainEditor
.BufferImage
->Modified
) {
717 HMainEditor
.BufferImage
->Modified
= TRUE
;
727 @retval EFI_SUCCESS The operation was successful.
728 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
729 @retval EFI_LOAD_ERROR A load error occured.
739 // Below is the scenario of Exit command:
740 // 1. IF currently opened file is not modified, exit the editor and
741 // Exit command ends.
742 // IF currently opened file is modified, do Step 2
744 // 2. An Input Bar will be prompted:
745 // "File modified. Save ( Yes/No/Cancel )?"
746 // IF user press 'y' or 'Y', currently opened file will be saved and
748 // IF user press 'n' or 'N', currently opened file will not be saved
750 // IF user press 'c' or 'C' or ESC, Exit command ends.
753 // if file has been modified, so will prompt user
754 // whether to save the changes
756 if (HMainEditor
.BufferImage
->Modified
) {
758 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
759 if (EFI_ERROR (Status
)) {
763 Status
= InputBarSetStringSize (1);
764 if (EFI_ERROR (Status
)) {
769 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
774 if (Status
== EFI_NOT_READY
) {
778 switch (InputBarGetString()[0]) {
782 // write file back to disk
784 Status
= HBufferImageSave (
785 HMainEditor
.BufferImage
->FileImage
->FileName
,
786 HMainEditor
.BufferImage
->DiskImage
->Name
,
787 HMainEditor
.BufferImage
->DiskImage
->Offset
,
788 HMainEditor
.BufferImage
->DiskImage
->Size
,
789 HMainEditor
.BufferImage
->MemImage
->Offset
,
790 HMainEditor
.BufferImage
->MemImage
->Size
,
791 HMainEditor
.BufferImage
->BufferType
793 if (!EFI_ERROR (Status
)) {
818 Load a file from disk to editor.
820 @retval EFI_SUCCESS The operation was successful.
821 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
822 @retval EFI_LOAD_ERROR A load error occured.
825 HMainCommandOpenFile (
831 EDIT_FILE_TYPE BufferType
;
833 BufferType
= HMainEditor
.BufferImage
->BufferType
;
836 // This command will open a file from current working directory.
837 // Read-only file can also be opened. But it can not be modified.
838 // Below is the scenario of Open File command:
839 // 1. IF currently opened file has not been modified, directly go to step .
840 // IF currently opened file has been modified, an Input Bar will be
842 // "File Modified. Save ( Yes/No/Cancel) ?"
843 // IF user press 'y' or 'Y', currently opened file will be saved.
844 // IF user press 'n' or 'N', currently opened file will
846 // IF user press 'c' or 'C' or ESC, Open File command ends and
847 // currently opened file is still opened.
849 // 2. An Input Bar will be prompted as : "File Name to Open: "
850 // IF user press ESC, Open File command ends and
851 // currently opened file is still opened.
852 // Any other inputs with a Return will cause
853 // currently opened file close.
855 // 3. IF user input file name is an existing file ,
856 // this file will be read and opened.
857 // IF user input file name is a new file, this file will be created
858 // and opened. This file's type ( UNICODE or ASCII ) is the same with
862 // if current file is modified, so you need to choose whether to
865 if (HMainEditor
.BufferImage
->Modified
) {
867 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
868 if (EFI_ERROR (Status
)) {
872 // the answer is just one character
874 Status
= InputBarSetStringSize (1);
875 if (EFI_ERROR (Status
)) {
879 // loop for user's answer
880 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
884 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
889 if (Status
== EFI_NOT_READY
) {
893 switch (InputBarGetString()[0]) {
897 // want to save this buffer first
899 Status
= HBufferImageSave (
900 HMainEditor
.BufferImage
->FileImage
->FileName
,
901 HMainEditor
.BufferImage
->DiskImage
->Name
,
902 HMainEditor
.BufferImage
->DiskImage
->Offset
,
903 HMainEditor
.BufferImage
->DiskImage
->Size
,
904 HMainEditor
.BufferImage
->MemImage
->Offset
,
905 HMainEditor
.BufferImage
->MemImage
->Size
,
906 HMainEditor
.BufferImage
->BufferType
908 if (EFI_ERROR (Status
)) {
912 MainTitleBarRefresh (
913 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
914 HMainEditor
.BufferImage
->BufferType
,
915 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
917 HMainEditor
.ScreenSize
.Column
,
918 HMainEditor
.ScreenSize
.Row
,
919 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
920 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
928 // the file won't be saved
940 // TO get the open file name
942 Status
= InputBarSetPrompt (L
"File Name to Open: ");
943 if (EFI_ERROR (Status
)) {
945 HMainEditor
.BufferImage
->FileImage
->FileName
,
946 HMainEditor
.BufferImage
->DiskImage
->Name
,
947 HMainEditor
.BufferImage
->DiskImage
->Offset
,
948 HMainEditor
.BufferImage
->DiskImage
->Size
,
949 HMainEditor
.BufferImage
->MemImage
->Offset
,
950 HMainEditor
.BufferImage
->MemImage
->Size
,
957 Status
= InputBarSetStringSize (100);
958 if (EFI_ERROR (Status
)) {
959 Status
= HBufferImageRead (
960 HMainEditor
.BufferImage
->FileImage
->FileName
,
961 HMainEditor
.BufferImage
->DiskImage
->Name
,
962 HMainEditor
.BufferImage
->DiskImage
->Offset
,
963 HMainEditor
.BufferImage
->DiskImage
->Size
,
964 HMainEditor
.BufferImage
->MemImage
->Offset
,
965 HMainEditor
.BufferImage
->MemImage
->Size
,
973 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
978 if (Status
== EFI_NOT_READY
) {
979 Status
= HBufferImageRead (
980 HMainEditor
.BufferImage
->FileImage
->FileName
,
981 HMainEditor
.BufferImage
->DiskImage
->Name
,
982 HMainEditor
.BufferImage
->DiskImage
->Offset
,
983 HMainEditor
.BufferImage
->DiskImage
->Size
,
984 HMainEditor
.BufferImage
->MemImage
->Offset
,
985 HMainEditor
.BufferImage
->MemImage
->Size
,
993 // THE input string length should > 0
995 if (StrLen (InputBarGetString()) > 0) {
997 // CHECK if filename's valid
999 if (!IsValidFileName (InputBarGetString())) {
1001 HMainEditor
.BufferImage
->FileImage
->FileName
,
1002 HMainEditor
.BufferImage
->DiskImage
->Name
,
1003 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1004 HMainEditor
.BufferImage
->DiskImage
->Size
,
1005 HMainEditor
.BufferImage
->MemImage
->Offset
,
1006 HMainEditor
.BufferImage
->MemImage
->Size
,
1011 StatusBarSetStatusString (L
"Invalid File Name");
1021 Status
= HBufferImageRead (
1022 InputBarGetString(),
1023 HMainEditor
.BufferImage
->DiskImage
->Name
,
1024 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1025 HMainEditor
.BufferImage
->DiskImage
->Size
,
1026 HMainEditor
.BufferImage
->MemImage
->Offset
,
1027 HMainEditor
.BufferImage
->MemImage
->Size
,
1032 if (EFI_ERROR (Status
)) {
1034 HMainEditor
.BufferImage
->FileImage
->FileName
,
1035 HMainEditor
.BufferImage
->DiskImage
->Name
,
1036 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1037 HMainEditor
.BufferImage
->DiskImage
->Size
,
1038 HMainEditor
.BufferImage
->MemImage
->Offset
,
1039 HMainEditor
.BufferImage
->MemImage
->Size
,
1044 return EFI_LOAD_ERROR
;
1051 Load a disk buffer editor.
1053 @retval EFI_SUCCESS The operation was successful.
1054 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1055 @retval EFI_LOAD_ERROR A load error occured.
1056 @retval EFI_NOT_FOUND The disk was not found.
1059 HMainCommandOpenDisk (
1069 EDIT_FILE_TYPE BufferType
;
1072 // variable initialization
1076 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1079 // if current file is modified, so you need to choose
1080 // whether to save it first.
1082 if (HMainEditor
.BufferImage
->Modified
) {
1084 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1085 if (EFI_ERROR (Status
)) {
1089 // the answer is just one character
1091 Status
= InputBarSetStringSize (1);
1092 if (EFI_ERROR (Status
)) {
1096 // loop for user's answer
1097 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1101 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1106 if (Status
== EFI_NOT_READY
) {
1110 switch (InputBarGetString()[0]) {
1114 // want to save this buffer first
1116 Status
= HBufferImageSave (
1117 HMainEditor
.BufferImage
->FileImage
->FileName
,
1118 HMainEditor
.BufferImage
->DiskImage
->Name
,
1119 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1120 HMainEditor
.BufferImage
->DiskImage
->Size
,
1121 HMainEditor
.BufferImage
->MemImage
->Offset
,
1122 HMainEditor
.BufferImage
->MemImage
->Size
,
1125 if (EFI_ERROR (Status
)) {
1129 MainTitleBarRefresh (
1130 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1131 HMainEditor
.BufferImage
->BufferType
,
1132 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1134 HMainEditor
.ScreenSize
.Column
,
1135 HMainEditor
.ScreenSize
.Row
,
1136 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1137 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1145 // the file won't be saved
1157 // get disk block device name
1159 Status
= InputBarSetPrompt (L
"Block Device to Open: ");
1160 if (EFI_ERROR (Status
)) {
1164 Status
= InputBarSetStringSize (100);
1165 if (EFI_ERROR (Status
)) {
1170 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1175 if (Status
== EFI_NOT_READY
) {
1180 // THE input string length should > 0
1182 if (StrLen (InputBarGetString()) > 0) {
1187 DeviceName
= CatSPrint(NULL
, L
"%s", InputBarGetString());
1188 if (DeviceName
== NULL
) {
1189 return EFI_OUT_OF_RESOURCES
;
1192 // get starting offset
1194 Status
= InputBarSetPrompt (L
"First Block No.: ");
1195 if (EFI_ERROR (Status
)) {
1199 Status
= InputBarSetStringSize (16);
1200 if (EFI_ERROR (Status
)) {
1205 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1210 if (Status
== EFI_NOT_READY
) {
1215 // THE input string length should > 0
1217 if (StrLen (InputBarGetString()) > 0) {
1218 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1219 if (EFI_ERROR (Status
)) {
1227 // get Number of Blocks:
1229 Status
= InputBarSetPrompt (L
"Number of Blocks: ");
1230 if (EFI_ERROR (Status
)) {
1234 Status
= InputBarSetStringSize (8);
1235 if (EFI_ERROR (Status
)) {
1240 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1245 if (Status
== EFI_NOT_READY
) {
1250 // THE input string length should > 0
1252 if (StrLen (InputBarGetString()) > 0) {
1253 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1254 if (EFI_ERROR (Status
)) {
1266 Status
= HBufferImageRead (
1277 if (EFI_ERROR (Status
)) {
1280 HMainEditor
.BufferImage
->FileImage
->FileName
,
1281 HMainEditor
.BufferImage
->DiskImage
->Name
,
1282 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1283 HMainEditor
.BufferImage
->DiskImage
->Size
,
1284 HMainEditor
.BufferImage
->MemImage
->Offset
,
1285 HMainEditor
.BufferImage
->MemImage
->Size
,
1289 return EFI_NOT_FOUND
;
1296 Load memory content to editor
1298 @retval EFI_SUCCESS The operation was successful.
1299 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1300 @retval EFI_LOAD_ERROR A load error occured.
1301 @retval EFI_NOT_FOUND The disk was not found.
1304 HMainCommandOpenMemory (
1312 EDIT_FILE_TYPE BufferType
;
1315 // variable initialization
1319 BufferType
= HMainEditor
.BufferImage
->BufferType
;
1322 // if current buffer is modified, so you need to choose
1323 // whether to save it first.
1325 if (HMainEditor
.BufferImage
->Modified
) {
1327 Status
= InputBarSetPrompt (L
"Buffer modified. Save (Yes/No/Cancel) ? ");
1328 if (EFI_ERROR (Status
)) {
1332 // the answer is just one character
1334 Status
= InputBarSetStringSize (1);
1335 if (EFI_ERROR (Status
)) {
1339 // loop for user's answer
1340 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'
1344 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1349 if (Status
== EFI_NOT_READY
) {
1353 switch (InputBarGetString()[0]) {
1357 // want to save this buffer first
1359 Status
= HBufferImageSave (
1360 HMainEditor
.BufferImage
->FileImage
->FileName
,
1361 HMainEditor
.BufferImage
->DiskImage
->Name
,
1362 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1363 HMainEditor
.BufferImage
->DiskImage
->Size
,
1364 HMainEditor
.BufferImage
->MemImage
->Offset
,
1365 HMainEditor
.BufferImage
->MemImage
->Size
,
1368 if (EFI_ERROR (Status
)) {
1372 MainTitleBarRefresh (
1373 HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
?HMainEditor
.BufferImage
->FileImage
->FileName
:HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Name
:NULL
,
1374 HMainEditor
.BufferImage
->BufferType
,
1375 HMainEditor
.BufferImage
->FileImage
->ReadOnly
,
1377 HMainEditor
.ScreenSize
.Column
,
1378 HMainEditor
.ScreenSize
.Row
,
1379 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Offset
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Offset
:0,
1380 HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
?HMainEditor
.BufferImage
->DiskImage
->Size
:HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
?HMainEditor
.BufferImage
->MemImage
->Size
:0
1388 // the file won't be saved
1400 // get starting offset
1402 Status
= InputBarSetPrompt (L
"Starting Offset: ");
1403 if (EFI_ERROR (Status
)) {
1407 Status
= InputBarSetStringSize (8);
1408 if (EFI_ERROR (Status
)) {
1413 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1418 if (Status
== EFI_NOT_READY
) {
1423 // THE input string length should > 0
1425 if (StrLen (InputBarGetString()) > 0) {
1426 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Offset
, TRUE
, FALSE
);
1427 if (EFI_ERROR (Status
)) {
1435 // get Number of Blocks:
1437 Status
= InputBarSetPrompt (L
"Buffer Size: ");
1438 if (EFI_ERROR (Status
)) {
1442 Status
= InputBarSetStringSize (8);
1443 if (EFI_ERROR (Status
)) {
1448 Status
= InputBarRefresh (HMainEditor
.ScreenSize
.Row
, HMainEditor
.ScreenSize
.Column
);
1453 if (Status
== EFI_NOT_READY
) {
1458 // THE input string length should > 0
1460 if (StrLen (InputBarGetString()) > 0) {
1461 Status
= ShellConvertStringToUint64 (InputBarGetString(), &Size
, TRUE
, FALSE
);
1462 if (EFI_ERROR (Status
)) {
1474 if ((Offset
+ Size
- 1)> 0xffffffff) {
1475 StatusBarSetStatusString (L
"Invalid parameter");
1476 return EFI_LOAD_ERROR
;
1479 Status
= HBufferImageRead (
1490 if (EFI_ERROR (Status
)) {
1491 StatusBarSetStatusString (L
"Read Device Error!");
1493 HMainEditor
.BufferImage
->FileImage
->FileName
,
1494 HMainEditor
.BufferImage
->DiskImage
->Name
,
1495 HMainEditor
.BufferImage
->DiskImage
->Offset
,
1496 HMainEditor
.BufferImage
->DiskImage
->Size
,
1497 HMainEditor
.BufferImage
->MemImage
->Offset
,
1498 HMainEditor
.BufferImage
->MemImage
->Size
,
1502 return EFI_NOT_FOUND
;
1508 MENU_ITEM_FUNCTION HexMainControlBasedMenuFunctions
[] = {
1510 NULL
, /* Ctrl - A */
1511 NULL
, /* Ctrl - B */
1512 NULL
, /* Ctrl - C */
1513 HMainCommandSelectEnd
, /* Ctrl - D */
1514 HMainCommandDisplayHelp
, /* Ctrl - E */
1515 NULL
, /* Ctrl - F */
1516 HMainCommandGoToOffset
, /* Ctrl - G */
1517 NULL
, /* Ctrl - H */
1518 HMainCommandOpenDisk
, /* Ctrl - I */
1519 NULL
, /* Ctrl - J */
1520 NULL
, /* Ctrl - K */
1521 NULL
, /* Ctrl - L */
1522 HMainCommandOpenMemory
, /* Ctrl - M */
1523 NULL
, /* Ctrl - N */
1524 HMainCommandOpenFile
, /* Ctrl - O */
1525 NULL
, /* Ctrl - P */
1526 HMainCommandExit
, /* Ctrl - Q */
1527 NULL
, /* Ctrl - R */
1528 HMainCommandSaveBuffer
, /* Ctrl - S */
1529 HMainCommandSelectStart
, /* Ctrl - T */
1530 NULL
, /* Ctrl - U */
1531 HMainCommandPaste
, /* Ctrl - V */
1532 NULL
, /* Ctrl - W */
1533 HMainCommandCut
, /* Ctrl - X */
1534 NULL
, /* Ctrl - Y */
1535 NULL
, /* Ctrl - Z */
1538 CONST EDITOR_MENU_ITEM HexEditorMenuItems
[] = {
1540 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET
),
1541 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1
),
1542 HMainCommandGoToOffset
1545 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER
),
1546 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2
),
1547 HMainCommandSaveBuffer
1550 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT
),
1551 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3
),
1556 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START
),
1557 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4
),
1558 HMainCommandSelectStart
1561 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END
),
1562 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5
),
1563 HMainCommandSelectEnd
1566 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT
),
1567 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6
),
1571 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE
),
1572 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7
),
1577 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE
),
1578 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8
),
1579 HMainCommandOpenFile
1582 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK
),
1583 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9
),
1584 HMainCommandOpenDisk
1587 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY
),
1588 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10
),
1589 HMainCommandOpenMemory
1600 Init function for MainEditor
1602 @retval EFI_SUCCESS The operation was successful.
1603 @retval EFI_LOAD_ERROR A load error occured.
1611 EFI_HANDLE
*HandleBuffer
;
1616 // basic initialization
1618 CopyMem (&HMainEditor
, &HMainEditorConst
, sizeof (HMainEditor
));
1621 // set screen attributes
1623 HMainEditor
.ColorAttributes
.Colors
.Foreground
= gST
->ConOut
->Mode
->Attribute
& 0x000000ff;
1625 HMainEditor
.ColorAttributes
.Colors
.Background
= (UINT8
) (gST
->ConOut
->Mode
->Attribute
>> 4);
1627 HOriginalColors
= HMainEditor
.ColorAttributes
.Colors
;
1629 HOriginalMode
= gST
->ConOut
->Mode
->Mode
;
1632 // query screen size
1634 gST
->ConOut
->QueryMode (
1636 gST
->ConOut
->Mode
->Mode
,
1637 &(HMainEditor
.ScreenSize
.Column
),
1638 &(HMainEditor
.ScreenSize
.Row
)
1642 // Find mouse in System Table ConsoleInHandle
1644 Status
= gBS
->HandleProtocol (
1646 &gEfiSimplePointerProtocolGuid
,
1647 (VOID
**)&HMainEditor
.MouseInterface
1649 if (EFI_ERROR (Status
)) {
1651 // If there is no Simple Pointer Protocol on System Table
1653 HandleBuffer
= NULL
;
1654 HMainEditor
.MouseInterface
= NULL
;
1655 Status
= gBS
->LocateHandleBuffer (
1657 &gEfiSimplePointerProtocolGuid
,
1662 if (!EFI_ERROR (Status
) && HandleCount
> 0) {
1664 // Try to find the first available mouse device
1666 for (Index
= 0; Index
< HandleCount
; Index
++) {
1667 Status
= gBS
->HandleProtocol (
1668 HandleBuffer
[Index
],
1669 &gEfiSimplePointerProtocolGuid
,
1670 (VOID
**)&HMainEditor
.MouseInterface
1672 if (!EFI_ERROR (Status
)) {
1677 if (HandleBuffer
!= NULL
) {
1678 FreePool (HandleBuffer
);
1682 if (!EFI_ERROR (Status
) && HMainEditor
.MouseInterface
!= NULL
) {
1683 HMainEditor
.MouseAccumulatorX
= 0;
1684 HMainEditor
.MouseAccumulatorY
= 0;
1685 HMainEditor
.MouseSupported
= TRUE
;
1689 // below will call the five components' init function
1691 Status
= MainTitleBarInit (NULL
);
1692 if (EFI_ERROR (Status
)) {
1693 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE
), gShellDebug1HiiHandle
);
1694 return EFI_LOAD_ERROR
;
1697 Status
= ControlHotKeyInit (HexMainControlBasedMenuFunctions
);
1698 if (EFI_ERROR (Status
)) {
1699 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1700 return EFI_LOAD_ERROR
;
1702 Status
= MenuBarInit (HexEditorMenuItems
);
1703 if (EFI_ERROR (Status
)) {
1704 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU
), gShellDebug1HiiHandle
);
1705 return EFI_LOAD_ERROR
;
1708 Status
= StatusBarInit ();
1709 if (EFI_ERROR (Status
)) {
1710 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS
), gShellDebug1HiiHandle
);
1711 return EFI_LOAD_ERROR
;
1716 Status
= HBufferImageInit ();
1717 if (EFI_ERROR (Status
)) {
1718 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE
), gShellDebug1HiiHandle
);
1719 return EFI_LOAD_ERROR
;
1722 Status
= HClipBoardInit ();
1723 if (EFI_ERROR (Status
)) {
1724 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD
), gShellDebug1HiiHandle
);
1725 return EFI_LOAD_ERROR
;
1728 // clear whole screen and enable cursor
1730 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1731 gST
->ConOut
->EnableCursor (gST
->ConOut
, TRUE
);
1734 // initialize EditorFirst and EditorExit
1736 HEditorFirst
= TRUE
;
1737 HEditorExit
= FALSE
;
1738 HEditorMouseAction
= FALSE
;
1744 Cleanup function for MainEditor.
1746 @retval EFI_SUCCESS The operation was successful.
1747 @retval EFI_LOAD_ERROR A load error occured.
1750 HMainEditorCleanup (
1757 // call the five components' cleanup function
1759 MainTitleBarCleanup ();
1763 StatusBarCleanup ();
1767 Status
= HBufferImageCleanup ();
1768 if (EFI_ERROR (Status
)) {
1769 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN
), gShellDebug1HiiHandle
);
1772 Status
= HClipBoardCleanup ();
1773 if (EFI_ERROR (Status
)) {
1774 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN
), gShellDebug1HiiHandle
);
1779 if (HOriginalMode
!= gST
->ConOut
->Mode
->Mode
) {
1780 gST
->ConOut
->SetMode (gST
->ConOut
, HOriginalMode
);
1783 gST
->ConOut
->SetAttribute (
1785 EFI_TEXT_ATTR (HOriginalColors
.Foreground
, HOriginalColors
.Background
)
1787 gST
->ConOut
->ClearScreen (gST
->ConOut
);
1793 Refresh function for MainEditor.
1795 @retval EFI_SUCCESS The operation was successful.
1798 HMainEditorRefresh (
1808 if (HMainEditor
.BufferImage
->BufferType
== FileTypeDiskBuffer
) {
1809 if (HMainEditor
.BufferImage
->DiskImage
!= NULL
&&
1810 HBufferImageBackupVar
.DiskImage
!= NULL
&&
1811 (HMainEditor
.BufferImage
->DiskImage
->Offset
!= HBufferImageBackupVar
.DiskImage
->Offset
||
1812 HMainEditor
.BufferImage
->DiskImage
->Size
!= HBufferImageBackupVar
.DiskImage
->Size
) ){
1815 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeMemBuffer
) {
1816 if (HMainEditor
.BufferImage
->MemImage
!= NULL
&&
1817 HBufferImageBackupVar
.MemImage
!= NULL
&&
1818 (HMainEditor
.BufferImage
->MemImage
->Offset
!= HBufferImageBackupVar
.MemImage
->Offset
||
1819 HMainEditor
.BufferImage
->MemImage
->Size
!= HBufferImageBackupVar
.MemImage
->Size
) ){
1822 } else if (HMainEditor
.BufferImage
->BufferType
== FileTypeFileBuffer
) {
1823 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1824 HMainEditor
.BufferImage
->FileImage
->FileName
!= NULL
&&
1825 HBufferImageBackupVar
.FileImage
!= NULL
&&
1826 HBufferImageBackupVar
.FileImage
->FileName
!= NULL
&&
1827 StrCmp (HMainEditor
.BufferImage
->FileImage
->FileName
, HBufferImageBackupVar
.FileImage
->FileName
) != 0 ) {
1831 if ( HMainEditor
.BufferImage
->FileImage
!= NULL
&&
1832 HBufferImageBackupVar
.FileImage
!= NULL
&&
1833 HMainEditor
.BufferImage
->FileImage
->ReadOnly
!= HBufferImageBackupVar
.FileImage
->ReadOnly
) {
1838 // to aVOID screen flicker
1839 // the stall value is from experience
1844 // call the components refresh function
1848 || HMainEditor
.BufferImage
->BufferType
!= HBufferImageBackupVar
.BufferType
1849 || HBufferImageBackupVar
.Modified
!= HMainEditor
.BufferImage
->Modified
1852 MainTitleBarRefresh (
1853 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
,
1854 HMainEditor
.BufferImage
->BufferType
,
1855 (BOOLEAN
)(HMainEditor
.BufferImage
->FileImage
!=NULL
?HMainEditor
.BufferImage
->FileImage
->ReadOnly
:FALSE
),
1856 HMainEditor
.BufferImage
->Modified
,
1857 HMainEditor
.ScreenSize
.Column
,
1858 HMainEditor
.ScreenSize
.Row
,
1859 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,
1860 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
1862 HBufferImageRefresh ();
1865 || HBufferImageBackupVar
.DisplayPosition
.Row
!= HMainEditor
.BufferImage
->DisplayPosition
.Row
1866 || HBufferImageBackupVar
.DisplayPosition
.Column
!= HMainEditor
.BufferImage
->DisplayPosition
.Column
1867 || StatusBarGetRefresh()) {
1871 HMainEditor
.ScreenSize
.Row
,
1872 HMainEditor
.ScreenSize
.Column
,
1877 HBufferImageRefresh ();
1881 HBufferImageRefresh ();
1885 // EditorFirst is now set to FALSE
1887 HEditorFirst
= FALSE
;
1893 Handle the mouse input.
1895 @param[in] MouseState The current mouse state.
1896 @param[out] BeforeLeftButtonDown helps with selections.
1898 @retval EFI_SUCCESS The operation was successful.
1899 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
1900 @retval EFI_LOAD_ERROR A load error occured.
1901 @retval EFI_NOT_FOUND The disk was not found.
1904 HMainEditorHandleMouseInput (
1905 IN EFI_SIMPLE_POINTER_STATE MouseState
,
1906 OUT BOOLEAN
*BeforeLeftButtonDown
1916 HEFI_EDITOR_LINE
*Line
;
1923 // have mouse movement
1925 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
1929 TextX
= HGetTextX (MouseState
.RelativeMovementX
);
1930 TextY
= HGetTextY (MouseState
.RelativeMovementY
);
1932 HBufferImageAdjustMousePosition (TextX
, TextY
);
1938 if (MouseState
.LeftButton
) {
1939 HighBits
= HBufferImageIsAtHighBits (
1940 HMainEditor
.BufferImage
->MousePosition
.Column
,
1945 // not at an movable place
1949 // now just move mouse pointer to legal position
1952 // move mouse position to legal position
1954 HMainEditor
.BufferImage
->MousePosition
.Column
-= 10;
1955 if (HMainEditor
.BufferImage
->MousePosition
.Column
> 24) {
1956 HMainEditor
.BufferImage
->MousePosition
.Column
--;
1957 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1959 if (HMainEditor
.BufferImage
->MousePosition
.Column
< 24) {
1960 FCol
= HMainEditor
.BufferImage
->MousePosition
.Column
/ 3 + 1 + 1;
1973 FRow
= HMainEditor
.BufferImage
->BufferPosition
.Row
+
1974 HMainEditor
.BufferImage
->MousePosition
.Row
-
1975 HMainEditor
.BufferImage
->DisplayPosition
.Row
;
1977 if (HMainEditor
.BufferImage
->NumLines
< FRow
) {
1982 // now just move mouse pointer to legal position
1984 FRow
= HMainEditor
.BufferImage
->NumLines
;
1988 Link
= HMainEditor
.BufferImage
->ListHead
->ForwardLink
;
1989 for (Index
= 0; Index
< FRow
- 1; Index
++) {
1990 Link
= Link
->ForwardLink
;
1993 Line
= CR (Link
, HEFI_EDITOR_LINE
, Link
, EFI_EDITOR_LINE_LIST
);
1999 // now just move mouse pointer to legal position
2001 if (FCol
> Line
->Size
) {
2002 if (*BeforeLeftButtonDown
) {
2005 if (Line
->Size
== 0) {
2018 FCol
= Line
->Size
+ 1;
2023 HBufferImageMovePosition (FRow
, FCol
, HighBits
);
2025 HMainEditor
.BufferImage
->MousePosition
.Row
= HMainEditor
.BufferImage
->DisplayPosition
.Row
;
2027 HMainEditor
.BufferImage
->MousePosition
.Column
= HMainEditor
.BufferImage
->DisplayPosition
.Column
;
2029 *BeforeLeftButtonDown
= TRUE
;
2034 // else of if LButton
2038 if (*BeforeLeftButtonDown
) {
2044 *BeforeLeftButtonDown
= FALSE
;
2051 return EFI_NOT_FOUND
;
2055 Handle user key input. will route it to other components handle function.
2057 @retval EFI_SUCCESS The operation was successful.
2058 @retval EFI_OUT_OF_RESOURCES A memory allocation occured.
2059 @retval EFI_LOAD_ERROR A load error occured.
2062 HMainEditorKeyInput (
2068 EFI_SIMPLE_POINTER_STATE MouseState
;
2069 BOOLEAN LengthChange
;
2072 BOOLEAN BeforeMouseIsDown
;
2073 BOOLEAN MouseIsDown
;
2078 UINTN SelectStartBackup
;
2079 UINTN SelectEndBackup
;
2082 // variable initialization
2087 LengthChange
= FALSE
;
2089 MouseIsDown
= FALSE
;
2095 Status
= EFI_SUCCESS
;
2097 HEditorMouseAction
= FALSE
;
2100 // backup some key elements, so that can aVOID some refresh work
2102 HMainEditorBackup ();
2105 // wait for user key input
2108 // change priority of checking mouse/keyboard activity dynamically
2109 // so prevent starvation of keyboard.
2110 // if last time, mouse moves then this time check keyboard
2112 if (HMainEditor
.MouseSupported
) {
2113 Status
= HMainEditor
.MouseInterface
->GetState (
2114 HMainEditor
.MouseInterface
,
2117 if (!EFI_ERROR (Status
)) {
2119 BeforeMouseIsDown
= MouseIsDown
;
2121 Status
= HMainEditorHandleMouseInput (MouseState
, &MouseIsDown
);
2123 if (!EFI_ERROR (Status
)) {
2124 if (!BeforeMouseIsDown
) {
2129 FRow
= HBufferImage
.BufferPosition
.Row
;
2130 FCol
= HBufferImage
.BufferPosition
.Column
;
2131 SelectStartBackup
= HMainEditor
.SelectStart
;
2132 SelectEndBackup
= HMainEditor
.SelectEnd
;
2138 SelectStartBackup
= HMainEditor
.SelectStart
;
2139 SelectEndBackup
= HMainEditor
.SelectEnd
;
2146 if (MouseState
.RelativeMovementX
|| MouseState
.RelativeMovementY
) {
2147 HMainEditor
.SelectStart
= 0;
2148 HMainEditor
.SelectEnd
= 0;
2149 HMainEditor
.SelectStart
= (FRow
- 1) * 0x10 + FCol
;
2156 (HBufferImage
.BufferPosition
.Row
- 1) *
2158 HBufferImage
.BufferPosition
.Column
2159 ) >= HMainEditor
.SelectStart
2161 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2163 HBufferImage
.BufferPosition
.Column
;
2165 HMainEditor
.SelectEnd
= 0;
2169 // end of if RelativeX/Y
2176 if (HBufferImageGetTotalSize () == 0) {
2177 HMainEditor
.SelectStart
= 0;
2178 HMainEditor
.SelectEnd
= 0;
2184 (HBufferImage
.BufferPosition
.Row
- 1) *
2186 HBufferImage
.BufferPosition
.Column
2187 ) >= HMainEditor
.SelectStart
2189 HMainEditor
.SelectEnd
= (HBufferImage
.BufferPosition
.Row
- 1) *
2191 HBufferImage
.BufferPosition
.Column
;
2193 HMainEditor
.SelectEnd
= 0;
2196 if (HMainEditor
.SelectEnd
== 0) {
2197 HMainEditor
.SelectStart
= 0;
2205 if (SelectStartBackup
!= HMainEditor
.SelectStart
|| SelectEndBackup
!= HMainEditor
.SelectEnd
) {
2206 if ((SelectStartBackup
- 1) / 0x10 != (HMainEditor
.SelectStart
- 1) / 0x10) {
2207 HBufferImageNeedRefresh
= TRUE
;
2209 if ((SelectEndBackup
- 1) / 0x10 != (HMainEditor
.SelectEnd
- 1) / 0x10) {
2210 HBufferImageNeedRefresh
= TRUE
;
2212 HBufferImageOnlyLineNeedRefresh
= TRUE
;
2218 HEditorMouseAction
= TRUE
;
2219 HBufferImageMouseNeedRefresh
= TRUE
;
2221 } else if (Status
== EFI_LOAD_ERROR
) {
2222 StatusBarSetStatusString (L
"Invalid Mouse Movement ");
2227 Status
= gST
->ConIn
->ReadKeyStroke (gST
->ConIn
, &Key
);
2228 if (!EFI_ERROR (Status
)) {
2230 // dispatch to different components' key handling function
2231 // so not everywhere has to set this variable
2233 HBufferImageMouseNeedRefresh
= TRUE
;
2236 // clear previous status string
2238 StatusBarSetRefresh();
2239 if (EFI_SUCCESS
== MenuBarDispatchControlHotKey(&Key
)) {
2240 Status
= EFI_SUCCESS
;
2241 } else if (Key
.ScanCode
== SCAN_NULL
) {
2242 Status
= HBufferImageHandleInput (&Key
);
2243 } else if (((Key
.ScanCode
>= SCAN_UP
) && (Key
.ScanCode
<= SCAN_PAGE_DOWN
))) {
2244 Status
= HBufferImageHandleInput (&Key
);
2245 } else if (((Key
.ScanCode
>= SCAN_F1
) && Key
.ScanCode
<= (SCAN_F12
))) {
2246 Status
= MenuBarDispatchFunctionKey (&Key
);
2248 StatusBarSetStatusString (L
"Unknown Command");
2250 HBufferImageMouseNeedRefresh
= FALSE
;
2253 if (Status
!= EFI_SUCCESS
&& Status
!= EFI_OUT_OF_RESOURCES
) {
2255 // not already has some error status
2257 if (StrCmp (L
"", StatusBarGetString()) == 0) {
2258 StatusBarSetStatusString (L
"Disk Error. Try Again");
2263 // decide if has to set length warning
2265 if (HBufferImage
.BufferType
!= HBufferImageBackupVar
.BufferType
) {
2266 LengthChange
= FALSE
;
2269 // still the old buffer
2271 if (HBufferImage
.BufferType
!= FileTypeFileBuffer
) {
2272 Size
= HBufferImageGetTotalSize ();
2274 switch (HBufferImage
.BufferType
) {
2275 case FileTypeDiskBuffer
:
2276 OldSize
= HBufferImage
.DiskImage
->Size
* HBufferImage
.DiskImage
->BlockSize
;
2279 case FileTypeMemBuffer
:
2280 OldSize
= HBufferImage
.MemImage
->Size
;
2288 if (!LengthChange
) {
2289 if (OldSize
!= Size
) {
2290 StatusBarSetStatusString (L
"Disk/Mem Buffer Length should not be changed");
2294 if (OldSize
!= Size
) {
2295 LengthChange
= TRUE
;
2297 LengthChange
= FALSE
;
2302 // after handling, refresh editor
2304 HMainEditorRefresh ();
2306 } while (Status
!= EFI_OUT_OF_RESOURCES
&& !HEditorExit
);
2312 Backup function for MainEditor.
2320 HMainEditorBackupVar
.SelectStart
= HMainEditor
.SelectStart
;
2321 HMainEditorBackupVar
.SelectEnd
= HMainEditor
.SelectEnd
;
2322 HBufferImageBackup ();