3
votes

I have a problem on handling the file transfer from an "Android chat" to an other client (like Pidgin): the Pidgin client receives the transfer request, but my application cannot start transferring the file.

I must say that I've read all stackoverflows questions, some http://community.igniterealtime.org/ threads, but all that didn't solve my problems.

In order to test, i'm using the jabber.org server on port 5222, and I'm using the Beem-Asmack library v7 (in some clients you must also specify the proxy: is this necessary??). The code for file transfer is the following:

public boolean sendFile(final String jid, final String path, String description) {
    ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(this.xmpp);
    /*if (sdm==null) {
        sdm = new ServiceDiscoveryManager(this.xmpp);*/
        sdm.addFeature("http://jabber.org/protocol/disco#info");
        sdm.addFeature("http://jabber.org/protocol/disco#item");
        sdm.addFeature("jabber:iq:privacy");
    //}

    Log.d("sending file", "maganer");
    FileTransferNegotiator.setServiceEnabled(this.xmpp, true);
    FileTransferManager manage = new FileTransferManager(this.xmpp);
    Log.d("sending file", "set true");

    OutgoingFileTransfer.setResponseTimeout(10000);
    OutgoingFileTransfer oft = manage.createOutgoingFileTransfer(this.myRoster.getPresence(jid).getFrom());
    try {
        Log.d("sending file", "try to send... " + path);
        oft.sendFile(new File(path), description);
        Log.d("sending file", "Accepted");
        while (!oft.isDone()) {
            Log.d("status", oft.getStatus().toString());
            Log.d("percent", new Long(oft.getBytesSent()).toString());
            if (oft.getStatus() == FileTransfer.Status.error) {
                Log.e("percent", "Error " + new Long(oft.getBytesSent()).toString() + " " + oft.getError() + " " + oft.getException());
                oft.cancel();
                return false;
            }
            //Thread.sleep(1000);
        }
    } catch (Throwable e) {
        e.printStackTrace();
        Log.e("sendFile", path);
        return false;
    }
    return true;
}

I'm also doing the following procedure at the creation of my Remote Service

private void startup() {
    ProviderManager pm = ProviderManager.getInstance();
    // Private Data Storage
    pm.addIQProvider("query", "jabber:iq:private",
        new PrivateDataManager.PrivateDataIQProvider());

    // Time
    try {
        pm.addIQProvider("query", "jabber:iq:time",
            Class.forName("org.jivesoftware.smackx.packet.Time"));
    } catch (ClassNotFoundException e) {
        Log.w("TestClient",
            "Can't load class for org.jivesoftware.smackx.packet.Time");
    }

    // Roster Exchange
    pm.addExtensionProvider("x", "jabber:x:roster",
        new RosterExchangeProvider());

    // Message Events
    pm.addExtensionProvider("x", "jabber:x:event",
        new MessageEventProvider());

    // Chat State
    pm.addExtensionProvider("active",
        "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("composing",
        "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("paused",
        "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("inactive",
        "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("gone",
        "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    // XHTML
    pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
        new XHTMLExtensionProvider());

    // Group Chat Invitations
    pm.addExtensionProvider("x", "jabber:x:conference",
        new GroupChatInvitation.Provider());

    // Service Discovery # Items
    pm.addIQProvider("query", "http://jabber.org/protocol/disco#items",
        new DiscoverItemsProvider());

    // Service Discovery # Info
    pm.addIQProvider("query", "http://jabber.org/protocol/disco#info",
        new DiscoverInfoProvider());

    // Data Forms
    pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());

    // MUC User
    pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user",
        new MUCUserProvider());

    // MUC Admin
    pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin",
        new MUCAdminProvider());

    // MUC Owner
    pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner",
        new MUCOwnerProvider());

    // Delayed Delivery
    pm.addExtensionProvider("x", "jabber:x:delay",
        new DelayInformationProvider());

    // Version
    try {
        pm.addIQProvider("query", "jabber:iq:version",
            Class.forName("org.jivesoftware.smackx.packet.Version"));
    } catch (ClassNotFoundException e) {
        // Not sure what's happening here.
    }

    // VCard
    pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());

    // Offline Message Requests
    pm.addIQProvider("offline", "http://jabber.org/protocol/offline",
        new OfflineMessageRequest.Provider());

    // Offline Message Indicator
    pm.addExtensionProvider("offline",
        "http://jabber.org/protocol/offline",
        new OfflineMessageInfo.Provider());

    // Last Activity
    pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());

    // User Search
    pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());

    // SharedGroupsInfo
    pm.addIQProvider("sharedgroup",
        "http://www.jivesoftware.org/protocol/sharedgroup",
        new SharedGroupsInfo.Provider());

    // JEP-33: Extended Stanza Addressing
    pm.addExtensionProvider("addresses",
        "http://jabber.org/protocol/address",
        new MultipleAddressesProvider());

    // FileTransfer
    pm.addIQProvider("si", "http://jabber.org/protocol/si",
        new StreamInitiationProvider());

    pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
        new BytestreamsProvider());

    pm.addIQProvider("open","http://jabber.org/protocol/ibb",
        new IBBProviders.Open());
    //
    pm.addIQProvider("close","http://jabber.org/protocol/ibb",
        new IBBProviders.Close());
    //
    pm.addExtensionProvider("data","http://jabber.org/protocol/ibb",
        new IBBProviders.Data());

    //
    pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());

    // Privacy
    pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());

    pm.addIQProvider("command", "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider());
    pm.addExtensionProvider("malformed-action",
        "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider.MalformedActionError());
    pm.addExtensionProvider("bad-locale",
        "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider.BadLocaleError());
    pm.addExtensionProvider("bad-payload",
        "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider.BadPayloadError());
    pm.addExtensionProvider("bad-sessionid",
        "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider.BadSessionIDError());
    pm.addExtensionProvider("session-expired",
        "http://jabber.org/protocol/commands",
        new AdHocCommandDataProvider.SessionExpiredError());

    //  Private Data Storage
    pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());

    // Time
    try {
        pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
    } catch (ClassNotFoundException e) {
        Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time");
    }

    //  Roster Exchange
    pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider());

    //  Message Events
    pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider());

    //  Chat State
    pm.addExtensionProvider("active", "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("composing", "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("paused", "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("inactive", "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    pm.addExtensionProvider("gone", "http://jabber.org/protocol/chatstates",
        new ChatStateExtension.Provider());

    //  XHTML
    pm.addExtensionProvider("html", "http://jabber.org/protocol/xhtml-im",
        new XHTMLExtensionProvider());

    //  Group Chat Invitations
    pm.addExtensionProvider("x", "jabber:x:conference", new GroupChatInvitation.Provider());

    //  Service Discovery # Items    
    pm.addIQProvider("query", "http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());

    //  Service Discovery # Info
    pm.addIQProvider("query", "http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());

    //  Data Forms
    pm.addExtensionProvider("x", "jabber:x:data", new DataFormProvider());

    //  MUC User
    pm.addExtensionProvider("x", "http://jabber.org/protocol/muc#user", new MUCUserProvider());

    //  MUC Admin    
    pm.addIQProvider("query", "http://jabber.org/protocol/muc#admin", new MUCAdminProvider());

    //  MUC Owner    
    pm.addIQProvider("query", "http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());

    //  Delayed Delivery
    pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider());

    //  Version
    try {
        pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
    } catch (ClassNotFoundException e) {
        //  Not sure what's happening here.
    }

    //  VCard
    pm.addIQProvider("vCard", "vcard-temp", new VCardProvider());

    //  Offline Message Requests
    pm.addIQProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());

    //  Offline Message Indicator
    pm.addExtensionProvider("offline", "http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());

    //  Last Activity
    pm.addIQProvider("query", "jabber:iq:last", new LastActivity.Provider());

    //  User Search
    pm.addIQProvider("query", "jabber:iq:search", new UserSearch.Provider());

    //  SharedGroupsInfo
    pm.addIQProvider("sharedgroup", "http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());

    //  JEP-33: Extended Stanza Addressing
    pm.addExtensionProvider("addresses", "http://jabber.org/protocol/address", new MultipleAddressesProvider());

    //   FileTransfer
    pm.addIQProvider("si", "http://jabber.org/protocol/si", new StreamInitiationProvider());

    pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams", new BytestreamsProvider());

    pm.addIQProvider("open", "http://jabber.org/protocol/ibb", new IBBProviders.Open());

    pm.addIQProvider("close", "http://jabber.org/protocol/ibb", new IBBProviders.Close());

    pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb", new IBBProviders.Data());

    //  Privacy
    pm.addIQProvider("query", "jabber:iq:privacy", new PrivacyProvider());

    pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider());
    pm.addExtensionProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformedActionError());
    pm.addExtensionProvider("bad-locale", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadLocaleError());
    pm.addExtensionProvider("bad-payload", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadPayloadError());
    pm.addExtensionProvider("bad-sessionid", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadSessionIDError());
    pm.addExtensionProvider("session-expired", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.SessionExpiredError());
}

Now I'll describe my error: from the logging, i receive -1 as "percent" and "Negotiating Stream" as "status". I don't know where I'm wrong and how to start the trasfer. Thanks for any advice or suggestions.

EDIT (2) Now I've partially solved my problem by adding

FileTransferNegotiator.IBB_ONLY = true;

before initializing the FileTransferManager and rearranging the ServiceDiscoveryManager initialization as follows:

ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(this.xmpp);
     if (sdm==null)
         sdm = new ServiceDiscoveryManager(this.xmpp);
     sdm.addFeature("http://jabber.org/protocol/disco#info");
     sdm.addFeature("http://jabber.org/protocol/disco#item");
     sdm.addFeature("jabber:iq:privacy");

I've also added the following Configuration at startup:

SmackConfiguration.setPacketReplyTimeout(15000);

By the way, now I reach a progress value of the same amount of the original file, but the file is not closed on the receiver side. Consequently, the timeout is raised and the transfer is aborted. How can I communicate the finalization of the file? It seems that I transfer the whole file, even if the other client (Pidgin) doesn't handle it. Thanks again in advance.

1
The sendFile method creates a thread to send the file in the background. You may try doing a thread dump to see what that thread is doing. As when it has completed transferring the file it should "close" the stream. On the sending side does the status ever get updated to finished?alexwen
Thanks for the reply: I don't know how many solutions I've tried in this time that I almost gave up... Anyway, I tried to modify the class OutgoingFileTransfer in this way: pastebin.com/m2Wwt7XC I forced the flushing, did the closing, every chunk was sent (I've also tried in an other version to bufferize the sending, in order to check the amount of data transfered...), but a 0 length file was received. So the sending part was finished at last... My problem is that the sending part tells me that has sent all the file, while the receiving is still waiting to receive it.jackb
Ah: my Android applications receives actually a 0 length file.jackb
And again, the new function is sendFile2, at line 214.jackb
You said you were testing with pidgin? Can you set up a test receiver so we can eliminate another unknown from the equation. Other potential options are that the server is not forwarding the IBB packets or pidgin cannot process them properly...alexwen

1 Answers

1
votes
public void send()
{

    configureProviderManager(connection);
    FileTransferNegotiator.IBB_ONLY = true;
    FileTransferNegotiator.setServiceEnabled(connection, true);
    FileTransferManager manager = new FileTransferManager(connection);
    //OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer("[email protected]/Smack");
    String to = connection.getRoster().getPresence("[email protected]").getFrom();
    OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(to);


    File file = new File("/sdcard/DCIM/Camera/1385869353956.jpg");
    try {
        Log.d("file sending",file.getAbsolutePath()+" "+file.getName());
        configureProviderManager(connection);
       transfer.sendFile(file, "test_file");
    } catch (XMPPException e) {
       e.printStackTrace();
    }

    while(!transfer.isDone()) {
        Log.d("status", transfer.getStatus().toString());
        Log.d("percent", new Long(transfer.getBytesSent()).toString());
        if (transfer.getStatus() == Status.error) {
            Log.e("percent", "Error " + new Long(transfer.getBytesSent()).toString() + " " + transfer.getError() + " " + transfer.getException());
            transfer.cancel();

        }

        if(transfer.getStatus().equals(Status.refused))
                 System.out.println("refused  " + transfer.getError());
        else if( transfer.getStatus().equals(Status.error))
             System.out.println(" error " + transfer.getError());
        else if(transfer.getStatus().equals(Status.cancelled))
           System.out.println(" cancelled  " + transfer.getError());
        else
           System.out.println("Success");



    }
}



public void configureProviderManager(XMPPConnection connection) {


    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
    ProviderManager.getInstance().addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());



    ProviderManager.getInstance().addIQProvider("query",
            "http://jabber.org/protocol/bytestreams",
            new BytestreamsProvider());
    ProviderManager.getInstance().addIQProvider("query",
            "http://jabber.org/protocol/disco#items",
            new DiscoverItemsProvider());
    ProviderManager.getInstance().addIQProvider("query",
            "http://jabber.org/protocol/disco#info",
            new DiscoverInfoProvider());

    ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
    if (sdm == null)
        sdm = new ServiceDiscoveryManager(connection);

    sdm.addFeature("http://jabber.org/protocol/disco#info");
    sdm.addFeature("http://jabber.org/protocol/disco#item");
    sdm.addFeature("jabber:iq:privacy");


    ProviderManager pm = ProviderManager.getInstance();

    // The order is the same as in the smack.providers file

    //  Private Data Storage
    pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider());
    //  Time
    try {
        pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time"));
    } catch (ClassNotFoundException e) {
        System.err.println("Can't load class for org.jivesoftware.smackx.packet.Time");
    }

    //  Roster Exchange
    pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider());
    //  Message Events
    pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider());
    //  Chat State
    pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
    pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
    pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
    pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());
    pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider());

    //  XHTML
    pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider());

    //  Group Chat Invitations
    pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider());
    //  Service Discovery # Items
    pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider());
    //  Service Discovery # Info
    pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider());
    //  Data Forms
    pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider());
    //  MUC User
    pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider());
    //  MUC Admin
    pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider());
    //  MUC Owner
    pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider());
    //  Delayed Delivery
    pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider());
    pm.addExtensionProvider("delay", "urn:xmpp:delay", new DelayInformationProvider());
    //  Version
    try {
        pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version"));
    } catch (ClassNotFoundException e) {
        System.err.println("Can't load class for org.jivesoftware.smackx.packet.Version");
    }
    //  VCard
    pm.addIQProvider("vCard","vcard-temp", new VCardProvider());
    //  Offline Message Requests
    pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider());
    //  Offline Message Indicator
    pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider());
    //  Last Activity
    pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider());
    //  User Search
    pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider());
    //  SharedGroupsInfo
    pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider());

    //  JEP-33: Extended Stanza Addressing
    pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider());

    //   FileTransfer
    pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider());
    pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider());
    pm.addIQProvider("open","http://jabber.org/protocol/ibb", new OpenIQProvider());
    pm.addIQProvider("data","http://jabber.org/protocol/ibb", new DataPacketProvider());
    pm.addIQProvider("close","http://jabber.org/protocol/ibb", new CloseIQProvider());
    pm.addExtensionProvider("data","http://jabber.org/protocol/ibb", new DataPacketProvider());

    //  Privacy
    pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider());

    // SHIM
    pm.addExtensionProvider("headers", "http://jabber.org/protocol/shim", new HeadersProvider());
    pm.addExtensionProvider("header", "http://jabber.org/protocol/shim", new HeaderProvider());

    // PubSub
    pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub", new PubSubProvider());
    pm.addExtensionProvider("create", "http://jabber.org/protocol/pubsub", new SimpleNodeProvider());
    pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub", new ItemsProvider());
    pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub", new ItemProvider());
    pm.addExtensionProvider("subscriptions", "http://jabber.org/protocol/pubsub", new SubscriptionsProvider());
    pm.addExtensionProvider("subscription", "http://jabber.org/protocol/pubsub", new SubscriptionProvider());
    pm.addExtensionProvider("affiliations", "http://jabber.org/protocol/pubsub", new AffiliationsProvider());
    pm.addExtensionProvider("affiliation", "http://jabber.org/protocol/pubsub", new AffiliationProvider());
    pm.addExtensionProvider("options", "http://jabber.org/protocol/pubsub", new FormNodeProvider());
    // PubSub owner
    pm.addIQProvider("pubsub", "http://jabber.org/protocol/pubsub#owner", new PubSubProvider());
    pm.addExtensionProvider("configure", "http://jabber.org/protocol/pubsub#owner", new FormNodeProvider());
    pm.addExtensionProvider("default", "http://jabber.org/protocol/pubsub#owner", new FormNodeProvider());
    // PubSub event
    pm.addExtensionProvider("event", "http://jabber.org/protocol/pubsub#event", new EventProvider());
    pm.addExtensionProvider("configuration", "http://jabber.org/protocol/pubsub#event", new ConfigEventProvider());
    pm.addExtensionProvider("delete", "http://jabber.org/protocol/pubsub#event", new SimpleNodeProvider());
    pm.addExtensionProvider("options", "http://jabber.org/protocol/pubsub#event", new FormNodeProvider());
    pm.addExtensionProvider("items", "http://jabber.org/protocol/pubsub#event", new ItemsProvider());
    pm.addExtensionProvider("item", "http://jabber.org/protocol/pubsub#event", new ItemProvider());
    pm.addExtensionProvider("retract", "http://jabber.org/protocol/pubsub#event", new RetractEventProvider());
    pm.addExtensionProvider("purge", "http://jabber.org/protocol/pubsub#event", new SimpleNodeProvider());

    // Nick Exchange
    pm.addExtensionProvider("nick", "http://jabber.org/protocol/nick", new Nick.Provider());

    // Attention
    pm.addExtensionProvider("attention", "urn:xmpp:attention:0", new AttentionExtension.Provider());

    //input
    pm.addIQProvider("si", "http://jabber.org/protocol/si",
            new StreamInitiationProvider());
    pm.addIQProvider("query", "http://jabber.org/protocol/bytestreams",
            new BytestreamsProvider());
    pm.addIQProvider("open", "http://jabber.org/protocol/ibb",
            new OpenIQProvider());
    pm.addIQProvider("close", "http://jabber.org/protocol/ibb",
            new CloseIQProvider());
    pm.addExtensionProvider("data", "http://jabber.org/protocol/ibb",
            new DataPacketProvider());

}