Reviewed-by: Jaben Carsey <jaben.car...@intel.com> >-----Original Message----- >From: Qiu, Shumin >Sent: Monday, June 22, 2015 11:30 PM >To: edk2-devel@lists.sourceforge.net >Cc: Carsey, Jaben; Gao, Liming >Subject: [PATCH] MdePkg\Library\UefiFileHandleLib: Make >FileHandleWriteLine support both ASCII and UNICODE file. >Importance: High > >When the file is a UNICODE file (with UNICODE file tag) write UNICODE text. >When the file is an ASCII file write ASCII text. >If the file size is zero (without the file tag at the beginning) write ASCII >text as >default. > >Contributed-under: TianoCore Contribution Agreement 1.0 >Signed-off-by: Qiu Shumin <shumin....@intel.com> >--- > MdePkg/Include/Library/FileHandleLib.h | 10 ++- > .../Library/UefiFileHandleLib/UefiFileHandleLib.c | 97 >++++++++++++++++++++-- > 2 files changed, 97 insertions(+), 10 deletions(-) > >diff --git a/MdePkg/Include/Library/FileHandleLib.h >b/MdePkg/Include/Library/FileHandleLib.h >index bfcf8a4..b5ac19a 100644 >--- a/MdePkg/Include/Library/FileHandleLib.h >+++ b/MdePkg/Include/Library/FileHandleLib.h >@@ -433,7 +433,13 @@ FileHandleReturnLine( > ); > > /** >- Function to write a line of unicode text to a file. >+ Function to write a line of text to a file. >+ >+ If the file is a Unicode file (with UNICODE file tag) then write the unicode >+ text. >+ If the file is an ASCII file then write the ASCII text. >+ If the size of file is zero (without file tag at the beginning) then write >+ ASCII text as default. > > @param[in] Handle FileHandle to write to. > @param[in] Buffer Buffer to write, if NULL the function will >@@ -442,6 +448,8 @@ FileHandleReturnLine( > @retval EFI_SUCCESS The data was written. > Buffer is NULL. > @retval EFI_INVALID_PARAMETER Handle is NULL. >+ @retval EFI_OUT_OF_RESOURCES Unable to allocate temporary space for >ASCII >+ string due to out of resources. > > @sa FileHandleWrite > **/ >diff --git a/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c >b/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c >index 96f16ca..f6cbfad 100644 >--- a/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c >+++ b/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c >@@ -1027,7 +1027,13 @@ FileHandleReadLine( > } > > /** >- Function to write a line of unicode text to a file. >+ Function to write a line of text to a file. >+ >+ If the file is a Unicode file (with UNICODE file tag) then write the unicode >+ text. >+ If the file is an ASCII file then write the ASCII text. >+ If the size of file is zero (without file tag at the beginning) then write >+ ASCII text as default. > > @param[in] Handle FileHandle to write to. > @param[in] Buffer Buffer to write, if NULL the function will >@@ -1036,6 +1042,8 @@ FileHandleReadLine( > @retval EFI_SUCCESS The data was written. > Buffer is NULL. > @retval EFI_INVALID_PARAMETER Handle is NULL. >+ @retval EFI_OUT_OF_RESOURCES Unable to allocate temporary space for >ASCII >+ string due to out of resources. > > @sa FileHandleWrite > **/ >@@ -1046,8 +1054,14 @@ FileHandleWriteLine( > IN CHAR16 *Buffer > ) > { >- EFI_STATUS Status; >- UINTN Size; >+ EFI_STATUS Status; >+ CHAR16 CharBuffer; >+ UINTN Size; >+ UINTN CharSize; >+ UINT64 FileSize; >+ UINT64 OriginalFilePosition; >+ BOOLEAN Ascii; >+ CHAR8 *AsciiBuffer; > > if (Buffer == NULL) { > return (EFI_SUCCESS); >@@ -1056,14 +1070,79 @@ FileHandleWriteLine( > if (Handle == NULL) { > return (EFI_INVALID_PARAMETER); > } >- >- Size = StrSize(Buffer) - sizeof(Buffer[0]); >- Status = FileHandleWrite(Handle, &Size, Buffer); >+ >+ Ascii = FALSE; >+ AsciiBuffer = NULL; >+ >+ Status = FileHandleGetPosition(Handle, &OriginalFilePosition); > if (EFI_ERROR(Status)) { >- return (Status); >+ return Status; >+ } >+ >+ Status = FileHandleSetPosition(Handle, 0); >+ if (EFI_ERROR(Status)) { >+ return Status; > } >- Size = StrSize(L"\r\n") - sizeof(CHAR16); >- return FileHandleWrite(Handle, &Size, L"\r\n"); >+ >+ Status = FileHandleGetSize(Handle, &FileSize); >+ if (EFI_ERROR(Status)) { >+ return Status; >+ } >+ >+ if (FileSize == 0) { >+ Ascii = TRUE; >+ } else { >+ CharSize = sizeof (CHAR16); >+ Status = FileHandleRead (Handle, &CharSize, &CharBuffer); >+ ASSERT_EFI_ERROR (Status); >+ if (CharBuffer == gUnicodeFileTag) { >+ Ascii = FALSE; >+ } else { >+ Ascii = TRUE; >+ } >+ } >+ >+ Status = FileHandleSetPosition(Handle, OriginalFilePosition); >+ if (EFI_ERROR(Status)) { >+ return Status; >+ } >+ >+ if (Ascii) { >+ Size = ( StrSize(Buffer) / sizeof(CHAR16) ) * sizeof(CHAR8); >+ AsciiBuffer = (CHAR8 *)AllocateZeroPool(Size); >+ if (AsciiBuffer == NULL) { >+ return EFI_OUT_OF_RESOURCES; >+ } >+ UnicodeStrToAsciiStr (Buffer, AsciiBuffer); >+ >+ Size = AsciiStrSize(AsciiBuffer) - sizeof(CHAR8); >+ Status = FileHandleWrite(Handle, &Size, AsciiBuffer); >+ if (EFI_ERROR(Status)) { >+ FreePool (AsciiBuffer); >+ return (Status); >+ } >+ Size = AsciiStrSize("\r\n") - sizeof(CHAR8); >+ Status = FileHandleWrite(Handle, &Size, "\r\n"); >+ } else { >+ if (OriginalFilePosition == 0) { >+ Status = FileHandleSetPosition (Handle, sizeof(CHAR16)); >+ if (EFI_ERROR(Status)) { >+ return Status; >+ } >+ } >+ Size = StrSize(Buffer) - sizeof(CHAR16); >+ Status = FileHandleWrite(Handle, &Size, Buffer); >+ if (EFI_ERROR(Status)) { >+ return (Status); >+ } >+ Size = StrSize(L"\r\n") - sizeof(CHAR16); >+ Status = FileHandleWrite(Handle, &Size, L"\r\n"); >+ } >+ >+ if (AsciiBuffer != NULL) { >+ FreePool (AsciiBuffer); >+ } >+ return Status; > } > > /** >-- >1.9.5.msysgit.1 >
------------------------------------------------------------------------------ Monitor 25 network devices or servers for free with OpManager! OpManager is web-based network management software that monitors network devices and physical & virtual servers, alerts via email & sms for fault. Monitor 25 devices for free with no restriction. Download now http://ad.doubleclick.net/ddm/clk/292181274;119417398;o _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel