diff --git a/bindings/python/ns3_module_common.py b/bindings/python/ns3_module_common.py index 849f53104..8b8f3979e 100644 --- a/bindings/python/ns3_module_common.py +++ b/bindings/python/ns3_module_common.py @@ -13,6 +13,14 @@ def register_types(module): module.add_class('DataRate') ## packet.h: ns3::Packet [class] module.add_class('Packet', memory_policy=cppclass.ReferenceCountingMethodsPolicy(incref_method='Ref', decref_method='Unref', peekref_method='GetReferenceCount')) + ## packet-metadata.h: ns3::PacketMetadata [class] + module.add_class('PacketMetadata') + ## packet-metadata.h: ns3::PacketMetadata::Item [struct] + module.add_class('Item', outer_class=root_module['ns3::PacketMetadata']) + ## packet-metadata.h: ns3::PacketMetadata::Item [enumeration] + module.add_enum('', ['PAYLOAD', 'HEADER', 'TRAILER'], outer_class=root_module['ns3::PacketMetadata::Item']) + ## packet-metadata.h: ns3::PacketMetadata::ItemIterator [class] + module.add_class('ItemIterator', outer_class=root_module['ns3::PacketMetadata']) ## tag.h: ns3::Tag [class] module.add_class('Tag', parent=root_module['ns3::ObjectBase']) ## tag-buffer.h: ns3::TagBuffer [class] @@ -91,6 +99,9 @@ def register_methods(root_module): register_Ns3BufferIterator_methods(root_module, root_module['ns3::Buffer::Iterator']) register_Ns3DataRate_methods(root_module, root_module['ns3::DataRate']) register_Ns3Packet_methods(root_module, root_module['ns3::Packet']) + register_Ns3PacketMetadata_methods(root_module, root_module['ns3::PacketMetadata']) + register_Ns3PacketMetadataItem_methods(root_module, root_module['ns3::PacketMetadata::Item']) + register_Ns3PacketMetadataItemIterator_methods(root_module, root_module['ns3::PacketMetadata::ItemIterator']) register_Ns3Tag_methods(root_module, root_module['ns3::Tag']) register_Ns3TagBuffer_methods(root_module, root_module['ns3::TagBuffer']) register_Ns3TagIterator_methods(root_module, root_module['ns3::TagIterator']) @@ -489,6 +500,119 @@ def register_Ns3Packet_methods(root_module, cls): is_const=True) return +def register_Ns3PacketMetadata_methods(root_module, cls): + ## packet-metadata.h: static void ns3::PacketMetadata::Enable() [member function] + cls.add_method('Enable', + 'void', + [], + is_static=True) + ## packet-metadata.h: static void ns3::PacketMetadata::EnableChecking() [member function] + cls.add_method('EnableChecking', + 'void', + [], + is_static=True) + ## packet-metadata.h: ns3::PacketMetadata::PacketMetadata(uint32_t uid, uint32_t size) [constructor] + cls.add_constructor([param('uint32_t', 'uid'), param('uint32_t', 'size')]) + ## packet-metadata.h: ns3::PacketMetadata::PacketMetadata(ns3::PacketMetadata const & o) [copy constructor] + cls.add_constructor([param('ns3::PacketMetadata const &', 'o')]) + ## packet-metadata.h: void ns3::PacketMetadata::AddHeader(ns3::Header const & header, uint32_t size) [member function] + cls.add_method('AddHeader', + 'void', + [param('ns3::Header const &', 'header'), param('uint32_t', 'size')]) + ## packet-metadata.h: void ns3::PacketMetadata::RemoveHeader(ns3::Header const & header, uint32_t size) [member function] + cls.add_method('RemoveHeader', + 'void', + [param('ns3::Header const &', 'header'), param('uint32_t', 'size')]) + ## packet-metadata.h: void ns3::PacketMetadata::AddTrailer(ns3::Trailer const & trailer, uint32_t size) [member function] + cls.add_method('AddTrailer', + 'void', + [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')]) + ## packet-metadata.h: void ns3::PacketMetadata::RemoveTrailer(ns3::Trailer const & trailer, uint32_t size) [member function] + cls.add_method('RemoveTrailer', + 'void', + [param('ns3::Trailer const &', 'trailer'), param('uint32_t', 'size')]) + ## packet-metadata.h: ns3::PacketMetadata ns3::PacketMetadata::CreateFragment(uint32_t start, uint32_t end) const [member function] + cls.add_method('CreateFragment', + 'ns3::PacketMetadata', + [param('uint32_t', 'start'), param('uint32_t', 'end')], + is_const=True) + ## packet-metadata.h: void ns3::PacketMetadata::AddAtEnd(ns3::PacketMetadata const & o) [member function] + cls.add_method('AddAtEnd', + 'void', + [param('ns3::PacketMetadata const &', 'o')]) + ## packet-metadata.h: void ns3::PacketMetadata::AddPaddingAtEnd(uint32_t end) [member function] + cls.add_method('AddPaddingAtEnd', + 'void', + [param('uint32_t', 'end')]) + ## packet-metadata.h: void ns3::PacketMetadata::RemoveAtStart(uint32_t start) [member function] + cls.add_method('RemoveAtStart', + 'void', + [param('uint32_t', 'start')]) + ## packet-metadata.h: void ns3::PacketMetadata::RemoveAtEnd(uint32_t end) [member function] + cls.add_method('RemoveAtEnd', + 'void', + [param('uint32_t', 'end')]) + ## packet-metadata.h: uint32_t ns3::PacketMetadata::GetUid() const [member function] + cls.add_method('GetUid', + 'uint32_t', + [], + is_const=True) + ## packet-metadata.h: uint32_t ns3::PacketMetadata::GetSerializedSize() const [member function] + cls.add_method('GetSerializedSize', + 'uint32_t', + [], + is_const=True) + ## packet-metadata.h: void ns3::PacketMetadata::Serialize(ns3::Buffer::Iterator i, uint32_t size) const [member function] + cls.add_method('Serialize', + 'void', + [param('ns3::Buffer::Iterator', 'i'), param('uint32_t', 'size')], + is_const=True) + ## packet-metadata.h: uint32_t ns3::PacketMetadata::Deserialize(ns3::Buffer::Iterator i) [member function] + cls.add_method('Deserialize', + 'uint32_t', + [param('ns3::Buffer::Iterator', 'i')]) + ## packet-metadata.h: ns3::PacketMetadata::ItemIterator ns3::PacketMetadata::BeginItem(ns3::Buffer buffer) const [member function] + cls.add_method('BeginItem', + 'ns3::PacketMetadata::ItemIterator', + [param('ns3::Buffer', 'buffer')], + is_const=True) + return + +def register_Ns3PacketMetadataItem_methods(root_module, cls): + ## packet-metadata.h: ns3::PacketMetadata::Item::isFragment [variable] + cls.add_instance_attribute('isFragment', 'bool', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::tid [variable] + cls.add_instance_attribute('tid', 'ns3::TypeId', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::currentSize [variable] + cls.add_instance_attribute('currentSize', 'uint32_t', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::currentTrimedFromStart [variable] + cls.add_instance_attribute('currentTrimedFromStart', 'uint32_t', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::currentTrimedFromEnd [variable] + cls.add_instance_attribute('currentTrimedFromEnd', 'uint32_t', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::current [variable] + cls.add_instance_attribute('current', 'ns3::Buffer::Iterator', is_const=False) + ## packet-metadata.h: ns3::PacketMetadata::Item::Item(ns3::PacketMetadata::Item const & arg0) [copy constructor] + cls.add_constructor([param('ns3::PacketMetadata::Item const &', 'arg0')]) + ## packet-metadata.h: ns3::PacketMetadata::Item::Item() [constructor] + cls.add_constructor([]) + return + +def register_Ns3PacketMetadataItemIterator_methods(root_module, cls): + ## packet-metadata.h: ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata::ItemIterator const & arg0) [copy constructor] + cls.add_constructor([param('ns3::PacketMetadata::ItemIterator const &', 'arg0')]) + ## packet-metadata.h: ns3::PacketMetadata::ItemIterator::ItemIterator(ns3::PacketMetadata const * metadata, ns3::Buffer buffer) [constructor] + cls.add_constructor([param('ns3::PacketMetadata const *', 'metadata'), param('ns3::Buffer', 'buffer')]) + ## packet-metadata.h: bool ns3::PacketMetadata::ItemIterator::HasNext() const [member function] + cls.add_method('HasNext', + 'bool', + [], + is_const=True) + ## packet-metadata.h: ns3::PacketMetadata::Item ns3::PacketMetadata::ItemIterator::Next() [member function] + cls.add_method('Next', + 'ns3::PacketMetadata::Item', + []) + return + def register_Ns3Tag_methods(root_module, cls): ## tag.h: ns3::Tag::Tag(ns3::Tag const & arg0) [copy constructor] cls.add_constructor([param('ns3::Tag const &', 'arg0')]) diff --git a/bindings/python/ns3_module_core.py b/bindings/python/ns3_module_core.py index 593f07a92..db1bda53d 100644 --- a/bindings/python/ns3_module_core.py +++ b/bindings/python/ns3_module_core.py @@ -945,11 +945,6 @@ def register_Ns3TypeId_methods(root_module, cls): 'ns3::TypeId', [param('std::string', 'name')], is_static=True) - ## type-id.h: static bool ns3::TypeId::LookupByNameFailSafe(std::string name, ns3::TypeId * tid) [member function] - cls.add_method('LookupByNameFailSafe', - 'bool', - [param('std::string', 'name'), param('ns3::TypeId *', 'tid', transfer_ownership=False)], - is_static=True) ## type-id.h: ns3::Ptr ns3::TypeId::LookupTraceSourceByName(std::string name) const [member function] cls.add_method('LookupTraceSourceByName', 'ns3::Ptr< ns3::TraceSourceAccessor const >', diff --git a/bindings/python/ns3module_helpers.cc b/bindings/python/ns3module_helpers.cc index cb2fab4a9..03dc52445 100644 --- a/bindings/python/ns3module_helpers.cc +++ b/bindings/python/ns3module_helpers.cc @@ -188,3 +188,35 @@ error: return NULL; } + +PyObject * +_wrap_TypeId_LookupByNameFailSafe(PyNs3TypeId *PYBINDGEN_UNUSED(dummy), PyObject *args, PyObject *kwargs, + PyObject **return_exception) +{ + bool ok; + const char *name; + Py_ssize_t name_len; + ns3::TypeId tid; + PyNs3TypeId *py_tid; + const char *keywords[] = {"name", NULL}; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, (char *) "s#", (char **) keywords, &name, &name_len)) { + PyObject *exc_type, *traceback; + PyErr_Fetch(&exc_type, return_exception, &traceback); + Py_XDECREF(exc_type); + Py_XDECREF(traceback); + return NULL; + } + ok = ns3::TypeId::LookupByNameFailSafe(std::string(name, name_len), &tid); + if (!ok) + { + PyErr_Format(PyExc_KeyError, "The ns3 type with name `%s' is not registered", name); + return NULL; + } + + py_tid = PyObject_New(PyNs3TypeId, &PyNs3TypeId_Type); + py_tid->obj = new ns3::TypeId (tid); + PyNs3TypeId_wrapper_registry[(void *) py_tid->obj] = (PyObject *) py_tid; + + return (PyObject *) py_tid; +} diff --git a/bindings/python/ns3modulegen.py b/bindings/python/ns3modulegen.py index 1aa9c8c16..7cd34e182 100755 --- a/bindings/python/ns3modulegen.py +++ b/bindings/python/ns3modulegen.py @@ -85,6 +85,7 @@ def main(): ns3modulegen_core_customizations.Simulator_customizations(root_module) ns3modulegen_core_customizations.CommandLine_customizations(root_module) + ns3modulegen_core_customizations.TypeId_customizations(root_module) for local_module in LOCAL_MODULES: diff --git a/bindings/python/ns3modulegen_core_customizations.py b/bindings/python/ns3modulegen_core_customizations.py index 2766eb07c..d84fcc12e 100644 --- a/bindings/python/ns3modulegen_core_customizations.py +++ b/bindings/python/ns3modulegen_core_customizations.py @@ -517,3 +517,10 @@ def Attribute_customizations(module): and param.default_value_type is None: param.default_value_type = 'ns3::EmptyAttributeValue' + +def TypeId_customizations(module): + TypeId = module['ns3::TypeId'] + TypeId.add_custom_method_wrapper("LookupByNameFailSafe", "_wrap_TypeId_LookupByNameFailSafe", + flags=["METH_VARARGS", "METH_KEYWORDS", "METH_STATIC"]) + + diff --git a/bindings/python/ns3modulescan.py b/bindings/python/ns3modulescan.py index 942f77496..4b0684879 100644 --- a/bindings/python/ns3modulescan.py +++ b/bindings/python/ns3modulescan.py @@ -48,9 +48,6 @@ type_annotations = { 'decref_method': 'Unref', 'peekref_method': 'GetReferenceCount', }, - '::ns3::PacketMetadata': { - 'ignore': None, - }, '::ns3::AttributeChecker': { 'automatic_type_narrowing': 'true', 'allow_subclassing': 'false', @@ -73,7 +70,7 @@ type_annotations = { 'params': {'info':{'transfer_ownership': 'false'}} }, 'static bool ns3::TypeId::LookupByNameFailSafe(std::string name, ns3::TypeId * tid) [member function]': { - 'params': {'tid': {'transfer_ownership': 'false'}} + 'ignore': None, # manually wrapped in }, 'bool ns3::TraceSourceAccessor::ConnectWithoutContext(ns3::ObjectBase * obj, ns3::CallbackBase const & cb) const [member function]': { 'params': {'obj': {'transfer_ownership':'false'}} diff --git a/bindings/python/wscript b/bindings/python/wscript index 9989afe00..4efa378e8 100644 --- a/bindings/python/wscript +++ b/bindings/python/wscript @@ -22,7 +22,7 @@ else: os.environ['PYTHONPATH'] = LOCAL_PYBINDGEN_PATH ## https://launchpad.net/pybindgen/ -REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 598) +REQUIRED_PYBINDGEN_VERSION = (0, 9, 0, 600) REQUIRED_PYGCCXML_VERSION = (0, 9, 5) diff --git a/src/common/packet-metadata.h b/src/common/packet-metadata.h index 574d2f6e6..a2d5228fc 100644 --- a/src/common/packet-metadata.h +++ b/src/common/packet-metadata.h @@ -157,8 +157,6 @@ public: void Serialize (Buffer::Iterator i, uint32_t size) const; uint32_t Deserialize (Buffer::Iterator i); - static void PrintStats (void); - ItemIterator BeginItem (Buffer buffer) const; private: diff --git a/utils/python-unit-tests.py b/utils/python-unit-tests.py index 43ce5a53e..8495661fb 100644 --- a/utils/python-unit-tests.py +++ b/utils/python-unit-tests.py @@ -118,5 +118,11 @@ class TestSimulator(unittest.TestCase): self.assert_(c1 is c2) + def testTypeId(self): + typeId1 = ns3.TypeId.LookupByNameFailSafe("ns3::UdpSocketFactory") + self.assertEqual(typeId1.GetName (), "ns3::UdpSocketFactory") + + self.assertRaises(KeyError, ns3.TypeId.LookupByNameFailSafe, "__InvalidTypeName__") + if __name__ == '__main__': unittest.main()