diff --git a/3rd_party_software/Smack_4.3.0_Alpha/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java b/3rd_party_software/Smack_4.3.0_Alpha/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java index 1f10eff..e4c856b 100644 --- a/3rd_party_software/Smack_4.3.0_Alpha/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java +++ b/3rd_party_software/Smack_4.3.0_Alpha/smack-extensions/src/main/java/org/jivesoftware/smackx/muc/MultiUserChat.java @@ -56,6 +56,7 @@ import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Stanza; +import org.jivesoftware.smack.packet.XMPPError; import org.jivesoftware.smack.util.StringUtils; import org.jivesoftware.smackx.disco.ServiceDiscoveryManager; @@ -136,6 +137,11 @@ public class MultiUserChat { */ private final StanzaFilter fromRoomGroupchatFilter; + /** + * Same as {@link #fromRoomFilter} together with {@link MessageTypeFilter#ERROR}. + */ + private final StanzaFilter fromRoomErrorFilter; + private final StanzaListener presenceInterceptor; private final StanzaListener messageListener; private final StanzaListener presenceListener; @@ -157,6 +163,7 @@ public class MultiUserChat { fromRoomFilter = FromMatchesFilter.create(room); fromRoomGroupchatFilter = new AndFilter(fromRoomFilter, MessageTypeFilter.GROUPCHAT); + fromRoomErrorFilter = new AndFilter(fromRoomFilter, MessageTypeFilter.ERROR); messageListener = new StanzaListener() { @Override @@ -1856,13 +1863,29 @@ public class MultiUserChat { * Sends a message to the chat room. * * @param text the text of the message to send. + * @throws XMPPErrorException * @throws NotConnectedException * @throws InterruptedException */ - public void sendMessage(String text) throws NotConnectedException, InterruptedException { + public void sendMessage(String text) throws XMPPErrorException, NotConnectedException, InterruptedException { Message message = createMessage(); message.setBody(text); connection.sendStanza(message); + // Check for forbidden response from the server in case the user does + // not have permission to post to the room + StanzaFilter responseFilter = new AndFilter(fromRoomErrorFilter, new StanzaFilter() { + @Override + public boolean accept(Stanza packet) { + Message msg = (Message) packet; + return msg.getError().getCondition().equals(XMPPError.Condition.forbidden); + } + }); + StanzaCollector response = connection.createStanzaCollectorAndSend(responseFilter, message); + // Don't set timeout, defer to global setReplyTimeout value instead + Stanza msg = response.nextResult(); + if (msg != null) { + throw new XMPPErrorException(msg, msg.getError()); + } } /**