char *GetCStringLengthFromDict(PyObject * dict, const char *key, Py_ssize_t * length) { char *result, *data; data = GetDataFromDict(dict, key, length); result = (char *)malloc(*length); if (result == NULL) { PyErr_Format(PyExc_ValueError, "Failed to allocate memory!"); return NULL; } memcpy(result, data, *length); return result; }
int FileFromPython(PyObject * dict, GSM_File * file, gboolean check) { char *s; GSM_DateTime nulldt = { 0, 0, 0, 0, 0, 0, 0 }; Py_ssize_t i; if (!PyDict_Check(dict)) { PyErr_Format(PyExc_ValueError, "File is not a dictionary"); return 0; } memset(file, 0, sizeof(file)); if ((file->Used = GetIntFromDict(dict, "Used")) == INT_INVALID) { // We don't need Used in all cases, we can get size from buffer PyErr_Clear(); } if (!CopyStringFromDict(dict, "Name", 300, file->Name)) { if (check) { return 0; } else { PyErr_Clear(); } } if ((i = GetIntFromDict(dict, "Folder")) == INT_INVALID) { if (check) { return 0; } else { PyErr_Clear(); } } else { file->Folder = i; } if ((file->Level = GetIntFromDict(dict, "Level")) == INT_INVALID) { if (check) { return 0; } else { PyErr_Clear(); } } s = GetCharFromDict(dict, "Type"); if (s == NULL) { file->Type = 0; if (check) { return 0; } else { PyErr_Clear(); } } else { file->Type = StringToFileType(s); if (file->Type == ENUM_INVALID) return 0; } if (!CopyStringFromDict(dict, "ID_FullName", 800, file->ID_FullName)) { if (check) { return 0; } else { PyErr_Clear(); } } s = GetDataFromDict(dict, "Buffer", &i); if (s == NULL) { file->Buffer = NULL; file->Used = 0; if (check) { return 0; } else { PyErr_Clear(); } } else { if (file->Used == INT_INVALID) { file->Used = i; } else if (file->Used != (size_t) i) { PyErr_Format(PyExc_ValueError, "Used and Buffer size mismatch in File (%li != %" PY_FORMAT_SIZE_T "i)!", (long)file->Used, i); return 0; } file->Buffer = (unsigned char *)malloc(i * sizeof(unsigned char)); if (file->Buffer == NULL) { PyErr_Format(PyExc_MemoryError, "Not enough memory to allocate buffer (wanted %li bytes)", (long)(i * sizeof(unsigned char))); return 0; } memcpy(file->Buffer, s, i); } file->Modified = GetDateTimeFromDict(dict, "Modified"); if (file->Modified.Year == -1) { file->Modified = nulldt; file->ModifiedEmpty = TRUE; PyErr_Clear(); } else { file->ModifiedEmpty = FALSE; } if ((i = GetIntFromDict(dict, "Protected")) == INT_INVALID) { if (check) { free(file->Buffer); file->Buffer = NULL; return 0; } else { PyErr_Clear(); } } else { file->Protected = i; } if ((i = GetIntFromDict(dict, "ReadOnly")) == INT_INVALID) { if (check) { free(file->Buffer); file->Buffer = NULL; return 0; } else { PyErr_Clear(); } } else { file->ReadOnly = i; } if ((i = GetIntFromDict(dict, "Hidden")) == INT_INVALID) { if (check) { free(file->Buffer); file->Buffer = NULL; return 0; } else { PyErr_Clear(); } } else { file->Hidden = i; } if ((i = GetIntFromDict(dict, "System")) == INT_INVALID) { if (check) { free(file->Buffer); file->Buffer = NULL; return 0; } else { PyErr_Clear(); } } else { file->System = i; } return 1; }