llavatariconctrl.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llavatariconctrl.cpp
  3.  * @brief LLAvatarIconCtrl class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2009&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2009-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llavatariconctrl.h"
  34. #include "llagent.h"
  35. #include "llavatarconstants.h"
  36. #include "llcallingcard.h" // for LLAvatarTracker
  37. #include "llavataractions.h"
  38. #include "llmenugl.h"
  39. #include "lluictrlfactory.h"
  40. #include "llcachename.h"
  41. #include "llagentdata.h"
  42. #include "llimfloater.h"
  43. #define MENU_ITEM_VIEW_PROFILE 0
  44. #define MENU_ITEM_SEND_IM 1
  45. static LLDefaultChildRegistry::Register<LLAvatarIconCtrl> r("avatar_icon");
  46. bool LLAvatarIconIDCache::LLAvatarIconIDCacheItem::expired()
  47. {
  48. const F64 SEC_PER_DAY_PLUS_HOUR = (24.0 + 1.0) * 60.0 * 60.0;
  49. F64 delta = LLDate::now().secondsSinceEpoch() - cached_time.secondsSinceEpoch();
  50. if (delta > SEC_PER_DAY_PLUS_HOUR)
  51. return true;
  52. return false;
  53. }
  54. void LLAvatarIconIDCache::load ()
  55. {
  56. llinfos << "Loading avatar icon id cache." << llendl;
  57. // build filename for each user
  58. std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);
  59. llifstream file(resolved_filename);
  60. if (!file.is_open())
  61. return;
  62. // add each line in the file to the list
  63. int uuid_len = UUID_STR_LENGTH-1;
  64. std::string line;
  65. while (std::getline(file, line)) 
  66. {
  67. LLUUID avatar_id;
  68. LLUUID icon_id;
  69. LLDate date;
  70. std::string avatar_id_str = line.substr(0,uuid_len);
  71. std::string icon_id_str = line.substr(uuid_len,uuid_len);
  72. std::string date_str = line.substr(uuid_len*2, line.length()-uuid_len*2);
  73. if(!avatar_id.set(avatar_id_str) || !icon_id.set(icon_id_str) || !date.fromString(date_str))
  74. continue;
  75. LLAvatarIconIDCacheItem item = {icon_id,date};
  76. mCache[avatar_id] = item;
  77. }
  78. file.close();
  79. }
  80. void LLAvatarIconIDCache::save ()
  81. {
  82. std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, mFilename);
  83. // open a file for writing
  84. llofstream file (resolved_filename);
  85. if (!file.is_open())
  86. {
  87. llwarns << "can't open avatar icons cache file"" << mFilename << "" for writing" << llendl;
  88. return;
  89. }
  90. for(std::map<LLUUID,LLAvatarIconIDCacheItem>::iterator it = mCache.begin();it!=mCache.end();++it)
  91. {
  92. if(!it->second.expired())
  93. {
  94. file << it->first << it->second.icon_id << it->second.cached_time << std::endl;
  95. }
  96. }
  97. file.close();
  98. }
  99. LLUUID* LLAvatarIconIDCache::get (const LLUUID& avatar_id)
  100. {
  101. std::map<LLUUID,LLAvatarIconIDCacheItem>::iterator it = mCache.find(avatar_id);
  102. if(it==mCache.end())
  103. return 0;
  104. if(it->second.expired())
  105. return 0;
  106. return &it->second.icon_id;
  107. }
  108. void LLAvatarIconIDCache::add (const LLUUID& avatar_id,const LLUUID& icon_id)
  109. {
  110. LLAvatarIconIDCacheItem item = {icon_id,LLDate::now()};
  111. mCache[avatar_id] = item;
  112. }
  113. void LLAvatarIconIDCache::remove (const LLUUID& avatar_id)
  114. {
  115. mCache.erase(avatar_id);
  116. }
  117. LLAvatarIconCtrl::Params::Params()
  118. : avatar_id("avatar_id"),
  119. draw_tooltip("draw_tooltip", true),
  120. default_icon_name("default_icon_name")
  121. {
  122. name = "avatar_icon";
  123. }
  124. LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
  125. : LLIconCtrl(p),
  126. mDrawTooltip(p.draw_tooltip),
  127. mDefaultIconName(p.default_icon_name)
  128. {
  129. mPriority = LLViewerFetchedTexture::BOOST_ICON;
  130. LLRect rect = p.rect;
  131. mDrawWidth  = llmax(32, rect.getWidth()) ;
  132. mDrawHeight = llmax(32, rect.getHeight()) ;
  133. static LLUICachedControl<S32> llavatariconctrl_symbol_hpad("UIAvatariconctrlSymbolHPad", 2);
  134. static LLUICachedControl<S32> llavatariconctrl_symbol_vpad("UIAvatariconctrlSymbolVPad", 2);
  135. static LLUICachedControl<S32> llavatariconctrl_symbol_size("UIAvatariconctrlSymbolSize", 5);
  136. static LLUICachedControl<std::string> llavatariconctrl_symbol_pos("UIAvatariconctrlSymbolPosition", "BottomRight");
  137. // BottomRight is the default position
  138. S32 left = rect.getWidth() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_hpad;
  139. S32 bottom = llavatariconctrl_symbol_vpad;
  140. if ("BottomLeft" == (std::string)llavatariconctrl_symbol_pos)
  141. {
  142. left = llavatariconctrl_symbol_hpad;
  143. bottom = llavatariconctrl_symbol_vpad;
  144. }
  145. else if ("TopLeft" == (std::string)llavatariconctrl_symbol_pos)
  146. {
  147. left = llavatariconctrl_symbol_hpad;
  148. bottom = rect.getHeight() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_vpad;
  149. }
  150. else if ("TopRight" == (std::string)llavatariconctrl_symbol_pos)
  151. {
  152. left = rect.getWidth() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_hpad;
  153. bottom = rect.getHeight() - llavatariconctrl_symbol_size - llavatariconctrl_symbol_vpad;
  154. }
  155. rect.setOriginAndSize(left, bottom, llavatariconctrl_symbol_size, llavatariconctrl_symbol_size);
  156. if (p.avatar_id.isProvided())
  157. {
  158. LLSD value(p.avatar_id);
  159. setValue(value);
  160. }
  161. else
  162. {
  163. LLIconCtrl::setValue(mDefaultIconName);
  164. }
  165. }
  166. LLAvatarIconCtrl::~LLAvatarIconCtrl()
  167. {
  168. if (mAvatarId.notNull())
  169. {
  170. LLAvatarPropertiesProcessor::getInstance()->removeObserver(mAvatarId, this);
  171. // Name callbacks will be automatically disconnected since LLUICtrl is trackable
  172. }
  173. }
  174. //virtual
  175. void LLAvatarIconCtrl::setValue(const LLSD& value)
  176. {
  177. if (value.isUUID())
  178. {
  179. LLAvatarPropertiesProcessor* app =
  180. LLAvatarPropertiesProcessor::getInstance();
  181. if (mAvatarId.notNull())
  182. {
  183. app->removeObserver(mAvatarId, this);
  184. }
  185. if (mAvatarId != value.asUUID())
  186. {
  187. mAvatarId = value.asUUID();
  188. // *BUG: This will return stale icons if a user changes their
  189. // profile picture. However, otherwise we send too many upstream
  190. // AvatarPropertiesRequest messages.
  191. // to get fresh avatar icon use
  192. // LLAvatarIconIDCache::getInstance()->remove(avatar_id);
  193. // Check if cache already contains image_id for that avatar
  194. if (!updateFromCache())
  195. {
  196. LLIconCtrl::setValue(mDefaultIconName);
  197. app->addObserver(mAvatarId, this);
  198. app->sendAvatarPropertiesRequest(mAvatarId);
  199. }
  200. }
  201. }
  202. else
  203. {
  204. LLIconCtrl::setValue(value);
  205. }
  206. gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4));
  207. }
  208. bool LLAvatarIconCtrl::updateFromCache()
  209. {
  210. LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(mAvatarId);
  211. if(!icon_id_ptr)
  212. return false;
  213. const LLUUID& icon_id = *icon_id_ptr;
  214. // Update the avatar
  215. if (icon_id.notNull())
  216. {
  217. LLIconCtrl::setValue(icon_id);
  218. }
  219. else
  220. {
  221. LLIconCtrl::setValue(mDefaultIconName);
  222. }
  223. return true;
  224. }
  225. //virtual
  226. void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
  227. {
  228. if (APT_PROPERTIES == type)
  229. {
  230. LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
  231. if (avatar_data)
  232. {
  233. if (avatar_data->avatar_id != mAvatarId)
  234. {
  235. return;
  236. }
  237. LLAvatarIconIDCache::getInstance()->add(mAvatarId,avatar_data->image_id);
  238. updateFromCache();
  239. }
  240. }
  241. }
  242. void LLAvatarIconCtrl::nameUpdatedCallback(
  243. const LLUUID& id,
  244. const std::string& first,
  245. const std::string& last,
  246. BOOL is_group)
  247. {
  248. if (id == mAvatarId)
  249. {
  250. mFirstName = first;
  251. mLastName = last;
  252. if (mDrawTooltip)
  253. {
  254. setToolTip(mFirstName + " " + mLastName);
  255. }
  256. else
  257. {
  258. setToolTip(std::string(""));
  259. }
  260. }
  261. }