Changed the interface parameters
[people/mcb30/basetools.git] / Source / C / PyEfiCompressor / EfiCompressor.c
index e32478d..38a81c3 100644 (file)
@@ -9,9 +9,9 @@ PyObject*
 UefiDecompress(\r
   PyObject    *Self,\r
   PyObject    *Args\r
-  ) \r
+  )\r
 {\r
-  PyTypeObject  *SrcData;\r
+  PyObject      *SrcData;\r
   UINT32        SrcDataSize;\r
   UINT32        DstDataSize;\r
   UINTN         Status;\r
@@ -23,45 +23,47 @@ UefiDecompress(
 \r
   Status = PyArg_ParseTuple(\r
             Args,\r
-            "0ii",\r
+            "Oi",\r
             &SrcData,\r
-            &SrcDataSize,\r
-            &DstDataSize\r
+            &SrcDataSize\r
             );\r
   if (Status == 0) {\r
     return NULL;\r
   }\r
 \r
-  if (SrcData->tp_as_buffer == NULL\r
-      || SrcData->tp_as_buffer->bf_getreadbuffer == NULL\r
-      || SrcData->tp_as_buffer->bf_getsegcount == NULL) {\r
+  if (SrcData->ob_type->tp_as_buffer == NULL\r
+      || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL\r
+      || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) {\r
+    PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n");\r
     return NULL;\r
   }\r
 \r
   // Because some Python objects which support "buffer" protocol have more than one\r
   // memory segment, we have to copy them into a contiguous memory.\r
-  SrcBuf = malloc(SrcDataSize);\r
-  DstBuf = malloc(DstDataSize);\r
-  if (SrcBuf == NULL || DstBuf == NULL) {\r
+  SrcBuf = PyMem_Malloc(SrcDataSize);\r
+  if (SrcBuf == NULL) {\r
+    PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
     goto ERROR;\r
   }\r
 \r
-  SegNum = SrcData->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
+  SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
   TmpBuf = SrcBuf;\r
   for (Index = 0; Index < SegNum; ++Index) {\r
     VOID *BufSeg;\r
     Py_ssize_t Len;\r
 \r
-    Len = SrcData->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
+    Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
     if (Len < 0) {\r
+      PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n");\r
       goto ERROR;\r
     }\r
     memcpy(TmpBuf, BufSeg, Len);\r
     TmpBuf += Len;\r
   }\r
 \r
-  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 1);\r
+  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 1);\r
   if (Status != EFI_SUCCESS) {\r
+    PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
     goto ERROR;\r
   }\r
 \r
@@ -86,7 +88,7 @@ FrameworkDecompress(
   PyObject    *Args\r
   )\r
 {\r
-  PyTypeObject  *SrcData;\r
+  PyObject      *SrcData;\r
   UINT32        SrcDataSize;\r
   UINT32        DstDataSize;\r
   UINTN         Status;\r
@@ -98,49 +100,51 @@ FrameworkDecompress(
 \r
   Status = PyArg_ParseTuple(\r
             Args,\r
-            "0ii",\r
+            "Oi",\r
             &SrcData,\r
-            &SrcDataSize,\r
-            &DstDataSize\r
+            &SrcDataSize\r
             );\r
   if (Status == 0) {\r
     return NULL;\r
   }\r
 \r
-  if (SrcData->tp_as_buffer == NULL\r
-      || SrcData->tp_as_buffer->bf_getreadbuffer == NULL\r
-      || SrcData->tp_as_buffer->bf_getsegcount == NULL) {\r
+  if (SrcData->ob_type->tp_as_buffer == NULL\r
+      || SrcData->ob_type->tp_as_buffer->bf_getreadbuffer == NULL\r
+      || SrcData->ob_type->tp_as_buffer->bf_getsegcount == NULL) {\r
+    PyErr_SetString(PyExc_Exception, "First argument is not a buffer\n");\r
     return NULL;\r
   }\r
 \r
   // Because some Python objects which support "buffer" protocol have more than one\r
   // memory segment, we have to copy them into a contiguous memory.\r
-  SrcBuf = malloc(SrcDataSize);\r
-  DstBuf = malloc(DstDataSize);\r
-  if (SrcBuf == NULL || DstBuf == NULL) {\r
+  SrcBuf = PyMem_Malloc(SrcDataSize);\r
+  if (SrcBuf == NULL) {\r
+    PyErr_SetString(PyExc_Exception, "Not enough memory\n");\r
     goto ERROR;\r
   }\r
 \r
-  SegNum = SrcData->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
+  SegNum = SrcData->ob_type->tp_as_buffer->bf_getsegcount((PyObject *)SrcData, NULL);\r
   TmpBuf = SrcBuf;\r
   for (Index = 0; Index < SegNum; ++Index) {\r
     VOID *BufSeg;\r
     Py_ssize_t Len;\r
 \r
-    Len = SrcData->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
+    Len = SrcData->ob_type->tp_as_buffer->bf_getreadbuffer((PyObject *)SrcData, Index, &BufSeg);\r
     if (Len < 0) {\r
+      PyErr_SetString(PyExc_Exception, "Buffer segment is not available\n");\r
       goto ERROR;\r
     }\r
     memcpy(TmpBuf, BufSeg, Len);\r
     TmpBuf += Len;\r
   }\r
 \r
-  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID *)DstBuf, DstDataSize, 2);\r
+  Status = Extract((VOID *)SrcBuf, SrcDataSize, (VOID **)&DstBuf, &DstDataSize, 2);\r
   if (Status != EFI_SUCCESS) {\r
+    PyErr_SetString(PyExc_Exception, "Failed to decompress\n");\r
     goto ERROR;\r
   }\r
 \r
-  return PyBuffer_FromMemory(DstBuf, (Py_ssize_t)DstDataSize);\r
+  return PyString_FromStringAndSize((CONST INT8*)DstBuf, (Py_ssize_t)DstDataSize);\r
 \r
 ERROR:\r
   if (SrcBuf != NULL) {\r
@@ -153,12 +157,13 @@ ERROR:
   return NULL;\r
 }\r
 \r
+\r
 STATIC\r
 PyObject*\r
 UefiCompress(\r
   PyObject    *Self,\r
   PyObject    *Args\r
-  ) \r
+  )\r
 {\r
   return NULL;\r
 }\r