summaryrefslogtreecommitdiff
path: root/indra/newview/lleventpoll.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/lleventpoll.cpp')
-rw-r--r--indra/newview/lleventpoll.cpp254
1 files changed, 129 insertions, 125 deletions
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index 2ad7eb6866..6d1c384b5a 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -1,163 +1,167 @@
-/**
+/**
* @file lleventpoll.cpp
- * @brief Implementation of the LLEventPoll class.
+ * @brief Implementation of the LLEventPoll class.
*
- * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
+ * Copyright (c) 2006-$CurrentYear$, Linden Research, Inc.
* $License$
*/
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
#include "lleventpoll.h"
#include "llhttpclient.h"
-#include "llhttpnode.h"
#include "llsdserialize.h"
+#include "llviewerregion.h"
+#include "message.h"
+class LLEventPoll::Impl : LLHTTPClient::Responder
+{
+public:
+ static Impl& start(const std::string& pollURL);
+ void stop();
+
+private:
+ Impl(const std::string& pollURL);
+ ~Impl();
+
+ void makeRequest();
+ void handleMessage(const LLSD& content);
+ virtual void error(U32 status, const std::string& reason);
+ virtual void result(const LLSD& content);
+private:
+ typedef LLHTTPClient::ResponderPtr Ptr;
-class LLEventPoll::Impl : LLHTTPClient::Responder
+ Ptr mPtr;
+ bool mDone;
+
+ std::string mPollURL;
+ std::string mSender;
+
+ LLSD mAcknowledge;
+
+ // these are only here for debugging so we can see which poller is which
+ static int sCount;
+ int mCount;
+};
+
+//static
+LLEventPoll::Impl& LLEventPoll::Impl::start(
+ const std::string& pollURL)
{
-public:
- static Impl& start(
- const std::string& pollURL, const LLHTTPNode& treeRoot)
- {
- Impl* i = new Impl(pollURL, treeRoot);
- llinfos << "LLEventPoll::Impl::start <" << i->mCount << "> "
+ Impl* i = new Impl(pollURL);
+ llinfos << "LLEventPoll::Impl::start <" << i->mCount << "> "
<< pollURL << llendl;
- return *i;
- }
-
- void stop()
+ return *i;
+}
+
+void LLEventPoll::Impl::stop()
+{
+ lldebugs << "LLEventPoll::Impl::stop <" << mCount << "> "
+ << mPollURL << llendl;
+ // there should be a way to stop a LLHTTPClient request in progress
+ mDone = true;
+ mPtr = NULL;
+}
+
+int LLEventPoll::Impl::sCount = 0;
+
+LLEventPoll::Impl::Impl(const std::string& pollURL)
+ : mPtr(NULL), mDone(false),
+ mPollURL(pollURL),
+ mCount(++sCount)
+{
+ mPtr = this;
+ //extract host and port of simulator to set as sender
+ LLViewerRegion *regionp = gAgent.getRegion();
+ if (!regionp)
{
- lldebugs << "LLEventPoll::Impl::stop <" << mCount << "> "
- << mPollURL << llendl;
- // there should be a way to stop a LLHTTPClient request in progress
- mDone = true;
- mPtr = NULL;
+ llerrs << "LLEventPoll initialized before region is added." << llendl;
}
+ mSender = regionp->getHost().getIPandPort();
+ llinfos << "LLEventPoll initialized with sender " << mSender << llendl;
+ makeRequest();
+}
+
+LLEventPoll::Impl::~Impl()
+{
+ lldebugs << "LLEventPoll::Impl::~Impl <" << mCount << "> "
+ << mPollURL << llendl;
+}
+
+void LLEventPoll::Impl::makeRequest()
+{
+ LLSD request;
+ request["ack"] = mAcknowledge;
+ request["done"] = mDone;
-private:
- Impl(const std::string& pollURL, const LLHTTPNode& treeRoot)
- : mPtr(NULL), mDone(false),
- mPollURL(pollURL), mTreeRoot(treeRoot),
- mCount(++sCount)
- {
- mPtr = this;
- makeRequest();
- }
-
- ~Impl()
- {
- lldebugs << "LLEventPoll::Impl::~Impl <" << mCount << "> "
- << mPollURL << llendl;
- }
+ lldebugs << "LLEventPoll::Impl::makeRequest <" << mCount << "> ack = "
+ << LLSDXMLStreamer(mAcknowledge) << llendl;
+ LLHTTPClient::post(mPollURL, request, mPtr);
+}
+
+void LLEventPoll::Impl::handleMessage(const LLSD& content)
+{
+ std::string msg_name = content["message"];
+ LLSD message;
+ message["sender"] = mSender;
+ message["body"] = content["body"];
+ LLMessageSystem::dispatch(msg_name, message);
+}
+//virtual
+void LLEventPoll::Impl::error(U32 status, const std::string& reason)
+{
+ if (mDone) return;
- void makeRequest()
+ if(status != 499)
{
- LLSD request;
- request["ack"] = mAcknowledge;
- request["done"] = mDone;
-
- lldebugs << "LLEventPoll::Impl::makeRequest <" << mCount << "> ack = "
- << LLSDXMLStreamer(mAcknowledge) << llendl;
- LLHTTPClient::post(mPollURL, request, mPtr);
+ llwarns << "LLEventPoll::Impl::error: <" << mCount << "> got "
+ << status << ": " << reason
+ << (mDone ? " -- done" : "") << llendl;
+ stop();
+ return;
}
+
+ makeRequest();
+}
+
+//virtual
+void LLEventPoll::Impl::result(const LLSD& content)
+{
+ lldebugs << "LLEventPoll::Impl::result <" << mCount << ">"
+ << (mDone ? " -- done" : "") << llendl;
- void handleMessage(const LLSD& content)
- {
- std::string message = content["message"];
- if (message.empty())
- {
- llwarns << "LLEventPoll::Impl::handleMessage <" << mCount
- << "> empty message name" << llendl;
- return;
- }
-
- std::string path = "/message/" + message;
-
- LLSD context;
- const LLHTTPNode* handler = mTreeRoot.traverse(path, context);
- if (!handler)
- {
- llwarns << "LLEventPoll::Impl::handleMessage <" << mCount
- << "> no handler for " << path << llendl;
- return;
- }
- LLPointer<LLSimpleResponse> responsep = LLSimpleResponse::create();
- handler->post((LLHTTPNode::ResponsePtr)responsep, context, content["body"]);
-
- lldebugs << "LLEventPoll::Impl::handleMessage handled <" << mCount << "> "
- << message << ": " << *responsep << llendl;
- }
+ if (mDone) return;
+
+ mAcknowledge = content["id"];
+ LLSD events = content["events"];
- virtual void error(U32 status, const std::string& reason)
+ if(mAcknowledge.isUndefined())
{
- lldebugs << "LLEventPoll::Impl::error <" << mCount << "> got "
- << status << ": " << reason
- << (mDone ? " -- done" : "") << llendl;
-
- if (mDone) return;
-
- if (status == 404)
- {
- // the capability has been revoked
- stop();
- return;
- }
-
- makeRequest();
+ llwarns << "LLEventPoll::Impl: id undefined" << llendl;
}
+ llinfos << "LLEventPoll::Impl::completed <" << mCount << "> " << events.size() << "events (id "
+ << LLSDXMLStreamer(mAcknowledge) << ")" << llendl;
- virtual void result(const LLSD& content)
+ LLSD::array_const_iterator i = events.beginArray();
+ LLSD::array_const_iterator end = events.endArray();
+ for (; i != end; ++i)
{
- lldebugs << "LLEventPoll::Impl::result <" << mCount << ">"
- << (mDone ? " -- done" : "") << llendl;
-
- if (mDone) return;
-
- mAcknowledge = content["id"];
- LLSD events = content["events"];
-
- lldebugs << "LLEventPoll::Impl::completed <" << mCount << "> ack = "
- << LLSDXMLStreamer(mAcknowledge) << llendl;
-
- LLSD::array_const_iterator i = events.beginArray();
- LLSD::array_const_iterator end = events.endArray();
- for (; i != end; ++i)
+ if (i->has("message"))
{
- if (i->has("message"))
- {
- handleMessage(*i);
- }
+ handleMessage(*i);
}
-
- makeRequest();
}
-
-private:
- typedef LLHTTPClient::ResponderPtr Ptr;
-
- Ptr mPtr;
- bool mDone;
-
- std::string mPollURL;
- const LLHTTPNode& mTreeRoot;
- LLSD mAcknowledge;
-
- // these are only here for debugging so we can see which poller is which
- static int sCount;
- int mCount;
-};
-
-int LLEventPoll::Impl::sCount = 0;
-
+ makeRequest();
+}
-LLEventPoll::LLEventPoll(const std::string& pollURL, const LLHTTPNode& treeRoot)
- : impl(Impl::start(pollURL, treeRoot))
+LLEventPoll::LLEventPoll(const std::string& pollURL)
+ : impl(Impl::start(pollURL))
{ }
LLEventPoll::~LLEventPoll()