From 8cae8bee2688c5e6441fb4355a70df81f5c0e1d6 Mon Sep 17 00:00:00 2001
From: florent <florent@laas.fr>
Date: Tue, 26 Oct 2010 09:16:05 +0200
Subject: [PATCH] Bind method Entity::getNewStyleCommandMap()

     * src/dynamic-graph-py.cc,
     * src/entity-py.cc.
---
 src/dynamic-graph-py.cc |  5 +++++
 src/entity-py.cc        | 30 ++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc
index f2a4cac..a57eb8e 100644
--- a/src/dynamic-graph-py.cc
+++ b/src/dynamic-graph-py.cc
@@ -28,6 +28,7 @@ namespace dynamicgraph {
       extern PyObject* getSignal(PyObject* self, PyObject* args);
       extern PyObject* displaySignals(PyObject* self, PyObject* args);
       extern PyObject* executeCommand(PyObject* self, PyObject* args);
+      extern PyObject* listCommands(PyObject* self, PyObject* args);
     }
 
     namespace factory {
@@ -121,6 +122,10 @@ static PyMethodDef dynamicGraphMethods[] = {
    dynamicgraph::python::entity::executeCommand,
    METH_VARARGS,
    "execute a command"},
+  {"entity_list_commands",
+   dynamicgraph::python::entity::listCommands,
+   METH_VARARGS,
+   "list the commands of an entity"},
   {"factory_get_entity_class_list",
    dynamicgraph::python::factory::getEntityClassList,
    METH_VARARGS,
diff --git a/src/entity-py.cc b/src/entity-py.cc
index 3b93e6a..29df284 100644
--- a/src/entity-py.cc
+++ b/src/entity-py.cc
@@ -277,6 +277,36 @@ namespace dynamicgraph {
 	}
 	return NULL;
       }
+      
+      PyObject* listCommands(PyObject* self, PyObject* args)
+      {
+	PyObject* object = NULL;
+	if (!PyArg_ParseTuple(args, "O", &object)) {
+	  return NULL;
+	}
+
+	// Retrieve the entity instance
+	if (!PyCObject_Check(object)) {
+	  PyErr_SetString(error, "first argument is not an object");
+	  return NULL;
+	}
+	void* pointer = PyCObject_AsVoidPtr(object);
+	Entity* entity = (Entity*)pointer;
+	typedef	std::map<const std::string, command::Command*>  CommandMap;
+	CommandMap map = entity->getNewStyleCommandMap();
+	unsigned int nbCommands = map.size();
+	// Create a tuple of same size as the command map
+	PyObject* result = PyTuple_New(nbCommands);
+	unsigned int count = 0;
+	for (CommandMap::iterator it=map.begin();
+	     it != map.end(); it++) {
+	  std::string commandName = it->first;
+	  PyObject* pyName = Py_BuildValue("s", commandName.c_str());
+	  PyTuple_SET_ITEM(result, count, pyName);
+	  count++;
+	}
+	return result;
+      }
     }
   }
 }
-- 
GitLab