Openfire smack file transfer

Hi,

I am not able to tranfer file using smack3.2.1 client from Android. Please help I am struck here.

Here is the code that I am using :

FileTransfer.java code

package com.testchat;

import java.io.File;

import org.jivesoftware.smack.XMPPConnection;

import org.jivesoftware.smack.XMPPException;

import org.jivesoftware.smack.provider.PrivacyProvider;

import org.jivesoftware.smack.provider.ProviderManager;

import org.jivesoftware.smackx.GroupChatInvitation;

import org.jivesoftware.smackx.PrivateDataManager;

import org.jivesoftware.smackx.ServiceDiscoveryManager;

import org.jivesoftware.smackx.bytestreams.socks5.provider.BytestreamsProvider;

import org.jivesoftware.smackx.filetransfer.FileTransfer.Status;

import org.jivesoftware.smackx.filetransfer.FileTransferListener;

import org.jivesoftware.smackx.filetransfer.FileTransferManager;

import org.jivesoftware.smackx.filetransfer.FileTransferNegotiator;

import org.jivesoftware.smackx.filetransfer.FileTransferRequest;

import org.jivesoftware.smackx.filetransfer.IncomingFileTransfer;

import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer;

import org.jivesoftware.smackx.packet.ChatStateExtension;

import org.jivesoftware.smackx.packet.LastActivity;

import org.jivesoftware.smackx.packet.OfflineMessageInfo;

import org.jivesoftware.smackx.packet.OfflineMessageRequest;

import org.jivesoftware.smackx.packet.SharedGroupsInfo;

import org.jivesoftware.smackx.provider.AdHocCommandDataProvider;

import org.jivesoftware.smackx.provider.DataFormProvider;

import org.jivesoftware.smackx.provider.DelayInformationProvider;

import org.jivesoftware.smackx.provider.DiscoverInfoProvider;

import org.jivesoftware.smackx.provider.DiscoverItemsProvider;

import org.jivesoftware.smackx.provider.MUCAdminProvider;

import org.jivesoftware.smackx.provider.MUCOwnerProvider;

import org.jivesoftware.smackx.provider.MUCUserProvider;

import org.jivesoftware.smackx.provider.MessageEventProvider;

import org.jivesoftware.smackx.provider.MultipleAddressesProvider;

import org.jivesoftware.smackx.provider.RosterExchangeProvider;

import org.jivesoftware.smackx.provider.StreamInitiationProvider;

import org.jivesoftware.smackx.provider.VCardProvider;

import org.jivesoftware.smackx.provider.XHTMLExtensionProvider;

import org.jivesoftware.smackx.search.UserSearch;

import android.util.Log;

