mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2026-01-05 11:30:06 +01:00
113 lines
3.2 KiB
Plaintext
113 lines
3.2 KiB
Plaintext
//--------------------------------------------------------------------------
|
|
// Name: src/wxpybuffer.sip
|
|
// Purpose: A MappedType for wxPyBuffer to automatically convert buffer-
|
|
// compatible objects to a C pointer and length.
|
|
//
|
|
// Also MappedTypes for wxMemoryBuffer and wxCharBuffer
|
|
//
|
|
// Author: Robin Dunn
|
|
//
|
|
// Created: 26-Apr-2012
|
|
// Copyright: (c) 2012-2017 by Total Control Software
|
|
// Licence: wxWindows license
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
%ModuleHeaderCode
|
|
#include "wxpybuffer.h"
|
|
%End
|
|
|
|
|
|
%MappedType wxPyBuffer
|
|
{
|
|
%ConvertToTypeCode
|
|
// Code to test a PyObject for compatibility
|
|
if (!sipIsErr) {
|
|
if (PyObject_CheckBuffer(sipPy) // New buffer interface
|
|
|| PyObject_CheckReadBuffer(sipPy)) // or old buffer interface
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
// Code to create a new wxPyBuffer from the PyObject
|
|
wxPyBuffer* buf = new wxPyBuffer();
|
|
buf->create(sipPy);
|
|
*sipCppPtr = buf;
|
|
return sipGetState(sipTransferObj);
|
|
%End
|
|
|
|
|
|
// This isn't being used anywhere yet, but it should work.
|
|
%ConvertFromTypeCode
|
|
return wxPyMakeBuffer(sipCpp->m_ptr, sipCpp->m_len);
|
|
%End
|
|
};
|
|
|
|
|
|
//--------------------------------------------------------------------------
|
|
// The wxMemoryBuffer class can be mapped to/from Python buffer objects
|
|
// similarly, and we'll use a wxPyBuffer to help out.
|
|
|
|
%ModuleHeaderCode
|
|
#include <wx/buffer.h>
|
|
%End
|
|
|
|
|
|
%MappedType wxMemoryBuffer
|
|
{
|
|
%ConvertToTypeCode
|
|
// Code to test a PyObject for compatibility
|
|
if (!sipIsErr) {
|
|
if (PyObject_CheckBuffer(sipPy))
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
// Code to create a new wxMemoryBuffer from the PyObject
|
|
wxPyBuffer pybuf;
|
|
pybuf.create(sipPy);
|
|
wxMemoryBuffer* buf = new wxMemoryBuffer(pybuf.m_len);
|
|
buf->AppendData(pybuf.m_ptr, pybuf.m_len);
|
|
*sipCppPtr = buf;
|
|
return sipGetState(sipTransferObj);
|
|
%End
|
|
|
|
|
|
// Code to convert a wxMemoryBuffer to a Python object
|
|
%ConvertFromTypeCode
|
|
return wxPyMakeBuffer(sipCpp->GetData(), sipCpp->GetDataLen());
|
|
%End
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// wxCharBuffers will be converted to/from bytes objects
|
|
|
|
%MappedType wxCharBuffer
|
|
{
|
|
%ConvertToTypeCode
|
|
// Code to test a PyObject for compatibility
|
|
if (!sipIsErr) {
|
|
if (PyBytes_Check(sipPy))
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
// Code to create a new wxCharBuffer from the PyObject
|
|
char* bbuf;
|
|
Py_ssize_t blen;
|
|
PyBytes_AsStringAndSize(sipPy, &bbuf, &blen);
|
|
wxCharBuffer* cbuf = new wxCharBuffer(blen);
|
|
memcpy(cbuf->data(), bbuf, blen);
|
|
*sipCppPtr = cbuf;
|
|
return sipGetState(sipTransferObj);
|
|
%End
|
|
|
|
|
|
// Code to convert a wxCharBuffer to a Python object
|
|
%ConvertFromTypeCode
|
|
return PyBytes_FromStringAndSize(sipCpp->data(), sipCpp->length());
|
|
%End
|
|
};
|
|
|
|
|
|
//-------------------------------------------------------------------------- |