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");
 | 
						|
}
 | 
						|
 | 
						|
 |