public class FileTransfer {

/*public void configure(ProviderManager pm){

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) {

StackTraceElement(e);

//Log.w(Tools.LOG_TAG, “Can’t load class for org.jivesoftware.smackx.packet.Time”);

}

// XHTML

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

// 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](http://jabber.org/protocol/chatstates)", new ChatStateExtension.Provider());

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

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

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

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

// FileTransfer

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

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

    pm.addIQProvider("open","[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new OpenIQProvider());

    pm.addIQProvider("close","[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new CloseIQProvider());

    pm.addExtensionProvider("data","[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new DataPacketProvider());

// Group Chat Invitations

pm.addExtensionProvider(“x”,“jabber:x:conference”, new GroupChatInvitation.Provider());

// Service Discovery # Items

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

// Service Discovery # Info

    pm.addIQProvider("query","[http://jabber.org/protocol/disco#info](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](http://jabber.org/protocol/muc#user)", new MUCUserProvider());

// MUC Admin

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

// MUC Owner

    pm.addIQProvider("query","[http://jabber.org/protocol/muc#owner](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) {

//Log.w(Tools.LOG_TAG, “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](http://jabber.org/protocol/offline)", new OfflineMessageRequest.Provider());

// Offline Message Indicator

    pm.addExtensionProvider("offline","[http://jabber.org/protocol/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](http://www.jivesoftware.org/protocol/sharedgroup)", new SharedGroupsInfo.Provider());

// JEP-33: Extended Stanza Addressing

    pm.addExtensionProvider("addresses","[http://jabber.org/protocol/address](http://jabber.org/protocol/address)", new MultipleAddressesProvider());

}

private void StackTraceElement(ClassNotFoundException e) {

// TODO Auto-generated method stub

}*/

public void configure(ProviderManager pm) {

// 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](http://jabber.org/protocol/chatstates)",

new ChatStateExtension.Provider());

pm.addExtensionProvider(“composing”,

"[http://jabber.org/protocol/chatstates](http://jabber.org/protocol/chatstates)",

new ChatStateExtension.Provider());

pm.addExtensionProvider(“paused”,

"[http://jabber.org/protocol/chatstates](http://jabber.org/protocol/chatstates)",

new ChatStateExtension.Provider());

pm.addExtensionProvider(“inactive”,

"[http://jabber.org/protocol/chatstates](http://jabber.org/protocol/chatstates)",

new ChatStateExtension.Provider());

pm.addExtensionProvider(“gone”,

"[http://jabber.org/protocol/chatstates](http://jabber.org/protocol/chatstates)",

new ChatStateExtension.Provider());

// XHTML

pm.addExtensionProvider("html", "[http://jabber.org/protocol/xhtml-im](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](http://jabber.org/protocol/disco#items)",

new DiscoverItemsProvider());

// Service Discovery # Info

pm.addIQProvider("query", "[http://jabber.org/protocol/disco#info](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](http://jabber.org/protocol/muc#user)",

new MUCUserProvider());

// MUC Admin

pm.addIQProvider("query", "[http://jabber.org/protocol/muc#admin](http://jabber.org/protocol/muc#admin)",

new MUCAdminProvider());

// MUC Owner

pm.addIQProvider("query", "[http://jabber.org/protocol/muc#owner](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](http://jabber.org/protocol/offline)",

new OfflineMessageRequest.Provider());

// Offline Message Indicator

pm.addExtensionProvider(“offline”,

"[http://jabber.org/protocol/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](http://www.jivesoftware.org/protocol/sharedgroup)",

new SharedGroupsInfo.Provider());

// JEP-33: Extended Stanza Addressing

pm.addExtensionProvider(“addresses”,

"[http://jabber.org/protocol/address](http://jabber.org/protocol/address)",

new MultipleAddressesProvider());

// FileTransfer

pm.addIQProvider("si", "[http://jabber.org/protocol/si](http://jabber.org/protocol/si)",

new StreamInitiationProvider());

pm.addIQProvider("query", "[http://jabber.org/protocol/bytestreams](http://jabber.org/protocol/bytestreams)",

new BytestreamsProvider());

// pm.addIQProvider("open","[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new

// IBBProviders.Open());

//

// pm.addIQProvider("close","[http://jabber.org/protocol/ibb](http://jabber.org/protocol/ibb)", new

// IBBProviders.Close());

//

// pm.addExtensionProvider("data","[http://jabber.org/protocol/ibb](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](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider());

pm.addExtensionProvider(“malformed-action”,

    "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider.MalformedActionError());

pm.addExtensionProvider(“bad-locale”,

    "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider.BadLocaleError());

pm.addExtensionProvider(“bad-payload”,

    "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider.BadPayloadError());

pm.addExtensionProvider(“bad-sessionid”,

    "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider.BadSessionIDError());

pm.addExtensionProvider(“session-expired”,

    "[http://jabber.org/protocol/commands](http://jabber.org/protocol/commands)",

new AdHocCommandDataProvider.SessionExpiredError());

}

public void SendFile(final String Receiver, final String Directory,

final XMPPConnection connection) {

Thread thread = new Thread() {

public void run() {

ServiceDiscoveryManager sdm = ServiceDiscoveryManager

.getInstanceFor(connection);

if (sdm == null)

sdm = new ServiceDiscoveryManager(connection);

    sdm.addFeature("[http://jabber.org/protocol/disco#info](http://jabber.org/protocol/disco#info)");

sdm.addFeature(“jabber:iq:privacy”);

// Create the file transfer manager

FileTransferManager manager = new FileTransferManager(

connection);

FileTransferNegotiator.setServiceEnabled(connection, true);

// Create the outgoing file transfer

OutgoingFileTransfer transfer = manager

.createOutgoingFileTransfer(Receiver + "@domain.com"

  • “/Smack”);

Log.i(“transfere file”, “outgoingfiletransfere is created”);

try {

OutgoingFileTransfer.setResponseTimeout(30000);

transfer.sendFile(new File(Directory), “Description”);

Log.i(“transfere file”, “sending file”);

while (!transfer.isDone()) {

try {

Thread.sleep(1000);

Log.i(“transfere file”, "sending file status "

  • transfer.getStatus() + "progress: "

  • transfer.getProgress());

if (transfer.getStatus() == Status.error) {

transfer.cancel();

break;

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

} catch (XMPPException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Log.i(“transfere file”, “sending file done”);

}

};

thread.start();

}

public void ReceiveFile() {

Thread thread = new Thread() {

public void run(XMPPConnection connection) {

ServiceDiscoveryManager sdm = ServiceDiscoveryManager

.getInstanceFor(connection);

if (sdm == null)

sdm = new ServiceDiscoveryManager(connection);

    sdm.addFeature("[http://jabber.org/protocol/disco#info](http://jabber.org/protocol/disco#info)");

sdm.addFeature(“jabber:iq:privacy”);

// Create the file transfer manager

final FileTransferManager managerListner = new FileTransferManager(

connection);

FileTransferNegotiator.setServiceEnabled(connection, true);

Log.i(“File transfere manager”, “created”);

// Create the listener

managerListner

.addFileTransferListener(new FileTransferListener() {

public void fileTransferRequest(

final FileTransferRequest request) {

Log.i(“Recieve File”,

“new file transfere request new file transfere request new file transfere request”);

Log.i(“file request”,

“from” + request.getRequestor());

IncomingFileTransfer transfer = request

.accept();

Log.i(“Recieve File alert dialog”, “accepted”);

try {

transfer.recieveFile(new File("/sdcard/"

  • request.getFileName()));

while (!transfer.isDone()

|| (transfer.getProgress() < 1)) {

Thread.sleep(1000);

Log.i(“Recieve File alert dialog”,

"still receiving : "

  • (transfer

.getProgress())

  • " status "

  • transfer.getStatus());

if (transfer.getStatus().equals(

Status.error)) {

Log.i(“Recieve File alert dialog”,

"cancelling still receiving : "

  • (transfer

.getProgress())

  • " status "

  • transfer

.getStatus());

transfer.cancel();

break;

}

}

} catch (XMPPException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

};

thread.start();

}

}

Android Code:

package com.testchat;

import org.jivesoftware.smack.ConnectionConfiguration;

import org.jivesoftware.smack.XMPPConnection;

import org.jivesoftware.smack.XMPPException;

import org.jivesoftware.smack.packet.Presence;

import org.jivesoftware.smack.provider.ProviderManager;

import android.app.Dialog;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

/**

  • Gather the xmpp settings and create an XMPPConnection

*/

public class SettingsDialog extends Dialog implements

android.view.View.OnClickListener {

private XMPPClient xmppClient;

private XMPPConnection connection;

private FileTransfer fileTransfer;

public SettingsDialog(XMPPClient xmppClient) {

super(xmppClient);

this.xmppClient = xmppClient;

}

protected void onStart() {

super.onStart();

setContentView(R.layout.settings);

getWindow().setFlags(4, 4);

setTitle(“XMPP Settings”);

Button ok = (Button) findViewById(R.id.ok);

EditText hostEditText = (EditText) findViewById(R.id.host);

// hostEditText.setText(“talk.google.com”);

hostEditText.setText(“192.168.1.14”);

EditText portText = (EditText) findViewById(R.id.port);

// portText.setText(“5222”);

portText.setText(“5222”);

EditText serviceText = (EditText) findViewById(R.id.service);

// serviceText.setText(“gmail.com”);

serviceText.setText(“192.168.1.14”);

EditText usernameText = (EditText) findViewById(R.id.userid);

// usernameText.setText("vakn.app@gmail.com");

usernameText.setText(“admin”);

EditText passwordText = (EditText) findViewById(R.id.password);

// passwordText.setText(“y13029264”);

passwordText.setText(“admin”);

ok.setOnClickListener(this);

}

public void onClick(View v) {

String host = getText(R.id.host);

String port = getText(R.id.port);

String service = getText(R.id.service);

String username = getText(R.id.userid);

String password = getText(R.id.password);

// Create a connection

ConnectionConfiguration connConfig = new ConnectionConfiguration(host, Integer.parseInt(port), service);

connConfig.setReconnectionAllowed(true);

connConfig.setSASLAuthenticationEnabled(false);

// connConfig.setDebuggerEnabled(true);

ProviderManager pm = ProviderManager.getInstance();

fileTransfer.configure(pm);

XMPPConnection connection = new XMPPConnection(connConfig);

try {

connection.connect();

Log.i(“XMPPClient”,

"[SettingsDialog] Connected to " + connection.getHost());

} catch (XMPPException ex) {

Log.e(“XMPPClient”, "[SettingsDialog] Failed to connect to "

  • connection.getHost());

Log.e(“XMPPClient”, ex.toString());

xmppClient.setConnection(null);

}

try {

connection.login(username, password);

Log.i(“XMPPClient”, "Logged in as " + connection.getUser());

// Set the status to available

Presence presence = new Presence(Presence.Type.available);

connection.sendPacket(presence);

xmppClient.setConnection(connection);

} catch (XMPPException ex) {

Log.e(“XMPPClient”, "[SettingsDialog] Failed to log in as "

  • username);

Log.e(“XMPPClient”, ex.toString());

xmppClient.setConnection(null);

}

dismiss();

}

private String getText(int id) {

EditText widget = (EditText) this.findViewById(id);

return widget.getText().toString();

}

}

Regards,

Vikash

That’s not related to Openfire. Moved it to Smack Developers. Maybe someone can help here

It would be helpful to say what is actually going wrong. You have lots of sys out messages printed but you have not indicated where things are “not working”.

You should also try your FileTransfer class outside of Android to see if it works there first, just to eliminate another variable from the equation. It would also enable you to run it with the Smack debug console so you can gather more information.

Hi Rcollier,

The very first thing I am new to Java. The Code I have posted above I have moved it inside the Android and It is a bit in progress. But the problem is I am not able to call figure out when should I call the ReceiveFile method.

Can you please tell me when should I call the Receive file from the Send File because I am getting an error request was not responded.

Thanks,

Vikash

Not sure what you mean, you don’t call the ReceiveFile from the SendFile, it is run on a different vm. The ReceiveFile will have to be called on the receiver before the send is called on the sender since it sets up the listener, which has to be in place before the sender sends the file transfer request.

Hi Rcollier,

Do you have any android openfire filetransfer working demo app?

Regards,

Vikash