1 /** @file 2 Python Utility 3 4 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR> 5 This program and the accompanying materials are licensed and made available 6 under the terms and conditions of the BSD License which accompanies this 7 distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include <Python.h> 16 #include <Windows.h> 17 #include <Common/UefiBaseTypes.h> 18 19 /* 20 SaveFileToDisk(FilePath, Content) 21 */ 22 STATIC 23 PyObject* 24 SaveFileToDisk ( 25 PyObject *Self, 26 PyObject *Args 27 ) 28 { 29 CHAR8 *File; 30 UINT8 *Data; 31 UINTN DataLength; 32 UINTN WriteBytes; 33 UINTN Status; 34 HANDLE FileHandle; 35 PyObject *ReturnValue = Py_False; 36 37 Status = PyArg_ParseTuple( 38 Args, 39 "ss#", 40 &File, 41 &Data, 42 &DataLength 43 ); 44 if (Status == 0) { 45 return NULL; 46 } 47 48 FileHandle = CreateFile( 49 File, 50 GENERIC_WRITE, 51 FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE, 52 NULL, 53 CREATE_ALWAYS, 54 FILE_ATTRIBUTE_NORMAL, 55 NULL 56 ); 57 if (FileHandle == INVALID_HANDLE_VALUE) { 58 PyErr_SetString(PyExc_Exception, "File creation failure"); 59 return NULL; 60 } 61 62 while (WriteFile(FileHandle, Data, DataLength, &WriteBytes, NULL)) { 63 if (DataLength <= WriteBytes) { 64 DataLength = 0; 65 break; 66 } 67 68 Data += WriteBytes; 69 DataLength -= WriteBytes; 70 } 71 72 if (DataLength != 0) { 73 // file saved unsuccessfully 74 PyErr_SetString(PyExc_Exception, "File write failure"); 75 goto Done; 76 } 77 78 // 79 // Flush buffer may slow down the whole build performance (average 10s slower) 80 // 81 //if (!FlushFileBuffers(FileHandle)) { 82 // PyErr_SetString(PyExc_Exception, "File flush failure"); 83 // goto Done; 84 //} 85 86 // success! 87 ReturnValue = Py_True; 88 89 Done: 90 CloseHandle(FileHandle); 91 return ReturnValue; 92 } 93 94 STATIC INT8 SaveFileToDiskDocs[] = "SaveFileToDisk(): Make sure the file is saved to disk\n"; 95 96 STATIC PyMethodDef PyUtility_Funcs[] = { 97 {"SaveFileToDisk", (PyCFunction)SaveFileToDisk, METH_VARARGS, SaveFileToDiskDocs}, 98 {NULL, NULL, 0, NULL} 99 }; 100 101 PyMODINIT_FUNC 102 initPyUtility(VOID) { 103 Py_InitModule3("PyUtility", PyUtility_Funcs, "Utilties Module Implemented C Language"); 104 } 105 106 107