summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2011-02-18 10:56:26 -0500
committerNat Goodspeed <nat@lindenlab.com>2011-02-18 10:56:26 -0500
commit4ef02bc1b6cf5e044d2cf57725eac1a4ccd7580d (patch)
tree97b7612d5467e3d206ac7b5bb04f084b644db6fd
parent89258376ffc3d1e6d9e40a9136e4901e643187c8 (diff)
Introduce and use new sendReply() function for LLEventAPI methods.
Each LLEventAPI method that generates a reply needs to extract the name of the reply LLEventPump from the request, typically from a ["reply"] key, copy the ["reqid"] value from request to reply, locate the reply LLEventPump and send the enriched reply object. Encapsulate in sendReply() function before we proliferate doing all that by hand too many more times.
-rw-r--r--indra/llcommon/llevents.cpp13
-rw-r--r--indra/llcommon/llevents.h14
-rw-r--r--indra/llui/llfloaterreglistener.cpp12
-rw-r--r--indra/newview/llsidetraylistener.cpp15
-rw-r--r--indra/newview/llviewerwindowlistener.cpp5
5 files changed, 37 insertions, 22 deletions
diff --git a/indra/llcommon/llevents.cpp b/indra/llcommon/llevents.cpp
index 97e2bdeb57..ff03506e84 100644
--- a/indra/llcommon/llevents.cpp
+++ b/indra/llcommon/llevents.cpp
@@ -588,3 +588,16 @@ void LLReqID::stamp(LLSD& response) const
}
response["reqid"] = mReqid;
}
+
+bool sendReply(const LLSD& reply, const LLSD& request, const std::string& replyKey)
+{
+ // Copy 'reply' to modify it.
+ LLSD newreply(reply);
+ // Get the ["reqid"] element from request
+ LLReqID reqID(request);
+ // and copy it to 'newreply'.
+ reqID.stamp(newreply);
+ // Send reply on LLEventPump named in request[replyKey]. Don't forget to
+ // send the modified 'newreply' instead of the original 'reply'.
+ return LLEventPumps::instance().obtain(request[replyKey]).post(newreply);
+}
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index 2491cf1371..65b0fef354 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -692,6 +692,20 @@ private:
};
/**
+ * Conventionally send a reply to a request event.
+ *
+ * @a reply is the LLSD reply event to send
+ * @a request is the corresponding LLSD request event
+ * @a replyKey is the key in the @a request event, conventionally ["reply"],
+ * whose value is the name of the LLEventPump on which to send the reply.
+ *
+ * Before sending the reply event, sendReply() copies the ["reqid"] item from
+ * the request to the reply.
+ */
+LL_COMMON_API bool sendReply(const LLSD& reply, const LLSD& request,
+ const std::string& replyKey="reply");
+
+/**
* Base class for LLListenerWrapper. See visit_and_connect() and llwrap(). We
* provide virtual @c accept_xxx() methods, customization points allowing a
* subclass access to certain data visible at LLEventPump::listen() time.
diff --git a/indra/llui/llfloaterreglistener.cpp b/indra/llui/llfloaterreglistener.cpp
index ec2ac6834e..7525b8cab3 100644
--- a/indra/llui/llfloaterreglistener.cpp
+++ b/indra/llui/llfloaterreglistener.cpp
@@ -76,9 +76,7 @@ LLFloaterRegListener::LLFloaterRegListener():
void LLFloaterRegListener::getBuildMap(const LLSD& event) const
{
- // Honor the "reqid" convention by echoing event["reqid"] in our reply packet.
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
+ LLSD reply;
// Build an LLSD map that mirrors sBuildMap. Since we have no good way to
// represent a C++ callable in LLSD, the only part of BuildData we can
// store is the filename. For each LLSD map entry, it would be more
@@ -91,7 +89,7 @@ void LLFloaterRegListener::getBuildMap(const LLSD& event) const
reply[mi->first] = mi->second.mFile;
}
// Send the reply to the LLEventPump named in event["reply"].
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(reply, event);
}
void LLFloaterRegListener::showInstance(const LLSD& event) const
@@ -111,10 +109,8 @@ void LLFloaterRegListener::toggleInstance(const LLSD& event) const
void LLFloaterRegListener::instanceVisible(const LLSD& event) const
{
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
- reply["visible"] = LLFloaterReg::instanceVisible(event["name"], event["key"]);
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(LLSDMap("visible", LLFloaterReg::instanceVisible(event["name"], event["key"])),
+ event);
}
void LLFloaterRegListener::clickButton(const LLSD& event) const
diff --git a/indra/newview/llsidetraylistener.cpp b/indra/newview/llsidetraylistener.cpp
index 185bf1d6a7..6db13e517d 100644
--- a/indra/newview/llsidetraylistener.cpp
+++ b/indra/newview/llsidetraylistener.cpp
@@ -37,16 +37,12 @@ LLSideTrayListener::LLSideTrayListener(const Getter& getter):
void LLSideTrayListener::getCollapsed(const LLSD& event) const
{
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
- reply["open"] = ! mGetter()->getCollapsed();
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(LLSDMap("open", ! mGetter()->getCollapsed()), event);
}
void LLSideTrayListener::getTabs(const LLSD& event) const
{
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
+ LLSD reply;
LLSideTray* tray = mGetter();
LLSD::Integer ord(0);
@@ -68,7 +64,7 @@ void LLSideTrayListener::getTabs(const LLSD& event) const
reply[child->getName()] = info;
}
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(reply, event);
}
static LLSD getTabInfo(LLPanel* tab)
@@ -133,8 +129,7 @@ static LLSD getTabInfo(LLPanel* tab)
void LLSideTrayListener::getPanels(const LLSD& event) const
{
- LLReqID reqID(event);
- LLSD reply(reqID.makeResponse());
+ LLSD reply;
LLSideTray* tray = mGetter();
// Iterate through the attached tabs.
@@ -163,5 +158,5 @@ void LLSideTrayListener::getPanels(const LLSD& event) const
reply[tab->getName()] = getTabInfo(tab).with("attached", false).with("ord", ord);
}
- LLEventPumps::instance().obtain(event["reply"]).post(reply);
+ sendReply(reply, event);
}
diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp
index 0b52948680..1fe5fc9800 100644
--- a/indra/newview/llviewerwindowlistener.cpp
+++ b/indra/newview/llviewerwindowlistener.cpp
@@ -65,7 +65,6 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow):
void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
{
- LLReqID reqid(event);
typedef std::map<LLSD::String, LLViewerWindow::ESnapshotType> TypeMap;
TypeMap types;
#define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name
@@ -98,9 +97,7 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const
type = found->second;
}
bool ok = mViewerWindow->saveSnapshot(event["filename"], width, height, showui, rebuild, type);
- LLSD response(reqid.makeResponse());
- response["ok"] = ok;
- LLEventPumps::instance().obtain(event["reply"]).post(response);
+ sendReply(LLSDMap("ok", ok), event);
}
void LLViewerWindowListener::requestReshape(LLSD const & event_data) const