diff --git a/src/net/java/sip/communicator/plugin/gibberishaccregwizz/FirstWizardPage.java b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/FirstWizardPage.java
new file mode 100644
index 000000000..5a22d9060
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/FirstWizardPage.java
@@ -0,0 +1,308 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.gibberishaccregwizz;
+
+import java.util.*;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.event.*;
+
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+
+/**
+ * The FirstWizardPage is the page, where user could enter the user ID
+ * and the password of the account.
+ *
+ * @author Emil Ivov
+ */
+public class FirstWizardPage
+ extends JPanel implements WizardPage, DocumentListener
+{
+
+ public static final String FIRST_PAGE_IDENTIFIER = "FirstPageIdentifier";
+
+ private JPanel userPassPanel = new JPanel(new BorderLayout(10, 10));
+
+ private JPanel labelsPanel = new JPanel();
+
+ private JPanel valuesPanel = new JPanel();
+
+ private JLabel userID = new JLabel(Resources.getString("userID"));
+
+ private JLabel passLabel = new JLabel(Resources.getString("password"));
+
+ private JLabel existingAccountLabel
+ = new JLabel(Resources.getString("existingAccount"));
+
+ private JPanel emptyPanel = new JPanel();
+
+ private JLabel userIDExampleLabel = new JLabel("Ex: random.user.name");
+
+ private JTextField userIDField = new JTextField();
+
+ private JPasswordField passField = new JPasswordField();
+
+ private JCheckBox rememberPassBox = new JCheckBox(
+ Resources.getString("rememberPassword"));
+
+ private JPanel mainPanel = new JPanel();
+
+ private Object nextPageIdentifier = WizardPage.SUMMARY_PAGE_IDENTIFIER;
+
+ private GibberishAccountRegistration registration = null;
+
+ private WizardContainer wizardContainer;
+
+ /**
+ * Creates an instance of FirstWizardPage.
+ * @param registration the GibberishAccountRegistration, where
+ * all data through the wizard are stored
+ * @param wizardContainer the wizardContainer, where this page will
+ * be added
+ */
+ public FirstWizardPage(GibberishAccountRegistration registration,
+ WizardContainer wizardContainer)
+ {
+
+ super(new BorderLayout());
+
+ this.wizardContainer = wizardContainer;
+
+ this.registration = registration;
+
+ this.setPreferredSize(new Dimension(300, 150));
+
+ mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
+
+ this.init();
+
+ this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+
+ this.labelsPanel.setLayout(new BoxLayout(labelsPanel, BoxLayout.Y_AXIS));
+
+ this.valuesPanel.setLayout(new BoxLayout(valuesPanel, BoxLayout.Y_AXIS));
+ }
+
+ /**
+ * Initializes all panels, buttons, etc.
+ */
+ private void init()
+ {
+ this.userIDField.getDocument().addDocumentListener(this);
+ this.rememberPassBox.setSelected(true);
+
+ this.existingAccountLabel.setForeground(Color.RED);
+
+ this.userIDExampleLabel.setForeground(Color.GRAY);
+ this.userIDExampleLabel.setFont(
+ userIDExampleLabel.getFont().deriveFont(8));
+ this.emptyPanel.setMaximumSize(new Dimension(40, 35));
+ this.userIDExampleLabel.setBorder(
+ BorderFactory.createEmptyBorder(0, 0, 8,0));
+
+ labelsPanel.add(userID);
+ labelsPanel.add(emptyPanel);
+ labelsPanel.add(passLabel);
+
+ valuesPanel.add(userIDField);
+ valuesPanel.add(userIDExampleLabel);
+ valuesPanel.add(passField);
+
+ userPassPanel.add(labelsPanel, BorderLayout.WEST);
+ userPassPanel.add(valuesPanel, BorderLayout.CENTER);
+ userPassPanel.add(rememberPassBox, BorderLayout.SOUTH);
+
+ userPassPanel.setBorder(BorderFactory
+ .createTitledBorder(Resources.getString(
+ "userAndPassword")));
+
+ this.add(userPassPanel, BorderLayout.NORTH);
+ }
+
+ /**
+ * Implements the WizardPage.getIdentifier to return
+ * this page identifier.
+ *
+ * @return the Identifier of the first page in this wizard.
+ */
+ public Object getIdentifier()
+ {
+ return FIRST_PAGE_IDENTIFIER;
+ }
+
+ /**
+ * Implements the WizardPage.getNextPageIdentifier to return
+ * the next page identifier - the summary page.
+ *
+ * @return the identifier of the page following this one.
+ */
+ public Object getNextPageIdentifier()
+ {
+ return nextPageIdentifier;
+ }
+
+ /**
+ * Implements the WizardPage.getBackPageIdentifier to return
+ * the next back identifier - the default page.
+ *
+ * @return the identifier of the default wizard page.
+ */
+ public Object getBackPageIdentifier()
+ {
+ return WizardPage.DEFAULT_PAGE_IDENTIFIER;
+ }
+
+ /**
+ * Implements the WizardPage.getWizardForm to return
+ * this panel.
+ *
+ * @return the component to be displayed in this wizard page.
+ */
+ public Object getWizardForm()
+ {
+ return this;
+ }
+
+ /**
+ * Before this page is displayed enables or disables the "Next" wizard
+ * button according to whether the UserID field is empty.
+ */
+ public void pageShowing()
+ {
+ this.setNextButtonAccordingToUserID();
+ }
+
+ /**
+ * Saves the user input when the "Next" wizard buttons is clicked.
+ */
+ public void pageNext()
+ {
+ String userID = userIDField.getText();
+
+ if (isExistingAccount(userID))
+ {
+ nextPageIdentifier = FIRST_PAGE_IDENTIFIER;
+ userPassPanel.add(existingAccountLabel, BorderLayout.NORTH);
+ this.revalidate();
+ }
+ else
+ {
+ nextPageIdentifier = SUMMARY_PAGE_IDENTIFIER;
+ userPassPanel.remove(existingAccountLabel);
+
+ registration.setUserID(userIDField.getText());
+ registration.setPassword(new String(passField.getPassword()));
+ registration.setRememberPassword(rememberPassBox.isSelected());
+ }
+ }
+
+ /**
+ * Enables or disables the "Next" wizard button according to whether the
+ * User ID field is empty.
+ */
+ private void setNextButtonAccordingToUserID()
+ {
+ if (userIDField.getText() == null || userIDField.getText().equals(""))
+ {
+ wizardContainer.setNextFinishButtonEnabled(false);
+ }
+ else
+ {
+ wizardContainer.setNextFinishButtonEnabled(true);
+ }
+ }
+
+ /**
+ * Handles the DocumentEvent triggered when user types in the
+ * User ID field. Enables or disables the "Next" wizard button according to
+ * whether the User ID field is empty.
+ *
+ * @param event the event containing the update.
+ */
+ public void insertUpdate(DocumentEvent event)
+ {
+ this.setNextButtonAccordingToUserID();
+ }
+
+ /**
+ * Handles the DocumentEvent triggered when user deletes letters
+ * from the UserID field. Enables or disables the "Next" wizard button
+ * according to whether the UserID field is empty.
+ *
+ * @param event the event containing the update.
+ */
+ public void removeUpdate(DocumentEvent event)
+ {
+ this.setNextButtonAccordingToUserID();
+ }
+
+ public void changedUpdate(DocumentEvent event)
+ {
+ }
+
+ public void pageHiding()
+ {
+ }
+
+ public void pageShown()
+ {
+ }
+
+ public void pageBack()
+ {
+ }
+
+ /**
+ * Fills the UserID and Password fields in this panel with the data comming
+ * from the given protocolProvider.
+ * @param protocolProvider The ProtocolProviderService to load the
+ * data from.
+ */
+ public void loadAccount(ProtocolProviderService protocolProvider)
+ {
+ AccountID accountID = protocolProvider.getAccountID();
+ String password = (String) accountID.getAccountProperties()
+ .get(ProtocolProviderFactory.PASSWORD);
+
+ this.userIDField.setText(accountID.getUserID());
+
+ if (password != null)
+ {
+ this.passField.setText(password);
+ this.rememberPassBox.setSelected(true);
+ }
+ }
+
+ /**
+ * Verifies whether there is already an account installed with the same
+ * details as the one that the user has just entered.
+ *
+ * @param userID the name of the user that the account is registered for
+ * @return true if there is already an account for this userID and false
+ * otherwise.
+ */
+ private boolean isExistingAccount(String userID)
+ {
+ ProtocolProviderFactory factory
+ = GibberishAccRegWizzActivator.getGibberishProtocolProviderFactory();
+
+ ArrayList registeredAccounts = factory.getRegisteredAccounts();
+
+ for (int i = 0; i < registeredAccounts.size(); i++)
+ {
+ AccountID accountID = (AccountID) registeredAccounts.get(i);
+
+ if (userID.equalsIgnoreCase(accountID.getUserID()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccRegWizzActivator.java b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccRegWizzActivator.java
new file mode 100644
index 000000000..0d27f418e
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccRegWizzActivator.java
@@ -0,0 +1,109 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.gibberishaccregwizz;
+
+import org.osgi.framework.*;
+import net.java.sip.communicator.service.configuration.*;
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ * Registers the GibberishAccountRegistrationWizard in the UI Service.
+ *
+ * @author Emil Ivov
+ */
+public class GibberishAccRegWizzActivator
+ implements BundleActivator
+{
+ private static Logger logger = Logger.getLogger(
+ GibberishAccRegWizzActivator.class.getName());
+
+ /**
+ * A currently valid bundle context.
+ */
+ public static BundleContext bundleContext;
+
+ /**
+ * A currently valid reference to the configuration service.
+ */
+ private static ConfigurationService configService;
+
+ /**
+ * Starts this bundle.
+ * @param bc the currently valid BundleContext.
+ */
+ public void start(BundleContext bc)
+ {
+ logger.info("Loading gibberish account wizard.");
+
+ bundleContext = bc;
+
+ ServiceReference uiServiceRef = bundleContext
+ .getServiceReference(UIService.class.getName());
+
+ UIService uiService
+ = (UIService) bundleContext.getService(uiServiceRef);
+
+ AccountRegistrationWizardContainer wizardContainer
+ = uiService.getAccountRegWizardContainer();
+
+ GibberishAccountRegistrationWizard gibberishWizard
+ = new GibberishAccountRegistrationWizard(wizardContainer);
+
+ wizardContainer.addAccountRegistrationWizard(gibberishWizard);
+
+ logger.info("Gibberish account registration wizard [STARTED].");
+ }
+
+ /**
+ * Called when this bundle is stopped so the Framework can perform the
+ * bundle-specific activities necessary to stop the bundle.
+ *
+ * @param context The execution context of the bundle being stopped.
+ */
+ public void stop(BundleContext context)
+ {
+
+ }
+
+ /**
+ * Returns the ProtocolProviderFactory for the Gibberish protocol.
+ * @return the ProtocolProviderFactory for the Gibberish protocol
+ */
+ public static ProtocolProviderFactory getGibberishProtocolProviderFactory()
+ {
+
+ ServiceReference[] serRefs = null;
+
+ String osgiFilter = "("
+ + ProtocolProviderFactory.PROTOCOL
+ + "=" + "Gibberish" + ")";
+
+ try
+ {
+ serRefs = bundleContext.getServiceReferences(
+ ProtocolProviderFactory.class.getName(), osgiFilter);
+ }
+ catch (InvalidSyntaxException ex)
+ {
+ logger.error(ex);
+ }
+
+ return (ProtocolProviderFactory) bundleContext.getService(serRefs[0]);
+ }
+
+ /**
+ * Returns the bundleContext that we received when we were started.
+ *
+ * @return a currently valid instance of a bundleContext.
+ */
+ public BundleContext getBundleContext()
+ {
+ return bundleContext;
+ }
+}
diff --git a/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistration.java b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistration.java
new file mode 100644
index 000000000..ad0ff17bf
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistration.java
@@ -0,0 +1,82 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.gibberishaccregwizz;
+
+/**
+ * The GibberishAccountRegistration is used to store all user input data
+ * through the GibberishAccountRegistrationWizard.
+ *
+ * @author Emil Ivov
+ */
+public class GibberishAccountRegistration
+{
+ private String userID;
+ private String password;
+ private boolean rememberPassword;
+
+ /**
+ * Returns the User ID of the gibberish registration account.
+ * @return the User ID of the gibberish registration account.
+ */
+ public String getUserID()
+ {
+ return userID;
+ }
+
+ /**
+ * Sets the user ID of the gibberish registration account.
+ * @param userID the userID of the gibberish registration account.
+ */
+ public void setUserID(String userID)
+ {
+ this.userID = userID;
+ }
+
+ /**
+ * Returns the password of the Gibberish registration account.
+ *
+ * @return the password of the Gibberish registration account.
+ */
+ public String getPassword()
+ {
+ return password;
+ }
+
+ /**
+ * Sets the password of the Gibberish registration account.
+ *
+ * @param password the password of the Gibberish registration account.
+ */
+ public void setPassword(String password)
+ {
+ this.password = password;
+ }
+
+ /**
+ * Returns true if password has to remembered, false
+ * otherwise.
+ *
+ * @return true if password has to remembered, false
+ * otherwise.
+ */
+ public boolean isRememberPassword()
+ {
+ return rememberPassword;
+ }
+
+ /**
+ * Sets the rememberPassword value of this Gibberish account registration.
+ *
+ * @param rememberPassword true if password has to remembered,
+ * false otherwise.
+ */
+ public void setRememberPassword(boolean rememberPassword)
+ {
+ this.rememberPassword = rememberPassword;
+ }
+
+}
diff --git a/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistrationWizard.java b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistrationWizard.java
new file mode 100644
index 000000000..7ca4ead4f
--- /dev/null
+++ b/src/net/java/sip/communicator/plugin/gibberishaccregwizz/GibberishAccountRegistrationWizard.java
@@ -0,0 +1,189 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.plugin.gibberishaccregwizz;
+
+import java.util.*;
+
+import org.osgi.framework.*;
+import net.java.sip.communicator.impl.gui.customcontrols.*;
+import net.java.sip.communicator.service.gui.*;
+import net.java.sip.communicator.service.protocol.*;
+
+/**
+ * The GibberishAccountRegistrationWizard is an implementation of the
+ * AccountRegistrationWizard for the Gibberish protocol. It allows
+ * the user to create and configure a new Gibberish account.
+ *
+ * @author Emil Ivov
+ */
+public class GibberishAccountRegistrationWizard
+ implements AccountRegistrationWizard
+{
+
+ /**
+ * The first page of the gibberish account registration wizard.
+ */
+ private FirstWizardPage firstWizardPage;
+
+ /**
+ * The object that we use to store details on an account that we will be
+ * creating.
+ */
+ private GibberishAccountRegistration registration
+ = new GibberishAccountRegistration();
+
+ private WizardContainer wizardContainer;
+
+ private ProtocolProviderService protocolProvider;
+
+ private String propertiesPackage
+ = "net.java.sip.communicator.plugin.gibberishaccregwizz";
+
+ private boolean isModification;
+
+ /**
+ * Creates an instance of GibberishAccountRegistrationWizard.
+ * @param wizardContainer the wizard container, where this wizard
+ * is added
+ */
+ public GibberishAccountRegistrationWizard(WizardContainer wizardContainer)
+ {
+ this.wizardContainer = wizardContainer;
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getIcon method.
+ * Returns the icon to be used for this wizard.
+ * @return byte[]
+ */
+ public byte[] getIcon()
+ {
+ return Resources.getImage(Resources.GIBBERISH_LOGO);
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getProtocolName
+ * method. Returns the protocol name for this wizard.
+ * @return String
+ */
+ public String getProtocolName()
+ {
+ return Resources.getString("protocolName");
+ }
+
+ /**
+ * Implements the AccountRegistrationWizard.getProtocolDescription
+ * method. Returns the description of the protocol for this wizard.
+ * @return String
+ */
+ public String getProtocolDescription()
+ {
+ return Resources.getString("protocolDescription");
+ }
+
+ /**
+ * Returns the set of pages contained in this wizard.
+ * @return Iterator
+ */
+ public Iterator getPages()
+ {
+ ArrayList pages = new ArrayList();
+ firstWizardPage = new FirstWizardPage(registration, wizardContainer);
+
+ pages.add(firstWizardPage);
+
+ return pages.iterator();
+ }
+
+ /**
+ * Returns the set of data that user has entered through this wizard.
+ * @return Iterator
+ */
+ public Iterator getSummary()
+ {
+ Hashtable summaryTable = new Hashtable();
+
+ summaryTable.put("User ID", registration.getUserID());
+
+ return summaryTable.entrySet().iterator();
+ }
+
+ /**
+ * Installs the account created through this wizard.
+ * @return ProtocolProviderService
+ */
+ public ProtocolProviderService finish()
+ {
+ firstWizardPage = null;
+ ProtocolProviderFactory factory
+ = GibberishAccRegWizzActivator.getGibberishProtocolProviderFactory();
+
+ return this.installAccount(factory,
+ registration.getUserID());
+ }
+
+ /**
+ * Creates an account for the given user and password.
+ * @param providerFactory the ProtocolProviderFactory which will create
+ * the account
+ * @param user the user identifier
+ * @param passwd the password
+ * @return the ProtocolProviderService for the new account.
+ */
+ public ProtocolProviderService installAccount(
+ ProtocolProviderFactory providerFactory,
+ String user)
+ {
+
+ Hashtable accountProperties = new Hashtable();
+
+ if (registration.isRememberPassword())
+ {
+ accountProperties.put(ProtocolProviderFactory.PASSWORD
+ , registration.getPassword());
+ }
+
+ try
+ {
+ AccountID accountID = providerFactory.installAccount(
+ user, accountProperties);
+
+ ServiceReference serRef = providerFactory
+ .getProviderForAccount(accountID);
+
+ protocolProvider = (ProtocolProviderService)
+ GibberishAccRegWizzActivator.bundleContext
+ .getService(serRef);
+ }
+ catch (IllegalArgumentException exc)
+ {
+ new ErrorDialog(null, exc.getMessage(), exc).showDialog();
+ }
+ catch (IllegalStateException exc)
+ {
+ new ErrorDialog(null, exc.getMessage(), exc).showDialog();
+ }
+
+ return protocolProvider;
+ }
+
+ /**
+ * Fills the UserID and Password fields in this panel with the data comming
+ * from the given protocolProvider.
+ * @param protocolProvider The ProtocolProviderService to load the
+ * data from.
+ */
+ public void loadAccount(ProtocolProviderService protocolProvider)
+ {
+
+ this.protocolProvider = protocolProvider;
+
+ this.firstWizardPage.loadAccount(protocolProvider);
+
+ isModification = true;
+ }
+}
diff --git a/src/net/java/sip/communicator/service/protocol/OperationSetMultiUserChat.java b/src/net/java/sip/communicator/service/protocol/OperationSetMultiUserChat.java
new file mode 100644
index 000000000..720dffdd0
--- /dev/null
+++ b/src/net/java/sip/communicator/service/protocol/OperationSetMultiUserChat.java
@@ -0,0 +1,132 @@
+/*
+ * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package net.java.sip.communicator.service.protocol;
+
+import java.util.*;
+import net.java.sip.communicator.service.protocol.event.*;
+
+/**
+ * Allows creating, configuring, joining and administrating of individual
+ * text-based conference rooms.
+ *
+ * @author Emil Ivov
+ */
+public interface OperationSetMultiUserChat
+{
+ /**
+ * Returns the List of ChatRooms currently available on
+ * the server that this protocol provider is connected to.
+ *
+ * @return a java.util.List of ChatRooms that are
+ * currently available on the server that this protocol provider is
+ * connected to.
+ *
+ * @throws OperationFailedException if we faile retrieving this list from
+ * the server.
+ */
+ public List getExistingChatRooms()
+ throws OperationFailedException;
+
+ /**
+ * Returns a list of the chat rooms that we have joined and are currently
+ * active in.
+ *
+ * @return a List of the rooms where the user has joined using a
+ * given connection.
+ */
+ public List getCurrentlyJoinedChatRooms();
+
+ /**
+ * Returns a list of the chat rooms that contact has joined and is
+ * currently active in.
+ *
+ * @param contact the contact whose current ChatRooms we will be querying.
+ * @return a list of the chat rooms that contact has joined and is
+ * currently active in.
+ */
+ public List getCurrentlyJoinedChatRooms(Contact contact);
+
+ /**
+ * Creates a room with the named roomName and according to the
+ * specified roomProperties on the server that this protocol
+ * provider is currently connected to. When the method returns the room the
+ * local user will not have joined it and thus will not receive messages on
+ * it until the ChatRoom.join() method is called.
+ *
+ * @param roomName the name of the ChatRoom to create. + * @param roomProperties properties specifying how the room should be + * created. + * @throws OperationFailedException if the room couldn't be created for some + * reason (e.g. room already exists; user already joined to an existant + * room or user has no permissions to create a chat room). + */ + public ChatRoom createChatRoom(String roomName, Hashtable roomProperties) + throws OperationFailedException; + + /** + * Returns a reference to a chatRoom named roomName or null if + * no such room exists. + *
+ * @param roomName the name of the ChatRoom that we're looking for. + * @return the ChatRoom named roomName or null if no such + * room exists on the server that this provider is currently connected to. + */ + public ChatRoom findRoom(String roomName); + + /** + * Informs the sender of an invitation that we decline their invitation. + * + * @param conn the connection to use for sending the rejection. + * @param room the room that sent the original invitation. + * @param inviter the inviter of the declined invitation. + * @param reason the reason why the invitee is declining the invitation. + */ + public void rejectInvitation(ChatRoomInvitation invitation); + + /** + * Adds a listener to invitation notifications. The listener will be fired + * anytime an invitation is received. + * + * @param listener an invitation listener. + */ + public void addInvitationListener(InvitationListener listener); + + /** + * Removes listener from the list of invitation listeners + * registered to receive invitation events. + * + * @param listener the invitation listener to remove. + */ + public void removeInvitationListener(InvitationListener listener); + + /** + * Adds a listener to invitation notifications. The listener will be fired + * anytime an invitation is received. + * + * @param listener an invitation listener. + */ + public void addInvitationRejectionListener( + InvitationRejectionListener listener); + + /** + * Removes listener from the list of invitation listeners + * registered to receive invitation rejection events. + * + * @param listener the invitation listener to remove. + */ + public void removeInvitationRejectionListener( + InvitationRejectionListener listener); + + /** + * Returns true if contact supports multi user chat sessions. + * + * @param contact reference to the contact whose support for chat rooms + * we are currently querying. + * @return a boolean indicating whether contact supports chatrooms. + */ + public boolean isMultiChatSupportedByContact(Contact contact); +}