1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_LIBJINGLE_XMPP_CHATROOMMODULE_H_ 12 #define WEBRTC_LIBJINGLE_XMPP_CHATROOMMODULE_H_ 13 14 #include "webrtc/libjingle/xmpp/module.h" 15 #include "webrtc/libjingle/xmpp/rostermodule.h" 16 17 namespace buzz { 18 19 // forward declarations 20 class XmppChatroomModule; 21 class XmppChatroomHandler; 22 class XmppChatroomMember; 23 class XmppChatroomMemberEnumerator; 24 25 enum XmppChatroomState { 26 XMPP_CHATROOM_STATE_NOT_IN_ROOM = 0, 27 XMPP_CHATROOM_STATE_REQUESTED_ENTER = 1, 28 XMPP_CHATROOM_STATE_IN_ROOM = 2, 29 XMPP_CHATROOM_STATE_REQUESTED_EXIT = 3, 30 }; 31 32 //! Module that encapsulates a chatroom. 33 class XmppChatroomModule : public XmppModule { 34 public: 35 36 //! Creates a new XmppChatroomModule 37 static XmppChatroomModule* Create(); ~XmppChatroomModule()38 virtual ~XmppChatroomModule() {} 39 40 //! Sets the chatroom handler (callbacks) for the chatroom 41 virtual XmppReturnStatus set_chatroom_handler(XmppChatroomHandler* handler) = 0; 42 43 //! Gets the chatroom handler for the module 44 virtual XmppChatroomHandler* chatroom_handler() = 0; 45 46 //! Sets the jid of the chatroom. 47 //! Has to be set before entering the chatroom and can't be changed 48 //! while in the chatroom 49 virtual XmppReturnStatus set_chatroom_jid(const Jid& chatroom_jid) = 0; 50 51 //! The jid for the chatroom 52 virtual const Jid& chatroom_jid() const = 0; 53 54 //! Sets the nickname of the member 55 //! Has to be set before entering the chatroom and can't be changed 56 //! while in the chatroom 57 virtual XmppReturnStatus set_nickname(const std::string& nickname) = 0; 58 59 //! The nickname of the member in the chatroom 60 virtual const std::string& nickname() const = 0; 61 62 //! Returns the jid of the member (this is the chatroom_jid plus the 63 //! nickname as the resource name) 64 virtual const Jid member_jid() const = 0; 65 66 //! Requests that the user enter a chatroom 67 //! The EnterChatroom callback will be called when the request is complete. 68 //! Password should be empty for a room that doesn't require a password 69 //! If the room doesn't exist, the server will create an "Instant Room" if the 70 //! server policy supports this action. 71 //! There will be different methods for creating/configuring a "Reserved Room" 72 //! Async callback for this method is ChatroomEnteredStatus 73 virtual XmppReturnStatus RequestEnterChatroom(const std::string& password, 74 const std::string& client_version, 75 const std::string& locale) = 0; 76 77 //! Requests that the user exit a chatroom 78 //! Async callback for this method is ChatroomExitedStatus 79 virtual XmppReturnStatus RequestExitChatroom() = 0; 80 81 //! Requests a status change 82 //! status is the standard XMPP status code 83 //! extended_status is the extended status when status is XMPP_PRESENCE_XA 84 virtual XmppReturnStatus RequestConnectionStatusChange( 85 XmppPresenceConnectionStatus connection_status) = 0; 86 87 //! Returns the number of members in the room 88 virtual size_t GetChatroomMemberCount() = 0; 89 90 //! Gets an enumerator for the members in the chatroom 91 //! The caller must delete the enumerator when the caller is finished with it. 92 //! The caller must also ensure that the lifetime of the enumerator is 93 //! scoped by the XmppChatRoomModule that created it. 94 virtual XmppReturnStatus CreateMemberEnumerator(XmppChatroomMemberEnumerator** enumerator) = 0; 95 96 //! Gets the subject of the chatroom 97 virtual const std::string subject() = 0; 98 99 //! Returns the current state of the user with respect to the chatroom 100 virtual XmppChatroomState state() = 0; 101 102 virtual XmppReturnStatus SendMessage(const XmlElement& message) = 0; 103 }; 104 105 //! Class for enumerating participatns 106 class XmppChatroomMemberEnumerator { 107 public: ~XmppChatroomMemberEnumerator()108 virtual ~XmppChatroomMemberEnumerator() { } 109 //! Returns the member at the current position 110 //! Returns null if the enumerator is before the beginning 111 //! or after the end of the collection 112 virtual XmppChatroomMember* current() = 0; 113 114 //! Returns whether the enumerator is valid 115 //! This returns true if the collection has changed 116 //! since the enumerator was created 117 virtual bool IsValid() = 0; 118 119 //! Returns whether the enumerator is before the beginning 120 //! This is the initial state of the enumerator 121 virtual bool IsBeforeBeginning() = 0; 122 123 //! Returns whether the enumerator is after the end 124 virtual bool IsAfterEnd() = 0; 125 126 //! Advances the enumerator to the next position 127 //! Returns false is the enumerator is advanced 128 //! off the end of the collection 129 virtual bool Next() = 0; 130 131 //! Advances the enumerator to the previous position 132 //! Returns false is the enumerator is advanced 133 //! off the end of the collection 134 virtual bool Prev() = 0; 135 }; 136 137 138 //! Represents a single member in a chatroom 139 class XmppChatroomMember { 140 public: ~XmppChatroomMember()141 virtual ~XmppChatroomMember() { } 142 143 //! The jid for the member in the chatroom 144 virtual const Jid member_jid() const = 0; 145 146 //! The full jid for the member 147 //! This is only available in non-anonymous rooms. 148 //! If the room is anonymous, this returns JID_EMPTY 149 virtual const Jid full_jid() const = 0; 150 151 //! Returns the backing presence for this member 152 virtual const XmppPresence* presence() const = 0; 153 154 //! The nickname for this member 155 virtual const std::string name() const = 0; 156 }; 157 158 //! Status codes for ChatroomEnteredStatus callback 159 enum XmppChatroomEnteredStatus 160 { 161 //! User successfully entered the room 162 XMPP_CHATROOM_ENTERED_SUCCESS = 0, 163 //! The nickname confliced with somebody already in the room 164 XMPP_CHATROOM_ENTERED_FAILURE_NICKNAME_CONFLICT = 1, 165 //! A password is required to enter the room 166 XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_REQUIRED = 2, 167 //! The specified password was incorrect 168 XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_INCORRECT = 3, 169 //! The user is not a member of a member-only room 170 XMPP_CHATROOM_ENTERED_FAILURE_NOT_A_MEMBER = 4, 171 //! The user cannot enter because the user has been banned 172 XMPP_CHATROOM_ENTERED_FAILURE_MEMBER_BANNED = 5, 173 //! The room has the maximum number of users already 174 XMPP_CHATROOM_ENTERED_FAILURE_MAX_USERS = 6, 175 //! The room has been locked by an administrator 176 XMPP_CHATROOM_ENTERED_FAILURE_ROOM_LOCKED = 7, 177 //! Someone in the room has blocked you 178 XMPP_CHATROOM_ENTERED_FAILURE_MEMBER_BLOCKED = 8, 179 //! You have blocked someone in the room 180 XMPP_CHATROOM_ENTERED_FAILURE_MEMBER_BLOCKING = 9, 181 //! Client is old. User must upgrade to a more recent version for 182 // hangouts to work. 183 XMPP_CHATROOM_ENTERED_FAILURE_OUTDATED_CLIENT = 10, 184 //! Some other reason 185 XMPP_CHATROOM_ENTERED_FAILURE_UNSPECIFIED = 2000, 186 }; 187 188 //! Status codes for ChatroomExitedStatus callback 189 enum XmppChatroomExitedStatus 190 { 191 //! The user requested to exit and did so 192 XMPP_CHATROOM_EXITED_REQUESTED = 0, 193 //! The user was banned from the room 194 XMPP_CHATROOM_EXITED_BANNED = 1, 195 //! The user has been kicked out of the room 196 XMPP_CHATROOM_EXITED_KICKED = 2, 197 //! The user has been removed from the room because the 198 //! user is no longer a member of a member-only room 199 //! or the room has changed to membership-only 200 XMPP_CHATROOM_EXITED_NOT_A_MEMBER = 3, 201 //! The system is shutting down 202 XMPP_CHATROOM_EXITED_SYSTEM_SHUTDOWN = 4, 203 //! For some other reason 204 XMPP_CHATROOM_EXITED_UNSPECIFIED = 5, 205 }; 206 207 //! The XmppChatroomHandler is the interface for callbacks from the 208 //! the chatroom 209 class XmppChatroomHandler { 210 public: ~XmppChatroomHandler()211 virtual ~XmppChatroomHandler() {} 212 213 //! Indicates the response to RequestEnterChatroom method 214 //! XMPP_CHATROOM_SUCCESS represents success. 215 //! Other status codes are for errors 216 virtual void ChatroomEnteredStatus(XmppChatroomModule* room, 217 const XmppPresence* presence, 218 XmppChatroomEnteredStatus status) = 0; 219 220 221 //! Indicates that the user has exited the chatroom, either due to 222 //! a call to RequestExitChatroom or for some other reason. 223 //! status indicates the reason the user exited 224 virtual void ChatroomExitedStatus(XmppChatroomModule* room, 225 XmppChatroomExitedStatus status) = 0; 226 227 //! Indicates a member entered the room. 228 //! It can be called before ChatroomEnteredStatus. 229 virtual void MemberEntered(XmppChatroomModule* room, 230 const XmppChatroomMember* entered_member) = 0; 231 232 //! Indicates that a member exited the room. 233 virtual void MemberExited(XmppChatroomModule* room, 234 const XmppChatroomMember* exited_member) = 0; 235 236 //! Indicates that the data for the member has changed 237 //! (such as the nickname or presence) 238 virtual void MemberChanged(XmppChatroomModule* room, 239 const XmppChatroomMember* changed_member) = 0; 240 241 //! Indicates a new message has been received 242 //! message is the message - 243 // $TODO - message should be changed 244 //! to a strongly-typed message class that contains info 245 //! such as the sender, message bodies, etc., 246 virtual void MessageReceived(XmppChatroomModule* room, 247 const XmlElement& message) = 0; 248 }; 249 250 251 } 252 253 #endif // WEBRTC_LIBJINGLE_XMPP_CHATROOMMODULE_H_ 254