Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu <yingke.d.liu@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15971 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
| Python Utility
 | |
| 
 | |
| Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials are licensed and made available 
 | |
| under the terms and conditions of the BSD License which accompanies this 
 | |
| distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include <Python.h>
 | |
| #include <Windows.h>
 | |
| #include <Common/UefiBaseTypes.h>
 | |
| 
 | |
| /*
 | |
|  SaveFileToDisk(FilePath, Content)
 | |
| */
 | |
| STATIC
 | |
| PyObject*
 | |
| SaveFileToDisk (
 | |
|   PyObject    *Self,
 | |
|   PyObject    *Args
 | |
|   )
 | |
| {
 | |
|   CHAR8         *File;
 | |
|   UINT8         *Data;
 | |
|   UINTN         DataLength;
 | |
|   UINTN         WriteBytes;
 | |
|   UINTN         Status;
 | |
|   HANDLE        FileHandle;
 | |
|   PyObject      *ReturnValue = Py_False;
 | |
| 
 | |
|   Status = PyArg_ParseTuple(
 | |
|             Args,
 | |
|             "ss#",
 | |
|             &File,
 | |
|             &Data,
 | |
|             &DataLength
 | |
|             );
 | |
|   if (Status == 0) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   FileHandle = CreateFile(
 | |
|                 File,
 | |
|                 GENERIC_WRITE,
 | |
|                 FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,
 | |
|                 NULL,
 | |
|                 CREATE_ALWAYS,
 | |
|                 FILE_ATTRIBUTE_NORMAL,
 | |
|                 NULL
 | |
|                 );
 | |
|   if (FileHandle == INVALID_HANDLE_VALUE) {
 | |
|     PyErr_SetString(PyExc_Exception, "File creation failure");
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   while (WriteFile(FileHandle, Data, DataLength, &WriteBytes, NULL)) {
 | |
|     if (DataLength <= WriteBytes) {
 | |
|       DataLength = 0;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     Data += WriteBytes;
 | |
|     DataLength -= WriteBytes;
 | |
|   }
 | |
| 
 | |
|   if (DataLength != 0) {
 | |
|     // file saved unsuccessfully
 | |
|     PyErr_SetString(PyExc_Exception, "File write failure");
 | |
|     goto Done;
 | |
|   }
 | |
| 
 | |
|   // 
 | |
|   // Flush buffer may slow down the whole build performance (average 10s slower)
 | |
|   // 
 | |
|   //if (!FlushFileBuffers(FileHandle)) {
 | |
|   //  PyErr_SetString(PyExc_Exception, "File flush failure");
 | |
|   //  goto Done;
 | |
|   //}
 | |
| 
 | |
|   // success!
 | |
|   ReturnValue = Py_True;
 | |
| 
 | |
| Done:
 | |
|   CloseHandle(FileHandle);
 | |
|   return ReturnValue;
 | |
| }
 | |
| 
 | |
| STATIC INT8 SaveFileToDiskDocs[] = "SaveFileToDisk(): Make sure the file is saved to disk\n";
 | |
| 
 | |
| STATIC PyMethodDef PyUtility_Funcs[] = {
 | |
|   {"SaveFileToDisk", (PyCFunction)SaveFileToDisk, METH_VARARGS, SaveFileToDiskDocs},
 | |
|   {NULL, NULL, 0, NULL}
 | |
| };
 | |
| 
 | |
| PyMODINIT_FUNC
 | |
| initPyUtility(VOID) {
 | |
|   Py_InitModule3("PyUtility", PyUtility_Funcs, "Utilties Module Implemented C Language");
 | |
| }
 | |
| 
 | |
| 
 |