summaryrefslogtreecommitdiffstats
path: root/BaseTools/Source/C/PyUtility/PyUtility.c
blob: f06cb9222d8499fde568fdcbc416b0688bee0ef3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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");
}