python/cproton.py (500 lines of code) (raw):
#
# 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.
#
# Ignore unused imports in this file
# flake8: noqa: F401
import atexit
from uuid import UUID
from cproton_ffi import ffi, lib
from cproton_ffi.lib import (PN_ACCEPTED, PN_ARRAY, PN_BINARY, PN_BOOL, PN_BYTE, PN_CHAR,
PN_CONFIGURATION, PN_CONNECTION_BOUND, PN_CONNECTION_FINAL,
PN_CONNECTION_INIT, PN_CONNECTION_LOCAL_CLOSE,
PN_CONNECTION_LOCAL_OPEN, PN_CONNECTION_REMOTE_CLOSE,
PN_CONNECTION_REMOTE_OPEN, PN_CONNECTION_UNBOUND, PN_COORDINATOR,
PN_DECIMAL32, PN_DECIMAL64, PN_DECIMAL128, PN_DEFAULT_PRIORITY,
PN_DELIVERIES, PN_DELIVERY, PN_DESCRIBED, PN_DIST_MODE_COPY,
PN_DIST_MODE_MOVE, PN_DIST_MODE_UNSPECIFIED, PN_DOUBLE, PN_EOS,
PN_EVENT_NONE, PN_EXPIRE_NEVER, PN_EXPIRE_WITH_CONNECTION,
PN_EXPIRE_WITH_LINK, PN_EXPIRE_WITH_SESSION, PN_FLOAT, PN_INT, PN_INTR,
PN_LINK_FINAL, PN_LINK_FLOW, PN_LINK_INIT, PN_LINK_LOCAL_CLOSE,
PN_LINK_LOCAL_DETACH, PN_LINK_LOCAL_OPEN, PN_LINK_REMOTE_CLOSE,
PN_LINK_REMOTE_DETACH, PN_LINK_REMOTE_OPEN, PN_LIST, PN_LOCAL_ACTIVE,
PN_LOCAL_CLOSED, PN_LOCAL_UNINIT, PN_LONG, PN_MAP, PN_MODIFIED,
PN_NONDURABLE, PN_NULL, PN_OK, PN_OVERFLOW, PN_RCV_FIRST,
PN_RCV_SECOND, PN_RECEIVED, PN_REJECTED, PN_RELEASED, PN_REMOTE_ACTIVE,
PN_REMOTE_CLOSED, PN_REMOTE_UNINIT, PN_SASL_AUTH, PN_SASL_NONE,
PN_SASL_OK, PN_SASL_PERM, PN_SASL_SYS, PN_SASL_TEMP, PN_SESSION_FINAL,
PN_SESSION_INIT, PN_SESSION_LOCAL_CLOSE, PN_SESSION_LOCAL_OPEN,
PN_SESSION_REMOTE_CLOSE, PN_SESSION_REMOTE_OPEN, PN_SHORT,
PN_SND_MIXED, PN_SND_SETTLED, PN_SND_UNSETTLED, PN_SOURCE,
PN_SSL_ANONYMOUS_PEER, PN_SSL_CERT_SUBJECT_CITY_OR_LOCALITY,
PN_SSL_CERT_SUBJECT_COMMON_NAME, PN_SSL_CERT_SUBJECT_COUNTRY_NAME,
PN_SSL_CERT_SUBJECT_ORGANIZATION_NAME,
PN_SSL_CERT_SUBJECT_ORGANIZATION_UNIT,
PN_SSL_CERT_SUBJECT_STATE_OR_PROVINCE, PN_SSL_MD5, PN_SSL_MODE_CLIENT,
PN_SSL_MODE_SERVER, PN_SSL_RESUME_NEW, PN_SSL_RESUME_REUSED,
PN_SSL_RESUME_UNKNOWN, PN_SSL_SHA1, PN_SSL_SHA256, PN_SSL_SHA512,
PN_SSL_VERIFY_PEER, PN_SSL_VERIFY_PEER_NAME, PN_STRING, PN_SYMBOL,
PN_TARGET, PN_TIMEOUT, PN_TIMER_TASK, PN_TIMESTAMP, PN_TRACE_DRV,
PN_TRACE_FRM, PN_TRACE_OFF, PN_TRACE_RAW, PN_TRANSACTIONAL_STATE, PN_TRANSPORT,
PN_TRANSPORT_CLOSED, PN_TRANSPORT_ERROR, PN_TRANSPORT_HEAD_CLOSED,
PN_TRANSPORT_TAIL_CLOSED, PN_UBYTE, PN_UINT, PN_ULONG, PN_UNSPECIFIED,
PN_USHORT, PN_UUID, PN_VERSION_MAJOR, PN_VERSION_MINOR,
PN_VERSION_POINT, pn_cast_pn_connection, pn_cast_pn_delivery,
pn_cast_pn_link, pn_cast_pn_session, pn_cast_pn_transport,
pn_collector, pn_collector_free, pn_collector_more, pn_collector_peek,
pn_collector_pop, pn_collector_release, pn_condition_clear,
pn_condition_info, pn_condition_is_set, pn_connection,
pn_connection_attachments, pn_connection_close, pn_connection_collect,
pn_connection_condition, pn_connection_desired_capabilities,
pn_connection_error, pn_connection_offered_capabilities,
pn_connection_open, pn_connection_properties, pn_connection_release,
pn_connection_remote_condition,
pn_connection_remote_desired_capabilities,
pn_connection_remote_offered_capabilities,
pn_connection_remote_properties, pn_connection_state,
pn_connection_transport, pn_data, pn_data_clear, pn_data_copy,
pn_data_dump, pn_data_encoded_size, pn_data_enter, pn_data_error,
pn_data_exit, pn_data_free, pn_data_get_array, pn_data_get_array_type,
pn_data_get_bool, pn_data_get_byte, pn_data_get_char,
pn_data_get_decimal32, pn_data_get_decimal64, pn_data_get_double,
pn_data_get_float, pn_data_get_int, pn_data_get_list, pn_data_get_long,
pn_data_get_map, pn_data_get_short, pn_data_get_timestamp,
pn_data_get_ubyte, pn_data_get_uint, pn_data_get_ulong,
pn_data_get_ushort, pn_data_is_array_described, pn_data_is_described,
pn_data_is_null, pn_data_narrow, pn_data_next, pn_data_prev,
pn_data_put_array, pn_data_put_bool, pn_data_put_byte,
pn_data_put_char, pn_data_put_decimal32, pn_data_put_decimal64,
pn_data_put_described, pn_data_put_double, pn_data_put_float,
pn_data_put_int, pn_data_put_list, pn_data_put_long, pn_data_put_map,
pn_data_put_null, pn_data_put_short, pn_data_put_timestamp,
pn_data_put_ubyte, pn_data_put_uint, pn_data_put_ulong,
pn_data_put_ushort, pn_data_rewind, pn_data_type, pn_data_widen,
pn_decref, pn_delivery_abort, pn_delivery_aborted,
pn_delivery_attachments, pn_delivery_link, pn_delivery_local,
pn_delivery_local_state, pn_delivery_partial, pn_delivery_pending,
pn_delivery_readable, pn_delivery_remote, pn_delivery_remote_state,
pn_delivery_settle, pn_delivery_settled, pn_delivery_update,
pn_delivery_updated, pn_delivery_writable, pn_disposition_annotations,
pn_disposition_condition, pn_disposition_data,
pn_disposition_get_section_number, pn_disposition_get_section_offset,
pn_disposition_is_failed, pn_disposition_is_undeliverable,
pn_disposition_set_failed, pn_disposition_set_section_number,
pn_disposition_set_section_offset, pn_disposition_set_undeliverable,
pn_disposition_type, pn_error_code, pn_event_connection,
pn_event_context, pn_event_delivery, pn_event_link, pn_event_session,
pn_event_transport, pn_event_type, pn_incref, pn_link_advance,
pn_link_attachments, pn_link_available, pn_link_close,
pn_link_condition, pn_link_credit, pn_link_current, pn_link_detach,
pn_link_drain, pn_link_drained, pn_link_draining, pn_link_error,
pn_link_flow, pn_link_free, pn_link_get_drain, pn_link_head,
pn_link_is_receiver, pn_link_is_sender, pn_link_max_message_size,
pn_link_next, pn_link_offered, pn_link_open, pn_link_properties,
pn_link_queued, pn_link_rcv_settle_mode, pn_link_remote_condition,
pn_link_remote_max_message_size, pn_link_remote_properties,
pn_link_remote_rcv_settle_mode, pn_link_remote_snd_settle_mode,
pn_link_remote_source, pn_link_remote_target, pn_link_session,
pn_link_set_drain, pn_link_set_max_message_size,
pn_link_set_rcv_settle_mode, pn_link_set_snd_settle_mode,
pn_link_snd_settle_mode, pn_link_source, pn_link_state, pn_link_target,
pn_link_unsettled, pn_unsettled_head, pn_unsettled_next,
pn_message, pn_message_annotations, pn_message_body,
pn_message_clear, pn_message_error, pn_message_free,
pn_message_get_creation_time, pn_message_get_delivery_count,
pn_message_get_expiry_time, pn_message_get_group_sequence,
pn_message_get_priority, pn_message_get_ttl, pn_message_instructions,
pn_message_is_durable, pn_message_is_first_acquirer,
pn_message_is_inferred, pn_message_properties,
pn_message_set_creation_time, pn_message_set_delivery_count,
pn_message_set_durable, pn_message_set_expiry_time,
pn_message_set_first_acquirer, pn_message_set_group_sequence,
pn_message_set_inferred, pn_message_set_priority, pn_message_set_ttl,
pn_sasl, pn_sasl_done, pn_sasl_extended,
pn_sasl_get_allow_insecure_mechs, pn_sasl_outcome,
pn_sasl_set_allow_insecure_mechs, pn_session, pn_session_attachments,
pn_session_close, pn_session_condition, pn_session_connection,
pn_session_free, pn_session_get_incoming_capacity,
pn_session_get_outgoing_window, pn_session_head,
pn_session_incoming_bytes, pn_session_next, pn_session_open,
pn_session_outgoing_bytes, pn_session_remote_condition,
pn_session_set_incoming_capacity, pn_session_set_outgoing_window,
pn_session_state, pn_ssl, pn_ssl_domain,
pn_ssl_domain_allow_unsecured_client, pn_ssl_domain_free,
pn_ssl_present, pn_ssl_resume_status, pn_terminus_capabilities,
pn_terminus_copy, pn_terminus_filter,
pn_terminus_get_distribution_mode, pn_terminus_get_durability,
pn_terminus_get_expiry_policy, pn_terminus_get_timeout,
pn_terminus_get_type, pn_terminus_is_dynamic, pn_terminus_outcomes,
pn_terminus_properties, pn_terminus_set_distribution_mode,
pn_terminus_set_durability, pn_terminus_set_dynamic,
pn_terminus_set_expiry_policy, pn_terminus_set_timeout,
pn_terminus_set_type, pn_transactional_disposition,
pn_transactional_disposition_get_outcome_type,
pn_transactional_disposition_set_outcome_type, pn_transport, pn_transport_attachments,
pn_transport_bind, pn_transport_capacity, pn_transport_close_head,
pn_transport_close_tail, pn_transport_closed, pn_transport_condition,
pn_transport_connection, pn_transport_error,
pn_transport_get_channel_max, pn_transport_get_frames_input,
pn_transport_get_frames_output, pn_transport_get_idle_timeout,
pn_transport_get_max_frame, pn_transport_get_remote_idle_timeout,
pn_transport_get_remote_max_frame, pn_transport_is_authenticated,
pn_transport_is_encrypted, pn_transport_pending, pn_transport_pop,
pn_transport_remote_channel_max, pn_transport_require_auth,
pn_transport_require_encryption, pn_transport_set_channel_max,
pn_transport_set_idle_timeout, pn_transport_set_max_frame,
pn_transport_set_server, pn_transport_tick, pn_transport_trace,
pn_transport_unbind,
pn_custom_disposition,
pn_custom_disposition_get_type,
pn_custom_disposition_set_type,
pn_custom_disposition_data,
pn_rejected_disposition,
pn_rejected_disposition_condition,
pn_received_disposition,
pn_received_disposition_get_section_number,
pn_received_disposition_set_section_number,
pn_received_disposition_get_section_offset,
pn_received_disposition_set_section_offset,
pn_modified_disposition,
pn_modified_disposition_is_failed,
pn_modified_disposition_set_failed,
pn_modified_disposition_is_undeliverable,
pn_modified_disposition_set_undeliverable,
pn_modified_disposition_annotations)
def isnull(obj):
return obj is None or obj == ffi.NULL
def addressof(obj):
return int(ffi.cast('uint64_t', obj))
def void2py(void):
if void == ffi.NULL:
return None
return ffi.from_handle(void)
def string2utf8(string):
"""Convert python string into bytes compatible with char* C string"""
if string is None:
return ffi.NULL
elif isinstance(string, str):
return string.encode('utf8')
# Anything else illegal - specifically python3 bytes
raise TypeError("Unrecognized string type: %r (%s)" % (string, type(string)))
def utf82string(string):
"""Convert char* C strings returned from proton-c into python unicode"""
if string == ffi.NULL:
return None
return ffi.string(string).decode('utf8')
def bytes2py(b):
return memoryview(ffi.buffer(b.start, b.size))
def bytes2pybytes(b):
return bytes(ffi.buffer(b.start, b.size))
def bytes2string(b, encoding='utf8', errors='surrogateescape'):
return ffi.unpack(b.start, b.size).decode(encoding, errors)
def py2bytes(py):
if isinstance(py, (bytes, bytearray, memoryview)):
s = ffi.from_buffer(py)
return len(s), s
elif isinstance(py, str):
s = ffi.from_buffer(py.encode('utf8'))
return len(s), s
def string2bytes(py, encoding='utf8', errors='surrogateescape'):
s = ffi.from_buffer(py.encode(encoding, errors))
return len(s), s
def UUID2uuid(py):
u = ffi.new('pn_uuid_t*')
ffi.memmove(u.bytes, py.bytes, 16)
return u[0]
def uuid2bytes(uuid):
return ffi.unpack(uuid.bytes, 16)
def decimal1282py(decimal128):
return ffi.unpack(decimal128.bytes, 16)
def py2decimal128(py):
d = ffi.new('pn_decimal128_t*')
ffi.memmove(d.bytes, py, 16)
return d[0]
def msgid2py(msgid):
t = msgid.type
if t == PN_NULL:
return None
elif t == PN_ULONG:
return msgid.u.as_ulong
elif t == PN_BINARY:
return bytes2py(msgid.u.as_bytes)
elif t == PN_STRING:
return bytes2string(msgid.u.as_bytes)
elif t == PN_UUID:
return UUID(bytes=uuid2bytes(msgid.u.as_uuid))
# These two cases are for compatibility with the broken ruby binding
elif t == PN_INT:
v = msgid.u.as_int
if v >= 0:
return v
return None
elif t == PN_LONG:
v = msgid.u.as_long
if v >= 0:
return v
return None
return None
def py2msgid(py):
if py is None:
return {'type': PN_NULL}
elif isinstance(py, int):
return {'type': PN_ULONG, 'u': {'as_ulong': py}}
elif isinstance(py, str):
return {'type': PN_STRING, 'u': {'as_bytes': string2bytes(py)}}
elif isinstance(py, bytes):
return {'type': PN_BINARY, 'u': {'as_bytes': py2bytes(py)}}
elif isinstance(py, UUID):
return {'type': PN_UUID, 'u': {'as_uuid': {'bytes': py.bytes}}}
elif isinstance(py, tuple):
if py[0] == PN_UUID:
return {'type': PN_UUID, 'u': {'as_uuid': {'bytes': py[1]}}}
return {'type': PN_NULL}
@ffi.def_extern()
def pn_pytracer(transport, message):
attrs = pn_record_get_py(lib.pn_transport_attachments(transport))
tracer = attrs['_tracer']
if tracer:
tracer(transport, utf82string(message))
def pn_transport_get_pytracer(transport):
attrs = pn_record_get_py(lib.pn_transport_attachments(transport))
if '_tracer' in attrs:
return attrs['_tracer']
else:
return None
def pn_transport_set_pytracer(transport, tracer):
attrs = pn_record_get_py(lib.pn_transport_attachments(transport))
attrs['_tracer'] = tracer
lib.pn_transport_set_tracer(transport, lib.pn_pytracer)
retained_objects = set()
lib.init()
@atexit.register
def clear_retained_objects():
retained_objects.clear()
def retained_count():
""" Debugging aid to give the number of wrapper objects retained by the bindings"""
return len(retained_objects)
@ffi.def_extern()
def pn_pyref_incref(obj):
retained_objects.add(obj)
@ffi.def_extern()
def pn_pyref_decref(obj):
retained_objects.discard(obj)
def pn_tostring(obj):
cs = lib.pn_tostring(obj)
s = ffi.string(cs).decode('utf8')
lib.free(cs)
return s
def pn_collector_put_pyref(collector, obj, etype):
d = ffi.new_handle(obj)
retained_objects.add(d)
lib.pn_collector_put_py(collector, d, etype.number)
def pn_record_get_py(record):
d = lib.pn_record_get_py(record)
if d == ffi.NULL:
d = ffi.new_handle({})
retained_objects.add(d)
lib.pn_record_def_py(record)
lib.pn_record_set_py(record, d)
return ffi.from_handle(d)
def pn_event_class_name(event):
return ffi.string(lib.pn_event_class_name_py(event)).decode('utf8')
# size_t pn_transport_peek(pn_transport_t *transport, char *dst, size_t size);
def pn_transport_peek(transport, size):
buff = bytearray(size)
cd = lib.pn_transport_peek(transport, ffi.from_buffer(buff), size)
if cd >= 0:
buff = buff[:cd]
return cd, buff
# ssize_t pn_transport_push(pn_transport_t *transport, const char *src, size_t size);
def pn_transport_push(transport, src):
return lib.pn_transport_push(transport, ffi.from_buffer(src), len(src))
# int pn_message_decode(pn_message_t *msg, const char *bytes, size_t size);
def pn_message_decode(msg, buff):
return lib.pn_message_decode(msg, ffi.from_buffer(buff), len(buff))
# int pn_message_encode_py(pn_message_t *msg, char *bytes, size_t size);
def pn_message_encode(msg, size):
buff = bytearray(size)
err = lib.pn_message_encode_py(msg, ffi.from_buffer(buff), size)
if err >= 0:
buff = buff[:err]
return err, buff
# ssize_t pn_data_decode(pn_data_t *data, const char *bytes, size_t size);
def pn_data_decode(data, buff):
return lib.pn_data_decode(data, ffi.from_buffer(buff), len(buff))
# ssize_t pn_data_encode(pn_data_t *data, char *bytes, size_t size);
def pn_data_encode(data, size):
buff = bytearray(size)
err = lib.pn_data_encode(data, ffi.from_buffer(buff), size)
if err >= 0:
buff = buff[:err]
return err, buff
# int pn_data_format(pn_data_t *data, char *bytes, size_t *size);
def pn_data_format(data, size):
buff = bytearray(size)
err = lib.pn_data_format_py(data, ffi.from_buffer(buff), size)
if err >= 0:
buff = buff[:err]
return err, buff
# ssize_t pn_link_recv(pn_link_t *receiver, char *bytes, size_t n);
def pn_link_recv(receiver, limit):
buff = bytearray(limit)
err = lib.pn_link_recv(receiver, ffi.from_buffer(buff), limit)
if err >= 0:
buff = buff[:err]
return err, buff
# ssize_t pn_link_send(pn_link_t *sender, const char *bytes, size_t n);
def pn_link_send(sender, buff):
return lib.pn_link_send(sender, ffi.from_buffer(buff), len(buff))
# pn_condition bindings
def pn_condition_set_name(cond, name):
return lib.pn_condition_set_name(cond, string2utf8(name))
def pn_condition_set_description(cond, description):
return lib.pn_condition_set_description(cond, string2utf8(description))
def pn_condition_get_name(cond):
return utf82string(lib.pn_condition_get_name(cond))
def pn_condition_get_description(cond):
return utf82string(lib.pn_condition_get_description(cond))
# pn_error bindings
def pn_error_text(error):
return utf82string(lib.pn_error_text(error))
# pn_data bindings
def pn_data_lookup(data, name):
return lib.pn_data_lookup(data, string2utf8(name))
def pn_data_put_decimal128(data, d):
return lib.pn_data_put_decimal128(data, py2decimal128(d))
def pn_data_put_uuid(data, u):
return lib.pn_data_put_uuid(data, UUID2uuid(u))
def pn_data_put_binary(data, b):
return lib.pn_data_put_binary(data, py2bytes(b))
def pn_data_put_string(data, s):
return lib.pn_data_put_string(data, string2bytes(s))
def pn_data_put_symbol(data, s):
return lib.pn_data_put_symbol(data, string2bytes(s, 'ascii'))
def pn_data_get_decimal128(data):
return decimal1282py(lib.pn_data_get_decimal128(data))
def pn_data_get_uuid(data):
return UUID(bytes=uuid2bytes(lib.pn_data_get_uuid(data)))
def pn_data_get_binary(data):
return bytes2py(lib.pn_data_get_binary(data))
def pn_data_get_string(data):
return bytes2string(lib.pn_data_get_string(data))
def pn_data_get_symbol(data):
return bytes2string(lib.pn_data_get_symbol(data), 'ascii')
def pn_delivery_tag(delivery):
return bytes2string(lib.pn_delivery_tag(delivery))
def pn_connection_get_container(connection):
return utf82string(lib.pn_connection_get_container(connection))
def pn_connection_set_container(connection, name):
lib.pn_connection_set_container(connection, string2utf8(name))
def pn_connection_get_hostname(connection):
return utf82string(lib.pn_connection_get_hostname(connection))
def pn_connection_set_hostname(connection, name):
lib.pn_connection_set_hostname(connection, string2utf8(name))
def pn_connection_get_user(connection):
return utf82string(lib.pn_connection_get_user(connection))
def pn_connection_set_user(connection, name):
lib.pn_connection_set_user(connection, string2utf8(name))
def pn_connection_get_authorization(connection):
return utf82string(lib.pn_connection_get_authorization(connection))
def pn_connection_set_authorization(connection, name):
lib.pn_connection_set_authorization(connection, string2utf8(name))
def pn_connection_set_password(connection, name):
lib.pn_connection_set_password(connection, string2utf8(name))
def pn_connection_remote_container(connection):
return utf82string(lib.pn_connection_remote_container(connection))
def pn_connection_remote_hostname(connection):
return utf82string(lib.pn_connection_remote_hostname(connection))
def pn_sender(session, name):
return lib.pn_sender(session, string2utf8(name))
def pn_receiver(session, name):
return lib.pn_receiver(session, string2utf8(name))
def pn_delivery(link, tag):
return lib.pn_delivery(link, py2bytes(tag))
def pn_link_name(link):
return utf82string(lib.pn_link_name(link))
def pn_terminus_get_address(terminus):
return utf82string(lib.pn_terminus_get_address(terminus))
def pn_terminus_set_address(terminus, address):
return lib.pn_terminus_set_address(terminus, string2utf8(address))
def pn_event_type_name(number):
return utf82string(lib.pn_event_type_name(number))
def pn_message_get_id(message):
return msgid2py(lib.pn_message_get_id(message))
def pn_message_set_id(message, value):
lib.pn_message_set_id(message, py2msgid(value))
def pn_message_get_user_id(message):
return bytes2pybytes(lib.pn_message_get_user_id(message))
def pn_message_set_user_id(message, value):
return lib.pn_message_set_user_id(message, py2bytes(value))
def pn_message_get_address(message):
return utf82string(lib.pn_message_get_address(message))
def pn_message_set_address(message, value):
return lib.pn_message_set_address(message, string2utf8(value))
def pn_message_get_subject(message):
return utf82string(lib.pn_message_get_subject(message))
def pn_message_set_subject(message, value):
return lib.pn_message_set_subject(message, string2utf8(value))
def pn_message_get_reply_to(message):
return utf82string(lib.pn_message_get_reply_to(message))
def pn_message_set_reply_to(message, value):
return lib.pn_message_set_reply_to(message, string2utf8(value))
def pn_message_get_correlation_id(message):
return msgid2py(lib.pn_message_get_correlation_id(message))
def pn_message_set_correlation_id(message, value):
lib.pn_message_set_correlation_id(message, py2msgid(value))
def pn_message_get_content_type(message):
return utf82string(lib.pn_message_get_content_type(message))
def pn_message_set_content_type(message, value):
return lib.pn_message_set_content_type(message, string2utf8(value))
def pn_message_get_content_encoding(message):
return utf82string(lib.pn_message_get_content_encoding(message))
def pn_message_set_content_encoding(message, value):
return lib.pn_message_set_content_encoding(message, string2utf8(value))
def pn_message_get_group_id(message):
return utf82string(lib.pn_message_get_group_id(message))
def pn_message_set_group_id(message, value):
return lib.pn_message_set_group_id(message, string2utf8(value))
def pn_message_get_reply_to_group_id(message):
return utf82string(lib.pn_message_get_reply_to_group_id(message))
def pn_message_set_reply_to_group_id(message, value):
return lib.pn_message_set_reply_to_group_id(message, string2utf8(value))
def pn_transport_log(transport, message):
lib.pn_transport_log(transport, string2utf8(message))
def pn_transport_get_user(transport):
return utf82string(lib.pn_transport_get_user(transport))
def pn_sasl_get_user(sasl):
return utf82string(lib.pn_sasl_get_user(sasl))
def pn_sasl_get_authorization(sasl):
return utf82string(lib.pn_sasl_get_authorization(sasl))
def pn_sasl_get_mech(sasl):
return utf82string(lib.pn_sasl_get_mech(sasl))
def pn_sasl_allowed_mechs(sasl, mechs):
lib.pn_sasl_allowed_mechs(sasl, string2utf8(mechs))
def pn_sasl_config_name(sasl, name):
lib.pn_sasl_config_name(sasl, string2utf8(name))
def pn_sasl_config_path(sasl, path):
lib.pn_sasl_config_path(sasl, string2utf8(path))
def pn_ssl_domain_set_credentials(domain, cert_file, key_file, password):
return lib.pn_ssl_domain_set_credentials(domain, string2utf8(cert_file), string2utf8(key_file), string2utf8(password))
def pn_ssl_domain_set_trusted_ca_db(domain, certificate_db):
return lib.pn_ssl_domain_set_trusted_ca_db(domain, string2utf8(certificate_db))
def pn_ssl_domain_set_peer_authentication(domain, verify_mode, trusted_CAs):
return lib.pn_ssl_domain_set_peer_authentication(domain, verify_mode, string2utf8(trusted_CAs))
def pn_ssl_init(ssl, domain, session_id):
lib.pn_ssl_init(ssl, domain, string2utf8(session_id))
def pn_ssl_get_remote_subject_subfield(ssl, subfield_name):
return utf82string(lib.pn_ssl_get_remote_subject_subfield(ssl, subfield_name))
def pn_ssl_get_remote_subject(ssl):
return utf82string(lib.pn_ssl_get_remote_subject(ssl))
# int pn_ssl_domain_set_protocols(pn_ssl_domain_t *domain, const char *protocols);
def pn_ssl_domain_set_protocols(domain, protocols):
return lib.pn_ssl_domain_set_protocols(domain, string2utf8(protocols))
# int pn_ssl_domain_set_ciphers(pn_ssl_domain_t *domain, const char *ciphers);
def pn_ssl_domain_set_ciphers(domain, ciphers):
return lib.pn_ssl_domain_set_ciphers(domain, string2utf8(ciphers))
# _Bool pn_ssl_get_cipher_name(pn_ssl_t *ssl, char *buffer, size_t size);
def pn_ssl_get_cipher_name(ssl, size):
buff = ffi.new('char[]', size)
r = lib.pn_ssl_get_cipher_name(ssl, buff, size)
if r:
return utf82string(buff)
return None
# _Bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *buffer, size_t size);
def pn_ssl_get_protocol_name(ssl, size):
buff = ffi.new('char[]', size)
r = lib.pn_ssl_get_protocol_name(ssl, buff, size)
if r:
return utf82string(buff)
return None
# int pn_ssl_get_cert_fingerprint(pn_ssl_t *ssl, char *fingerprint, size_t fingerprint_len, pn_ssl_hash_alg hash_alg);
def pn_ssl_get_cert_fingerprint(ssl, fingerprint_len, hash_alg):
buff = ffi.new('char[]', fingerprint_len)
r = lib.pn_ssl_get_cert_fingerprint(ssl, buff, fingerprint_len, hash_alg)
if r == PN_OK:
return utf82string(buff)
return None
# int pn_ssl_get_peer_hostname(pn_ssl_t *ssl, char *hostname, size_t *bufsize);
def pn_ssl_get_peer_hostname(ssl, size):
buff = ffi.new('char[]', size)
r = lib.pn_ssl_get_peer_hostname_py(ssl, buff, size)
if r == PN_OK:
return r, utf82string(buff)
return r, None
def pn_ssl_set_peer_hostname(ssl, hostname):
return lib.pn_ssl_set_peer_hostname(ssl, string2utf8(hostname))
def pn_transactional_disposition_get_id(disp):
return bytes2pybytes(lib.pn_transactional_disposition_get_id(disp))
def pn_transactional_disposition_set_id(disp, id):
return lib.pn_transactional_disposition_set_id(disp, py2bytes(id))