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