示例#1
0
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;
}
示例#2
0
文件: file.c 项目: Romppanen/gammu
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;
}