/** * @file llfloaterdisplayname.cpp * @author Leyla Farazha * @brief Implementation of the LLFloaterDisplayName class. * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ #include "llviewerprecompiledheaders.h" #include "llfloaterreg.h" #include "llfloater.h" #include "llnotificationsutil.h" #include "llviewerdisplayname.h" #include "llnotifications.h" #include "llfloaterdisplayname.h" #include "llavatarnamecache.h" #include "llagent.h" class LLFloaterDisplayName : public LLFloater { public: LLFloaterDisplayName(const LLSD& key); virtual ~LLFloaterDisplayName() { } /*virtual*/ bool postBuild(); void onSave(); void onReset(); void onCancel(); /*virtual*/ void onOpen(const LLSD& key); private: void onCacheSetName(bool success, const std::string& reason, const LLSD& content); }; LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) : LLFloater(key) { } void LLFloaterDisplayName::onOpen(const LLSD& key) { getChild("display_name_editor")->clear(); getChild("display_name_confirm")->clear(); LLAvatarName av_name; LLAvatarNameCache::get(gAgent.getID(), &av_name); F64 now_secs = LLDate::now().secondsSinceEpoch(); if (now_secs < av_name.mNextUpdate) { // ...can't update until some time in the future F64 next_update_local_secs = av_name.mNextUpdate - LLStringOps::getLocalTimeOffset(); LLDate next_update_local(next_update_local_secs); // display as "July 18 12:17 PM" std::string next_update_string = next_update_local.toHTTPDateString("%B %d %I:%M %p"); getChild("lockout_text")->setTextArg("[TIME]", next_update_string); getChild("lockout_text")->setVisible(true); getChild("save_btn")->setEnabled(false); getChild("display_name_editor")->setEnabled(false); getChild("display_name_confirm")->setEnabled(false); getChild("cancel_btn")->setFocus(true); } else { getChild("lockout_text")->setVisible(false); getChild("save_btn")->setEnabled(true); getChild("display_name_editor")->setEnabled(true); getChild("display_name_confirm")->setEnabled(true); } } bool LLFloaterDisplayName::postBuild() { getChild("reset_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onReset, this)); getChild("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onCancel, this)); getChild("save_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onSave, this)); center(); return true; } void LLFloaterDisplayName::onCacheSetName(bool success, const std::string& reason, const LLSD& content) { if (success) { // Inform the user that the change took place, but will take a while // to percolate. LLSD args; args["DISPLAY_NAME"] = content["display_name"]; LLNotificationsUtil::add("SetDisplayNameSuccess", args); return; } // Request failed, notify the user std::string error_tag = content["error_tag"].asString(); LL_INFOS() << "set name failure error_tag " << error_tag << LL_ENDL; // We might have a localized string for this message // error_args will usually be empty from the server. if (!error_tag.empty() && LLNotifications::getInstance()->templateExists(error_tag)) { LLNotificationsUtil::add(error_tag); return; } // The server error might have a localized message for us std::string lang_code = LLUI::getLanguage(); LLSD error_desc = content["error_description"]; if (error_desc.has( lang_code )) { LLSD args; args["MESSAGE"] = error_desc[lang_code].asString(); LLNotificationsUtil::add("GenericAlert", args); return; } // No specific error, throw a generic one LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); } void LLFloaterDisplayName::onCancel() { setVisible(false); } void LLFloaterDisplayName::onReset() { LLAvatarName av_name; if (!LLAvatarNameCache::get(gAgent.getID(), &av_name)) { return; } getChild("display_name_editor")->setValue(av_name.getUserName()); if (getChild("display_name_editor")->getEnabled()) { // UI is enabled, fill the first field getChild("display_name_confirm")->clear(); getChild("display_name_confirm")->setFocus(true); } else { // UI is disabled, looks like we should allow resetting // even if user already set a display name, enable save button getChild("display_name_confirm")->setValue(av_name.getUserName()); getChild("save_btn")->setEnabled(true); } } void LLFloaterDisplayName::onSave() { std::string display_name_utf8 = getChild("display_name_editor")->getValue().asString(); std::string display_name_confirm = getChild("display_name_confirm")->getValue().asString(); if (display_name_utf8.compare(display_name_confirm)) { LLNotificationsUtil::add("SetDisplayNameMismatch"); return; } LLAvatarName av_name; if (!LLAvatarNameCache::get(gAgent.getID(), &av_name)) { return; } std::string user_name = av_name.getUserName(); if (display_name_utf8.compare(user_name) == 0 && LLAvatarNameCache::getInstance()->hasNameLookupURL()) { // A reset LLViewerDisplayName::set("", boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3)); return; } const U32 DISPLAY_NAME_MAX_LENGTH = 31; // characters, not bytes LLWString display_name_wstr = utf8string_to_wstring(display_name_utf8); if (display_name_wstr.size() > DISPLAY_NAME_MAX_LENGTH) { LLSD args; args["LENGTH"] = llformat("%d", DISPLAY_NAME_MAX_LENGTH); LLNotificationsUtil::add("SetDisplayNameFailedLength", args); return; } if (LLAvatarNameCache::getInstance()->hasNameLookupURL()) { LLViewerDisplayName::set(display_name_utf8,boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3)); } else { LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); } setVisible(false); } ////////////////////////////////////////////////////////////////////////////// // LLInspectObjectUtil ////////////////////////////////////////////////////////////////////////////// void LLFloaterDisplayNameUtil::registerFloater() { LLFloaterReg::add("display_name", "floater_display_name.xml", &LLFloaterReg::build); }