summaryrefslogtreecommitdiffstats
path: root/AppPkg/Applications/Sockets/WebServer/Handles.c
diff options
context:
space:
mode:
Diffstat (limited to 'AppPkg/Applications/Sockets/WebServer/Handles.c')
-rw-r--r--AppPkg/Applications/Sockets/WebServer/Handles.c294
1 files changed, 294 insertions, 0 deletions
diff --git a/AppPkg/Applications/Sockets/WebServer/Handles.c b/AppPkg/Applications/Sockets/WebServer/Handles.c
new file mode 100644
index 0000000000..f39620aa48
--- /dev/null
+++ b/AppPkg/Applications/Sockets/WebServer/Handles.c
@@ -0,0 +1,294 @@
+/*++
+ This file contains an 'Intel UEFI Application' and is
+ licensed for Intel CPUs and chipsets under the terms of your
+ license agreement with Intel or your vendor. This file may
+ be modified by the user, subject to additional terms of the
+ license agreement
+--*/
+/*++
+
+Copyright (c) 2011 Intel Corporation. All rights reserved
+This software and associated documentation (if any) is furnished
+under a license and may only be used or copied in accordance
+with the terms of the license. Except as permitted by such
+license, no part of this software or documentation may be
+reproduced, stored in a retrieval system, or transmitted in any
+form or by any means without the express written consent of
+Intel Corporation.
+
+--*/
+
+/** @file
+ Display the handles in the system
+
+**/
+
+#include <WebServer.h>
+
+
+/**
+ Respond with the handles in the system
+
+ @param [in] SocketFD The socket's file descriptor to add to the list.
+ @param [in] pPort The WSDT_PORT structure address
+ @param [out] pbDone Address to receive the request completion status
+
+ @retval EFI_SUCCESS The request was successfully processed
+
+**/
+EFI_STATUS
+HandlePage (
+ IN int SocketFD,
+ IN WSDT_PORT * pPort,
+ OUT BOOLEAN * pbDone
+ )
+{
+ INTN Digit;
+ INTN Entries;
+ INTN Index;
+ UINTN GuidCount;
+ UINTN LengthInBytes;
+ UINT8 * pDigit;
+ EFI_HANDLE * pHandleArray;
+ EFI_HANDLE * pHandle;
+ EFI_HANDLE * pHandleEnd;
+ EFI_GUID ** ppGuidArray;
+ EFI_GUID ** ppGuid;
+ EFI_GUID ** ppGuidEnd;
+ INTN Shift;
+ EFI_STATUS Status;
+ UINTN Value;
+ CONST UINTN cDigit [] = {
+ 3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, 12, 13, 14, 15 };
+
+ DBG_ENTER ( );
+
+ //
+ // Send the handles page
+ //
+ for ( ; ; ) {
+ //
+ // Send the page header
+ //
+ Status = HttpPageHeader ( SocketFD, pPort, L"Handle Database" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Build the table header
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "<h1>Handle Database</h1>\r\n"
+ "<table border=\"1\">\r\n"
+ " <tr bgcolor=\"c0c0ff\"><th>Handle</th><th>Protocol Guids</th></tr>\r\n" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Determine the number of handles in the database
+ //
+ LengthInBytes = 0;
+ Status = gBS->LocateHandle ( AllHandles,
+ NULL,
+ NULL,
+ &LengthInBytes,
+ NULL );
+ if ( EFI_BUFFER_TOO_SMALL == Status ) {
+ //
+ // Allocate space for the handles
+ //
+ Status = gBS->AllocatePool ( EfiRuntimeServicesData,
+ LengthInBytes,
+ (VOID **) &pHandleArray );
+ if ( !EFI_ERROR ( Status )) {
+ //
+ // Get the list of handles
+ //
+ Status = gBS->LocateHandle ( AllHandles,
+ NULL,
+ NULL,
+ &LengthInBytes,
+ pHandleArray );
+ if ( !EFI_ERROR ( Status )) {
+ Entries = LengthInBytes / sizeof ( *pHandleArray );
+ pHandle = pHandleArray;
+ pHandleEnd = &pHandle [ Entries ];
+ while ( pHandleEnd > pHandle ) {
+ //
+ // Build the table entry for this page
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "<tr><td><code>0x" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ Value = (UINTN) *pHandle;
+ for ( Shift = ( sizeof ( Shift ) << 3 ) - 4; 0 <= Shift; Shift -= 4 ) {
+ //
+ // Convert the next address nibble to ANSI hex
+ //
+ Digit = (( Value >> Shift ) & 0xf ) | '0';
+ if ( '9' < Digit ) {
+ Digit += 'a' - '0' - 10;
+ }
+
+ //
+ // Display the address digit
+ //
+ Status = HttpSendByte ( SocketFD,
+ pPort,
+ (UINT8) Digit );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ }
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Start the second column
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "</code></td><td><code>\r\n" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Determine the number of protocols connected to this handle
+ //
+ Status = gBS->ProtocolsPerHandle ( *pHandle,
+ &ppGuidArray,
+ &GuidCount );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ ppGuid = ppGuidArray;
+ ppGuidEnd = &ppGuid [ GuidCount ];
+ while ( ppGuidEnd > ppGuid ) {
+ //
+ // Display the guid
+ //
+ pDigit = (UINT8 *) *ppGuid;
+ for ( Index = 0; 16 > Index; Index++ ) {
+ //
+ // Separate the portions of the GUID
+ // 99E87DCF-6162-40c5-9FA1-32111F5197F7
+ //
+ if (( 4 == Index )
+ || ( 6 == Index )
+ || ( 8 == Index )
+ || ( 10 == Index )) {
+ Status = HttpSendByte ( SocketFD,
+ pPort,
+ '-' );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ }
+
+ //
+ // Display the GUID digits
+ //
+ Value = pDigit [ cDigit [ Index ]];
+ for ( Shift = 4; 0 <= Shift; Shift -= 4 ) {
+ //
+ // Convert the next address nibble to ANSI hex
+ //
+ Digit = (( Value >> Shift ) & 0xf ) | '0';
+ if ( '9' < Digit ) {
+ Digit += 'a' - '0' - 10;
+ }
+
+ //
+ // Display the address digit
+ //
+ Status = HttpSendByte ( SocketFD,
+ pPort,
+ (UINT8) Digit );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ }
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+ }
+
+ //
+ // Separate each GUID
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "<br/>\r\n" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Set the next protocol
+ //
+ ppGuid+= 1;
+ }
+
+ //
+ // Free the GUID array
+ //
+ gBS->FreePool ( ppGuidArray );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // End the row
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "</code></td></tr>\r\n" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Set the next handle
+ //
+ pHandle += 1;
+ }
+ }
+
+ //
+ // Done with the handle array
+ //
+ gBS->FreePool ( pHandleArray );
+ }
+ }
+
+ //
+ // Build the table trailer
+ //
+ Status = HttpSendAnsiString ( SocketFD,
+ pPort,
+ "</table>\r\n" );
+ if ( EFI_ERROR ( Status )) {
+ break;
+ }
+
+ //
+ // Send the page trailer
+ //
+ Status = HttpPageTrailer ( SocketFD, pPort, pbDone );
+ break;
+ }
+
+ //
+ // Return the operation status
+ //
+ DBG_EXIT_STATUS ( Status );
+ return Status;
+}