/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ %module cproton %{ /* Includes the header in the wrapper code */ #if defined(_WIN32) && ! defined(__CYGWIN__) #include #endif #include #include #include #include #include #include #include #include %} %include %cstring_output_withsize(char *OUTPUT, size_t *OUTPUT_SIZE) %cstring_output_allocate_size(char **ALLOC_OUTPUT, size_t *ALLOC_SIZE, free(*$1)); %cstring_output_maxsize(char *OUTPUT, size_t MAX_OUTPUT_SIZE) // These are not used/needed in the python binding %ignore pn_message_get_id; %ignore pn_message_set_id; %ignore pn_message_get_correlation_id; %ignore pn_message_set_correlation_id; %typemap(in) pn_bytes_t { if ($input == Py_None) { $1.start = NULL; $1.size = 0; } else { $1.start = PyString_AsString($input); if (!$1.start) { return NULL; } $1.size = PyString_Size($input); } } %typemap(out) pn_bytes_t { $result = PyString_FromStringAndSize($1.start, $1.size); } %typemap(out) pn_delivery_tag_t { $result = PyString_FromStringAndSize($1.bytes, $1.size); } %typemap(in) pn_uuid_t { memset($1.bytes, 0, 16); if ($input == Py_None) { ; // Already zeroed out } else { const char* b = PyString_AsString($input); if (b) { memmove($1.bytes, b, (PyString_Size($input) < 16 ? PyString_Size($input) : 16)); } else { return NULL; } } } %typemap(out) pn_uuid_t { $result = PyString_FromStringAndSize($1.bytes, 16); } %apply pn_uuid_t { pn_decimal128_t }; int pn_message_load(pn_message_t *msg, char *STRING, size_t LENGTH); %ignore pn_message_load; int pn_message_load_data(pn_message_t *msg, char *STRING, size_t LENGTH); %ignore pn_message_load_data; int pn_message_load_text(pn_message_t *msg, char *STRING, size_t LENGTH); %ignore pn_message_load_text; int pn_message_load_amqp(pn_message_t *msg, char *STRING, size_t LENGTH); %ignore pn_message_load_amqp; int pn_message_load_json(pn_message_t *msg, char *STRING, size_t LENGTH); %ignore pn_message_load_json; int pn_message_encode(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_encode; int pn_message_save(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_save; int pn_message_save_data(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_save_data; int pn_message_save_text(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_save_text; int pn_message_save_amqp(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_save_amqp; int pn_message_save_json(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_message_save_json; ssize_t pn_link_send(pn_link_t *transport, char *STRING, size_t LENGTH); %ignore pn_link_send; %rename(pn_link_recv) wrap_pn_link_recv; %inline %{ int wrap_pn_link_recv(pn_link_t *link, char *OUTPUT, size_t *OUTPUT_SIZE) { ssize_t sz = pn_link_recv(link, OUTPUT, *OUTPUT_SIZE); if (sz >= 0) { *OUTPUT_SIZE = sz; } else { *OUTPUT_SIZE = 0; } return sz; } %} %ignore pn_link_recv; ssize_t pn_transport_push(pn_transport_t *transport, char *STRING, size_t LENGTH); %ignore pn_transport_push; %rename(pn_transport_peek) wrap_pn_transport_peek; %inline %{ int wrap_pn_transport_peek(pn_transport_t *transport, char *OUTPUT, size_t *OUTPUT_SIZE) { ssize_t sz = pn_transport_peek(transport, OUTPUT, *OUTPUT_SIZE); if (sz >= 0) { *OUTPUT_SIZE = sz; } else { *OUTPUT_SIZE = 0; } return sz; } %} %ignore pn_transport_peek; %rename(pn_delivery) wrap_pn_delivery; %inline %{ pn_delivery_t *wrap_pn_delivery(pn_link_t *link, char *STRING, size_t LENGTH) { return pn_delivery(link, pn_dtag(STRING, LENGTH)); } %} %ignore pn_delivery; %rename(pn_delivery_tag) wrap_pn_delivery_tag; %inline %{ void wrap_pn_delivery_tag(pn_delivery_t *delivery, char **ALLOC_OUTPUT, size_t *ALLOC_SIZE) { pn_delivery_tag_t tag = pn_delivery_tag(delivery); *ALLOC_OUTPUT = (char *) malloc(tag.size); *ALLOC_SIZE = tag.size; memcpy(*ALLOC_OUTPUT, tag.bytes, tag.size); } %} %ignore pn_delivery_tag; %rename(pn_message_data) wrap_pn_message_data; %inline %{ int wrap_pn_message_data(char *STRING, size_t LENGTH, char *OUTPUT, size_t *OUTPUT_SIZE) { ssize_t sz = pn_message_data(OUTPUT, *OUTPUT_SIZE, STRING, LENGTH); if (sz >= 0) { *OUTPUT_SIZE = sz; } else { *OUTPUT_SIZE = 0; } return sz; } %} %ignore pn_message_data; ssize_t pn_data_decode(pn_data_t *data, char *STRING, size_t LENGTH); %ignore pn_data_decode; %rename(pn_data_encode) wrap_pn_data_encode; %inline %{ int wrap_pn_data_encode(pn_data_t *data, char *OUTPUT, size_t *OUTPUT_SIZE) { ssize_t sz = pn_data_encode(data, OUTPUT, *OUTPUT_SIZE); if (sz >= 0) { *OUTPUT_SIZE = sz; } else { *OUTPUT_SIZE = 0; } return sz; } %} %ignore pn_data_encode; %rename(pn_sasl_recv) wrap_pn_sasl_recv; %inline %{ int wrap_pn_sasl_recv(pn_sasl_t *sasl, char *OUTPUT, size_t *OUTPUT_SIZE) { ssize_t sz = pn_sasl_recv(sasl, OUTPUT, *OUTPUT_SIZE); if (sz >= 0) { *OUTPUT_SIZE = sz; } else { *OUTPUT_SIZE = 0; } return sz; } %} %ignore pn_sasl_recv; int pn_data_format(pn_data_t *data, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_data_format; bool pn_ssl_get_cipher_name(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_SIZE); %ignore pn_ssl_get_cipher_name; bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *OUTPUT, size_t MAX_OUTPUT_SIZE); %ignore pn_ssl_get_protocol_name; int pn_ssl_get_peer_hostname(pn_ssl_t *ssl, char *OUTPUT, size_t *OUTPUT_SIZE); %ignore pn_ssl_get_peer_hostname; %immutable PN_PYREF; %inline %{ extern const pn_class_t *PN_PYREF; #define CID_pn_pyref CID_pn_void #define pn_pyref_new NULL #define pn_pyref_initialize NULL #define pn_pyref_finalize NULL #define pn_pyref_free NULL #define pn_pyref_hashcode pn_void_hashcode #define pn_pyref_compare pn_void_compare #define pn_pyref_inspect pn_void_inspect static void pn_pyref_incref(void *object) { PyObject* p = (PyObject*) object; Py_XINCREF(p); } static void pn_pyref_decref(void *object) { PyObject* p = (PyObject*) object; Py_XDECREF(p); } static int pn_pyref_refcount(void *object) { return 1; } static const pn_class_t *pn_pyref_reify(void *object) { return PN_PYREF; } const pn_class_t PNI_PYREF = PN_METACLASS(pn_pyref); const pn_class_t *PN_PYREF = &PNI_PYREF; void *pn_py2void(PyObject *object) { return object; } PyObject *pn_void2py(void *object) { if (object) { PyObject* p = (PyObject*) object; Py_INCREF(p); return p; } else { Py_RETURN_NONE; } } PyObject *pn_cast_pn_void(void *object) { return pn_void2py(object); } %} %include "proton/cproton.i"