mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-26 08:12:05 +01:00
Add support for multiple status codes to MUCUser
Fixes SMACK-604
This commit is contained in:
parent
5d4aa76d19
commit
afd7c67bf9
5 changed files with 145 additions and 27 deletions
|
@ -59,6 +59,11 @@ public class XmlStringBuilder implements Appendable, CharSequence {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public XmlStringBuilder element(Element element) {
|
||||||
|
assert element != null;
|
||||||
|
return append(element.toXML());
|
||||||
|
}
|
||||||
|
|
||||||
public XmlStringBuilder optElement(String name, String content) {
|
public XmlStringBuilder optElement(String name, String content) {
|
||||||
if (content != null) {
|
if (content != null) {
|
||||||
element(name, content);
|
element(name, content);
|
||||||
|
@ -147,6 +152,11 @@ public class XmlStringBuilder implements Appendable, CharSequence {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public XmlStringBuilder attribute(String name, int value) {
|
||||||
|
assert name != null;
|
||||||
|
return attribute(name, String.valueOf(value));
|
||||||
|
}
|
||||||
|
|
||||||
public XmlStringBuilder optAttribute(String name, String value) {
|
public XmlStringBuilder optAttribute(String name, String value) {
|
||||||
if (value != null) {
|
if (value != null) {
|
||||||
attribute(name, value);
|
attribute(name, value);
|
||||||
|
|
|
@ -27,6 +27,7 @@ import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.WeakHashMap;
|
import java.util.WeakHashMap;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -70,6 +71,7 @@ import org.jivesoftware.smackx.muc.packet.MUCInitialPresence;
|
||||||
import org.jivesoftware.smackx.muc.packet.MUCItem;
|
import org.jivesoftware.smackx.muc.packet.MUCItem;
|
||||||
import org.jivesoftware.smackx.muc.packet.MUCOwner;
|
import org.jivesoftware.smackx.muc.packet.MUCOwner;
|
||||||
import org.jivesoftware.smackx.muc.packet.MUCUser;
|
import org.jivesoftware.smackx.muc.packet.MUCUser;
|
||||||
|
import org.jivesoftware.smackx.muc.packet.MUCUser.Status;
|
||||||
import org.jivesoftware.smackx.xdata.Form;
|
import org.jivesoftware.smackx.xdata.Form;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -414,12 +416,10 @@ public class MultiUserChat {
|
||||||
|
|
||||||
// Look for confirmation of room creation from the server
|
// Look for confirmation of room creation from the server
|
||||||
MUCUser mucUser = MUCUser.getFrom(presence);
|
MUCUser mucUser = MUCUser.getFrom(presence);
|
||||||
if (mucUser != null && mucUser.getStatus() != null) {
|
if (mucUser != null && mucUser.getStatus().contains(Status.ROOM_CREATED_201)) {
|
||||||
if ("201".equals(mucUser.getStatus().getCode())) {
|
|
||||||
// Room was created and the user has joined the room
|
// Room was created and the user has joined the room
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1969,7 +1969,7 @@ public class MultiUserChat {
|
||||||
if (mucUser != null && mucUser.getStatus() != null) {
|
if (mucUser != null && mucUser.getStatus() != null) {
|
||||||
// Fire events according to the received presence code
|
// Fire events according to the received presence code
|
||||||
checkPresenceCode(
|
checkPresenceCode(
|
||||||
mucUser.getStatus().getCode(),
|
mucUser.getStatus(),
|
||||||
presence.getFrom().equals(myRoomJID),
|
presence.getFrom().equals(myRoomJID),
|
||||||
mucUser,
|
mucUser,
|
||||||
from);
|
from);
|
||||||
|
@ -2241,18 +2241,18 @@ public class MultiUserChat {
|
||||||
/**
|
/**
|
||||||
* Fires events according to the received presence code.
|
* Fires events according to the received presence code.
|
||||||
*
|
*
|
||||||
* @param code
|
* @param statusCodes
|
||||||
* @param isUserModification
|
* @param isUserModification
|
||||||
* @param mucUser
|
* @param mucUser
|
||||||
* @param from
|
* @param from
|
||||||
*/
|
*/
|
||||||
private void checkPresenceCode(
|
private void checkPresenceCode(
|
||||||
String code,
|
Set<Status> statusCodes,
|
||||||
boolean isUserModification,
|
boolean isUserModification,
|
||||||
MUCUser mucUser,
|
MUCUser mucUser,
|
||||||
String from) {
|
String from) {
|
||||||
// Check if an occupant was kicked from the room
|
// Check if an occupant was kicked from the room
|
||||||
if ("307".equals(code)) {
|
if (statusCodes.contains(Status.KICKED_307)) {
|
||||||
// Check if this occupant was kicked
|
// Check if this occupant was kicked
|
||||||
if (isUserModification) {
|
if (isUserModification) {
|
||||||
joined = false;
|
joined = false;
|
||||||
|
@ -2275,7 +2275,7 @@ public class MultiUserChat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// A user was banned from the room
|
// A user was banned from the room
|
||||||
else if ("301".equals(code)) {
|
if (statusCodes.contains(Status.BANNED_301)) {
|
||||||
// Check if this occupant was banned
|
// Check if this occupant was banned
|
||||||
if (isUserModification) {
|
if (isUserModification) {
|
||||||
joined = false;
|
joined = false;
|
||||||
|
@ -2298,7 +2298,7 @@ public class MultiUserChat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// A user's membership was revoked from the room
|
// A user's membership was revoked from the room
|
||||||
else if ("321".equals(code)) {
|
if (statusCodes.contains(Status.REMOVED_AFFIL_CHANGE_321)) {
|
||||||
// Check if this occupant's membership was revoked
|
// Check if this occupant's membership was revoked
|
||||||
if (isUserModification) {
|
if (isUserModification) {
|
||||||
joined = false;
|
joined = false;
|
||||||
|
@ -2312,7 +2312,7 @@ public class MultiUserChat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// A occupant has changed his nickname in the room
|
// A occupant has changed his nickname in the room
|
||||||
else if ("303".equals(code)) {
|
if (statusCodes.contains(Status.NEW_NICKNAME_303)) {
|
||||||
List<String> params = new ArrayList<String>();
|
List<String> params = new ArrayList<String>();
|
||||||
params.add(from);
|
params.add(from);
|
||||||
params.add(mucUser.getItem().getNick());
|
params.add(mucUser.getItem().getNick());
|
||||||
|
|
|
@ -19,6 +19,12 @@ package org.jivesoftware.smackx.muc.packet;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.Element;
|
import org.jivesoftware.smack.packet.Element;
|
||||||
import org.jivesoftware.smack.packet.Packet;
|
import org.jivesoftware.smack.packet.Packet;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.PacketExtension;
|
import org.jivesoftware.smack.packet.PacketExtension;
|
||||||
import org.jivesoftware.smack.util.XmlStringBuilder;
|
import org.jivesoftware.smack.util.XmlStringBuilder;
|
||||||
|
|
||||||
|
@ -33,11 +39,12 @@ public class MUCUser implements PacketExtension {
|
||||||
public static final String ELEMENT = "x";
|
public static final String ELEMENT = "x";
|
||||||
public static final String NAMESPACE = MUCInitialPresence.NAMESPACE + "#user";
|
public static final String NAMESPACE = MUCInitialPresence.NAMESPACE + "#user";
|
||||||
|
|
||||||
|
private final Set<Status> statusCodes = new HashSet<Status>(4);
|
||||||
|
|
||||||
private Invite invite;
|
private Invite invite;
|
||||||
private Decline decline;
|
private Decline decline;
|
||||||
private MUCItem item;
|
private MUCItem item;
|
||||||
private String password;
|
private String password;
|
||||||
private Status status;
|
|
||||||
private Destroy destroy;
|
private Destroy destroy;
|
||||||
|
|
||||||
public String getElementName() {
|
public String getElementName() {
|
||||||
|
@ -56,7 +63,9 @@ public class MUCUser implements PacketExtension {
|
||||||
xml.optElement(getDecline());
|
xml.optElement(getDecline());
|
||||||
xml.optElement(getItem());
|
xml.optElement(getItem());
|
||||||
xml.optElement("password", getPassword());
|
xml.optElement("password", getPassword());
|
||||||
xml.optElement(getStatus());
|
for (Status status : statusCodes) {
|
||||||
|
xml.element(status);
|
||||||
|
}
|
||||||
xml.optElement(getDestroy());
|
xml.optElement(getDestroy());
|
||||||
xml.closeElement(this);
|
xml.closeElement(this);
|
||||||
return xml;
|
return xml;
|
||||||
|
@ -103,12 +112,12 @@ public class MUCUser implements PacketExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the status which holds a code that assists in presenting notification messages.
|
* Returns a set of status which holds the status code that assist in presenting notification messages.
|
||||||
*
|
*
|
||||||
* @return the status which holds a code that assists in presenting notification messages.
|
* @return the set of status which holds the status code that assist in presenting notification messages.
|
||||||
*/
|
*/
|
||||||
public Status getStatus() {
|
public Set<Status> getStatus() {
|
||||||
return status;
|
return statusCodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -163,13 +172,22 @@ public class MUCUser implements PacketExtension {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the status which holds a code that assists in presenting notification messages.
|
* Add the status codes which holds the codes that assists in presenting notification messages.
|
||||||
*
|
*
|
||||||
* @param status the status which holds a code that assists in presenting notification
|
* @param statusCodes the status codes which hold the codes that assists in presenting notification
|
||||||
* messages.
|
* messages.
|
||||||
*/
|
*/
|
||||||
public void setStatus(Status status) {
|
public void addStatusCodes(Set<Status> statusCodes) {
|
||||||
this.status = status;
|
this.statusCodes.addAll(statusCodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a status code which hold a code that assists in presenting notification messages.
|
||||||
|
*
|
||||||
|
* @param status the status code which olds a code that assists in presenting notification messages.
|
||||||
|
*/
|
||||||
|
public void addStatusCode(Status status) {
|
||||||
|
this.statusCodes.add(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -368,21 +386,43 @@ public class MUCUser implements PacketExtension {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Status code assists in presenting notification messages. The following link provides the
|
* Status code assists in presenting notification messages. The following link provides the
|
||||||
* list of existing error codes (@link http://www.xmpp.org/extensions/jep-0045.html#errorstatus).
|
* list of existing error codes <a href="http://xmpp.org/registrar/mucstatus.html">Multi-User Chat Status Codes</a>.
|
||||||
*
|
*
|
||||||
* @author Gaston Dombiak
|
* @author Gaston Dombiak
|
||||||
*/
|
*/
|
||||||
public static class Status implements Element {
|
public static class Status implements Element {
|
||||||
public static final String ELEMENT = "status";
|
public static final String ELEMENT = "status";
|
||||||
|
|
||||||
private String code;
|
private static final Map<Integer, Status> statusMap = new HashMap<Integer, Status>(8);
|
||||||
|
|
||||||
|
public static final Status ROOM_CREATED_201 = Status.create(201);
|
||||||
|
public static final Status BANNED_301 = Status.create(301);
|
||||||
|
public static final Status NEW_NICKNAME_303 = Status.create(303);
|
||||||
|
public static final Status KICKED_307 = Status.create(307);
|
||||||
|
public static final Status REMOVED_AFFIL_CHANGE_321 = Status.create(321);
|
||||||
|
|
||||||
|
private final Integer code;
|
||||||
|
|
||||||
|
public static Status create(String string) {
|
||||||
|
Integer integer = Integer.valueOf(string);
|
||||||
|
return create(integer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Status create(Integer i) {
|
||||||
|
Status status = statusMap.get(i);
|
||||||
|
if (status == null) {
|
||||||
|
status = new Status(i);
|
||||||
|
statusMap.put(i, status);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance of Status with the specified code.
|
* Creates a new instance of Status with the specified code.
|
||||||
*
|
*
|
||||||
* @param code the code that uniquely identifies the reason of the error.
|
* @param code the code that uniquely identifies the reason of the error.
|
||||||
*/
|
*/
|
||||||
public Status(String code) {
|
private Status(int code) {
|
||||||
this.code = code;
|
this.code = code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,7 +432,7 @@ public class MUCUser implements PacketExtension {
|
||||||
*
|
*
|
||||||
* @return the code that uniquely identifies the reason of the error.
|
* @return the code that uniquely identifies the reason of the error.
|
||||||
*/
|
*/
|
||||||
public String getCode() {
|
public int getCode() {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,6 +444,23 @@ public class MUCUser implements PacketExtension {
|
||||||
return xml;
|
return xml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object other) {
|
||||||
|
if (other == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (other instanceof Status) {
|
||||||
|
Status otherStatus = (Status) other;
|
||||||
|
return code.equals(otherStatus.getCode());
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getElementName() {
|
public String getElementName() {
|
||||||
return ELEMENT;
|
return ELEMENT;
|
||||||
|
|
|
@ -54,7 +54,8 @@ public class MUCUserProvider implements PacketExtensionProvider {
|
||||||
mucUser.setPassword(parser.nextText());
|
mucUser.setPassword(parser.nextText());
|
||||||
}
|
}
|
||||||
if (parser.getName().equals("status")) {
|
if (parser.getName().equals("status")) {
|
||||||
mucUser.setStatus(new MUCUser.Status(parser.getAttributeValue("", "code")));
|
String statusString = parser.getAttributeValue("", "code");
|
||||||
|
mucUser.addStatusCode(MUCUser.Status.create(statusString));
|
||||||
}
|
}
|
||||||
if (parser.getName().equals("decline")) {
|
if (parser.getName().equals("decline")) {
|
||||||
mucUser.setDecline(parseDecline(parser));
|
mucUser.setDecline(parseDecline(parser));
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright © 2014 Florian Schmaus
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.jivesoftware.smackx.muc.packet;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jivesoftware.smackx.muc.packet.MUCUser.Status;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class MUCUserTest {
|
||||||
|
|
||||||
|
private static final Set<Status> createStatusSet() {
|
||||||
|
Status status301 = Status.create(301);
|
||||||
|
Status status110 = Status.create(110);
|
||||||
|
Set<Status> statusSet = new HashSet<Status>();
|
||||||
|
statusSet.add(status301);
|
||||||
|
statusSet.add(status110);
|
||||||
|
|
||||||
|
return statusSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mucUserStatusShouldCompareWithStatus() {
|
||||||
|
Set<Status> statusSet = createStatusSet();
|
||||||
|
|
||||||
|
assertTrue(statusSet.contains(Status.create(110)));
|
||||||
|
assertTrue(statusSet.contains(Status.create(301)));
|
||||||
|
assertFalse(statusSet.contains(Status.create(332)));
|
||||||
|
|
||||||
|
assertTrue(statusSet.contains(Status.create("110")));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue