]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/HexEdit/MainHexEditor.c
add Edit and HexEdit commands.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / HexEdit / MainHexEditor.c
CommitLineData
632820d1 1/** @file\r
2 Defines the Main Editor data type - \r
3 - Global variables \r
4 - Instances of the other objects of the editor\r
5 - Main Interfaces\r
6 \r
7 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR>\r
8 This program and the accompanying materials\r
9 are licensed and made available under the terms and conditions of the BSD License\r
10 which accompanies this distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
12\r
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16**/\r
17\r
18#include "HexEditor.h"\r
19#include "EditStatusBar.h"\r
20#include "EditInputBar.h"\r
21\r
22HEFI_EDITOR_COLOR_ATTRIBUTES HOriginalColors;\r
23INTN HOriginalMode;\r
24\r
25//\r
26// the first time editor launch\r
27//\r
28BOOLEAN HEditorFirst;\r
29\r
30//\r
31// it's time editor should exit\r
32//\r
33BOOLEAN HEditorExit;\r
34\r
35BOOLEAN HEditorMouseAction;\r
36\r
37extern HEFI_EDITOR_BUFFER_IMAGE HBufferImage;\r
38extern HEFI_EDITOR_BUFFER_IMAGE HBufferImageBackupVar;\r
39\r
40extern HEFI_EDITOR_CLIPBOARD HClipBoard;\r
41\r
42extern BOOLEAN HBufferImageMouseNeedRefresh;\r
43extern BOOLEAN HBufferImageNeedRefresh;\r
44extern BOOLEAN HBufferImageOnlyLineNeedRefresh;\r
45\r
46HEFI_EDITOR_GLOBAL_EDITOR HMainEditor;\r
47HEFI_EDITOR_GLOBAL_EDITOR HMainEditorBackupVar;\r
48\r
49//\r
50// basic initialization for MainEditor\r
51//\r
52HEFI_EDITOR_GLOBAL_EDITOR HMainEditorConst = {\r
53 &HBufferImage,\r
54 &HClipBoard,\r
55 {\r
56 0,\r
57 0\r
58 },\r
59 {\r
60 0,\r
61 0\r
62 },\r
63 FALSE,\r
64 NULL,\r
65 0,\r
66 0,\r
67 1,\r
68 1\r
69};\r
70\r
71EFI_STATUS\r
72HMainCommandGoToOffset (\r
73 VOID\r
74 )\r
75/*++\r
76\r
77Routine Description: \r
78\r
79 move cursor to specified lines\r
80\r
81Arguments: \r
82\r
83 None\r
84\r
85Returns: \r
86\r
87 EFI_SUCCESS\r
88\r
89--*/\r
90{\r
91 UINTN Size;\r
92 UINT64 Offset;\r
93 EFI_STATUS Status;\r
94 UINTN FRow;\r
95 UINTN FCol;\r
96\r
97 //\r
98 // variable initialization\r
99 //\r
100 Size = 0;\r
101 Offset = 0;\r
102 FRow = 0;\r
103 FCol = 0;\r
104\r
105 //\r
106 // get offset\r
107 //\r
108 Status = InputBarSetPrompt (L"Go To Offset: ");\r
109 if (EFI_ERROR (Status)) {\r
110 return Status;\r
111 }\r
112\r
113 Status = InputBarSetStringSize (8);\r
114 if (EFI_ERROR (Status)) {\r
115 return Status;\r
116 }\r
117\r
118 while (1) {\r
119 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
120\r
121 //\r
122 // ESC pressed\r
123 //\r
124 if (Status == EFI_NOT_READY) {\r
125\r
126 return EFI_SUCCESS;\r
127 }\r
128 //\r
129 // THE input string length should > 0\r
130 //\r
131 if (StrLen (InputBarGetString()) > 0) {\r
132 Status = ShellConvertStringToUint64 (InputBarGetString(), &Offset, TRUE, FALSE);\r
133 if (EFI_ERROR (Status)) {\r
134 StatusBarSetStatusString (L"Invalid Offset");\r
135 return EFI_SUCCESS;\r
136 }\r
137\r
138 break;\r
139 }\r
140 }\r
141\r
142 Size = HBufferImageGetTotalSize ();\r
143 if (Offset >= Size) {\r
144 StatusBarSetStatusString (L"Invalid Offset");\r
145 return EFI_SUCCESS;\r
146 }\r
147\r
148 FRow = (UINTN)DivU64x32(Offset , 0x10) + 1;\r
149 FCol = (UINTN)ModU64x32(Offset , 0x10) + 1;\r
150\r
151 HBufferImageMovePosition (FRow, FCol, TRUE);\r
152\r
153 HBufferImageNeedRefresh = TRUE;\r
154 HBufferImageOnlyLineNeedRefresh = FALSE;\r
155 HBufferImageMouseNeedRefresh = TRUE;\r
156\r
157 return EFI_SUCCESS;\r
158}\r
159\r
160EFI_STATUS\r
161HMainCommandSaveBuffer (\r
162 VOID\r
163 )\r
164/*++\r
165\r
166Routine Description: \r
167\r
168 save current opened buffer . \r
169 if is file buffer, you can save to current file name or \r
170 save to another file name\r
171\r
172Arguments: \r
173\r
174 None\r
175\r
176Returns: \r
177\r
178 EFI_SUCCESS\r
179 EFI_OUT_OF_RESOURCES\r
180 EFI_LOAD_ERROR\r
181\r
182--*/\r
183{\r
184 EFI_STATUS Status;\r
185 BOOLEAN Done;\r
186 CHAR16 *FileName;\r
187 BOOLEAN OldFile;\r
188 CHAR16 *Str;\r
189 EFI_FILE_INFO *Info;\r
190 SHELL_FILE_HANDLE ShellFileHandle;\r
191\r
192 if (HMainEditor.BufferImage->BufferType != FileTypeFileBuffer) {\r
193 if (HMainEditor.BufferImage->Modified == FALSE) {\r
194 return EFI_SUCCESS;\r
195 }\r
196\r
197 Status = InputBarSetPrompt (L"Dangerous to save disk/mem buffer. Save (Yes/No/Cancel) ? ");\r
198 if (EFI_ERROR (Status)) {\r
199 return Status;\r
200 }\r
201 //\r
202 // the answer is just one character\r
203 //\r
204 Status = InputBarSetStringSize (1);\r
205 if (EFI_ERROR (Status)) {\r
206 return Status;\r
207 }\r
208 //\r
209 // loop for user's answer\r
210 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'\r
211 //\r
212 while (1) {\r
213 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
214\r
215 //\r
216 // ESC pressed\r
217 //\r
218 if (Status == EFI_NOT_READY) {\r
219 return EFI_SUCCESS;\r
220 }\r
221\r
222 switch (InputBarGetString()[0]) {\r
223 case L'y':\r
224 case L'Y':\r
225 //\r
226 // want to save this buffer first\r
227 //\r
228 Status = HBufferImageSave (\r
229 NULL,\r
230 HMainEditor.BufferImage->DiskImage->Name,\r
231 HMainEditor.BufferImage->DiskImage->Offset,\r
232 HMainEditor.BufferImage->DiskImage->Size,\r
233 HMainEditor.BufferImage->MemImage->Offset,\r
234 HMainEditor.BufferImage->MemImage->Size,\r
235 HMainEditor.BufferImage->BufferType\r
236 );\r
237\r
238 if (EFI_ERROR (Status)) {\r
239 StatusBarSetStatusString (L"BufferSave: Problems Writing");\r
240 return Status;\r
241 }\r
242\r
243 return EFI_SUCCESS;\r
244\r
245 case L'n':\r
246 case L'N':\r
247 //\r
248 // the file won't be saved\r
249 //\r
250 return EFI_SUCCESS;\r
251 break;\r
252\r
253 case L'c':\r
254 case L'C':\r
255 return EFI_SUCCESS;\r
256 }\r
257 //\r
258 // end of switch\r
259 //\r
260 }\r
261 //\r
262 // ENDOF WHILE\r
263 //\r
264 }\r
265 //\r
266 // ENDOF != FILEBUFFER\r
267 //\r
268 // This command will save currently opened file to disk.\r
269 // You can choose save to another file name or just save to\r
270 // current file name.\r
271 // Below is the scenario of Save File command: (\r
272 // Suppose the old file name is A )\r
273 // 1. An Input Bar will be prompted: "File To Save: [ old file name]"\r
274 // IF user press ESC, Save File command ends .\r
275 // IF user press Enter, input file name will be A.\r
276 // IF user inputs a new file name B, input file name will be B.\r
277 //\r
278 // 2. IF input file name is A, go to do Step 3.\r
279 // IF input file name is B, go to do Step 4.\r
280 //\r
281 // 3. IF A is read only, Status Bar will show "Access Denied"\r
282 // and Save File commands ends.\r
283 // IF A is not read only, save file buffer to disk\r
284 // and remove Modified flag in Title Bar , then Save File command ends.\r
285 //\r
286 // 4. IF B does not exist, create this file and save file buffer to it.\r
287 // Go to do Step 7.\r
288 // IF B exits, do Step 5.\r
289 //\r
290 // 5. An Input Bar will be prompted:\r
291 // "File Exists. Overwrite ( Yes/No/Cancel ) ?"\r
292 // IF user press 'y' or 'Y', do Step 6.\r
293 // IF user press 'n' or 'N', Save File commands ends.\r
294 // IF user press 'c' or 'C' or ESC, Save File commands ends.\r
295 //\r
296 // 6. IF B is a read-only file, Status Bar will show "Access Denied"\r
297 // and Save File commands ends.\r
298 // IF B can be read and write, save file buffer to B.\r
299 //\r
300 // 7. Update File Name field in Title Bar to B\r
301 // and remove the Modified flag in Title Bar.\r
302 //\r
303 Str = CatSPrint(NULL, \r
304 L"File to Save: [%s]",\r
305 HMainEditor.BufferImage->FileImage->FileName\r
306 );\r
307 if (Str == NULL) {\r
308 return EFI_OUT_OF_RESOURCES;\r
309 }\r
310\r
311 if (StrLen (Str) >= 50) {\r
312 //\r
313 // replace the long file name with "..."\r
314 //\r
315 Str[46] = L'.';\r
316 Str[47] = L'.';\r
317 Str[48] = L'.';\r
318 Str[49] = L']';\r
319 Str[50] = L'\0';\r
320 }\r
321\r
322 Status = InputBarSetPrompt (Str);\r
323 if (EFI_ERROR (Status)) {\r
324 return Status;\r
325 }\r
326\r
327 Status = InputBarSetStringSize (100);\r
328 if (EFI_ERROR (Status)) {\r
329 return Status;\r
330 }\r
331 //\r
332 // get new file name\r
333 //\r
334 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
335\r
336 //\r
337 // if user pressed ESC\r
338 //\r
339 if (Status == EFI_NOT_READY) {\r
340 SHELL_FREE_NON_NULL (Str);\r
341 return EFI_SUCCESS;\r
342 }\r
343\r
344 SHELL_FREE_NON_NULL (Str);\r
345\r
346 //\r
347 // if just enter pressed, so think save to current file name\r
348 //\r
349 if (StrLen (InputBarGetString()) == 0) {\r
350 FileName = CatSPrint(NULL, \r
351 L"%s",\r
352 HMainEditor.BufferImage->FileImage->FileName\r
353 );\r
354 } else {\r
355 FileName = CatSPrint(NULL, L"%s", InputBarGetString());\r
356 }\r
357\r
358 if (FileName == NULL) {\r
359 return EFI_OUT_OF_RESOURCES;\r
360 }\r
361\r
362 if (!IsValidFileName (FileName)) {\r
363 StatusBarSetStatusString (L"Invalid File Name");\r
364 SHELL_FREE_NON_NULL (FileName);\r
365 return EFI_SUCCESS;\r
366 }\r
367\r
368 OldFile = FALSE;\r
369\r
370 //\r
371 // save to the old file\r
372 //\r
373 if (StringNoCaseCompare (\r
374 &FileName,\r
375 &HMainEditor.BufferImage->FileImage->FileName\r
376 ) == 0) {\r
377 OldFile = TRUE;\r
378 }\r
379\r
380 if (OldFile) {\r
381 //\r
382 // if the file is read only, so can not write back to it.\r
383 //\r
384 if (HMainEditor.BufferImage->FileImage->ReadOnly == TRUE) {\r
385 StatusBarSetStatusString (L"Access Denied");\r
386 SHELL_FREE_NON_NULL (FileName);\r
387 return EFI_SUCCESS;\r
388 }\r
389 } else {\r
390 Status = ShellOpenFileByName (FileName, &ShellFileHandle, EFI_FILE_MODE_READ, 0);\r
391\r
392 if (!EFI_ERROR (Status)) {\r
393\r
394 Info = ShellGetFileInfo(ShellFileHandle);\r
395\r
396 ShellCloseFile(&ShellFileHandle);\r
397 //\r
398 // check if read only\r
399 //\r
400 if (Info->Attribute & EFI_FILE_READ_ONLY) {\r
401 StatusBarSetStatusString (L"Access Denied");\r
402 SHELL_FREE_NON_NULL (FileName);\r
403 return EFI_SUCCESS;\r
404 } \r
405\r
406 SHELL_FREE_NON_NULL(Info);\r
407 //\r
408 // ask user whether to overwrite this file\r
409 //\r
410 Status = InputBarSetPrompt (L"File exists. Overwrite (Yes/No/Cancel) ? ");\r
411 if (EFI_ERROR (Status)) {\r
412 SHELL_FREE_NON_NULL (FileName);\r
413 return Status;\r
414 }\r
415\r
416 Status = InputBarSetStringSize (1);\r
417 if (EFI_ERROR (Status)) {\r
418 SHELL_FREE_NON_NULL (FileName);\r
419 return Status;\r
420 }\r
421\r
422 Done = FALSE;\r
423 while (!Done) {\r
424 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
425\r
426 if (Status == EFI_NOT_READY) {\r
427 SHELL_FREE_NON_NULL (FileName);\r
428 return EFI_SUCCESS;\r
429 }\r
430\r
431 switch (InputBarGetString()[0]) {\r
432 case L'y':\r
433 case L'Y':\r
434 Done = TRUE;\r
435 break;\r
436 case L'n':\r
437 case L'N':\r
438 SHELL_FREE_NON_NULL (FileName);\r
439 return EFI_SUCCESS;\r
440 case L'c':\r
441 case L'C':\r
442 SHELL_FREE_NON_NULL (FileName);\r
443 return EFI_SUCCESS;\r
444 } // switch\r
445 } // while\r
446 } // if opened existing file\r
447 } // if OldFile\r
448 \r
449 //\r
450 // save file back to disk\r
451 //\r
452 Status = HBufferImageSave (\r
453 FileName,\r
454 HMainEditor.BufferImage->DiskImage->Name,\r
455 HMainEditor.BufferImage->DiskImage->Offset,\r
456 HMainEditor.BufferImage->DiskImage->Size,\r
457 HMainEditor.BufferImage->MemImage->Offset,\r
458 HMainEditor.BufferImage->MemImage->Size,\r
459 FileTypeFileBuffer\r
460 );\r
461 SHELL_FREE_NON_NULL (FileName);\r
462\r
463 if (EFI_ERROR (Status)) {\r
464 return EFI_LOAD_ERROR;\r
465 }\r
466\r
467 return EFI_SUCCESS;\r
468}\r
469\r
470EFI_STATUS\r
471HMainCommandSelectStart (\r
472 VOID\r
473 )\r
474/*++\r
475\r
476Routine Description: \r
477\r
478 Load a disk buffer editor\r
479\r
480Arguments: \r
481\r
482 None\r
483\r
484Returns: \r
485\r
486 EFI_SUCCESS\r
487 EFI_LOAD_ERROR\r
488 EFI_OUT_OF_RESOURCES\r
489\r
490--*/\r
491{\r
492 UINTN Start;\r
493\r
494 Start = (HMainEditor.BufferImage->BufferPosition.Row - 1) * 0x10 + HMainEditor.BufferImage->BufferPosition.Column;\r
495\r
496 //\r
497 // last line\r
498 //\r
499 if (HMainEditor.BufferImage->CurrentLine->Link.ForwardLink == HMainEditor.BufferImage->ListHead) {\r
500 if (HMainEditor.BufferImage->BufferPosition.Column > HMainEditor.BufferImage->CurrentLine->Size) {\r
501 StatusBarSetStatusString (L"Invalid Block Start");\r
502 return EFI_LOAD_ERROR;\r
503 }\r
504 }\r
505\r
506 if (HMainEditor.SelectEnd != 0 && Start > HMainEditor.SelectEnd) {\r
507 StatusBarSetStatusString (L"Invalid Block Start");\r
508 return EFI_LOAD_ERROR;\r
509 }\r
510\r
511 HMainEditor.SelectStart = Start;\r
512\r
513 HBufferImageNeedRefresh = TRUE;\r
514\r
515 return EFI_SUCCESS;\r
516}\r
517\r
518EFI_STATUS\r
519HMainCommandSelectEnd (\r
520 VOID\r
521 )\r
522/*++\r
523\r
524Routine Description: \r
525\r
526 Load a disk buffer editor\r
527\r
528Arguments: \r
529\r
530 None\r
531\r
532Returns: \r
533\r
534 EFI_SUCCESS\r
535 EFI_LOAD_ERROR\r
536 EFI_OUT_OF_RESOURCES\r
537\r
538--*/\r
539{\r
540 UINTN End;\r
541\r
542 End = (HMainEditor.BufferImage->BufferPosition.Row - 1) * 0x10 + HMainEditor.BufferImage->BufferPosition.Column;\r
543\r
544 //\r
545 // last line\r
546 //\r
547 if (HMainEditor.BufferImage->CurrentLine->Link.ForwardLink == HMainEditor.BufferImage->ListHead) {\r
548 if (HMainEditor.BufferImage->BufferPosition.Column > HMainEditor.BufferImage->CurrentLine->Size) {\r
549 StatusBarSetStatusString (L"Invalid Block End");\r
550 return EFI_LOAD_ERROR;\r
551 }\r
552 }\r
553\r
554 if (HMainEditor.SelectStart != 0 && End < HMainEditor.SelectStart) {\r
555 StatusBarSetStatusString (L"Invalid Block End");\r
556 return EFI_SUCCESS;\r
557 }\r
558\r
559 HMainEditor.SelectEnd = End;\r
560\r
561 HBufferImageNeedRefresh = TRUE;\r
562\r
563 return EFI_SUCCESS;\r
564}\r
565\r
566EFI_STATUS\r
567HMainCommandCut (\r
568 VOID\r
569 )\r
570/*++\r
571\r
572Routine Description: \r
573\r
574 cut current line to clipboard\r
575\r
576Arguments: \r
577\r
578 None\r
579\r
580Returns: \r
581\r
582 EFI_SUCCESS\r
583 EFI_OUT_OF_RESOURCES\r
584 EFI_LOAD_ERROR\r
585\r
586--*/\r
587{\r
588 UINTN Index;\r
589 HEFI_EDITOR_LINE *Line;\r
590 LIST_ENTRY *Link;\r
591 UINT8 *Buffer;\r
592 UINTN Count;\r
593\r
594 //\r
595 // not select, so not allowed to cut\r
596 //\r
597 if (HMainEditor.SelectStart == 0) {\r
598 StatusBarSetStatusString (L"No Block is Selected");\r
599 return EFI_SUCCESS;\r
600 }\r
601 //\r
602 // not select, so not allowed to cut\r
603 //\r
604 if (HMainEditor.SelectEnd == 0) {\r
605 StatusBarSetStatusString (L"No Block is Selected");\r
606 return EFI_SUCCESS;\r
607 }\r
608\r
609 Link = HMainEditor.BufferImage->ListHead->ForwardLink;\r
610 for (Index = 0; Index < (HMainEditor.SelectEnd - 1) / 0x10; Index++) {\r
611 Link = Link->ForwardLink;\r
612 }\r
613\r
614 Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
615\r
616 Count = HMainEditor.SelectEnd - HMainEditor.SelectStart + 1;\r
617 Buffer = AllocateZeroPool (Count);\r
618 if (Buffer == NULL) {\r
619 return EFI_OUT_OF_RESOURCES;\r
620 }\r
621 //\r
622 // cut the selected area\r
623 //\r
624 HBufferImageDeleteCharacterFromBuffer (\r
625 HMainEditor.SelectStart - 1,\r
626 Count,\r
627 Buffer\r
628 );\r
629\r
630 //\r
631 // put to clipboard\r
632 //\r
633 HClipBoardSet (Buffer, Count);\r
634\r
635 HBufferImageNeedRefresh = TRUE;\r
636 HBufferImageOnlyLineNeedRefresh = FALSE;\r
637\r
638 if (!HMainEditor.BufferImage->Modified) {\r
639 HMainEditor.BufferImage->Modified = TRUE;\r
640 }\r
641\r
642 //\r
643 // now no select area\r
644 //\r
645 HMainEditor.SelectStart = 0;\r
646 HMainEditor.SelectEnd = 0;\r
647\r
648 return EFI_SUCCESS;\r
649}\r
650\r
651EFI_STATUS\r
652HMainCommandPaste (\r
653 VOID\r
654 )\r
655/*++\r
656\r
657Routine Description: \r
658\r
659 paste line to file buffer\r
660\r
661Arguments: \r
662\r
663 None\r
664\r
665Returns: \r
666\r
667 EFI_SUCCESS\r
668 EFI_OUT_OF_RESOURCES\r
669 EFI_LOAD_ERROR\r
670\r
671\r
672--*/\r
673{\r
674\r
675 BOOLEAN OnlyLineRefresh;\r
676 HEFI_EDITOR_LINE *Line;\r
677 UINT8 *Buffer;\r
678 UINTN Count;\r
679 UINTN FPos;\r
680\r
681 Count = HClipBoardGet (&Buffer);\r
682 if (Count == 0 || Buffer == NULL) {\r
683 StatusBarSetStatusString (L"Nothing to Paste");\r
684 return EFI_SUCCESS;\r
685 }\r
686\r
687 Line = HMainEditor.BufferImage->CurrentLine;\r
688\r
689 OnlyLineRefresh = FALSE;\r
690 if (Line->Link.ForwardLink == HMainEditor.BufferImage->ListHead && Line->Size + Count < 0x10) {\r
691 //\r
692 // is at last line, and after paste will not exceed\r
693 // so only this line need to be refreshed\r
694 //\r
695 // if after add, the line is 0x10, then will append a new line\r
696 // so the whole page will need be refreshed\r
697 //\r
698 OnlyLineRefresh = TRUE;\r
699\r
700 }\r
701\r
702 FPos = 0x10 * (HMainEditor.BufferImage->BufferPosition.Row - 1) + HMainEditor.BufferImage->BufferPosition.Column - 1;\r
703\r
704 HBufferImageAddCharacterToBuffer (FPos, Count, Buffer);\r
705\r
706 if (OnlyLineRefresh) {\r
707 HBufferImageNeedRefresh = FALSE;\r
708 HBufferImageOnlyLineNeedRefresh = TRUE;\r
709 } else {\r
710 HBufferImageNeedRefresh = TRUE;\r
711 HBufferImageOnlyLineNeedRefresh = FALSE;\r
712 }\r
713\r
714 if (!HMainEditor.BufferImage->Modified) {\r
715 HMainEditor.BufferImage->Modified = TRUE;\r
716 }\r
717\r
718 return EFI_SUCCESS;\r
719\r
720}\r
721\r
722EFI_STATUS\r
723HMainCommandExit (\r
724 VOID\r
725 )\r
726/*++\r
727\r
728Routine Description: \r
729\r
730 exit editor\r
731\r
732Arguments: \r
733\r
734 None\r
735\r
736Returns: \r
737\r
738 EFI_SUCCESS\r
739 EFI_OUT_OF_RESOURCES\r
740 EFI_LOAD_ERROR\r
741\r
742--*/\r
743{\r
744 EFI_STATUS Status;\r
745\r
746 //\r
747 // Below is the scenario of Exit command:\r
748 // 1. IF currently opened file is not modified, exit the editor and\r
749 // Exit command ends.\r
750 // IF currently opened file is modified, do Step 2\r
751 //\r
752 // 2. An Input Bar will be prompted:\r
753 // "File modified. Save ( Yes/No/Cancel )?"\r
754 // IF user press 'y' or 'Y', currently opened file will be saved and\r
755 // Editor exits\r
756 // IF user press 'n' or 'N', currently opened file will not be saved\r
757 // and Editor exits.\r
758 // IF user press 'c' or 'C' or ESC, Exit command ends.\r
759 //\r
760 //\r
761 // if file has been modified, so will prompt user\r
762 // whether to save the changes\r
763 //\r
764 if (HMainEditor.BufferImage->Modified) {\r
765\r
766 Status = InputBarSetPrompt (L"Buffer modified. Save (Yes/No/Cancel) ? ");\r
767 if (EFI_ERROR (Status)) {\r
768 return Status;\r
769 }\r
770\r
771 Status = InputBarSetStringSize (1);\r
772 if (EFI_ERROR (Status)) {\r
773 return Status;\r
774 }\r
775\r
776 while (1) {\r
777 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
778\r
779 //\r
780 // ESC pressed\r
781 //\r
782 if (Status == EFI_NOT_READY) {\r
783 return EFI_SUCCESS;\r
784 }\r
785\r
786 switch (InputBarGetString()[0]) {\r
787 case L'y':\r
788 case L'Y':\r
789 //\r
790 // write file back to disk\r
791 //\r
792 Status = HBufferImageSave (\r
793 HMainEditor.BufferImage->FileImage->FileName,\r
794 HMainEditor.BufferImage->DiskImage->Name,\r
795 HMainEditor.BufferImage->DiskImage->Offset,\r
796 HMainEditor.BufferImage->DiskImage->Size,\r
797 HMainEditor.BufferImage->MemImage->Offset,\r
798 HMainEditor.BufferImage->MemImage->Size,\r
799 HMainEditor.BufferImage->BufferType\r
800 );\r
801 if (!EFI_ERROR (Status)) {\r
802 HEditorExit = TRUE;\r
803 }\r
804\r
805 return Status;\r
806\r
807 case L'n':\r
808 case L'N':\r
809 HEditorExit = TRUE;\r
810 return EFI_SUCCESS;\r
811\r
812 case L'c':\r
813 case L'C':\r
814 return EFI_SUCCESS;\r
815\r
816 }\r
817 }\r
818 }\r
819\r
820 HEditorExit = TRUE;\r
821 return EFI_SUCCESS;\r
822\r
823}\r
824\r
825EFI_STATUS\r
826HMainCommandOpenFile (\r
827 VOID\r
828 )\r
829/*++\r
830\r
831Routine Description: \r
832\r
833 Load a file from disk to editor\r
834\r
835Arguments: \r
836\r
837 None\r
838\r
839Returns: \r
840\r
841 EFI_SUCCESS\r
842 EFI_LOAD_ERROR\r
843 EFI_OUT_OF_RESOURCES\r
844\r
845--*/\r
846{\r
847 BOOLEAN Done;\r
848 EFI_STATUS Status;\r
849 EDIT_FILE_TYPE BufferType;\r
850\r
851 BufferType = HMainEditor.BufferImage->BufferType;\r
852\r
853 //\r
854 // This command will open a file from current working directory.\r
855 // Read-only file can also be opened. But it can not be modified.\r
856 // Below is the scenario of Open File command:\r
857 // 1. IF currently opened file has not been modified, directly go to step .\r
858 // IF currently opened file has been modified, an Input Bar will be\r
859 // prompted as :\r
860 // "File Modified. Save ( Yes/No/Cancel) ?"\r
861 // IF user press 'y' or 'Y', currently opened file will be saved.\r
862 // IF user press 'n' or 'N', currently opened file will\r
863 // not be saved.\r
864 // IF user press 'c' or 'C' or ESC, Open File command ends and\r
865 // currently opened file is still opened.\r
866 //\r
867 // 2. An Input Bar will be prompted as : "File Name to Open: "\r
868 // IF user press ESC, Open File command ends and\r
869 // currently opened file is still opened.\r
870 // Any other inputs with a Return will cause\r
871 // currently opened file close.\r
872 //\r
873 // 3. IF user input file name is an existing file ,\r
874 // this file will be read and opened.\r
875 // IF user input file name is a new file, this file will be created\r
876 // and opened. This file's type ( UNICODE or ASCII ) is the same with\r
877 // the old file.\r
878 //\r
879 //\r
880 // if current file is modified, so you need to choose whether to\r
881 // save it first.\r
882 //\r
883 if (HMainEditor.BufferImage->Modified) {\r
884\r
885 Status = InputBarSetPrompt (L"Buffer modified. Save (Yes/No/Cancel) ? ");\r
886 if (EFI_ERROR (Status)) {\r
887 return Status;\r
888 }\r
889 //\r
890 // the answer is just one character\r
891 //\r
892 Status = InputBarSetStringSize (1);\r
893 if (EFI_ERROR (Status)) {\r
894 return Status;\r
895 }\r
896 //\r
897 // loop for user's answer\r
898 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'\r
899 //\r
900 Done = FALSE;\r
901 while (!Done) {\r
902 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
903\r
904 //\r
905 // ESC pressed\r
906 //\r
907 if (Status == EFI_NOT_READY) {\r
908 return EFI_SUCCESS;\r
909 }\r
910\r
911 switch (InputBarGetString()[0]) {\r
912 case L'y':\r
913 case L'Y':\r
914 //\r
915 // want to save this buffer first\r
916 //\r
917 Status = HBufferImageSave (\r
918 HMainEditor.BufferImage->FileImage->FileName,\r
919 HMainEditor.BufferImage->DiskImage->Name,\r
920 HMainEditor.BufferImage->DiskImage->Offset,\r
921 HMainEditor.BufferImage->DiskImage->Size,\r
922 HMainEditor.BufferImage->MemImage->Offset,\r
923 HMainEditor.BufferImage->MemImage->Size,\r
924 HMainEditor.BufferImage->BufferType\r
925 );\r
926 if (EFI_ERROR (Status)) {\r
927 return Status;\r
928 }\r
929\r
930 MainTitleBarRefresh (\r
931 HMainEditor.BufferImage->BufferType == FileTypeFileBuffer?HMainEditor.BufferImage->FileImage->FileName:HMainEditor.BufferImage->BufferType == FileTypeDiskBuffer?HMainEditor.BufferImage->DiskImage->Name:NULL,\r
932 HMainEditor.BufferImage->BufferType,\r
933 HMainEditor.BufferImage->FileImage->ReadOnly,\r
934 FALSE,\r
935 HMainEditor.ScreenSize.Column,\r
936 HMainEditor.ScreenSize.Row\r
937 );\r
938 Done = TRUE;\r
939 break;\r
940\r
941 case L'n':\r
942 case L'N':\r
943 //\r
944 // the file won't be saved\r
945 //\r
946 Done = TRUE;\r
947 break;\r
948\r
949 case L'c':\r
950 case L'C':\r
951 return EFI_SUCCESS;\r
952 }\r
953 }\r
954 }\r
955 //\r
956 // TO get the open file name\r
957 //\r
958 Status = InputBarSetPrompt (L"File Name to Open: ");\r
959 if (EFI_ERROR (Status)) {\r
960 HBufferImageRead (\r
961 HMainEditor.BufferImage->FileImage->FileName,\r
962 HMainEditor.BufferImage->DiskImage->Name,\r
963 HMainEditor.BufferImage->DiskImage->Offset,\r
964 HMainEditor.BufferImage->DiskImage->Size,\r
965 HMainEditor.BufferImage->MemImage->Offset,\r
966 HMainEditor.BufferImage->MemImage->Size,\r
967 BufferType,\r
968 TRUE\r
969 );\r
970 return Status;\r
971 }\r
972\r
973 Status = InputBarSetStringSize (100);\r
974 if (EFI_ERROR (Status)) {\r
975 Status = HBufferImageRead (\r
976 HMainEditor.BufferImage->FileImage->FileName,\r
977 HMainEditor.BufferImage->DiskImage->Name,\r
978 HMainEditor.BufferImage->DiskImage->Offset,\r
979 HMainEditor.BufferImage->DiskImage->Size,\r
980 HMainEditor.BufferImage->MemImage->Offset,\r
981 HMainEditor.BufferImage->MemImage->Size,\r
982 BufferType,\r
983 TRUE\r
984 );\r
985 return Status;\r
986 }\r
987\r
988 while (1) {\r
989 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
990\r
991 //\r
992 // ESC pressed\r
993 //\r
994 if (Status == EFI_NOT_READY) {\r
995 Status = HBufferImageRead (\r
996 HMainEditor.BufferImage->FileImage->FileName,\r
997 HMainEditor.BufferImage->DiskImage->Name,\r
998 HMainEditor.BufferImage->DiskImage->Offset,\r
999 HMainEditor.BufferImage->DiskImage->Size,\r
1000 HMainEditor.BufferImage->MemImage->Offset,\r
1001 HMainEditor.BufferImage->MemImage->Size,\r
1002 BufferType,\r
1003 TRUE\r
1004 );\r
1005\r
1006 return Status;\r
1007 }\r
1008 //\r
1009 // THE input string length should > 0\r
1010 //\r
1011 if (StrLen (InputBarGetString()) > 0) {\r
1012 //\r
1013 // CHECK if filename's valid\r
1014 //\r
1015 if (!IsValidFileName (InputBarGetString())) {\r
1016 HBufferImageRead (\r
1017 HMainEditor.BufferImage->FileImage->FileName,\r
1018 HMainEditor.BufferImage->DiskImage->Name,\r
1019 HMainEditor.BufferImage->DiskImage->Offset,\r
1020 HMainEditor.BufferImage->DiskImage->Size,\r
1021 HMainEditor.BufferImage->MemImage->Offset,\r
1022 HMainEditor.BufferImage->MemImage->Size,\r
1023 BufferType,\r
1024 TRUE\r
1025 );\r
1026\r
1027 StatusBarSetStatusString (L"Invalid File Name");\r
1028 return EFI_SUCCESS;\r
1029 }\r
1030\r
1031 break;\r
1032 }\r
1033 }\r
1034 //\r
1035 // read from disk\r
1036 //\r
1037 Status = HBufferImageRead (\r
1038 InputBarGetString(),\r
1039 HMainEditor.BufferImage->DiskImage->Name,\r
1040 HMainEditor.BufferImage->DiskImage->Offset,\r
1041 HMainEditor.BufferImage->DiskImage->Size,\r
1042 HMainEditor.BufferImage->MemImage->Offset,\r
1043 HMainEditor.BufferImage->MemImage->Size,\r
1044 FileTypeFileBuffer,\r
1045 FALSE\r
1046 );\r
1047\r
1048 if (EFI_ERROR (Status)) {\r
1049 HBufferImageRead (\r
1050 HMainEditor.BufferImage->FileImage->FileName,\r
1051 HMainEditor.BufferImage->DiskImage->Name,\r
1052 HMainEditor.BufferImage->DiskImage->Offset,\r
1053 HMainEditor.BufferImage->DiskImage->Size,\r
1054 HMainEditor.BufferImage->MemImage->Offset,\r
1055 HMainEditor.BufferImage->MemImage->Size,\r
1056 BufferType,\r
1057 TRUE\r
1058 );\r
1059\r
1060 return EFI_LOAD_ERROR;\r
1061 }\r
1062\r
1063 return EFI_SUCCESS;\r
1064}\r
1065\r
1066EFI_STATUS\r
1067HMainCommandOpenDisk (\r
1068 VOID\r
1069 )\r
1070/*++\r
1071\r
1072Routine Description: \r
1073\r
1074 Load a disk buffer editor\r
1075\r
1076Arguments: \r
1077\r
1078 None\r
1079\r
1080Returns: \r
1081\r
1082 EFI_SUCCESS\r
1083 EFI_LOAD_ERROR\r
1084 EFI_OUT_OF_RESOURCES\r
1085 EFI_NOT_FOUND\r
1086\r
1087--*/\r
1088{\r
1089 UINT64 Size;\r
1090 UINT64 Offset;\r
1091 CHAR16 *DeviceName;\r
1092 EFI_STATUS Status;\r
1093 BOOLEAN Done;\r
1094\r
1095 EDIT_FILE_TYPE BufferType;\r
1096\r
1097 //\r
1098 // variable initialization\r
1099 //\r
1100 Size = 0;\r
1101 Offset = 0;\r
1102 BufferType = HMainEditor.BufferImage->BufferType;\r
1103\r
1104 //\r
1105 // if current file is modified, so you need to choose\r
1106 // whether to save it first.\r
1107 //\r
1108 if (HMainEditor.BufferImage->Modified) {\r
1109\r
1110 Status = InputBarSetPrompt (L"Buffer modified. Save (Yes/No/Cancel) ? ");\r
1111 if (EFI_ERROR (Status)) {\r
1112 return Status;\r
1113 }\r
1114 //\r
1115 // the answer is just one character\r
1116 //\r
1117 Status = InputBarSetStringSize (1);\r
1118 if (EFI_ERROR (Status)) {\r
1119 return Status;\r
1120 }\r
1121 //\r
1122 // loop for user's answer\r
1123 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'\r
1124 //\r
1125 Done = FALSE;\r
1126 while (!Done) {\r
1127 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1128\r
1129 //\r
1130 // ESC pressed\r
1131 //\r
1132 if (Status == EFI_NOT_READY) {\r
1133 return EFI_SUCCESS;\r
1134 }\r
1135\r
1136 switch (InputBarGetString()[0]) {\r
1137 case L'y':\r
1138 case L'Y':\r
1139 //\r
1140 // want to save this buffer first\r
1141 //\r
1142 Status = HBufferImageSave (\r
1143 HMainEditor.BufferImage->FileImage->FileName,\r
1144 HMainEditor.BufferImage->DiskImage->Name,\r
1145 HMainEditor.BufferImage->DiskImage->Offset,\r
1146 HMainEditor.BufferImage->DiskImage->Size,\r
1147 HMainEditor.BufferImage->MemImage->Offset,\r
1148 HMainEditor.BufferImage->MemImage->Size,\r
1149 BufferType\r
1150 );\r
1151 if (EFI_ERROR (Status)) {\r
1152 return Status;\r
1153 }\r
1154\r
1155 MainTitleBarRefresh (\r
1156 HMainEditor.BufferImage->BufferType == FileTypeFileBuffer?HMainEditor.BufferImage->FileImage->FileName:HMainEditor.BufferImage->BufferType == FileTypeDiskBuffer?HMainEditor.BufferImage->DiskImage->Name:NULL,\r
1157 HMainEditor.BufferImage->BufferType,\r
1158 HMainEditor.BufferImage->FileImage->ReadOnly,\r
1159 FALSE,\r
1160 HMainEditor.ScreenSize.Column,\r
1161 HMainEditor.ScreenSize.Row\r
1162 );\r
1163 Done = TRUE;\r
1164 break;\r
1165\r
1166 case L'n':\r
1167 case L'N':\r
1168 //\r
1169 // the file won't be saved\r
1170 //\r
1171 Done = TRUE;\r
1172 break;\r
1173\r
1174 case L'c':\r
1175 case L'C':\r
1176 return EFI_SUCCESS;\r
1177 }\r
1178 }\r
1179 }\r
1180 //\r
1181 // get disk block device name\r
1182 //\r
1183 Status = InputBarSetPrompt (L"Block Device to Open: ");\r
1184 if (EFI_ERROR (Status)) {\r
1185 return Status;\r
1186 }\r
1187\r
1188 Status = InputBarSetStringSize (100);\r
1189 if (EFI_ERROR (Status)) {\r
1190 return Status;\r
1191 }\r
1192\r
1193 while (1) {\r
1194 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1195\r
1196 //\r
1197 // ESC pressed\r
1198 //\r
1199 if (Status == EFI_NOT_READY) {\r
1200\r
1201 return EFI_SUCCESS;\r
1202 }\r
1203 //\r
1204 // THE input string length should > 0\r
1205 //\r
1206 if (StrLen (InputBarGetString()) > 0) {\r
1207 break;\r
1208 }\r
1209 }\r
1210\r
1211 DeviceName = CatSPrint(NULL, L"%s", InputBarGetString());\r
1212 if (DeviceName == NULL) {\r
1213 return EFI_OUT_OF_RESOURCES;\r
1214 }\r
1215 //\r
1216 // get starting offset\r
1217 //\r
1218 Status = InputBarSetPrompt (L"First Block No.: ");\r
1219 if (EFI_ERROR (Status)) {\r
1220 return Status;\r
1221 }\r
1222\r
1223 Status = InputBarSetStringSize (16);\r
1224 if (EFI_ERROR (Status)) {\r
1225 return Status;\r
1226 }\r
1227\r
1228 while (1) {\r
1229 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1230\r
1231 //\r
1232 // ESC pressed\r
1233 //\r
1234 if (Status == EFI_NOT_READY) {\r
1235\r
1236 return EFI_SUCCESS;\r
1237 }\r
1238 //\r
1239 // THE input string length should > 0\r
1240 //\r
1241 if (StrLen (InputBarGetString()) > 0) {\r
1242 Status = ShellConvertStringToUint64 (InputBarGetString(), &Offset, TRUE, FALSE);\r
1243 if (EFI_ERROR (Status)) {\r
1244 continue;\r
1245 }\r
1246\r
1247 break;\r
1248 }\r
1249 }\r
1250 //\r
1251 // get Number of Blocks:\r
1252 //\r
1253 Status = InputBarSetPrompt (L"Number of Blocks: ");\r
1254 if (EFI_ERROR (Status)) {\r
1255 return Status;\r
1256 }\r
1257\r
1258 Status = InputBarSetStringSize (8);\r
1259 if (EFI_ERROR (Status)) {\r
1260 return Status;\r
1261 }\r
1262\r
1263 while (1) {\r
1264 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1265\r
1266 //\r
1267 // ESC pressed\r
1268 //\r
1269 if (Status == EFI_NOT_READY) {\r
1270\r
1271 return EFI_SUCCESS;\r
1272 }\r
1273 //\r
1274 // THE input string length should > 0\r
1275 //\r
1276 if (StrLen (InputBarGetString()) > 0) {\r
1277 Status = ShellConvertStringToUint64 (InputBarGetString(), &Size, TRUE, FALSE);\r
1278 if (EFI_ERROR (Status)) {\r
1279 continue;\r
1280 }\r
1281\r
1282 if (Size == 0) {\r
1283 continue;\r
1284 }\r
1285\r
1286 break;\r
1287 }\r
1288 }\r
1289\r
1290 Status = HBufferImageRead (\r
1291 NULL,\r
1292 DeviceName,\r
1293 (UINTN)Offset,\r
1294 (UINTN)Size,\r
1295 0,\r
1296 0,\r
1297 FileTypeDiskBuffer,\r
1298 FALSE\r
1299 );\r
1300\r
1301 if (EFI_ERROR (Status)) {\r
1302\r
1303 HBufferImageRead (\r
1304 HMainEditor.BufferImage->FileImage->FileName,\r
1305 HMainEditor.BufferImage->DiskImage->Name,\r
1306 HMainEditor.BufferImage->DiskImage->Offset,\r
1307 HMainEditor.BufferImage->DiskImage->Size,\r
1308 HMainEditor.BufferImage->MemImage->Offset,\r
1309 HMainEditor.BufferImage->MemImage->Size,\r
1310 BufferType,\r
1311 TRUE\r
1312 );\r
1313 return EFI_NOT_FOUND;\r
1314 }\r
1315\r
1316 return EFI_SUCCESS;\r
1317}\r
1318\r
1319EFI_STATUS\r
1320HMainCommandOpenMemory (\r
1321 VOID\r
1322 )\r
1323/*++\r
1324\r
1325Routine Description: \r
1326\r
1327 Load memory content to editor\r
1328\r
1329Arguments: \r
1330\r
1331 None\r
1332\r
1333Returns: \r
1334\r
1335 EFI_SUCCESS\r
1336 EFI_LOAD_ERROR\r
1337 EFI_OUT_OF_RESOURCES\r
1338 EFI_NOT_FOUND\r
1339\r
1340--*/\r
1341{\r
1342 UINT64 Size;\r
1343 UINT64 Offset;\r
1344 EFI_STATUS Status;\r
1345 BOOLEAN Done;\r
1346 EDIT_FILE_TYPE BufferType;\r
1347\r
1348 //\r
1349 // variable initialization\r
1350 //\r
1351 Size = 0;\r
1352 Offset = 0;\r
1353 BufferType = HMainEditor.BufferImage->BufferType;\r
1354\r
1355 //\r
1356 // if current buffer is modified, so you need to choose\r
1357 // whether to save it first.\r
1358 //\r
1359 if (HMainEditor.BufferImage->Modified) {\r
1360\r
1361 Status = InputBarSetPrompt (L"Buffer modified. Save (Yes/No/Cancel) ? ");\r
1362 if (EFI_ERROR (Status)) {\r
1363 return Status;\r
1364 }\r
1365 //\r
1366 // the answer is just one character\r
1367 //\r
1368 Status = InputBarSetStringSize (1);\r
1369 if (EFI_ERROR (Status)) {\r
1370 return Status;\r
1371 }\r
1372 //\r
1373 // loop for user's answer\r
1374 // valid answer is just 'y' 'Y', 'n' 'N', 'c' 'C'\r
1375 //\r
1376 Done = FALSE;\r
1377 while (!Done) {\r
1378 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1379\r
1380 //\r
1381 // ESC pressed\r
1382 //\r
1383 if (Status == EFI_NOT_READY) {\r
1384 return EFI_SUCCESS;\r
1385 }\r
1386\r
1387 switch (InputBarGetString()[0]) {\r
1388 case L'y':\r
1389 case L'Y':\r
1390 //\r
1391 // want to save this buffer first\r
1392 //\r
1393 Status = HBufferImageSave (\r
1394 HMainEditor.BufferImage->FileImage->FileName,\r
1395 HMainEditor.BufferImage->DiskImage->Name,\r
1396 HMainEditor.BufferImage->DiskImage->Offset,\r
1397 HMainEditor.BufferImage->DiskImage->Size,\r
1398 HMainEditor.BufferImage->MemImage->Offset,\r
1399 HMainEditor.BufferImage->MemImage->Size,\r
1400 BufferType\r
1401 );\r
1402 if (EFI_ERROR (Status)) {\r
1403 return Status;\r
1404 }\r
1405\r
1406 MainTitleBarRefresh (\r
1407 HMainEditor.BufferImage->BufferType == FileTypeFileBuffer?HMainEditor.BufferImage->FileImage->FileName:HMainEditor.BufferImage->BufferType == FileTypeDiskBuffer?HMainEditor.BufferImage->DiskImage->Name:NULL,\r
1408 HMainEditor.BufferImage->BufferType,\r
1409 HMainEditor.BufferImage->FileImage->ReadOnly,\r
1410 FALSE,\r
1411 HMainEditor.ScreenSize.Column,\r
1412 HMainEditor.ScreenSize.Row\r
1413 );\r
1414 Done = TRUE;\r
1415 break;\r
1416\r
1417 case L'n':\r
1418 case L'N':\r
1419 //\r
1420 // the file won't be saved\r
1421 //\r
1422 Done = TRUE;\r
1423 break;\r
1424\r
1425 case L'c':\r
1426 case L'C':\r
1427 return EFI_SUCCESS;\r
1428 }\r
1429 }\r
1430 }\r
1431 //\r
1432 // get starting offset\r
1433 //\r
1434 Status = InputBarSetPrompt (L"Starting Offset: ");\r
1435 if (EFI_ERROR (Status)) {\r
1436 return Status;\r
1437 }\r
1438\r
1439 Status = InputBarSetStringSize (8);\r
1440 if (EFI_ERROR (Status)) {\r
1441 return Status;\r
1442 }\r
1443\r
1444 while (1) {\r
1445 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1446\r
1447 //\r
1448 // ESC pressed\r
1449 //\r
1450 if (Status == EFI_NOT_READY) {\r
1451\r
1452 return EFI_SUCCESS;\r
1453 }\r
1454 //\r
1455 // THE input string length should > 0\r
1456 //\r
1457 if (StrLen (InputBarGetString()) > 0) {\r
1458 Status = ShellConvertStringToUint64 (InputBarGetString(), &Offset, TRUE, FALSE);\r
1459 if (EFI_ERROR (Status)) {\r
1460 continue;\r
1461 }\r
1462\r
1463 break;\r
1464 }\r
1465 }\r
1466 //\r
1467 // get Number of Blocks:\r
1468 //\r
1469 Status = InputBarSetPrompt (L"Buffer Size: ");\r
1470 if (EFI_ERROR (Status)) {\r
1471 return Status;\r
1472 }\r
1473\r
1474 Status = InputBarSetStringSize (8);\r
1475 if (EFI_ERROR (Status)) {\r
1476 return Status;\r
1477 }\r
1478\r
1479 while (1) {\r
1480 Status = InputBarRefresh (HMainEditor.ScreenSize.Row, HMainEditor.ScreenSize.Column);\r
1481\r
1482 //\r
1483 // ESC pressed\r
1484 //\r
1485 if (Status == EFI_NOT_READY) {\r
1486\r
1487 return EFI_SUCCESS;\r
1488 }\r
1489 //\r
1490 // THE input string length should > 0\r
1491 //\r
1492 if (StrLen (InputBarGetString()) > 0) {\r
1493 Status = ShellConvertStringToUint64 (InputBarGetString(), &Size, TRUE, FALSE);\r
1494 if (EFI_ERROR (Status)) {\r
1495 continue;\r
1496 }\r
1497\r
1498 if (Size == 0) {\r
1499 continue;\r
1500 }\r
1501\r
1502 break;\r
1503 }\r
1504 }\r
1505\r
1506 if ((Offset + Size - 1)> 0xffffffff) {\r
1507 StatusBarSetStatusString (L"Invalid parameter");\r
1508 return EFI_LOAD_ERROR;\r
1509 }\r
1510\r
1511 Status = HBufferImageRead (\r
1512 NULL,\r
1513 NULL,\r
1514 0,\r
1515 0,\r
1516 (UINTN)Offset,\r
1517 (UINTN)Size,\r
1518 FileTypeMemBuffer,\r
1519 FALSE\r
1520 );\r
1521\r
1522 if (EFI_ERROR (Status)) {\r
1523 StatusBarSetStatusString (L"Read Device Error!");\r
1524 HBufferImageRead (\r
1525 HMainEditor.BufferImage->FileImage->FileName,\r
1526 HMainEditor.BufferImage->DiskImage->Name,\r
1527 HMainEditor.BufferImage->DiskImage->Offset,\r
1528 HMainEditor.BufferImage->DiskImage->Size,\r
1529 HMainEditor.BufferImage->MemImage->Offset,\r
1530 HMainEditor.BufferImage->MemImage->Size,\r
1531 BufferType,\r
1532 TRUE\r
1533 );\r
1534 return EFI_NOT_FOUND;\r
1535 }\r
1536 return EFI_SUCCESS;\r
1537\r
1538}\r
1539\r
1540CONST EDITOR_MENU_ITEM HexEditorMenuItems[] = {\r
1541 {\r
1542 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_GO_TO_OFFSET),\r
1543 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F1),\r
1544 HMainCommandGoToOffset\r
1545 },\r
1546 {\r
1547 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SAVE_BUFFER),\r
1548 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F2),\r
1549 HMainCommandSaveBuffer\r
1550 },\r
1551 {\r
1552 STRING_TOKEN(STR_EDIT_LIBMENUBAR_EXIT),\r
1553 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F3),\r
1554 HMainCommandExit\r
1555 },\r
1556\r
1557 {\r
1558 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_START),\r
1559 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F4),\r
1560 HMainCommandSelectStart\r
1561 },\r
1562 {\r
1563 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_SELECT_END),\r
1564 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F5),\r
1565 HMainCommandSelectEnd\r
1566 },\r
1567 {\r
1568 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_CUT),\r
1569 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F6),\r
1570 HMainCommandCut\r
1571 },\r
1572 {\r
1573 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_PASTE),\r
1574 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F7),\r
1575 HMainCommandPaste\r
1576 },\r
1577\r
1578 {\r
1579 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_FILE),\r
1580 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F8),\r
1581 HMainCommandOpenFile\r
1582 },\r
1583 {\r
1584 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_DISK),\r
1585 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F9),\r
1586 HMainCommandOpenDisk\r
1587 },\r
1588 {\r
1589 STRING_TOKEN(STR_HEXEDIT_LIBMENUBAR_OPEN_MEMORY),\r
1590 STRING_TOKEN(STR_EDIT_LIBMENUBAR_F10),\r
1591 HMainCommandOpenMemory\r
1592 },\r
1593\r
1594 {\r
1595 0,\r
1596 0,\r
1597 NULL\r
1598 }\r
1599};\r
1600\r
1601\r
1602EFI_STATUS\r
1603HMainEditorInit (\r
1604 VOID\r
1605 )\r
1606/*++\r
1607\r
1608Routine Description: \r
1609\r
1610 Init function for MainEditor\r
1611\r
1612Arguments: \r
1613\r
1614 None\r
1615\r
1616Returns: \r
1617\r
1618 EFI_SUCCESS\r
1619 EFI_LOAD_ERROR\r
1620\r
1621--*/\r
1622{\r
1623 EFI_STATUS Status;\r
1624 EFI_HANDLE *HandleBuffer;\r
1625 UINTN HandleCount;\r
1626 UINTN Index;\r
1627\r
1628 //\r
1629 // basic initialization\r
1630 //\r
1631 CopyMem (&HMainEditor, &HMainEditorConst, sizeof (HMainEditor));\r
1632\r
1633 //\r
1634 // set screen attributes\r
1635 //\r
1636 HMainEditor.ColorAttributes.Colors.Foreground = gST->ConOut->Mode->Attribute & 0x000000ff;\r
1637\r
1638 HMainEditor.ColorAttributes.Colors.Background = (UINT8) (gST->ConOut->Mode->Attribute >> 4);\r
1639\r
1640 HOriginalColors = HMainEditor.ColorAttributes.Colors;\r
1641\r
1642 HOriginalMode = gST->ConOut->Mode->Mode;\r
1643\r
1644 //\r
1645 // query screen size\r
1646 //\r
1647 gST->ConOut->QueryMode (\r
1648 gST->ConOut,\r
1649 gST->ConOut->Mode->Mode,\r
1650 &(HMainEditor.ScreenSize.Column),\r
1651 &(HMainEditor.ScreenSize.Row)\r
1652 );\r
1653\r
1654 //\r
1655 // Find mouse in System Table ConsoleInHandle\r
1656 //\r
1657 Status = gBS->HandleProtocol (\r
1658 gST->ConIn,\r
1659 &gEfiSimplePointerProtocolGuid,\r
1660 (VOID**)&HMainEditor.MouseInterface\r
1661 );\r
1662 if (EFI_ERROR (Status)) {\r
1663 //\r
1664 // If there is no Simple Pointer Protocol on System Table\r
1665 //\r
1666 HandleBuffer = NULL;\r
1667 HMainEditor.MouseInterface = NULL;\r
1668 Status = gBS->LocateHandleBuffer (\r
1669 ByProtocol,\r
1670 &gEfiSimplePointerProtocolGuid,\r
1671 NULL,\r
1672 &HandleCount,\r
1673 &HandleBuffer\r
1674 );\r
1675 if (!EFI_ERROR (Status) && HandleCount > 0) {\r
1676 //\r
1677 // Try to find the first available mouse device\r
1678 //\r
1679 for (Index = 0; Index < HandleCount; Index++) {\r
1680 Status = gBS->HandleProtocol (\r
1681 HandleBuffer[Index],\r
1682 &gEfiSimplePointerProtocolGuid,\r
1683 (VOID**)&HMainEditor.MouseInterface\r
1684 );\r
1685 if (!EFI_ERROR (Status)) {\r
1686 break;\r
1687 }\r
1688 }\r
1689 }\r
1690 if (HandleBuffer != NULL) {\r
1691 FreePool (HandleBuffer);\r
1692 }\r
1693 }\r
1694\r
1695 if (!EFI_ERROR (Status) && HMainEditor.MouseInterface != NULL) {\r
1696 HMainEditor.MouseAccumulatorX = 0;\r
1697 HMainEditor.MouseAccumulatorY = 0;\r
1698 HMainEditor.MouseSupported = TRUE;\r
1699 }\r
1700\r
1701 //\r
1702 // below will call the five components' init function\r
1703 //\r
1704 Status = MainTitleBarInit (NULL);\r
1705 if (EFI_ERROR (Status)) {\r
1706 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_TITLE), gShellDebug1HiiHandle);\r
1707 return EFI_LOAD_ERROR;\r
1708 }\r
1709\r
1710 Status = MenuBarInit (HexEditorMenuItems);\r
1711 if (EFI_ERROR (Status)) {\r
1712 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_MAINMENU), gShellDebug1HiiHandle);\r
1713 return EFI_LOAD_ERROR;\r
1714 }\r
1715\r
1716 Status = StatusBarInit ();\r
1717 if (EFI_ERROR (Status)) {\r
1718 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_STATUS), gShellDebug1HiiHandle);\r
1719 return EFI_LOAD_ERROR;\r
1720 }\r
1721\r
1722 InputBarInit ();\r
1723\r
1724 Status = HBufferImageInit ();\r
1725 if (EFI_ERROR (Status)) {\r
1726 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_BUFFERIMAGE), gShellDebug1HiiHandle);\r
1727 return EFI_LOAD_ERROR;\r
1728 }\r
1729\r
1730 Status = HClipBoardInit ();\r
1731 if (EFI_ERROR (Status)) {\r
1732 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_MAINEDITOR_CLIPBOARD), gShellDebug1HiiHandle);\r
1733 return EFI_LOAD_ERROR;\r
1734 }\r
1735 //\r
1736 // clear whole screen and enable cursor\r
1737 //\r
1738 gST->ConOut->ClearScreen (gST->ConOut);\r
1739 gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
1740\r
1741 //\r
1742 // initialize EditorFirst and EditorExit\r
1743 //\r
1744 HEditorFirst = TRUE;\r
1745 HEditorExit = FALSE;\r
1746 HEditorMouseAction = FALSE;\r
1747\r
1748 return EFI_SUCCESS;\r
1749}\r
1750\r
1751EFI_STATUS\r
1752HMainEditorCleanup (\r
1753 VOID\r
1754 )\r
1755/*++\r
1756\r
1757Routine Description: \r
1758\r
1759 cleanup function for MainEditor\r
1760\r
1761Arguments: \r
1762\r
1763 None\r
1764\r
1765Returns: \r
1766\r
1767 EFI_SUCCESS\r
1768 EFI_LOAD_ERROR\r
1769\r
1770--*/\r
1771{\r
1772 EFI_STATUS Status;\r
1773\r
1774 //\r
1775 // call the five components' cleanup function\r
1776 //\r
1777 MainTitleBarCleanup ();\r
1778\r
1779 MenuBarCleanup ();\r
1780\r
1781 StatusBarCleanup ();\r
1782 \r
1783 InputBarCleanup ();\r
1784 \r
1785 Status = HBufferImageCleanup ();\r
1786 if (EFI_ERROR (Status)) {\r
1787 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_BUFFERIMAGE_CLEAN), gShellDebug1HiiHandle);\r
1788 }\r
1789\r
1790 Status = HClipBoardCleanup ();\r
1791 if (EFI_ERROR (Status)) {\r
1792 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HEXEDIT_LIBEDITOR_CLIPBOARD_CLEAN), gShellDebug1HiiHandle);\r
1793 }\r
1794 //\r
1795 // restore old mode\r
1796 //\r
1797 if (HOriginalMode != gST->ConOut->Mode->Mode) {\r
1798 gST->ConOut->SetMode (gST->ConOut, HOriginalMode);\r
1799 }\r
1800\r
1801 gST->ConOut->SetAttribute (\r
1802 gST->ConOut,\r
1803 EFI_TEXT_ATTR (HOriginalColors.Foreground, HOriginalColors.Background)\r
1804 );\r
1805 gST->ConOut->ClearScreen (gST->ConOut);\r
1806\r
1807 return EFI_SUCCESS;\r
1808}\r
1809\r
1810EFI_STATUS\r
1811HMainEditorRefresh (\r
1812 VOID\r
1813 )\r
1814/*++\r
1815\r
1816Routine Description: \r
1817\r
1818 Refresh function for MainEditor\r
1819\r
1820Arguments: \r
1821\r
1822 None\r
1823\r
1824Returns: \r
1825\r
1826 EFI_SUCCESS\r
1827\r
1828--*/\r
1829{\r
1830 //\r
1831 // to aVOID screen flicker\r
1832 // the stall value is from experience\r
1833 //\r
1834 gBS->Stall (50);\r
1835\r
1836 //\r
1837 // call the four components refresh function\r
1838 //\r
1839 MainTitleBarRefresh (\r
1840 HMainEditor.BufferImage->BufferType == FileTypeFileBuffer?HMainEditor.BufferImage->FileImage->FileName:HMainEditor.BufferImage->BufferType == FileTypeDiskBuffer?HMainEditor.BufferImage->DiskImage->Name:NULL,\r
1841 HMainEditor.BufferImage->BufferType,\r
1842 HMainEditor.BufferImage->FileImage->ReadOnly,\r
1843 HMainEditor.BufferImage->Modified,\r
1844 HMainEditor.ScreenSize.Column,\r
1845 HMainEditor.ScreenSize.Row\r
1846 );\r
1847 HBufferImageRefresh ();\r
1848 StatusBarRefresh (\r
1849 HEditorFirst,\r
1850 HMainEditor.ScreenSize.Row,\r
1851 HMainEditor.ScreenSize.Column,\r
1852 0,\r
1853 0,\r
1854 TRUE\r
1855 );\r
1856 MenuBarRefresh ( \r
1857 HMainEditor.ScreenSize.Row,\r
1858 HMainEditor.ScreenSize.Column);\r
1859\r
1860 //\r
1861 // EditorFirst is now set to FALSE\r
1862 //\r
1863 HEditorFirst = FALSE;\r
1864\r
1865 return EFI_SUCCESS;\r
1866}\r
1867\r
1868STATIC\r
1869EFI_STATUS\r
1870HMainEditorHandleMouseInput (\r
1871 IN EFI_SIMPLE_POINTER_STATE MouseState,\r
1872 OUT BOOLEAN *BeforeLeftButtonDown\r
1873 )\r
1874{\r
1875\r
1876 INT32 TextX;\r
1877 INT32 TextY;\r
1878 UINTN FRow;\r
1879 UINTN FCol;\r
1880 BOOLEAN HighBits;\r
1881 LIST_ENTRY *Link;\r
1882 HEFI_EDITOR_LINE *Line;\r
1883 UINTN Index;\r
1884 BOOLEAN Action;\r
1885\r
1886 Action = FALSE;\r
1887\r
1888 //\r
1889 // have mouse movement\r
1890 //\r
1891 if (MouseState.RelativeMovementX || MouseState.RelativeMovementY) {\r
1892 //\r
1893 // handle\r
1894 //\r
1895 TextX = HGetTextX (MouseState.RelativeMovementX);\r
1896 TextY = HGetTextY (MouseState.RelativeMovementY);\r
1897\r
1898 HBufferImageAdjustMousePosition (TextX, TextY);\r
1899\r
1900 Action = TRUE;\r
1901\r
1902 }\r
1903\r
1904 if (MouseState.LeftButton) {\r
1905 HighBits = HBufferImageIsAtHighBits (\r
1906 HMainEditor.BufferImage->MousePosition.Column,\r
1907 &FCol\r
1908 );\r
1909\r
1910 //\r
1911 // not at an movable place\r
1912 //\r
1913 if (FCol == 0) {\r
1914 //\r
1915 // now just move mouse pointer to legal position\r
1916 //\r
1917 //\r
1918 // move mouse position to legal position\r
1919 //\r
1920 HMainEditor.BufferImage->MousePosition.Column -= 10;\r
1921 if (HMainEditor.BufferImage->MousePosition.Column > 24) {\r
1922 HMainEditor.BufferImage->MousePosition.Column--;\r
1923 FCol = HMainEditor.BufferImage->MousePosition.Column / 3 + 1 + 1;\r
1924 } else {\r
1925 if (HMainEditor.BufferImage->MousePosition.Column < 24) {\r
1926 FCol = HMainEditor.BufferImage->MousePosition.Column / 3 + 1 + 1;\r
1927 } else {\r
1928 //\r
1929 // == 24\r
1930 //\r
1931 FCol = 9;\r
1932 }\r
1933 }\r
1934\r
1935 HighBits = TRUE;\r
1936\r
1937 }\r
1938\r
1939 FRow = HMainEditor.BufferImage->BufferPosition.Row +\r
1940 HMainEditor.BufferImage->MousePosition.Row -\r
1941 HMainEditor.BufferImage->DisplayPosition.Row;\r
1942\r
1943 if (HMainEditor.BufferImage->NumLines < FRow) {\r
1944 //\r
1945 // dragging\r
1946 //\r
1947 //\r
1948 // now just move mouse pointer to legal position\r
1949 //\r
1950 FRow = HMainEditor.BufferImage->NumLines;\r
1951 HighBits = TRUE;\r
1952 }\r
1953\r
1954 Link = HMainEditor.BufferImage->ListHead->ForwardLink;\r
1955 for (Index = 0; Index < FRow - 1; Index++) {\r
1956 Link = Link->ForwardLink;\r
1957 }\r
1958\r
1959 Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST);\r
1960\r
1961 //\r
1962 // dragging\r
1963 //\r
1964 //\r
1965 // now just move mouse pointer to legal position\r
1966 //\r
1967 if (FCol > Line->Size) {\r
1968 if (*BeforeLeftButtonDown) {\r
1969 HighBits = FALSE;\r
1970\r
1971 if (Line->Size == 0) {\r
1972 if (FRow > 1) {\r
1973 FRow--;\r
1974 FCol = 16;\r
1975 } else {\r
1976 FRow = 1;\r
1977 FCol = 1;\r
1978 }\r
1979\r
1980 } else {\r
1981 FCol = Line->Size;\r
1982 }\r
1983 } else {\r
1984 FCol = Line->Size + 1;\r
1985 HighBits = TRUE;\r
1986 }\r
1987 }\r
1988\r
1989 HBufferImageMovePosition (FRow, FCol, HighBits);\r
1990\r
1991 HMainEditor.BufferImage->MousePosition.Row = HMainEditor.BufferImage->DisplayPosition.Row;\r
1992\r
1993 HMainEditor.BufferImage->MousePosition.Column = HMainEditor.BufferImage->DisplayPosition.Column;\r
1994\r
1995 *BeforeLeftButtonDown = TRUE;\r
1996\r
1997 Action = TRUE;\r
1998 } else {\r
1999 //\r
2000 // else of if LButton\r
2001 //\r
2002 // release LButton\r
2003 //\r
2004 if (*BeforeLeftButtonDown == TRUE) {\r
2005 Action = TRUE;\r
2006 }\r
2007 //\r
2008 // mouse up\r
2009 //\r
2010 *BeforeLeftButtonDown = FALSE;\r
2011 }\r
2012\r
2013 if (Action) {\r
2014 return EFI_SUCCESS;\r
2015 }\r
2016\r
2017 return EFI_NOT_FOUND;\r
2018}\r
2019\r
2020EFI_STATUS\r
2021HMainEditorKeyInput (\r
2022 VOID\r
2023 )\r
2024/*++\r
2025\r
2026Routine Description: \r
2027\r
2028 Handle user key input. will route it to other components handle function\r
2029\r
2030Arguments: \r
2031\r
2032 None\r
2033\r
2034Returns: \r
2035\r
2036 EFI_SUCCESS\r
2037 EFI_LOAD_ERROR\r
2038 EFI_OUT_OF_RESOURCES\r
2039\r
2040--*/\r
2041{\r
2042 EFI_INPUT_KEY Key;\r
2043 EFI_STATUS Status;\r
2044 EFI_SIMPLE_POINTER_STATE MouseState;\r
2045 BOOLEAN LengthChange;\r
2046 UINTN Size;\r
2047 UINTN OldSize;\r
2048 BOOLEAN BeforeMouseIsDown;\r
2049 BOOLEAN MouseIsDown;\r
2050 BOOLEAN FirstDown;\r
2051 BOOLEAN MouseDrag;\r
2052 UINTN FRow;\r
2053 UINTN FCol;\r
2054 UINTN SelectStartBackup;\r
2055 UINTN SelectEndBackup;\r
2056\r
2057 //\r
2058 // variable initialization\r
2059 //\r
2060 OldSize = 0;\r
2061 FRow = 0;\r
2062 FCol = 0;\r
2063 LengthChange = FALSE;\r
2064\r
2065 MouseIsDown = FALSE;\r
2066 FirstDown = FALSE;\r
2067 MouseDrag = FALSE;\r
2068\r
2069 do {\r
2070\r
2071 Status = EFI_SUCCESS;\r
2072\r
2073 HEditorMouseAction = FALSE;\r
2074\r
2075 //\r
2076 // backup some key elements, so that can aVOID some refresh work\r
2077 //\r
2078 HMainEditorBackup ();\r
2079\r
2080 //\r
2081 // wait for user key input\r
2082 //\r
2083 //\r
2084 // change priority of checking mouse/keyboard activity dynamically\r
2085 // so prevent starvation of keyboard.\r
2086 // if last time, mouse moves then this time check keyboard\r
2087 //\r
2088 if (HMainEditor.MouseSupported) {\r
2089 Status = HMainEditor.MouseInterface->GetState (\r
2090 HMainEditor.MouseInterface,\r
2091 &MouseState\r
2092 );\r
2093 if (!EFI_ERROR (Status)) {\r
2094\r
2095 BeforeMouseIsDown = MouseIsDown;\r
2096\r
2097 Status = HMainEditorHandleMouseInput (MouseState, &MouseIsDown);\r
2098\r
2099 if (!EFI_ERROR (Status)) {\r
2100 if (BeforeMouseIsDown == FALSE) {\r
2101 //\r
2102 // mouse down\r
2103 //\r
2104 if (MouseIsDown == TRUE) {\r
2105 FRow = HBufferImage.BufferPosition.Row;\r
2106 FCol = HBufferImage.BufferPosition.Column;\r
2107 SelectStartBackup = HMainEditor.SelectStart;\r
2108 SelectEndBackup = HMainEditor.SelectEnd;\r
2109\r
2110 FirstDown = TRUE;\r
2111 }\r
2112 } else {\r
2113\r
2114 SelectStartBackup = HMainEditor.SelectStart;\r
2115 SelectEndBackup = HMainEditor.SelectEnd;\r
2116\r
2117 //\r
2118 // begin to drag\r
2119 //\r
2120 if (MouseIsDown == TRUE) {\r
2121 if (FirstDown == TRUE) {\r
2122 if (MouseState.RelativeMovementX || MouseState.RelativeMovementY) {\r
2123 HMainEditor.SelectStart = 0;\r
2124 HMainEditor.SelectEnd = 0;\r
2125 HMainEditor.SelectStart = (FRow - 1) * 0x10 + FCol;\r
2126\r
2127 MouseDrag = TRUE;\r
2128 FirstDown = FALSE;\r
2129 }\r
2130 } else {\r
2131 if ((\r
2132 (HBufferImage.BufferPosition.Row - 1) *\r
2133 0x10 +\r
2134 HBufferImage.BufferPosition.Column\r
2135 ) >= HMainEditor.SelectStart\r
2136 ) {\r
2137 HMainEditor.SelectEnd = (HBufferImage.BufferPosition.Row - 1) *\r
2138 0x10 +\r
2139 HBufferImage.BufferPosition.Column;\r
2140 } else {\r
2141 HMainEditor.SelectEnd = 0;\r
2142 }\r
2143 }\r
2144 //\r
2145 // end of if RelativeX/Y\r
2146 //\r
2147 } else {\r
2148 //\r
2149 // mouse is up\r
2150 //\r
2151 if (MouseDrag) {\r
2152 if (HBufferImageGetTotalSize () == 0) {\r
2153 HMainEditor.SelectStart = 0;\r
2154 HMainEditor.SelectEnd = 0;\r
2155 FirstDown = FALSE;\r
2156 MouseDrag = FALSE;\r
2157 }\r
2158\r
2159 if ((\r
2160 (HBufferImage.BufferPosition.Row - 1) *\r
2161 0x10 +\r
2162 HBufferImage.BufferPosition.Column\r
2163 ) >= HMainEditor.SelectStart\r
2164 ) {\r
2165 HMainEditor.SelectEnd = (HBufferImage.BufferPosition.Row - 1) *\r
2166 0x10 +\r
2167 HBufferImage.BufferPosition.Column;\r
2168 } else {\r
2169 HMainEditor.SelectEnd = 0;\r
2170 }\r
2171\r
2172 if (HMainEditor.SelectEnd == 0) {\r
2173 HMainEditor.SelectStart = 0;\r
2174 }\r
2175 }\r
2176\r
2177 FirstDown = FALSE;\r
2178 MouseDrag = FALSE;\r
2179 }\r
2180\r
2181 if (SelectStartBackup != HMainEditor.SelectStart || SelectEndBackup != HMainEditor.SelectEnd) {\r
2182 if ((SelectStartBackup - 1) / 0x10 != (HMainEditor.SelectStart - 1) / 0x10) {\r
2183 HBufferImageNeedRefresh = TRUE;\r
2184 } else {\r
2185 if ((SelectEndBackup - 1) / 0x10 != (HMainEditor.SelectEnd - 1) / 0x10) {\r
2186 HBufferImageNeedRefresh = TRUE;\r
2187 } else {\r
2188 HBufferImageOnlyLineNeedRefresh = TRUE;\r
2189 }\r
2190 }\r
2191 }\r
2192 }\r
2193\r
2194 HEditorMouseAction = TRUE;\r
2195 HBufferImageMouseNeedRefresh = TRUE;\r
2196\r
2197 } else if (Status == EFI_LOAD_ERROR) {\r
2198 StatusBarSetStatusString (L"Invalid Mouse Movement ");\r
2199 }\r
2200 }\r
2201 }\r
2202\r
2203 Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
2204 if (!EFI_ERROR (Status)) {\r
2205 //\r
2206 // dispatch to different components' key handling function\r
2207 // so not everywhere has to set this variable\r
2208 //\r
2209 HBufferImageMouseNeedRefresh = TRUE;\r
2210\r
2211 //\r
2212 // clear previous status string\r
2213 //\r
2214 StatusBarSetRefresh();\r
2215\r
2216 if (Key.ScanCode == SCAN_NULL) {\r
2217 Status = HBufferImageHandleInput (&Key);\r
2218 } else if (((Key.ScanCode >= SCAN_UP) && (Key.ScanCode <= SCAN_PAGE_DOWN))) {\r
2219 Status = HBufferImageHandleInput (&Key);\r
2220 } else if (((Key.ScanCode >= SCAN_F1) && Key.ScanCode <= (SCAN_F12))) {\r
2221 Status = MenuBarDispatchFunctionKey (&Key);\r
2222 } else {\r
2223 StatusBarSetStatusString (L"Unknown Command");\r
2224\r
2225 HBufferImageMouseNeedRefresh = FALSE;\r
2226 }\r
2227\r
2228 if (Status != EFI_SUCCESS && Status != EFI_OUT_OF_RESOURCES) {\r
2229 //\r
2230 // not already has some error status\r
2231 //\r
2232 if (StrCmp (L"", StatusBarGetString()) == 0) {\r
2233 StatusBarSetStatusString (L"Disk Error. Try Again");\r
2234 }\r
2235 }\r
2236 }\r
2237 //\r
2238 // decide if has to set length warning\r
2239 //\r
2240 if (HBufferImage.BufferType != HBufferImageBackupVar.BufferType) {\r
2241 LengthChange = FALSE;\r
2242 } else {\r
2243 //\r
2244 // still the old buffer\r
2245 //\r
2246 if (HBufferImage.BufferType != FileTypeFileBuffer) {\r
2247 Size = HBufferImageGetTotalSize ();\r
2248\r
2249 switch (HBufferImage.BufferType) {\r
2250 case FileTypeDiskBuffer:\r
2251 OldSize = HBufferImage.DiskImage->Size * HBufferImage.DiskImage->BlockSize;\r
2252 break;\r
2253\r
2254 case FileTypeMemBuffer:\r
2255 OldSize = HBufferImage.MemImage->Size;\r
2256 break;\r
2257 }\r
2258\r
2259 if (LengthChange == FALSE) {\r
2260 if (OldSize != Size) {\r
2261 StatusBarSetStatusString (L"Disk/Mem Buffer Length should not be changed");\r
2262 }\r
2263 }\r
2264\r
2265 if (OldSize != Size) {\r
2266 LengthChange = TRUE;\r
2267 } else {\r
2268 LengthChange = FALSE;\r
2269 }\r
2270 }\r
2271 }\r
2272 //\r
2273 // after handling, refresh editor\r
2274 //\r
2275 HMainEditorRefresh ();\r
2276\r
2277 } while (Status != EFI_OUT_OF_RESOURCES && !HEditorExit);\r
2278\r
2279 return Status;\r
2280}\r
2281\r
2282/**\r
2283 Backup function for MainEditor.\r
2284**/\r
2285VOID\r
2286EFIAPI\r
2287HMainEditorBackup (\r
2288 VOID\r
2289 )\r
2290{\r
2291 HMainEditorBackupVar.SelectStart = HMainEditor.SelectStart;\r
2292 HMainEditorBackupVar.SelectEnd = HMainEditor.SelectEnd;\r
2293 HBufferImageBackup ();\r
2294}\r