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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llgroupmgr.h
  3.  * @brief Manager for aggregating all client knowledge for specific groups
  4.  *
  5.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2004-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. #ifndef LL_LLGROUPMGR_H
  33. #define LL_LLGROUPMGR_H
  34. #include "lluuid.h"
  35. #include "roles_constants.h"
  36. #include <vector>
  37. #include <string>
  38. #include <map>
  39. class LLMessageSystem;
  40. class LLGroupMgrObserver
  41. {
  42. public:
  43. LLGroupMgrObserver(const LLUUID& id) : mID(id){};
  44. LLGroupMgrObserver() : mID(LLUUID::null){};
  45. virtual ~LLGroupMgrObserver(){};
  46. virtual void changed(LLGroupChange gc) = 0;
  47. const LLUUID& getID() { return mID; }
  48. protected:
  49. LLUUID mID;
  50. };
  51. class LLParticularGroupObserver
  52. {
  53. public:
  54. virtual ~LLParticularGroupObserver(){}
  55. virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
  56. };
  57. class LLGroupRoleData;
  58. class LLGroupMemberData
  59. {
  60. friend class LLGroupMgrGroupData;
  61. public:
  62. typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
  63. LLGroupMemberData(const LLUUID& id, 
  64. S32 contribution,
  65. U64 agent_powers,
  66. const std::string& title,
  67. const std::string& online_status,
  68. BOOL is_owner);
  69. ~LLGroupMemberData();
  70. const LLUUID& getID() const { return mID; }
  71. S32 getContribution() const { return mContribution; }
  72. U64 getAgentPowers() const { return mAgentPowers; }
  73. BOOL isOwner() const { return mIsOwner; }
  74. const std::string& getTitle() const { return mTitle; }
  75. const std::string& getOnlineStatus() const { return mOnlineStatus; }
  76. void addRole(const LLUUID& role, LLGroupRoleData* rd);
  77. bool removeRole(const LLUUID& role);
  78. void clearRoles() { mRolesList.clear(); };
  79. role_list_t::iterator roleBegin() { return mRolesList.begin(); }
  80. role_list_t::iterator roleEnd() { return mRolesList.end(); }
  81. BOOL isInRole(const LLUUID& role_id) { return (mRolesList.find(role_id) != mRolesList.end()); }
  82. protected:
  83. LLUUID mID;
  84. S32 mContribution;
  85. U64 mAgentPowers;
  86. std::string mTitle;
  87. std::string mOnlineStatus;
  88. BOOL mIsOwner;
  89. role_list_t mRolesList;
  90. };
  91. struct LLRoleData
  92. {
  93. LLRoleData() : mRolePowers(0), mChangeType(RC_UPDATE_NONE) { }
  94. LLRoleData(const LLRoleData& rd)
  95. :  mRoleName(rd.mRoleName),
  96. mRoleTitle(rd.mRoleTitle),
  97. mRoleDescription(rd.mRoleDescription),
  98. mRolePowers(rd.mRolePowers),
  99. mChangeType(rd.mChangeType) { }
  100. std::string mRoleName;
  101. std::string mRoleTitle;
  102. std::string mRoleDescription;
  103. U64 mRolePowers;
  104. LLRoleChangeType mChangeType;
  105. };
  106. class LLGroupRoleData
  107. {
  108. friend class LLGroupMgrGroupData;
  109. public:
  110. LLGroupRoleData(const LLUUID& role_id, 
  111. const std::string& role_name,
  112. const std::string& role_title,
  113. const std::string& role_desc,
  114. const U64 role_powers,
  115. const S32 member_count);
  116. LLGroupRoleData(const LLUUID& role_id, 
  117. LLRoleData role_data,
  118. const S32 member_count);
  119. ~LLGroupRoleData();
  120. const LLUUID& getID() const { return mRoleID; }
  121. const std::vector<LLUUID>& getRoleMembers() const { return mMemberIDs; }
  122. S32 getMembersInRole(std::vector<LLUUID> members, BOOL needs_sort = TRUE);
  123. S32 getTotalMembersInRole() { return mMemberIDs.size(); }
  124. LLRoleData getRoleData() const { return mRoleData; }
  125. void setRoleData(LLRoleData data) { mRoleData = data; }
  126. void addMember(const LLUUID& member);
  127. bool removeMember(const LLUUID& member);
  128. void clearMembers();
  129. const std::vector<LLUUID>::const_iterator getMembersBegin() const
  130. { return mMemberIDs.begin(); }
  131. const std::vector<LLUUID>::const_iterator getMembersEnd() const
  132. { return mMemberIDs.end(); }
  133. protected:
  134. LLGroupRoleData()
  135. : mMemberCount(0), mMembersNeedsSort(FALSE) {}
  136. LLUUID mRoleID;
  137. LLRoleData mRoleData;
  138. std::vector<LLUUID> mMemberIDs;
  139. S32 mMemberCount;
  140. private:
  141. BOOL mMembersNeedsSort;
  142. };
  143. struct LLRoleMemberChange
  144. {
  145. LLRoleMemberChange() : mChange(RMC_NONE) { }
  146. LLRoleMemberChange(const LLUUID& role, const LLUUID& member, LLRoleMemberChangeType change)
  147. : mRole(role), mMember(member), mChange(change) { }
  148. LLRoleMemberChange(const LLRoleMemberChange& rc)
  149. : mRole(rc.mRole), mMember(rc.mMember), mChange(rc.mChange) { }
  150. LLUUID mRole;
  151. LLUUID mMember;
  152. LLRoleMemberChangeType mChange;
  153. };
  154. typedef std::pair<LLUUID,LLUUID> lluuid_pair;
  155. struct lluuid_pair_less
  156. {
  157. bool operator()(const lluuid_pair& lhs, const lluuid_pair& rhs) const
  158. {
  159. if (lhs.first == rhs.first)
  160. return lhs.second < rhs.second;
  161. else
  162. return lhs.first < rhs.first;
  163. }
  164. };
  165. struct LLGroupTitle
  166. {
  167. std::string mTitle;
  168. LLUUID mRoleID;
  169. BOOL mSelected;
  170. };
  171. class LLGroupMgr;
  172. class LLGroupMgrGroupData
  173. {
  174. friend class LLGroupMgr;
  175. public:
  176. LLGroupMgrGroupData(const LLUUID& id);
  177. ~LLGroupMgrGroupData();
  178. const LLUUID& getID() { return mID; }
  179. BOOL getRoleData(const LLUUID& role_id, LLRoleData& role_data);
  180. void setRoleData(const LLUUID& role_id, LLRoleData role_data);
  181. void createRole(const LLUUID& role_id, LLRoleData role_data);
  182. void deleteRole(const LLUUID& role_id);
  183. BOOL pendingRoleChanges();
  184. void addRolePower(const LLUUID& role_id, U64 power);
  185. void removeRolePower(const LLUUID& role_id, U64 power);
  186. U64  getRolePowers(const LLUUID& role_id);
  187. void removeData();
  188. void removeRoleData();
  189. void removeMemberData();
  190. void removeRoleMemberData();
  191. bool changeRoleMember(const LLUUID& role_id, const LLUUID& member_id, LLRoleMemberChangeType rmc);
  192. void recalcAllAgentPowers();
  193. void recalcAgentPowers(const LLUUID& agent_id);
  194. BOOL isMemberDataComplete() { return mMemberDataComplete; }
  195. BOOL isRoleDataComplete() { return mRoleDataComplete; }
  196. BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
  197. BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
  198. public:
  199. typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
  200. typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
  201. typedef std::map<lluuid_pair,LLRoleMemberChange,lluuid_pair_less> change_map_t;
  202. typedef std::map<LLUUID,LLRoleData> role_data_map_t;
  203. member_list_t mMembers;
  204. role_list_t mRoles;
  205. change_map_t mRoleMemberChanges;
  206. role_data_map_t mRoleChanges;
  207. std::vector<LLGroupTitle> mTitles;
  208. LLUUID mID;
  209. LLUUID mOwnerRole;
  210. std::string mName;
  211. std::string mCharter;
  212. BOOL mShowInList;
  213. LLUUID mInsigniaID;
  214. LLUUID mFounderID;
  215. BOOL mOpenEnrollment;
  216. S32 mMembershipFee;
  217. BOOL mAllowPublish;
  218. BOOL mListInProfile;
  219. BOOL mMaturePublish;
  220. BOOL mChanged;
  221. S32 mMemberCount;
  222. S32 mRoleCount;
  223. protected:
  224. void sendRoleChanges();
  225. void cancelRoleChanges();
  226. private:
  227. LLUUID mMemberRequestID;
  228. LLUUID mRoleDataRequestID;
  229. LLUUID mRoleMembersRequestID;
  230. LLUUID mTitlesRequestID;
  231. U32 mReceivedRoleMemberPairs;
  232. BOOL mMemberDataComplete;
  233. BOOL mRoleDataComplete;
  234. BOOL mRoleMemberDataComplete;
  235. BOOL mGroupPropertiesDataComplete;
  236. BOOL mPendingRoleMemberRequest;
  237. };
  238. struct LLRoleAction
  239. {
  240. std::string mName;
  241. std::string mDescription;
  242. std::string mLongDescription;
  243. U64 mPowerBit;
  244. };
  245. struct LLRoleActionSet
  246. {
  247. LLRoleActionSet();
  248. ~LLRoleActionSet();
  249. LLRoleAction* mActionSetData;
  250. std::vector<LLRoleAction*> mActions;
  251. };
  252. class LLGroupMgr : public LLSingleton<LLGroupMgr>
  253. {
  254. LOG_CLASS(LLGroupMgr);
  255. public:
  256. LLGroupMgr();
  257. ~LLGroupMgr();
  258. void addObserver(LLGroupMgrObserver* observer);
  259. void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
  260. void removeObserver(LLGroupMgrObserver* observer);
  261. void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
  262. LLGroupMgrGroupData* getGroupData(const LLUUID& id);
  263. void sendGroupPropertiesRequest(const LLUUID& group_id);
  264. void sendGroupRoleDataRequest(const LLUUID& group_id);
  265. void sendGroupRoleMembersRequest(const LLUUID& group_id);
  266. void sendGroupMembersRequest(const LLUUID& group_id);
  267. void sendGroupTitlesRequest(const LLUUID& group_id);
  268. void sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id);
  269. void sendUpdateGroupInfo(const LLUUID& group_id);
  270. void sendGroupRoleMemberChanges(const LLUUID& group_id);
  271. void sendGroupRoleChanges(const LLUUID& group_id);
  272. static void sendCreateGroupRequest(const std::string& name,
  273.    const std::string& charter,
  274.    U8 show_in_list,
  275.    const LLUUID& insignia,
  276.    S32 membership_fee,
  277.    BOOL open_enrollment,
  278.    BOOL allow_publish,
  279.    BOOL mature_publish);
  280. static void sendGroupMemberJoin(const LLUUID& group_id);
  281. static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
  282. static void sendGroupMemberEjects(const LLUUID& group_id,
  283.   std::vector<LLUUID>& member_ids);
  284. void cancelGroupRoleChanges(const LLUUID& group_id);
  285. static void processGroupPropertiesReply(LLMessageSystem* msg, void** data);
  286. static void processGroupMembersReply(LLMessageSystem* msg, void** data);
  287. static void processGroupRoleDataReply(LLMessageSystem* msg, void** data);
  288. static void processGroupRoleMembersReply(LLMessageSystem* msg, void** data);
  289. static void processGroupTitlesReply(LLMessageSystem* msg, void** data);
  290. static void processCreateGroupReply(LLMessageSystem* msg, void** data);
  291. static void processJoinGroupReply(LLMessageSystem* msg, void ** data);
  292. static void processEjectGroupMemberReply(LLMessageSystem* msg, void ** data);
  293. static void processLeaveGroupReply(LLMessageSystem* msg, void ** data);
  294. static bool parseRoleActions(const std::string& xml_filename);
  295. std::vector<LLRoleActionSet*> mRoleActionSets;
  296. static void debugClearAllGroups(void*);
  297. void clearGroups();
  298. void clearGroupData(const LLUUID& group_id);
  299. private:
  300. void notifyObservers(LLGroupChange gc);
  301. void notifyObserver(const LLUUID& group_id, LLGroupChange gc);
  302. void addGroup(LLGroupMgrGroupData* group_datap);
  303. LLGroupMgrGroupData* createGroupData(const LLUUID &id);
  304. typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
  305. observer_multimap_t mObservers;
  306. typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
  307. group_map_t mGroups;
  308. typedef std::set<LLParticularGroupObserver*> observer_set_t;
  309. typedef std::map<LLUUID,observer_set_t> observer_map_t;
  310. observer_map_t mParticularObservers;
  311. };
  312. #endif