/**************************************************************************** ** ** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt for Python. ** ** $QT_BEGIN_LICENSE:COMM$ ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "shibokenbuffer.h" #include #include bool Shiboken::Buffer::checkType(PyObject *pyObj) { #ifdef IS_PY3K return PyObject_CheckBuffer(pyObj) != 0; #else return PyObject_CheckReadBuffer(pyObj) != 0; #endif } void *Shiboken::Buffer::getPointer(PyObject *pyObj, Py_ssize_t *size) { const void *buffer = nullptr; #ifdef IS_PY3K Py_buffer view; if (PyObject_GetBuffer(pyObj, &view, PyBUF_ND) == 0) { if (size) *size = view.len; buffer = view.buf; PyBuffer_Release(&view); return view.buf; } return nullptr; #else Py_ssize_t bufferSize = 0; PyObject_AsReadBuffer(pyObj, &buffer, &bufferSize); if (size) *size = bufferSize; #endif return const_cast(buffer); } PyObject *Shiboken::Buffer::newObject(void *memory, Py_ssize_t size, Type type) { if (size == 0) Py_RETURN_NONE; #ifdef IS_PY3K Py_buffer view; memset(&view, 0, sizeof(Py_buffer)); view.buf = memory; view.len = size; view.readonly = type == Shiboken::Buffer::ReadOnly; view.ndim = 1; view.itemsize = sizeof(char); Py_ssize_t shape[] = { size }; view.shape = shape; // Pep384: This is way too complicated and impossible with the limited api: //return PyMemoryView_FromBuffer(&view); return PyMemoryView_FromMemory(reinterpret_cast(view.buf), size, type == ReadOnly ? PyBUF_READ : PyBUF_WRITE); #else return type == ReadOnly ? PyBuffer_FromMemory(memory, size) : PyBuffer_FromReadWriteMemory(memory, size); #endif } PyObject *Shiboken::Buffer::newObject(const void *memory, Py_ssize_t size) { return newObject(const_cast(memory), size, ReadOnly); }