llgroupmgr.h

Go to the documentation of this file.
00001 
00032 #ifndef LL_LLGROUPMGR_H
00033 #define LL_LLGROUPMGR_H
00034 
00035 #include "lluuid.h"
00036 #include "roles_constants.h"
00037 #include <vector>
00038 #include <string>
00039 #include <map>
00040 
00041 class LLMessageSystem;
00042 
00043 class LLGroupMgrObserver
00044 {
00045 public:
00046         LLGroupMgrObserver(const LLUUID& id) : mID(id){};
00047         virtual ~LLGroupMgrObserver(){};
00048         virtual void changed(LLGroupChange gc) = 0;
00049         const LLUUID& getID() { return mID; }
00050 protected:
00051         LLUUID  mID;
00052 };
00053 
00054 class LLGroupRoleData;
00055 
00056 class LLGroupMemberData
00057 {
00058 friend class LLGroupMgrGroupData;
00059 
00060 public:
00061         typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
00062         
00063         LLGroupMemberData(const LLUUID& id, 
00064                                                 S32 contribution,
00065                                                 U64 agent_powers,
00066                                                 const std::string& title,
00067                                                 const std::string& online_status,
00068                                                 BOOL is_owner);
00069 
00070         ~LLGroupMemberData();
00071 
00072         const LLUUID& getID() const { return mID; }
00073         S32 getContribution() const { return mContribution; }
00074         U64     getAgentPowers() const { return mAgentPowers; }
00075         BOOL isOwner() const { return mIsOwner; }
00076         const std::string& getTitle() const { return mTitle; }
00077         const std::string& getOnlineStatus() const { return mOnlineStatus; }
00078         void addRole(const LLUUID& role, LLGroupRoleData* rd);
00079         bool removeRole(const LLUUID& role);
00080         void clearRoles() { mRolesList.clear(); };
00081         role_list_t::iterator roleBegin() { return mRolesList.begin(); }
00082         role_list_t::iterator roleEnd() { return mRolesList.end(); }
00083 
00084         BOOL isInRole(const LLUUID& role_id) { return (mRolesList.find(role_id) != mRolesList.end()); }
00085 
00086 protected:
00087         LLUUID  mID;
00088         S32             mContribution;
00089         U64             mAgentPowers;
00090         std::string     mTitle;
00091         std::string     mOnlineStatus;
00092         BOOL    mIsOwner;
00093         role_list_t mRolesList;
00094 };
00095 
00096 struct LLRoleData
00097 {
00098         LLRoleData() : mRolePowers(0), mChangeType(RC_UPDATE_NONE) { }
00099         LLRoleData(const LLRoleData& rd)
00100         :       mRoleName(rd.mRoleName),
00101                 mRoleTitle(rd.mRoleTitle),
00102                 mRoleDescription(rd.mRoleDescription),
00103                 mRolePowers(rd.mRolePowers),
00104                 mChangeType(rd.mChangeType) { }
00105 
00106         std::string mRoleName;
00107         std::string mRoleTitle;
00108         std::string mRoleDescription;
00109         U64     mRolePowers;
00110         LLRoleChangeType mChangeType;
00111 };
00112 
00113 class LLGroupRoleData
00114 {
00115 friend class LLGroupMgrGroupData;
00116 
00117 public:
00118         LLGroupRoleData(const LLUUID& role_id, 
00119                                         const std::string& role_name,
00120                                         const std::string& role_title,
00121                                         const std::string& role_desc,
00122                                         const U64 role_powers,
00123                                         const S32 member_count);
00124         
00125         LLGroupRoleData(const LLUUID& role_id, 
00126                                         LLRoleData role_data,
00127                                         const S32 member_count);
00128 
00129         ~LLGroupRoleData();
00130 
00131         const LLUUID& getID() const { return mRoleID; }
00132 
00133         const std::vector<LLUUID>& getRoleMembers() const { return mMemberIDs; }
00134         S32 getMembersInRole(std::vector<LLUUID> members, BOOL needs_sort = TRUE);
00135         S32 getTotalMembersInRole() { return mMemberIDs.size(); }
00136 
00137         LLRoleData getRoleData() const { return mRoleData; }
00138         void setRoleData(LLRoleData data) { mRoleData = data; }
00139         
00140         void addMember(const LLUUID& member);
00141         bool removeMember(const LLUUID& member);
00142         void clearMembers();
00143 
00144         const std::vector<LLUUID>::const_iterator getMembersBegin() const
00145         { return mMemberIDs.begin(); }
00146 
00147         const std::vector<LLUUID>::const_iterator getMembersEnd() const
00148         { return mMemberIDs.end(); }
00149 
00150 
00151 protected:
00152         LLGroupRoleData()
00153         : mMemberCount(0), mMembersNeedsSort(FALSE) {}
00154 
00155         LLUUID mRoleID;
00156         LLRoleData      mRoleData;
00157 
00158         std::vector<LLUUID> mMemberIDs;
00159         S32     mMemberCount;
00160 
00161 private:
00162         BOOL mMembersNeedsSort;
00163 };
00164 
00165 struct LLRoleMemberChange
00166 {
00167         LLRoleMemberChange() : mChange(RMC_NONE) { }
00168         LLRoleMemberChange(const LLUUID& role, const LLUUID& member, LLRoleMemberChangeType change)
00169                 : mRole(role), mMember(member), mChange(change) { }
00170         LLRoleMemberChange(const LLRoleMemberChange& rc)
00171                 : mRole(rc.mRole), mMember(rc.mMember), mChange(rc.mChange) { }
00172         LLUUID mRole;
00173         LLUUID mMember;
00174         LLRoleMemberChangeType mChange;
00175 };
00176 
00177 typedef std::pair<LLUUID,LLUUID> lluuid_pair;
00178 
00179 struct lluuid_pair_less
00180 {
00181         bool operator()(const lluuid_pair& lhs, const lluuid_pair& rhs) const
00182         {
00183                 if (lhs.first == rhs.first)
00184                         return lhs.second < rhs.second;
00185                 else
00186                         return lhs.first < rhs.first;
00187         }
00188 };
00189 
00190 struct LLGroupTitle
00191 {
00192         std::string mTitle;
00193         LLUUID          mRoleID;
00194         BOOL            mSelected;
00195 };
00196 
00197 class LLGroupMgr;
00198 
00199 class LLGroupMgrGroupData
00200 {
00201 friend class LLGroupMgr;
00202 
00203 public:
00204         LLGroupMgrGroupData(const LLUUID& id);
00205         ~LLGroupMgrGroupData();
00206 
00207         const LLUUID& getID() { return mID; }
00208 
00209         BOOL getRoleData(const LLUUID& role_id, LLRoleData& role_data);
00210         void setRoleData(const LLUUID& role_id, LLRoleData role_data);
00211         void createRole(const LLUUID& role_id, LLRoleData role_data);
00212         void deleteRole(const LLUUID& role_id);
00213         BOOL pendingRoleChanges();
00214 
00215         void addRolePower(const LLUUID& role_id, U64 power);
00216         void removeRolePower(const LLUUID& role_id, U64 power);
00217         U64  getRolePowers(const LLUUID& role_id);
00218 
00219         void removeData();
00220         void removeRoleData();
00221         void removeMemberData();
00222         void removeRoleMemberData();
00223 
00224         bool changeRoleMember(const LLUUID& role_id, const LLUUID& member_id, LLRoleMemberChangeType rmc);
00225         void recalcAllAgentPowers();
00226         void recalcAgentPowers(const LLUUID& agent_id);
00227 
00228         BOOL isMemberDataComplete() { return mMemberDataComplete; }
00229         BOOL isRoleDataComplete() { return mRoleDataComplete; }
00230         BOOL isRoleMemberDataComplete() { return mRoleMemberDataComplete; }
00231         BOOL isGroupPropertiesDataComplete() { return mGroupPropertiesDataComplete; }
00232 
00233 public:
00234         typedef std::map<LLUUID,LLGroupMemberData*> member_list_t;
00235         typedef std::map<LLUUID,LLGroupRoleData*> role_list_t;
00236         typedef std::map<lluuid_pair,LLRoleMemberChange,lluuid_pair_less> change_map_t;
00237         typedef std::map<LLUUID,LLRoleData> role_data_map_t;
00238         member_list_t           mMembers;
00239         role_list_t                     mRoles;
00240 
00241         
00242         change_map_t            mRoleMemberChanges;
00243         role_data_map_t         mRoleChanges;
00244 
00245         std::vector<LLGroupTitle> mTitles;
00246 
00247         LLUUID                          mID;
00248         LLUUID                          mOwnerRole;
00249         std::string                     mName;
00250         std::string                     mCharter;
00251         BOOL                            mShowInList;
00252         LLUUID                          mInsigniaID;
00253         LLUUID                          mFounderID;
00254         BOOL                            mOpenEnrollment;
00255         S32                                     mMembershipFee;
00256         BOOL                            mAllowPublish;
00257         BOOL                            mListInProfile;
00258         BOOL                            mMaturePublish;
00259         BOOL                            mChanged;
00260         S32                                     mMemberCount;
00261         S32                                     mRoleCount;
00262 
00263 protected:
00264         void sendRoleChanges();
00265         void cancelRoleChanges();
00266 
00267 private:
00268         LLUUID                          mMemberRequestID;
00269         LLUUID                          mRoleDataRequestID;
00270         LLUUID                          mRoleMembersRequestID;
00271         LLUUID                          mTitlesRequestID;
00272         U32                                     mReceivedRoleMemberPairs;
00273 
00274         BOOL                            mMemberDataComplete;
00275         BOOL                            mRoleDataComplete;
00276         BOOL                            mRoleMemberDataComplete;
00277         BOOL                            mGroupPropertiesDataComplete;
00278 
00279         BOOL                            mPendingRoleMemberRequest;
00280 };
00281 
00282 struct LLRoleAction
00283 {
00284         std::string mName;
00285         std::string mDescription;
00286         std::string mLongDescription;
00287         U64 mPowerBit;
00288 };
00289 
00290 struct LLRoleActionSet
00291 {
00292         LLRoleActionSet();
00293         ~LLRoleActionSet();
00294         LLRoleAction* mActionSetData;
00295         std::vector<LLRoleAction*> mActions;
00296 };
00297 
00298 class LLGroupMgr : public LLSingleton<LLGroupMgr>
00299 {
00300         LOG_CLASS(LLGroupMgr);
00301         
00302 public:
00303         LLGroupMgr();
00304         ~LLGroupMgr();
00305 
00306         void addObserver(LLGroupMgrObserver* observer);
00307         void removeObserver(LLGroupMgrObserver* observer);
00308         LLGroupMgrGroupData* getGroupData(const LLUUID& id);
00309 
00310         void sendGroupPropertiesRequest(const LLUUID& group_id);
00311         void sendGroupRoleDataRequest(const LLUUID& group_id);
00312         void sendGroupRoleMembersRequest(const LLUUID& group_id);
00313         void sendGroupMembersRequest(const LLUUID& group_id);
00314         void sendGroupTitlesRequest(const LLUUID& group_id);
00315         void sendGroupTitleUpdate(const LLUUID& group_id, const LLUUID& title_role_id);
00316         void sendUpdateGroupInfo(const LLUUID& group_id);
00317         void sendGroupRoleMemberChanges(const LLUUID& group_id);
00318         void sendGroupRoleChanges(const LLUUID& group_id);
00319 
00320         static void sendCreateGroupRequest(const std::string& name,
00321                                                                            const std::string& charter,
00322                                                                            U8 show_in_list,
00323                                                                            const LLUUID& insignia,
00324                                                                            S32 membership_fee,
00325                                                                            BOOL open_enrollment,
00326                                                                            BOOL allow_publish,
00327                                                                            BOOL mature_publish);
00328 
00329         static void sendGroupMemberJoin(const LLUUID& group_id);
00330         static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
00331         static void sendGroupMemberEjects(const LLUUID& group_id,
00332                                                                           std::vector<LLUUID>& member_ids);
00333 
00334         void cancelGroupRoleChanges(const LLUUID& group_id);
00335 
00336         static void processGroupPropertiesReply(LLMessageSystem* msg, void** data);
00337         static void processGroupMembersReply(LLMessageSystem* msg, void** data);
00338         static void processGroupRoleDataReply(LLMessageSystem* msg, void** data);
00339         static void processGroupRoleMembersReply(LLMessageSystem* msg, void** data);
00340         static void processGroupTitlesReply(LLMessageSystem* msg, void** data);
00341         static void processCreateGroupReply(LLMessageSystem* msg, void** data);
00342         static void processJoinGroupReply(LLMessageSystem* msg, void ** data);
00343         static void processEjectGroupMemberReply(LLMessageSystem* msg, void ** data);
00344         static void processLeaveGroupReply(LLMessageSystem* msg, void ** data);
00345 
00346         static bool parseRoleActions(const LLString& xml_filename);
00347 
00348         std::vector<LLRoleActionSet*> mRoleActionSets;
00349 
00350         static void debugClearAllGroups(void*);
00351         void clearGroups();
00352         void clearGroupData(const LLUUID& group_id);
00353 
00354 private:
00355         void notifyObservers(LLGroupChange gc);
00356         void addGroup(LLGroupMgrGroupData* group_datap);
00357         LLGroupMgrGroupData* createGroupData(const LLUUID &id);
00358 
00359         typedef std::multimap<LLUUID,LLGroupMgrObserver*> observer_multimap_t;
00360         observer_multimap_t mObservers;
00361         typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
00362         group_map_t mGroups;
00363 };
00364 
00365 
00366 #endif
00367 

Generated on Fri May 16 08:33:38 2008 for SecondLife by  doxygen 1.5.5