Add new func, update rts
[ric-plt/lib/rmr.git] / src / bindings / rmr-python / rmr / rmr.py
index 0265e21..45515c8 100644 (file)
@@ -1,3 +1,4 @@
+# vim: expandtab ts=4 sw=4:
 # ==================================================================================
 #       Copyright (c) 2019 Nokia
 #       Copyright (c) 2018-2019 AT&T Intellectual Property.
@@ -215,7 +216,7 @@ _rmr_alloc_msg.argtypes = [c_void_p, c_int]
 _rmr_alloc_msg.restype = POINTER(rmr_mbuf_t)
 
 
-def rmr_alloc_msg(vctx, size, payload=None, gen_transaction_id=False, mtype=None, meid=None):
+def rmr_alloc_msg(vctx, size, payload=None, gen_transaction_id=False, mtype=None, meid=None, sub_id=None):
     """
     Refer to the rmr C documentation for rmr_alloc_msg
     extern rmr_mbuf_t* rmr_alloc_msg(void* vctx, int size)
@@ -227,9 +228,11 @@ def rmr_alloc_msg(vctx, size, payload=None, gen_transaction_id=False, mtype=None
 
     """
     sbuf = _rmr_alloc_msg(vctx, size)
-    # make sure it's good
     try:
+        # make sure the alloc worked
         sbuf.contents
+
+        # set specified fields
         if payload:
             set_payload_and_length(payload, sbuf)
 
@@ -242,12 +245,28 @@ def rmr_alloc_msg(vctx, size, payload=None, gen_transaction_id=False, mtype=None
         if meid:
             rmr_set_meid(sbuf, meid)
 
+        if sub_id:
+            sbuf.contents.sub_id = sub_id
+
         return sbuf
 
     except ValueError:
         raise BadBufferAllocation
 
 
+_rmr_realloc_payload = rmr_c_lib.rmr_realloc_payload
+_rmr_realloc_payload.argtypes = [POINTER(rmr_mbuf_t), c_int, c_int, c_int]  # new_len, copy, clone
+_rmr_realloc_payload.restype = POINTER(rmr_mbuf_t)
+
+
+def rmr_realloc_payload(ptr_mbuf, new_len, copy=False, clone=False):
+    """
+    Refer to the rmr C documentation for rmr_realloc_payload().
+    extern rmr_mbuf_t* rmr_realloc_payload(rmr_mbuf_t*, int, int, int)
+    """
+    return _rmr_realloc_payload(ptr_mbuf, new_len, copy, clone)
+
+
 _rmr_free_msg = rmr_c_lib.rmr_free_msg
 _rmr_free_msg.argtypes = [c_void_p]
 _rmr_free_msg.restype = None
@@ -256,7 +275,7 @@ _rmr_free_msg.restype = None
 def rmr_free_msg(mbuf):
     """
     Refer to the rmr C documentation for rmr_free_msg
-    extern void rmr_free_msg( rmr_mbuf_t* mbuf )
+    extern void rmr_free_msg(rmr_mbuf_t* mbuf )
     """
     if mbuf is not None:
         _rmr_free_msg(mbuf)
@@ -324,11 +343,22 @@ _rmr_rts_msg.argtypes = [c_void_p, POINTER(rmr_mbuf_t)]
 _rmr_rts_msg.restype = POINTER(rmr_mbuf_t)
 
 
-def rmr_rts_msg(vctx, ptr_mbuf):
+def rmr_rts_msg(vctx, ptr_mbuf, payload=None, mtype=None):
     """
     Refer to the rmr C documentation for rmr_rts_msg
     extern rmr_mbuf_t*  rmr_rts_msg(void* vctx, rmr_mbuf_t* msg)
+
+    additional features beyond c-rmr:
+        if payload is not None, attempts to set the payload
+        if mtype is not None, sets the sbuf's message type
     """
+
+    if payload:
+        set_payload_and_length(payload, ptr_mbuf)
+
+    if mtype:
+        ptr_mbuf.contents.mtype = mtype
+
     return _rmr_rts_msg(vctx, ptr_mbuf)
 
 
@@ -487,6 +517,9 @@ def set_payload_and_length(byte_str, ptr_mbuf):
     ptr_mbuf: ctypes c_void_p
         Pointer to an rmr message buffer
     """
+    if rmr_payload_size(ptr_mbuf) < len(byte_str):  # existing message payload too small
+        ptr_mbuf = rmr_realloc_payload(ptr_mbuf, len(byte_str), True)
+
     memmove(ptr_mbuf.contents.payload, byte_str, len(byte_str))
     ptr_mbuf.contents.len = len(byte_str)