diff options
Diffstat (limited to 'indra/newview/llfloaterperms.cpp')
| -rwxr-xr-x | indra/newview/llfloaterperms.cpp | 160 |
1 files changed, 68 insertions, 92 deletions
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index 04a818c2c0..b0b2770c6e 100755 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -37,6 +37,9 @@ #include "llnotificationsutil.h" #include "llsdserialize.h" #include "llvoavatar.h" +#include "llcorehttputil.h" +#include "lleventfilter.h" +#include "lleventcoro.h" LLFloaterPerms::LLFloaterPerms(const LLSD& seed) : LLFloater(seed) @@ -167,120 +170,93 @@ void LLFloaterPermsDefault::onCommitCopy(const LLSD& user_data) } const int MAX_HTTP_RETRIES = 5; -LLFloaterPermsRequester* LLFloaterPermsRequester::sPermsRequester = NULL; +const float RETRY_TIMEOUT = 5.0; -LLFloaterPermsRequester::LLFloaterPermsRequester(const std::string url, const LLSD report, - int maxRetries) - : mRetriesCount(0), mMaxRetries(maxRetries), mUrl(url), mReport(report) -{} - -//static -void LLFloaterPermsRequester::init(const std::string url, const LLSD report, int maxRetries) -{ - if (sPermsRequester == NULL) { - sPermsRequester = new LLFloaterPermsRequester(url, report, maxRetries); - } -} - -//static -void LLFloaterPermsRequester::finalize() +void LLFloaterPermsDefault::sendInitialPerms() { - if (sPermsRequester != NULL) + if(!mCapSent) { - delete sPermsRequester; - sPermsRequester = NULL; + updateCap(); + setCapSent(true); } } -//static -LLFloaterPermsRequester* LLFloaterPermsRequester::instance() +void LLFloaterPermsDefault::updateCap() { - return sPermsRequester; -} + std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences"); -void LLFloaterPermsRequester::start() -{ - ++mRetriesCount; - LLHTTPClient::post(mUrl, mReport, new LLFloaterPermsResponder()); -} - -bool LLFloaterPermsRequester::retry() -{ - if (++mRetriesCount < mMaxRetries) + if(!object_url.empty()) { - LLHTTPClient::post(mUrl, mReport, new LLFloaterPermsResponder()); - return true; + LLCoros::instance().launch("LLFloaterPermsDefault::updateCapCoro", + boost::bind(&LLFloaterPermsDefault::updateCapCoro, object_url)); } - return false; + else + { + LL_DEBUGS("ObjectPermissionsFloater") << "AgentPreferences cap not available." << LL_ENDL; + } } -void LLFloaterPermsResponder::httpFailure() +/*static*/ +void LLFloaterPermsDefault::updateCapCoro(std::string url) { - if (!LLFloaterPermsRequester::instance() || !LLFloaterPermsRequester::instance()->retry()) - { - LLFloaterPermsRequester::finalize(); - const std::string& reason = getReason(); - // Do not display the same error more than once in a row - if (reason != sPreviousReason) - { - sPreviousReason = reason; - LLSD args; - args["REASON"] = reason; - LLNotificationsUtil::add("DefaultObjectPermissions", args); - } - } -} + int retryCount = 0; + std::string previousReason; + LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID); + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t + httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericPostCoro", httpPolicy)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); -void LLFloaterPermsResponder::httpSuccess() -{ - //const LLSD& content = getContent(); - //dump_sequential_xml("perms_responder_result.xml", content); + LLSD postData = LLSD::emptyMap(); + postData["default_object_perm_masks"]["Group"] = + (LLSD::Integer)LLFloaterPerms::getGroupPerms(sCategoryNames[CAT_OBJECTS]); + postData["default_object_perm_masks"]["Everyone"] = + (LLSD::Integer)LLFloaterPerms::getEveryonePerms(sCategoryNames[CAT_OBJECTS]); + postData["default_object_perm_masks"]["NextOwner"] = + (LLSD::Integer)LLFloaterPerms::getNextOwnerPerms(sCategoryNames[CAT_OBJECTS]); - // Since we have had a successful POST call be sure to display the next error message - // even if it is the same as a previous one. - sPreviousReason = ""; - LL_INFOS("ObjectPermissionsFloater") << "Default permissions successfully sent to simulator" << LL_ENDL; -} + { + LL_DEBUGS("ObjectPermissionsFloater") << "Sending default permissions to '" + << url << "'\n"; + std::ostringstream sent_perms_log; + LLSDSerialize::toPrettyXML(postData, sent_perms_log); + LL_CONT << sent_perms_log.str() << LL_ENDL; + } -std::string LLFloaterPermsResponder::sPreviousReason; + while (true) + { + ++retryCount; + LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData); -void LLFloaterPermsDefault::sendInitialPerms() -{ - if(!mCapSent) - { - updateCap(); - setCapSent(true); - } -} + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); -void LLFloaterPermsDefault::updateCap() -{ - std::string object_url = gAgent.getRegion()->getCapability("AgentPreferences"); + if (!status) + { + const std::string& reason = status.toString(); + // Do not display the same error more than once in a row + if (reason != previousReason) + { + previousReason = reason; + LLSD args; + args["REASON"] = reason; + LLNotificationsUtil::add("DefaultObjectPermissions", args); + } - if(!object_url.empty()) - { - LLSD report = LLSD::emptyMap(); - report["default_object_perm_masks"]["Group"] = - (LLSD::Integer)LLFloaterPerms::getGroupPerms(sCategoryNames[CAT_OBJECTS]); - report["default_object_perm_masks"]["Everyone"] = - (LLSD::Integer)LLFloaterPerms::getEveryonePerms(sCategoryNames[CAT_OBJECTS]); - report["default_object_perm_masks"]["NextOwner"] = - (LLSD::Integer)LLFloaterPerms::getNextOwnerPerms(sCategoryNames[CAT_OBJECTS]); + llcoro::suspendUntilTimeout(RETRY_TIMEOUT); + if (retryCount < MAX_HTTP_RETRIES) + continue; - { - LL_DEBUGS("ObjectPermissionsFloater") << "Sending default permissions to '" - << object_url << "'\n"; - std::ostringstream sent_perms_log; - LLSDSerialize::toPrettyXML(report, sent_perms_log); - LL_CONT << sent_perms_log.str() << LL_ENDL; + LL_WARNS("ObjectPermissionsFloater") << "Unable to send default permissions. Giving up for now." << LL_ENDL; + return; } - LLFloaterPermsRequester::init(object_url, report, MAX_HTTP_RETRIES); - LLFloaterPermsRequester::instance()->start(); - } - else - { - LL_DEBUGS("ObjectPermissionsFloater") << "AgentPreferences cap not available." << LL_ENDL; + break; } + + // Since we have had a successful POST call be sure to display the next error message + // even if it is the same as a previous one. + previousReason.clear(); + LLFloaterPermsDefault::setCapSent(true); + LL_INFOS("ObjectPermissionsFloater") << "Default permissions successfully sent to simulator" << LL_ENDL; } void LLFloaterPermsDefault::setCapSent(bool cap_sent) |
