Revision: 6371
http://playerstage.svn.sourceforge.net/playerstage/?rev=6371&view=rev
Author: thjc
Date: 2008-04-22 20:44:00 -0700 (Tue, 22 Apr 2008)
Log Message:
-----------
fixed python bindings again, builddir is not needed as builds in curdir
Added group request to blackboard
Modified Paths:
--------------
code/player/branches/release-2-1-patches/client_libs/libplayerc/bindings/python/Makefile.am
code/player/branches/release-2-1-patches/client_libs/libplayerc/dev_blackboard.c
code/player/branches/release-2-1-patches/client_libs/libplayerc/playerc.h
code/player/branches/release-2-1-patches/client_libs/libplayerc++/blackboardproxy.cc
code/player/branches/release-2-1-patches/client_libs/libplayerc++/playerc++.h
code/player/branches/release-2-1-patches/libplayercore/interfaces/064_blackboard.def
code/player/branches/release-2-1-patches/server/drivers/blackboard/localbb/localbb.cpp
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc/bindings/python/Makefile.am
===================================================================
---
code/player/branches/release-2-1-patches/client_libs/libplayerc/bindings/python/Makefile.am
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/client_libs/libplayerc/bindings/python/Makefile.am
2008-04-23 03:44:00 UTC (rev 6371)
@@ -35,8 +35,8 @@
# Use distutils to build module
pythonbuild: playerc_oo.i ../../playerc.h srcbuilddirs.py
- if test ! -s $(builddir)/setup.py; then cp $(srcdir)/setup.py
$(builddir)/setup.py; fi
- python $(builddir)/setup.py build
+ if test ! -s setup.py; then cp $(srcdir)/setup.py setup.py; fi
+ python setup.py build
# For distcheck builds, clean up the files we created in the build tree
# This generates warnings, so I'm relying on the top-level Makefile.am
override.
@@ -54,8 +54,8 @@
# use distutils to install
pythoninstall:
- if test ! -s $(builddir)/setup.py; then cp $(srcdir)/setup.py
$(builddir)/setup.py; fi
- python $(builddir)/setup.py install --prefix=$(DESTDIR)/$(prefix)
+ if test ! -s setup.py; then cp $(srcdir)/setup.py setup.py; fi
+ python setup.py install --prefix=$(DESTDIR)/$(prefix)
# seems that distutils doesn't support 'uninstall', oh well
uninstall-local:
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc/dev_blackboard.c
===================================================================
---
code/player/branches/release-2-1-patches/client_libs/libplayerc/dev_blackboard.c
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/client_libs/libplayerc/dev_blackboard.c
2008-04-23 03:44:00 UTC (rev 6371)
@@ -329,6 +329,81 @@
}
+// Subscribe to a blackboard group
+int playerc_blackboard_subscribe_to_group(playerc_blackboard_t* device, const
char* group)
+{
+ player_blackboard_entry_t req;
+ memset(&req, 0, sizeof(req));
+ req.key = strdup("");
+ req.key_count = strlen("") + 1;
+
+ req.group = strdup(group);
+ req.group_count = strlen(group) + 1;
+
+ if (playerc_client_request(device->info.client, &device->info,
+ PLAYER_BLACKBOARD_REQ_SUBSCRIBE_TO_GROUP, &req, NULL) < 0)
+ {
+ if (req.key != NULL)
+ {
+ free(req.key);
+ }
+ if (req.group != NULL)
+ {
+ free(req.group);
+ }
+ PLAYERC_ERR("failed to subscribe to blackboard group");
+ return -1;
+ }
+
+ if (req.key != NULL)
+ {
+ free(req.key);
+ }
+ if (req.group != NULL)
+ {
+ free(req.group);
+ }
+ return 0;
+}
+
+// Unsubscribe from a blackboard group
+int playerc_blackboard_unsubscribe_from_group(playerc_blackboard_t* device,
const char* group)
+{
+ player_blackboard_entry_t req;
+ memset(&req, 0, sizeof(req));
+ req.key = strdup("");
+ req.key_count = strlen("") + 1;
+
+ req.group = strdup(group);
+ req.group_count = strlen(group) + 1;
+
+ if (playerc_client_request(device->info.client, &device->info,
+ PLAYER_BLACKBOARD_REQ_UNSUBSCRIBE_FROM_GROUP, &req, NULL) < 0)
+ {
+ if (req.key)
+ {
+ free(req.key);
+ }
+ if (req.group)
+ {
+ free(req.group);
+ }
+ PLAYERC_ERR("failed to unsubscribe to blackboard group");
+ return -1;
+ }
+
+ if (req.key)
+ {
+ free(req.key);
+ }
+ if (req.group)
+ {
+ free(req.group);
+ }
+ return 0;
+
+}
+
// Set a key
int playerc_blackboard_set_entry(playerc_blackboard_t *device,
player_blackboard_entry_t* entry)
{
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc/playerc.h
===================================================================
--- code/player/branches/release-2-1-patches/client_libs/libplayerc/playerc.h
2008-04-21 18:11:44 UTC (rev 6370)
+++ code/player/branches/release-2-1-patches/client_libs/libplayerc/playerc.h
2008-04-23 03:44:00 UTC (rev 6371)
@@ -1178,6 +1178,12 @@
/** @brief Unsubscribe from a key. */
int playerc_blackboard_unsubscribe_from_key(playerc_blackboard_t *device,
const char* key, const char* group);
+/** @brief Subscribe to a group. The current entries are sent as data
messages. */
+int playerc_blackboard_subscribe_to_group(playerc_blackboard_t *device, const
char* group);
+
+/** @brief Unsubscribe from a group. */
+int playerc_blackboard_unsubscribe_from_group(playerc_blackboard_t *device,
const char* group);
+
/** @brief Set an entry value. */
int playerc_blackboard_set_entry(playerc_blackboard_t *device,
player_blackboard_entry_t* entry);
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc++/blackboardproxy.cc
===================================================================
---
code/player/branches/release-2-1-patches/client_libs/libplayerc++/blackboardproxy.cc
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/client_libs/libplayerc++/blackboardproxy.cc
2008-04-23 03:44:00 UTC (rev 6371)
@@ -97,7 +97,7 @@
if (0 != playerc_blackboard_subscribe_to_key(mDevice, key, group, &pointer))
{
- throw PlayerError("BlackBoardProxy::SubscribeToKey(const string& key)",
"could not subscribe to key");
+ throw PlayerError("BlackBoardProxy::SubscribeToKey(const char* key,
const char* group)", "could not subscribe to key");
}
assert(pointer);
@@ -142,10 +142,29 @@
scoped_lock_t lock(mPc->mMutex);
if (0 != playerc_blackboard_unsubscribe_from_key(mDevice, key, group))
{
- throw PlayerError("BlackBoardProxy::UnsubscribeFromKey(const
string& key)", "could not unsubscribe from key");
+ throw PlayerError("BlackBoardProxy::UnsubscribeFromKey(const
char* key, const char* group)", "could not unsubscribe from key");
}
}
+void BlackBoardProxy::SubscribeToGroup(const char* group)
+{
+ scoped_lock_t lock(mPc->mMutex);
+
+ if (0 != playerc_blackboard_subscribe_to_group(mDevice, group))
+ {
+ throw PlayerError("BlackBoardProxy::SubscribeToGroup(const char*
group)", "could not subscribe to group");
+ }
+}
+
+void BlackBoardProxy::UnsubscribeFromGroup(const char* group)
+{
+ scoped_lock_t lock(mPc->mMutex);
+ if (0 != playerc_blackboard_unsubscribe_from_group(mDevice, group))
+ {
+ throw PlayerError("BlackBoardProxy::UnsubscribeFromGroup(const
char* group)", "could not unsubscribe from group");
+ }
+}
+
void BlackBoardProxy::SetEntry(const player_blackboard_entry_t &entry)
{
scoped_lock_t lock(mPc->mMutex);
Modified:
code/player/branches/release-2-1-patches/client_libs/libplayerc++/playerc++.h
===================================================================
---
code/player/branches/release-2-1-patches/client_libs/libplayerc++/playerc++.h
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/client_libs/libplayerc++/playerc++.h
2008-04-23 03:44:00 UTC (rev 6371)
@@ -348,6 +348,10 @@
player_blackboard_entry_t *SubscribeToKey(const char *key, const char*
group = "");
/** Stop receiving updates about this key. */
void UnsubscribeFromKey(const char *key, const char* group = "");
+ /** Subscribe to a group. The event handler must be set to retrieve the
current group entries. */
+ void SubscribeToGroup(const char* key);
+ /** Stop receiving updates about this group. */
+ void UnsubscribeFromGroup(const char* group);
/** Set a key value */
void SetEntry(const player_blackboard_entry_t &entry);
/** Set the function pointer which will be called when an entry is
updated. */
Modified:
code/player/branches/release-2-1-patches/libplayercore/interfaces/064_blackboard.def
===================================================================
---
code/player/branches/release-2-1-patches/libplayercore/interfaces/064_blackboard.def
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/libplayercore/interfaces/064_blackboard.def
2008-04-23 03:44:00 UTC (rev 6371)
@@ -9,6 +9,10 @@
message { REQ, UNSUBSCRIBE_FROM_KEY, 2, player_blackboard_entry_t };
/** Request/reply subtype: set entry. */
message { REQ, SET_ENTRY, 3, player_blackboard_entry_t };
+/** Request/reply subtype: subscribe to group. */
+message { REQ, SUBSCRIBE_TO_GROUP, 4, player_blackboard_entry_t };
+/** Request/reply subtype: unsubscribe from group. */
+message { REQ, UNSUBSCRIBE_FROM_GROUP, 5, player_blackboard_entry_t };
/** Data update reply */
message { DATA, UPDATE, 1, player_blackboard_entry_t };
Modified:
code/player/branches/release-2-1-patches/server/drivers/blackboard/localbb/localbb.cpp
===================================================================
---
code/player/branches/release-2-1-patches/server/drivers/blackboard/localbb/localbb.cpp
2008-04-21 18:11:44 UTC (rev 6370)
+++
code/player/branches/release-2-1-patches/server/drivers/blackboard/localbb/localbb.cpp
2008-04-23 03:44:00 UTC (rev 6371)
@@ -220,6 +220,24 @@
* @return 0 for success, -1 on error.
*/
int ProcessSetEntryMessage(QueuePointer &resp_queue,
player_msghdr * hdr, void * data);
+ /** @brief Process a subscribe to group message.
+ * Adds the response queue to the list of devices listenening
to that group in the map.
+ * Retrieves the entries for that group.
+ * Publishes the entries.
+ * @param resp_queue Player response queue.
+ * @param hdr Message header.
+ * @param data Message data.
+ * @return 0 for success, -1 on error.
+ */
+ int ProcessSubscribeGroupMessage(QueuePointer &resp_queue,
player_msghdr * hdr, void * data);
+ /** @brief Process an unsubscribe from group message.
+ * Removes the response queue from the list of devices
listening to that group in the map.
+ * @param resp_queue Player response queue.
+ * @param hdr Message header.
+ * @param data Message data.
+ * @return 0 for success, -1 on error.
+ * */
+ int ProcessUnsubscribeGroupMessage(QueuePointer &resp_queue,
player_msghdr * hdr, void * data);
// Blackboard handler functions
/** @brief Add the key and queue combination to the listeners
hash-map and return the entry for the key.
@@ -231,12 +249,26 @@
/** @brief Remove the key and queue combination from the
listeners hash-map.
* @param key Entry key.
* @param group Second identifier.
- * @param qp Player response queue of the subscriber.
+ * @param qp Player response queue of the unsubscriber.
+ * @return Blackboard entry containing the value of the key and
group.
*/
void UnsubscribeKey(const string &key, const string &group,
const QueuePointer &qp);
+ /** @brief Add a group to the group listeners hash-map and
return all entries of that group
+ * @param group Entry gruop
+ * @param qp resp_queue Player response queue of the subscriber
+ * @return Vector of blackboard entries of that group
+ */
+ vector<BlackBoardEntry> SubscribeGroup(const string &group,
const QueuePointer &qp);
+ /**
+ * @brief Remove the group from the group listeners hash-map.
+ * @param group Entry group
+ * @param qp Player response queue of the unsubscriber
+ */
+ void UnsubscribeGroup(const string &group, const QueuePointer
&qp);
+
/** @brief Set the entry in the entries hashmap. *
- * @param entry BlackBoardEntry that must be put in the hashmap.
- */
+ * @param entry BlackBoardEntry that must be put in the hashmap.
+ */
void SetEntry(const BlackBoardEntry &entry);
// Helper functions
@@ -246,12 +278,19 @@
bool CheckHeader(player_msghdr * hdr);
// Internal blackboard data
- /** Map of labels to entry data. */
- //map<group, map<key, entry> >
+ /** Map of labels to entry data.
+ * map<group, map<key, entry> >
+ */
map<string, map<string, BlackBoardEntry> > entries;
- /** Map of labels to listening queues. */
- //map<group, map<key, vector<device queue> > >
+ /** Map of labels to listening queues.
+ * map<group, map<key, vector<device queue> > >
+ */
map<string, map<string, vector<QueuePointer> > > listeners;
+
+ /** Map of groups to queues subscribed to groups.
+ * map<group, vector<device queue> >
+ */
+ map<string, vector<QueuePointer> > group_listeners;
};
////////////////////////////////////////////////////////////////////////////////
@@ -318,6 +357,14 @@
{
return ProcessSetEntryMessage(resp_queue, hdr, data);
}
+ else if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ,
PLAYER_BLACKBOARD_REQ_SUBSCRIBE_TO_GROUP, this->device_addr))
+ {
+ return ProcessSubscribeGroupMessage(resp_queue, hdr, data);
+ }
+ else if (Message::MatchMessage(hdr, PLAYER_MSGTYPE_REQ,
PLAYER_BLACKBOARD_REQ_UNSUBSCRIBE_FROM_GROUP, this->device_addr))
+ {
+ return ProcessUnsubscribeGroupMessage(resp_queue, hdr, data);
+ }
// Don't know how to handle this message
return -1;
}
@@ -388,6 +435,84 @@
}
////////////////////////////////////////////////////////////////////////////////
+// Subscribe a device to a group. Send out data messages for the current group
entries.
+int LocalBB::ProcessSubscribeGroupMessage(QueuePointer &resp_queue,
player_msghdr * hdr, void * data)
+{
+ if (!CheckHeader(hdr))
+ return -1;
+
+ // Add the device to the listeners map
+ player_blackboard_entry_t *request =
reinterpret_cast<player_blackboard_entry_t*>(data);
+ vector<BlackBoardEntry> current_values = SubscribeGroup(request->group,
resp_queue);
+
+ // Get the entries for the given key and send the data updates
+ for (vector<BlackBoardEntry>::iterator itr=current_values.begin(); itr
!= current_values.end(); itr++)
+ {
+ BlackBoardEntry current_value = *itr;
+ player_blackboard_entry_t response =
ToPlayerBlackBoardEntry(current_value);
+ size_t response_size = sizeof(player_blackboard_entry_t) +
response.key_count + response.group_count + response.data_count;
+
+ // Publish the blackboard entries
+ this->Publish(this->device_addr,
+ resp_queue,
+ PLAYER_MSGTYPE_DATA,
+ PLAYER_BLACKBOARD_DATA_UPDATE,
+ &response,
+ response_size,
+ NULL);
+
+ if (response.key)
+ {
+ delete [] response.key;
+ }
+ if (response.group)
+ {
+ delete [] response.group;
+ }
+ if (response.data)
+ {
+ delete [] response.data;
+ }
+ }
+
+ // Then send an empty ack
+ this->Publish(
+ this->device_addr,
+ resp_queue,
+ PLAYER_MSGTYPE_RESP_ACK,
+ PLAYER_BLACKBOARD_REQ_SUBSCRIBE_TO_GROUP,
+ NULL,
+ 0,
+ NULL);
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Unsubscribe a device from a group.
+int LocalBB::ProcessUnsubscribeGroupMessage(QueuePointer &resp_queue,
player_msghdr * hdr, void * data)
+{
+ if (!CheckHeader(hdr))
+ return -1;
+
+ // Remove the device from the group listeners map
+ player_blackboard_entry_t *request =
reinterpret_cast<player_blackboard_entry_t*>(data);
+ UnsubscribeGroup(request->group, resp_queue);
+
+ // Send back an empty ack
+ this->Publish(
+ this->device_addr,
+ resp_queue,
+ PLAYER_MSGTYPE_RESP_ACK,
+ PLAYER_BLACKBOARD_REQ_UNSUBSCRIBE_FROM_KEY,
+ NULL,
+ 0,
+ NULL);
+
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
// Set an entry and send out update events to all listeners.
int LocalBB::ProcessSetEntryMessage(QueuePointer &resp_queue, player_msghdr *
hdr, void * data)
{
@@ -399,7 +524,7 @@
SetEntry(entry);
- // Send out update events to other listening devices
+ // Send out update events to other listening devices for key group
combinations
vector<QueuePointer> &devices = listeners[entry.group][entry.key];
for (vector<QueuePointer>::iterator itr=devices.begin(); itr !=
devices.end(); itr++)
@@ -414,6 +539,20 @@
NULL);
}
+ // Send out update events to just groups
+ vector<QueuePointer> &devices_groups = group_listeners[entry.group];
+ for (vector<QueuePointer>::iterator itr=devices_groups.begin(); itr !=
devices_groups.end(); itr++)
+ {
+ QueuePointer device_queue = (*itr);
+ this->Publish(this->device_addr,
+ device_queue,
+ PLAYER_MSGTYPE_DATA,
+ PLAYER_BLACKBOARD_DATA_UPDATE,
+ data,
+ hdr->size,
+ NULL);
+ }
+
// Send back an empty ack
this->Publish(this->device_addr,
resp_queue,
@@ -457,6 +596,39 @@
}
////////////////////////////////////////////////////////////////////////////////
+// Add a device to the group listener map. Return vector of entries for that
group.
+vector<BlackBoardEntry> LocalBB::SubscribeGroup(const string &group, const
QueuePointer &qp)
+{
+ group_listeners[group].push_back(qp);
+ vector<BlackBoardEntry> group_entries;
+
+ // Add all entries for a group to the group_entries vector
+ //map<group, map<key, entry> >
+ map<string, BlackBoardEntry> entry_map = entries[group];
+ for (map<string, BlackBoardEntry>::iterator itr = entry_map.begin();
itr != entry_map.end(); itr++)
+ {
+ group_entries.push_back((*itr).second);
+ }
+ return group_entries;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// Remove a device from the group listener map
+void LocalBB::UnsubscribeGroup(const string &group, const QueuePointer &qp)
+{
+ vector<QueuePointer> &devices = group_listeners[group];
+
+ for (vector<QueuePointer>::iterator itr = devices.begin(); itr !=
devices.end(); itr++)
+ {
+ if ((*itr) == qp)
+ {
+ devices.erase(itr);
+ break;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
// Set entry value in the entries map.
void LocalBB::SetEntry(const BlackBoardEntry &entry)
{
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit