/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.impl.protocol.jabber; import net.java.sip.communicator.impl.protocol.jabber.extensions.usersearch.*; import net.java.sip.communicator.util.*; import org.jivesoftware.smack.packet.*; import org.jivesoftware.smack.provider.*; import org.jivesoftware.smackx.*; import org.jivesoftware.smackx.bytestreams.ibb.provider.*; import org.jivesoftware.smackx.packet.*; import org.jivesoftware.smackx.provider.*; /** * Our Provider Manager that loads providers and extensions we use. * If we receive query and packets for unknown providers * service-unavailable is sent according RFC 6120. * * @author Damian Minkov */ public class ProviderManagerExt extends ProviderManager { /** * Logger of this class */ private static final Logger logger = Logger.getLogger(ProviderManagerExt.class); /** * Creates and loads the providers and extensions used by us. */ ProviderManagerExt() { load(); } /** * Loads the providers and extensions used by us. */ public void load() { //<!-- Private Data Storage --> //addProvider("query", "jabber:iq:private", // org.jivesoftware.smackx.PrivateDataManager.PrivateDataIQProvider.class); //<!-- Time --> //addProvider("query", "jabber:iq:time", // org.jivesoftware.smackx.packet.Time.class); //<!-- Roster Exchange --> addExtProvider("x", "jabber:x:roster", RosterExchangeProvider.class); //<!-- Message Events --> addExtProvider("x", "jabber:x:event", MessageEventProvider.class); //<!-- Chat State --> addExtProvider( "active", "http://jabber.org/protocol/chatstates", ChatStateExtension.Provider.class); addExtProvider( "composing", "http://jabber.org/protocol/chatstates", ChatStateExtension.Provider.class); addExtProvider( "paused", "http://jabber.org/protocol/chatstates", ChatStateExtension.Provider.class); addExtProvider( "inactive", "http://jabber.org/protocol/chatstates", ChatStateExtension.Provider.class); addExtProvider( "gone", "http://jabber.org/protocol/chatstates", ChatStateExtension.Provider.class); //<!-- XHTML --> addExtProvider("html", "http://jabber.org/protocol/xhtml-im", XHTMLExtensionProvider.class); //<!-- Group Chat Invitations --> addExtProvider("x", "jabber:x:conference", GroupChatInvitation.Provider.class); //<!-- Service Discovery # Items --> addProvider("query", "http://jabber.org/protocol/disco#items", DiscoverItemsProvider.class); //<!-- Service Discovery # Info --> addProvider("query", "http://jabber.org/protocol/disco#info", DiscoverInfoProvider.class); //<!-- Data Forms--> addExtProvider("x", "jabber:x:data", org.jivesoftware.smackx.provider.DataFormProvider.class); //<!-- MUC User --> addExtProvider("x", "http://jabber.org/protocol/muc#user", MUCUserProvider.class); //<!-- MUC Admin --> addProvider("query", "http://jabber.org/protocol/muc#admin", MUCAdminProvider.class); //<!-- MUC Owner --> addProvider("query", "http://jabber.org/protocol/muc#owner", MUCOwnerProvider.class); //<!-- Delayed Delivery --> addExtProvider("x", "jabber:x:delay", DelayInformationProvider.class); addExtProvider("delay", "urn:xmpp:delay", DelayInfoProvider.class); //<!-- Version --> addProvider("query", "jabber:iq:version", Version.class); //<!-- VCard --> addProvider("vCard", "vcard-temp", VCardProvider.class); //<!-- Offline Message Requests --> addProvider("offline", "http://jabber.org/protocol/offline", OfflineMessageRequest.Provider.class); //<!-- Offline Message Indicator --> addExtProvider("offline", "http://jabber.org/protocol/offline", OfflineMessageInfo.Provider.class); //<!-- Last Activity --> addProvider("query", "jabber:iq:last", LastActivity.class); //<!-- User Search --> addProvider("query", "jabber:iq:search",UserSearchProvider.class); //<!-- SharedGroupsInfo --> //addProvider("sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup", // org.jivesoftware.smackx.packet.SharedGroupsInfo.Provider.class); //<!-- JEP-33: Extended Stanza Addressing --> //addProvider("addresses", "http://jabber.org/protocol/address", // org.jivesoftware.smackx.provider.MultipleAddressesProvider.class); //<!-- FileTransfer --> addProvider("si", "http://jabber.org/protocol/si", StreamInitiationProvider.class); addProvider("query", "http://jabber.org/protocol/bytestreams", org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider.class); addProvider("open", "http://jabber.org/protocol/ibb", OpenIQProvider.class); addProvider("data", "http://jabber.org/protocol/ibb", DataPacketProvider.class); addProvider("close", "http://jabber.org/protocol/ibb", CloseIQProvider.class); addExtProvider("data", "http://jabber.org/protocol/ibb", DataPacketProvider.class); //<!-- Privacy --> //addProvider("query", "jabber:iq:privacy", // org.jivesoftware.smack.provider.PrivacyProvider.class); //<!-- Ad-Hoc Command --> //addProvider("command", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.class); //addExtProvider("bad-action", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.BadActionError.class); //addExtProvider("malformed-actionn", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.MalformedActionError.class); //addExtProvider("bad-locale", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.BadLocaleError.class); //addExtProvider("bad-payload", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.BadPayloadError.class); //addExtProvider("bad-sessionid", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.BadSessionIDError.class); //addExtProvider("session-expired", "http://jabber.org/protocol/commands", // org.jivesoftware.smackx.provider.AdHocCommandDataProvider.SessionExpiredError.class); //<!-- Fastpath providers --> //addProvider("offer", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.OfferRequestProvider.class); //addProvider("offer-revoke", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.OfferRevokeProvider.class); //addProvider("agent-status-request", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.AgentStatusRequest.Provider.class); //addProvider("transcripts", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.TranscriptsProvider.class); //addProvider("transcript", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.TranscriptProvider.class); //addProvider("workgroups", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.AgentWorkgroups.Provider.class); //addProvider("agent-info", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.AgentInfo.Provider.class); //addProvider("transcript-search", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.TranscriptSearch.Provider.class); //addProvider("occupants-info", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.OccupantsInfo.Provider.class); //addProvider("chat-settings", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.ChatSettings.InternalProvider.class); //addProvider("chat-notes", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.ext.notes.ChatNotes.Provider.class); //addProvider("chat-sessions", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.ext.history.AgentChatHistory.InternalProvider.class); //addProvider("offline-settings", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.OfflineSettings.InternalProvider.class); //addProvider("sound-settings", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.SoundSettings.InternalProvider.class); //addProvider("workgroup-properties", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.WorkgroupProperties.InternalProvider.class); //addProvider("search-settings", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.SearchSettings.InternalProvider.class); //addProvider("workgroup-form", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.ext.forms.WorkgroupForm.InternalProvider.class); //addProvider("macros", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.ext.macros.Macros.InternalProvider.class); //addProvider("chat-metadata", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.ext.history.ChatMetadata.Provider.class); //<!-- //org.jivesoftware.smackx.workgroup.site is missing ... //addProvider("site-user", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.site.SiteUser.Provider.class); //addProvider("site-invite", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.site.SiteInvitation.Provider.class); //addProvider("site-user-history", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.site.SiteUserHistory.Provider.class); //--> //addProvider("generic-metadata", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.settings.GenericSettings.InternalProvider.class); //addProvider("monitor", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.MonitorPacket.InternalProvider.class); //<!-- Packet Extension Providers --> //addExtProvider("queue-status", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.QueueUpdate.Provider.class); //addExtProvider("workgroup", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.WorkgroupInformation.Provider.class); //addExtProvider("metadata", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.MetaDataProvider.class); //addExtProvider("session", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.SessionID.Provider.class); //addExtProvider("user", "http://jivesoftware.com/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.UserID.Provider.class); //addExtProvider("agent-status", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.AgentStatus.Provider.class); //addExtProvider("notify-queue-details", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.QueueDetails.Provider.class); //addExtProvider("notify-queue", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.QueueOverview.Provider.class); //addExtProvider("invite", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.RoomInvitation.Provider.class); //addExtProvider("transfer", "http://jabber.org/protocol/workgroup", // org.jivesoftware.smackx.workgroup.packet.RoomTransfer.Provider.class); //<!-- SHIM --> //addExtProvider("headers", "http://jabber.org/protocol/shim", // org.jivesoftware.smackx.provider.HeadersProvider.class); //addExtProvider("header", "http://jabber.org/protocol/shim", // org.jivesoftware.smackx.provider.HeaderProvider.class); //<!-- XEP-0060 pubsub --> //addProvider("pubsub", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.PubSubProvider.class); //addExtProvider("create", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.SimpleNodeProvider.class); //addExtProvider("items", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.ItemsProvider.class); //addExtProvider("item", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.ItemProvider.class); //addExtProvider("subscriptions", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.SubscriptionsProvider.class); //addExtProvider("subscription", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.SubscriptionProvider.class); //addExtProvider("affiliations", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.AffiliationsProvider.class); //addExtProvider("affiliation", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.AffiliationProvider.class); //addExtProvider("options", "http://jabber.org/protocol/pubsub", // org.jivesoftware.smackx.pubsub.provider.FormNodeProvider.class); //<!-- XEP-0060 pubsub#owner --> //addProvider("pubsub", "http://jabber.org/protocol/pubsub#owner", // org.jivesoftware.smackx.pubsub.provider.PubSubProvider.class); //addExtProvider("configure", "http://jabber.org/protocol/pubsub#owner", // org.jivesoftware.smackx.pubsub.provider.FormNodeProvider.class); //addExtProvider("default", "http://jabber.org/protocol/pubsub#owner", // org.jivesoftware.smackx.pubsub.provider.FormNodeProvider.class); //<!-- XEP-0060 pubsub#event --> //addExtProvider("event", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.EventProvider.class); //addExtProvider("configuration", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.ConfigEventProvider.class); //addExtProvider("delete", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.SimpleNodeProvider.class); //addExtProvider("options", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.FormNodeProvider.class); //addExtProvider("items", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.ItemsProvider.class); //addExtProvider("item", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.ItemProvider.class); //addExtProvider("retract", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.RetractEventProvider.class); //addExtProvider("purge", "http://jabber.org/protocol/pubsub#event", // org.jivesoftware.smackx.pubsub.provider.SimpleNodeProvider.class); //<!-- Nick Exchange --> //addExtProvider("nick", "http://jabber.org/protocol/nick", // org.jivesoftware.smackx.packet.Nick.Provider.class); //<!-- Attention --> //addExtProvider("attention", "urn:xmpp:attention:0", // org.jivesoftware.smackx.packet.AttentionExtension.Provider.class); } /** * Adds an IQ provider (must be an instance of IQProvider or Class object that is an IQ) * with the specified element name and name space. The provider will override any providers * loaded through the classpath. * * @param elementName the XML element name. * @param namespace the XML namespace. * @param provider the IQ provider class. */ private void addProvider( String elementName, String namespace, Class<?> provider) { // Attempt to load the provider class and then create // a new instance if it's an IQProvider. Otherwise, if it's // an IQ class, add the class object itself, then we'll use // reflection later to create instances of the class. try { // Add the provider to the map. if (IQProvider.class.isAssignableFrom(provider)) { addIQProvider(elementName, namespace, provider.newInstance()); } else if (IQ.class.isAssignableFrom(provider)) { addIQProvider(elementName, namespace, provider); } } catch (Throwable t) { logger.error("Error adding iq provider.", t); } } /** * Adds an extension provider with the specified element name and name space. The provider * will override any providers loaded through the classpath. The provider must be either * a PacketExtensionProvider instance, or a Class object of a Javabean. * * @param elementName the XML element name. * @param namespace the XML namespace. * @param provider the extension provider class. */ public void addExtProvider( String elementName, String namespace, Class<?> provider) { // Attempt to load the provider class and then create // a new instance if it's a Provider. Otherwise, if it's // a PacketExtension, add the class object itself and // then we'll use reflection later to create instances // of the class. try { // Add the provider to the map. if (PacketExtensionProvider.class.isAssignableFrom(provider)) { addExtensionProvider( elementName, namespace, provider.newInstance()); } else if (PacketExtension.class.isAssignableFrom( provider)) { addExtensionProvider(elementName, namespace, provider); } } catch (Throwable t) { logger.error("Error adding extension provider.", t); } } }