/** * @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); bool mIsLockedOut = false; }; 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(); mIsLockedOut = now_secs < av_name.mNextUpdate; if (mIsLockedOut) { // ...can't update until some time in the future // Display lock out date in SLT //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"); std::string next_update_string = getString("LockOutDateFormat"); LLStringUtil::format(next_update_string, LLSD().with("datetime", (S32)av_name.mNextUpdate)); // 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() { // FIRE-33330: Can't reset display name within the first week //LLAvatarName av_name; //if (!LLAvatarNameCache::get(gAgent.getID(), &av_name)) //{ // return; //} //getChild("display_name_editor")->setValue(av_name.getUserName()); //if (mIsLockedOut) //{ // // UI is disabled. // // 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); //} //else //{ // // UI is enabled, focus on the confirm field // getChild("display_name_confirm")->clear(); // getChild("display_name_confirm")->setFocus(true); //} if (LLAvatarNameCache::getInstance()->hasNameLookupURL()) { LLViewerDisplayName::set("", boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3)); } else { LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); } setVisible(false); // } 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); }