f06cb9222d8499fde568fdcbc416b0688bee0ef3
[efi/edk2/.git] / edk2 / BaseTools / Source / C / PyUtility / PyUtility.c
1 #include <Python.h>\r
2 #include <Windows.h>\r
3 #include <Common/UefiBaseTypes.h>\r
4 \r
5 /*\r
6  SaveFileToDisk(FilePath, Content)\r
7 */\r
8 STATIC\r
9 PyObject*\r
10 SaveFileToDisk (\r
11   PyObject    *Self,\r
12   PyObject    *Args\r
13   )\r
14 {\r
15   CHAR8         *File;\r
16   UINT8         *Data;\r
17   UINTN         DataLength;\r
18   UINTN         WriteBytes;\r
19   UINTN         Status;\r
20   HANDLE        FileHandle;\r
21   PyObject      *ReturnValue = Py_False;\r
22 \r
23   Status = PyArg_ParseTuple(\r
24             Args,\r
25             "ss#",\r
26             &File,\r
27             &Data,\r
28             &DataLength\r
29             );\r
30   if (Status == 0) {\r
31     return NULL;\r
32   }\r
33 \r
34   FileHandle = CreateFile(\r
35                 File,\r
36                 GENERIC_WRITE,\r
37                 FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_SHARE_DELETE,\r
38                 NULL,\r
39                 CREATE_ALWAYS,\r
40                 FILE_ATTRIBUTE_NORMAL,\r
41                 NULL\r
42                 );\r
43   if (FileHandle == INVALID_HANDLE_VALUE) {\r
44     PyErr_SetString(PyExc_Exception, "File creation failure");\r
45     return NULL;\r
46   }\r
47 \r
48   while (WriteFile(FileHandle, Data, DataLength, &WriteBytes, NULL)) {\r
49     if (DataLength <= WriteBytes) {\r
50       DataLength = 0;\r
51       break;\r
52     }\r
53 \r
54     Data += WriteBytes;\r
55     DataLength -= WriteBytes;\r
56   }\r
57 \r
58   if (DataLength != 0) {\r
59     // file saved unsuccessfully\r
60     PyErr_SetString(PyExc_Exception, "File write failure");\r
61     goto Done;\r
62   }\r
63 \r
64   // \r
65   // Flush buffer may slow down the whole build performance (average 10s slower)\r
66   // \r
67   //if (!FlushFileBuffers(FileHandle)) {\r
68   //  PyErr_SetString(PyExc_Exception, "File flush failure");\r
69   //  goto Done;\r
70   //}\r
71 \r
72   // success!\r
73   ReturnValue = Py_True;\r
74 \r
75 Done:\r
76   CloseHandle(FileHandle);\r
77   return ReturnValue;\r
78 }\r
79 \r
80 STATIC INT8 SaveFileToDiskDocs[] = "SaveFileToDisk(): Make sure the file is saved to disk\n";\r
81 \r
82 STATIC PyMethodDef PyUtility_Funcs[] = {\r
83   {"SaveFileToDisk", (PyCFunction)SaveFileToDisk, METH_VARARGS, SaveFileToDiskDocs},\r
84   {NULL, NULL, 0, NULL}\r
85 };\r
86 \r
87 PyMODINIT_FUNC\r
88 initPyUtility(VOID) {\r
89   Py_InitModule3("PyUtility", PyUtility_Funcs, "Utilties Module Implemented C Language");\r
90 }\r
91 \r
92 \r