diff options
Diffstat (limited to 'indra/newview/lleventpoll.cpp')
-rw-r--r-- | indra/newview/lleventpoll.cpp | 261 |
1 files changed, 134 insertions, 127 deletions
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp index 4452a134ae..8c362a0ac5 100644 --- a/indra/newview/lleventpoll.cpp +++ b/indra/newview/lleventpoll.cpp @@ -16,155 +16,162 @@ #include "llviewerregion.h" #include "message.h" -class LLEventPoll::Impl : LLHTTPClient::Responder +namespace { -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; - - 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) -{ - Impl* i = new Impl(pollURL); - llinfos << "LLEventPoll::Impl::start <" << i->mCount << "> " - << pollURL << llendl; - 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) + class LLEventPollResponder : public LLHTTPClient::Responder + { + public: + + static LLHTTPClient::ResponderPtr start(const std::string& pollURL, const LLHost& sender); + void stop(); + + private: + LLEventPollResponder(const std::string& pollURL, const LLHost& sender); + ~LLEventPollResponder(); + + void makeRequest(); + void handleMessage(const LLSD& content); + virtual void error(U32 status, const std::string& reason); + virtual void result(const LLSD& content); + + private: + + 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 + LLHTTPClient::ResponderPtr LLEventPollResponder::start( + const std::string& pollURL, const LLHost& sender) { - llerrs << "LLEventPoll initialized before region is added." << llendl; + LLHTTPClient::ResponderPtr result = new LLEventPollResponder(pollURL, sender); + llinfos << "LLEventPollResponder::start <" << sCount << "> " + << pollURL << llendl; + return result; } - 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; - - lldebugs << "LLEventPoll::Impl::makeRequest <" << mCount << "> ack = " - << LLSDXMLStreamer(mAcknowledge) << llendl; - LLHTTPClient::post(mPollURL, request, mPtr); -} + void LLEventPollResponder::stop() + { + llinfos << "LLEventPollResponder::stop <" << mCount << "> " + << mPollURL << llendl; + // there should be a way to stop a LLHTTPClient request in progress + mDone = true; + } -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); -} + int LLEventPollResponder::sCount = 0; -//virtual -void LLEventPoll::Impl::error(U32 status, const std::string& reason) -{ - if (mDone) return; + LLEventPollResponder::LLEventPollResponder(const std::string& pollURL, const LLHost& sender) + : mDone(false), + mPollURL(pollURL), + mCount(++sCount) + { + //extract host and port of simulator to set as sender + LLViewerRegion *regionp = gAgent.getRegion(); + if (!regionp) + { + llerrs << "LLEventPoll initialized before region is added." << llendl; + } + mSender = sender.getIPandPort(); + llinfos << "LLEventPoll initialized with sender " << mSender << llendl; + makeRequest(); + } - if(status != 499) + LLEventPollResponder::~LLEventPollResponder() { - llwarns << "LLEventPoll::Impl::error: <" << mCount << "> got " - << status << ": " << reason - << (mDone ? " -- done" : "") << llendl; stop(); - return; + lldebugs << "LLEventPollResponder::~Impl <" << mCount << "> " + << mPollURL << llendl; } - makeRequest(); -} + void LLEventPollResponder::makeRequest() + { + LLSD request; + request["ack"] = mAcknowledge; + request["done"] = mDone; + + lldebugs << "LLEventPollResponder::makeRequest <" << mCount << "> ack = " + << LLSDXMLStreamer(mAcknowledge) << llendl; + LLHTTPClient::post(mPollURL, request, this); + } -//virtual -void LLEventPoll::Impl::result(const LLSD& content) -{ - lldebugs << "LLEventPoll::Impl::result <" << mCount << ">" - << (mDone ? " -- done" : "") << llendl; - - if (mDone) return; - - mAcknowledge = content["id"]; - LLSD events = content["events"]; - - if(mAcknowledge.isUndefined()) + void LLEventPollResponder::handleMessage(const LLSD& content) { - llwarns << "LLEventPoll::Impl: id undefined" << llendl; + std::string msg_name = content["message"]; + LLSD message; + message["sender"] = mSender; + message["body"] = content["body"]; + LLMessageSystem::dispatch(msg_name, message); } - - llinfos << "LLEventPoll::Impl::completed <" << mCount << "> " << events.size() << "events (id " - << LLSDXMLStreamer(mAcknowledge) << ")" << llendl; - - LLSD::array_const_iterator i = events.beginArray(); - LLSD::array_const_iterator end = events.endArray(); - for (; i != end; ++i) + + //virtual + void LLEventPollResponder::error(U32 status, const std::string& reason) { - if (i->has("message")) + if (mDone) return; + + if(status != 499) { - handleMessage(*i); + llwarns << "LLEventPollResponder::error: <" << mCount << "> got " + << status << ": " << reason + << (mDone ? " -- done" : "") << llendl; + stop(); + return; } + + makeRequest(); } - - makeRequest(); + + //virtual + void LLEventPollResponder::result(const LLSD& content) + { + lldebugs << "LLEventPollResponder::result <" << mCount << ">" + << (mDone ? " -- done" : "") << llendl; + + if (mDone) return; + + if (!content.get("events") || + !content.get("id")) + { + llwarns << "received event poll with no events or id key" << llendl; + return; + } + + mAcknowledge = content["id"]; + LLSD events = content["events"]; + + if(mAcknowledge.isUndefined()) + { + llwarns << "LLEventPollResponder: id undefined" << llendl; + } + + llinfos << "LLEventPollResponder::completed <" << mCount << "> " << events.size() << "events (id " + << 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")) + { + handleMessage(*i); + } + } + + makeRequest(); + } } -LLEventPoll::LLEventPoll(const std::string& pollURL) - : impl(Impl::start(pollURL)) +LLEventPoll::LLEventPoll(const std::string& pollURL, const LLHost& sender) + : mImpl(LLEventPollResponder::start(pollURL, sender)) { } LLEventPoll::~LLEventPoll() { - impl.stop(); } |