From bc645f5da22111ef7f0e723a2e2c7d6f6a59a3a9 Mon Sep 17 00:00:00 2001 From: heck Date: Wed, 23 Jun 2021 18:26:10 +0200 Subject: [PATCH 1/3] PYADPT-116: refactor blob.data as setter/getter (getter added) --- src/pEp/_pEp/message.cc | 42 ++++++++++++++++++++++++----------------- src/pEp/_pEp/message.hh | 6 +++++- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/pEp/_pEp/message.cc b/src/pEp/_pEp/message.cc index ffdcca7..11bd51a 100644 --- a/src/pEp/_pEp/message.cc +++ b/src/pEp/_pEp/message.cc @@ -34,24 +34,8 @@ namespace pEp { if (!_bl) throw bad_alloc(); - Py_buffer src; - int result = PyObject_GetBuffer(data.ptr(), &src, PyBUF_CONTIG_RO); - if (result) - throw invalid_argument("need a contiguous buffer to read"); - - char *mem = (char *) malloc(src.len); - if (!mem) { - PyBuffer_Release(&src); - throw bad_alloc(); - } - - memcpy(mem, src.buf, src.len); - free(_bl->value); - _bl->size = src.len; - _bl->value = mem; - - PyBuffer_Release(&src); + this->data(data); this->mime_type(mime_type); this->filename(filename); } @@ -110,6 +94,30 @@ namespace pEp { return PyBuffer_FillInfo(view, self, bl->value, bl->size, 0, flags); } + object Message::Blob::data() { + return object(handle<>(PyBytes_FromString(_bl->value))); + } + + void Message::Blob::data(object data) { + Py_buffer src; + int result = PyObject_GetBuffer(data.ptr(), &src, PyBUF_CONTIG_RO); + if (result) + throw invalid_argument("need a contiguous buffer to read"); + + char *mem = (char *) malloc(src.len); + if (!mem) { + PyBuffer_Release(&src); + throw bad_alloc(); + } + + memcpy(mem, src.buf, src.len); + free(_bl->value); + _bl->size = src.len; + _bl->value = mem; + + PyBuffer_Release(&src); + } + string Message::Blob::decode(string encoding) { if (encoding == "") { string _mime_type = _bl->mime_type ? _bl->mime_type : ""; diff --git a/src/pEp/_pEp/message.hh b/src/pEp/_pEp/message.hh index 5eba845..af6df38 100644 --- a/src/pEp/_pEp/message.hh +++ b/src/pEp/_pEp/message.hh @@ -59,6 +59,10 @@ namespace pEp { size_t size() { return _bl->size; } + object data(); + + void data(object data); + string decode(string encoding); string decode() { return decode(""); } @@ -191,4 +195,4 @@ namespace pEp { } /* namespace PythonAdapter */ } /* namespace pEp */ -#endif /* MESSAGE_HH */ \ No newline at end of file +#endif /* MESSAGE_HH */ From 194f18b04f28c3a8affdef8f0b4e170bfea41305 Mon Sep 17 00:00:00 2001 From: heck Date: Wed, 23 Jun 2021 18:26:38 +0200 Subject: [PATCH 2/3] PYADPT-116: add get/set property Blob.data --- src/pEp/_pEp/pEpmodule.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/pEp/_pEp/pEpmodule.cc b/src/pEp/_pEp/pEpmodule.cc index b08278c..5872ed9 100644 --- a/src/pEp/_pEp/pEpmodule.cc +++ b/src/pEp/_pEp/pEpmodule.cc @@ -399,7 +399,10 @@ namespace pEp { "MIME type of object in Blob") .add_property("filename", (string(Message::Blob::*)()) &Message::Blob::filename, (void(Message::Blob::*)(string)) &Message::Blob::filename, - "filename of object in Blob"); + "filename of object in Blob") + .add_property("data", (object(Message::Blob::*)()) &Message::Blob::data, + (void(Message::Blob::*)(object)) &Message::Blob::data, + "data of object in Blob"); ((PyTypeObject *)(void *)blob_class.ptr())->tp_as_buffer = &Message::Blob::bp; From 50a09206cd2602a1d2dc962b2c3baa1625f5ddf6 Mon Sep 17 00:00:00 2001 From: heck Date: Wed, 23 Jun 2021 18:26:51 +0200 Subject: [PATCH 3/3] PYADPT-116: add tests --- tests/test_blob.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/test_blob.py diff --git a/tests/test_blob.py b/tests/test_blob.py new file mode 100644 index 0000000..857c369 --- /dev/null +++ b/tests/test_blob.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# This file is under GNU Affero General Public License 3.0 +# see LICENSE.txt + +"""Blob unit tests.""" + +import pytest + +from . import constants +from . import model + +def test_blob_data_constructor(pEp, model): + bdata = bytes('this is test data', 'utf-8') + b = pEp.Blob(bdata) + assert(b.data == bdata) + +def test_blob_data_property(pEp, model): + b = pEp.Blob(b'dummy') + bdata = bytes('this is test data', 'utf-8') + b.data = bdata + assert(b.data == bdata)