package org.kevoree.library.xmpp.mngr; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.ServiceDiscoveryManager; import org.jivesoftware.smackx.filetransfer.FileTransfer; import org.jivesoftware.smackx.filetransfer.FileTransferManager; import org.jivesoftware.smackx.filetransfer.FileTransferNegotiator; import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer; import org.jivesoftware.smackx.packet.DiscoverInfo; import org.kevoree.library.xmpp.core.XmppKernel; import org.kevoree.library.xmpp.lst.DefaultMessageListener; import org.kevoree.library.xmpp.str.Pending; import org.kevoree.library.xmpp.str.PendingFile; import org.kevoree.library.xmpp.str.PendingMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; import java.util.*; /** * Created with IntelliJ IDEA. * User: gregory.nain * Date: 08/05/12 * Time: 14:46 * To change this template use File | Settings | File Templates. */ public class ChatManager { private XmppKernel kernel; private Map<String, Chat> activeChats = new HashMap<String, Chat>(); private Map<String, List<Pending>> pendings = new HashMap<String, List<Pending>>(); private static final Logger logger = LoggerFactory.getLogger(ChatManager.class); //private DefaultMessageListener defaultListener = new DefaultMessageListener(); public ChatManager(XmppKernel kernel) { this.kernel = kernel; kernel.setChatsManager(this); } public void sendMessage(String message, String to, MessageListener listener) { if(!kernel.getContactsManager().isRecipientInContactsList(to) || !kernel.getContactsManager().isAvailable(to)) { PendingMessage pen = new PendingMessage(); pen.setListener(listener); pen.setMessage(message); pen.setTo(to); if(!pendings.containsKey(to)) { pendings.put(to,new ArrayList<Pending>()); } pendings.get(to).add(pen); if(!kernel.getContactsManager().isRecipientInContactsList(to)) { kernel.getContactsManager().addRecipient(to); } } else { try { if (!activeChats.containsKey(to)) { activeChats.put(to, kernel.getXmppConnection().getChatManager().createChat(to, listener)); } activeChats.get(to).sendMessage(message); } catch (XMPPException e) { e.printStackTrace(); } } } public void processPendings(String to) { if(pendings.containsKey(to)) { List<Pending> awaitingMessages = pendings.get(to); for(Pending p : awaitingMessages) { if(p instanceof PendingMessage) { PendingMessage msg = (PendingMessage)p; sendMessage(msg.getMessage(), msg.getTo(), msg.getListener()); } else if(p instanceof PendingFile) { PendingFile msg = (PendingFile)p; sendFile(msg.getFile(), msg.getDescription(), msg.getTo()); } else { logger.warn("Pending message type UNKNOWN: " + p.getClass().getName()); } } } else { logger.debug("no pending messages for: " + to); } } public void sendFile(File f, String description, String to) { if(!kernel.getContactsManager().isRecipientInContactsList(to) || !kernel.getContactsManager().isAvailable(to)) { PendingFile pen = new PendingFile(); pen.setTo(to); pen.setFile(f); pen.setDescription(description); if(!pendings.containsKey(to)) { pendings.put(to,new ArrayList<Pending>()); } pendings.get(to).add(pen); if(!kernel.getContactsManager().isRecipientInContactsList(to)) { kernel.getContactsManager().addRecipient(to); } } else { try { ServiceDiscoveryManager sdm = new ServiceDiscoveryManager(kernel.getXmppConnection()); Iterator<String> it = sdm.getFeatures(); while(it.hasNext()) { String feature = it.next(); System.out.println("Feature:" + feature); } FileTransferNegotiator.setServiceEnabled(kernel.getXmppConnection(), true); // Create the file transfer manager FileTransferManager manager = new FileTransferManager(kernel.getXmppConnection()); // Create the outgoing file transfer final OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(to); // Send the file transfer.sendFile(f,description); //final OutputStream os = transfer.sendFile(f.getName(), f.getTotalSpace(), description); //final FileInputStream fis = new FileInputStream(f); new Thread(new Runnable(){ public void run() { try { while(true) { System.out.println("testing transfer status"); if(transfer.getStatus() == FileTransfer.Status.error) { System.out.println("ERROR!!! " + transfer.getError()); } else { System.out.println("Getting transfer status"); System.out.println(transfer.getStatus()); System.out.println(transfer.getProgress()); /* byte[] buffer = new byte[1024]; fis.read(buffer); os.write(buffer); */ } System.out.println("preparing for sleeping"); Thread.sleep(1000); System.out.println("WakeUp"); System.out.println("Status:" + transfer.getStatus()); System.out.println("Progress:" + transfer.getProgress() + "("+transfer.getBytesSent()+")"); System.out.println("Exp:" + transfer.getException()); System.out.println("Error:" + transfer.getError()); System.out.println("Transfer done ?:" + transfer.isDone()); } } catch (InterruptedException e) { System.out.println("Interrupted"); e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } }).start(); } catch (XMPPException e) { e.printStackTrace(); } } } }