From 8e83a092dba8797c5d73fac76a5d0ab54ccc5f5d Mon Sep 17 00:00:00 2001 From: Matt Tucker Date: Sun, 12 Oct 2003 04:40:08 +0000 Subject: [PATCH] Added support for group chat invitations (SMACK-95). git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@2135 b35dd754-fafc-0310-a699-88a17e54d16e --- build/resources/META-INF/smack.providers | 7 + .../smackx/GroupChatInvitation.java | 137 ++++++++++++++++++ .../smackx/GroupChatInvitationTest.java | 136 +++++++++++++++++ 3 files changed, 280 insertions(+) create mode 100644 source/org/jivesoftware/smackx/GroupChatInvitation.java create mode 100644 test/org/jivesoftware/smackx/GroupChatInvitationTest.java diff --git a/build/resources/META-INF/smack.providers b/build/resources/META-INF/smack.providers index 68bfdf4b2..5efdca4d3 100644 --- a/build/resources/META-INF/smack.providers +++ b/build/resources/META-INF/smack.providers @@ -37,4 +37,11 @@ org.jivesoftware.smackx.provider.XHTMLExtensionProvider + + + x + jabber:x:conference + org.jivesoftware.smackx.GroupChatInvitation$Provider + + \ No newline at end of file diff --git a/source/org/jivesoftware/smackx/GroupChatInvitation.java b/source/org/jivesoftware/smackx/GroupChatInvitation.java new file mode 100644 index 000000000..dbc7b4b0b --- /dev/null +++ b/source/org/jivesoftware/smackx/GroupChatInvitation.java @@ -0,0 +1,137 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2003 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx; + +import org.jivesoftware.smack.packet.PacketExtension; +import org.jivesoftware.smack.provider.PacketExtensionProvider; +import org.xmlpull.v1.XmlPullParser; + +/** + * A group chat invitation packet extension, which is used to invite other + * users to a group chat room. To invite a user to a group chat room, address + * a new message to the user and set the room name appropriately, as in the + * following code example: + * + *
+ * Message message = new Message("user@chat.example.com");
+ * message.setBody("Join me for a group chat!");
+ * message.addExtension(new GroupChatInvitation("room@chat.example.com"););
+ * con.sendPacket(message);
+ * 
+ * + * To listen for group chat invitations, use a PacketExtensionFilter for the + * x element name and jabber:x:conference namespace, as in the + * following code example: + * + *
+ * PacketFilter filter = new PacketExtensionFilter("x", "jabber:x:conference");
+ * // Create a packet collector or packet listeners using the filter...
+ * 
+ * + * Note: this protocol is outdated now that the Multi-User Chat (MUC) JEP is available + * (JEP-45). However, most + * existing clients still use this older protocol. Once MUC support becomes more + * widespread, this API may be deprecated. + * + * @author Matt Tucker + */ +public class GroupChatInvitation implements PacketExtension { + + private String roomAddress; + + /** + * Creates a new group chat invitation to the specified room address. + * GroupChat room addresses are in the form room@service, + * where service is the name of groupchat server, such as + * chat.example.com. + * + * @param roomAddress the address of the group chat room. + */ + public GroupChatInvitation(String roomAddress) { + this.roomAddress = roomAddress; + } + + /** + * Returns the address of the group chat room. GroupChat room addresses + * are in the form room@service, where service is + * the name of groupchat server, such as chat.example.com. + * + * @return the address of the group chat room. + */ + public String getRoomAddress() { + return roomAddress; + } + + public String getElementName() { + return "x"; + } + + public String getNamespace() { + return "jabber:x:conference"; + } + + public String toXML() { + StringBuffer buf = new StringBuffer(); + buf.append(""); + return buf.toString(); + } + + public static class Provider implements PacketExtensionProvider { + public PacketExtension parseExtension (XmlPullParser parser) throws Exception { + String roomAddress = parser.getAttributeValue("", "jid"); + // Advance to end of extension. + parser.next(); + return new GroupChatInvitation(roomAddress); + } + } +} \ No newline at end of file diff --git a/test/org/jivesoftware/smackx/GroupChatInvitationTest.java b/test/org/jivesoftware/smackx/GroupChatInvitationTest.java new file mode 100644 index 000000000..2cbca74f8 --- /dev/null +++ b/test/org/jivesoftware/smackx/GroupChatInvitationTest.java @@ -0,0 +1,136 @@ +/** + * $RCSfile$ + * $Revision$ + * $Date$ + * + * Copyright (C) 2003 Jive Software. All rights reserved. + * ==================================================================== + * The Jive Software License (based on Apache Software License, Version 1.1) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by + * Jive Software (http://www.jivesoftware.com)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Smack" and "Jive Software" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please + * contact webmaster@jivesoftware.com. + * + * 5. Products derived from this software may not be called "Smack", + * nor may "Smack" appear in their name, without prior written + * permission of Jive Software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL JIVE SOFTWARE OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + */ + +package org.jivesoftware.smackx; + +import org.jivesoftware.smack.*; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.filter.PacketFilter; +import org.jivesoftware.smack.filter.PacketExtensionFilter; +import junit.framework.TestCase; + +/** + * + * + * @author Matt Tucker + */ +public class GroupChatInvitationTest extends TestCase { + + private XMPPConnection con1 = null; + private XMPPConnection con2 = null; + private PacketCollector collector = null; + + public void testInvitation() { + try { + GroupChatInvitation invitation = new GroupChatInvitation("test@chat.localhost"); + Message message = new Message("test2@" + con1.getHost()); + message.setBody("Group chat invitation!"); + message.addExtension(invitation); + con1.sendPacket(message); + + Thread.sleep(250); + + Message result = (Message)collector.pollResult(); + assertNotNull("Message not delivered correctly.", result); + + GroupChatInvitation resultInvite = (GroupChatInvitation)result.getExtension("x", + "jabber:x:conference"); + + assertEquals("Invitation not to correct room", "test@chat.localhost", + resultInvite.getRoomAddress()); + } + catch (Exception e) { + fail(e.getMessage()); + } + } + + protected void setUp() throws Exception { + super.setUp(); + try { + con1 = new XMPPConnection("localhost"); + con2 = new XMPPConnection("localhost"); + + // Create the test accounts + if (!con1.getAccountManager().supportsAccountCreation()) { + fail("Server does not support account creation"); + } + con1.getAccountManager().createAccount("test1", "test1"); + con2.getAccountManager().createAccount("test2", "test2"); + + // Login with the test accounts + con1.login("test1", "test1"); + con2.login("test2", "test2"); + + // Register listener for groupchat invitations. + PacketFilter filter = new PacketExtensionFilter("x", "jabber:x:conference"); + collector = con2.createPacketCollector(filter); + } + catch (Exception e) { + fail(e.getMessage()); + } + } + + /* + * @see TestCase#tearDown() + */ + protected void tearDown() throws Exception { + super.tearDown(); + + // Delete the created accounts for the test + con1.getAccountManager().deleteAccount(); + con2.getAccountManager().deleteAccount(); + + // Close all the connections + con1.close(); + con2.close(); + } +} \ No newline at end of file