aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/protocol
diff options
context:
space:
mode:
authorDamian Minkov <damencho@jitsi.org>2009-07-13 12:42:15 +0000
committerDamian Minkov <damencho@jitsi.org>2009-07-13 12:42:15 +0000
commit0ebdce1c3672f4aadaec715095b97d24ee0ae41b (patch)
tree60988e2ae93a9b6ec492eb0d29faf82fdf08fc24 /src/net/java/sip/communicator/impl/protocol
parent431d5a850d5b36d48cdec2e5e5f937b2eb2b93d3 (diff)
downloadjitsi-0ebdce1c3672f4aadaec715095b97d24ee0ae41b.zip
jitsi-0ebdce1c3672f4aadaec715095b97d24ee0ae41b.tar.gz
jitsi-0ebdce1c3672f4aadaec715095b97d24ee0ae41b.tar.bz2
Add filetransfer for yahoo and generic filetransfer tests - enabled for jabber and yahoo.
Diffstat (limited to 'src/net/java/sip/communicator/impl/protocol')
-rw-r--r--src/net/java/sip/communicator/impl/protocol/yahoo/FileTransferImpl.java104
-rw-r--r--src/net/java/sip/communicator/impl/protocol/yahoo/IncomingFileTransferRequestYahooImpl.java176
-rw-r--r--src/net/java/sip/communicator/impl/protocol/yahoo/OperationSetFileTransferYahooImpl.java407
-rw-r--r--src/net/java/sip/communicator/impl/protocol/yahoo/ProtocolProviderServiceYahooImpl.java6
4 files changed, 693 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/yahoo/FileTransferImpl.java b/src/net/java/sip/communicator/impl/protocol/yahoo/FileTransferImpl.java
new file mode 100644
index 0000000..0f3f2d9
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/protocol/yahoo/FileTransferImpl.java
@@ -0,0 +1,104 @@
+/*
+ * 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.impl.protocol.yahoo;
+
+import java.io.*;
+
+import net.java.sip.communicator.service.protocol.*;
+
+/**
+ * The Filetransfer imeplementation for yahoo.
+ * @author Damian Minkov
+ */
+public class FileTransferImpl
+ extends AbstractFileTransfer
+
+{
+ private ProtocolProviderServiceYahooImpl yahooProvider;
+ private String id = null;
+ private Contact contact = null;
+ private File file = null;
+ private int direction = -1;
+ private long transferedBytes;
+
+ public FileTransferImpl(ProtocolProviderServiceYahooImpl yahooProvider,
+ String id, Contact contact, File file, int direction)
+ {
+ this.yahooProvider = yahooProvider;
+ this.id = id;
+ this.contact = contact;
+ this.file = file;
+ this.direction = direction;
+ }
+
+ /**
+ * Cancels this file transfer. When this method is called transfer should
+ * be interrupted.
+ */
+ public void cancel()
+ {
+ yahooProvider.getYahooSession().cancelRunningFileTransfer(id);
+ }
+
+ /**
+ * Returns the number of bytes already transfered through this file transfer.
+ *
+ * @return the number of bytes already transfered through this file transfer
+ */
+ public long getTransferedBytes()
+ {
+ return transferedBytes;
+ }
+
+ /**
+ * Uniquie ID that is identifying the FileTransfer
+ * if the request has been accepted.
+ *
+ * @return the id.
+ */
+ public String getID()
+ {
+ return id;
+ }
+
+ /**
+ * The file transfer direction.
+ * @return returns the direction of the file transfer : IN or OUT.
+ */
+ public int getDirection()
+ {
+ return direction;
+ }
+
+ /**
+ * Returns the file that is transfered.
+ *
+ * @return the file
+ */
+ public File getFile()
+ {
+ return file;
+ }
+
+ /**
+ * Returns the contact that we are transfering files with.
+ * @return the contact.
+ */
+ public Contact getContact()
+ {
+ return contact;
+ }
+
+ /**
+ * @param transferedBytes the transferedBytes to set
+ */
+ public void setTransferedBytes(long transferedBytes)
+ {
+ this.transferedBytes = transferedBytes;
+ }
+
+}
diff --git a/src/net/java/sip/communicator/impl/protocol/yahoo/IncomingFileTransferRequestYahooImpl.java b/src/net/java/sip/communicator/impl/protocol/yahoo/IncomingFileTransferRequestYahooImpl.java
new file mode 100644
index 0000000..883129a
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/protocol/yahoo/IncomingFileTransferRequestYahooImpl.java
@@ -0,0 +1,176 @@
+/*
+ * 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.impl.protocol.yahoo;
+
+import java.util.*;
+import java.io.*;
+
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.service.protocol.event.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ * implementation of the incoming file transfer request
+ * @author Damian Minkov
+ */
+public class IncomingFileTransferRequestYahooImpl
+ implements IncomingFileTransferRequest
+{
+ /**
+ * The logger for this class.
+ */
+ private static final Logger logger =
+ Logger.getLogger(IncomingFileTransferRequestYahooImpl.class);
+
+ private String id;
+
+ /**
+ * The yahoo provider.
+ */
+ private ProtocolProviderServiceYahooImpl yahooProvider;
+
+ private final OperationSetFileTransferYahooImpl fileTransferOpSet;
+
+ private Contact sender;
+
+ private Date date;
+
+ private String fileName;
+
+ private long fileSize;
+
+ public IncomingFileTransferRequestYahooImpl(
+ ProtocolProviderServiceYahooImpl yahooProvider,
+ OperationSetFileTransferYahooImpl fileTransferOpSet,
+ Contact sender,
+ Date date,
+ String fileName,
+ String fileSize,
+ String id)
+ {
+ this.yahooProvider = yahooProvider;
+ this.fileTransferOpSet = fileTransferOpSet;
+ this.sender = sender;
+ this.date = date;
+ this.fileName = fileName;
+
+ try
+ {
+ this.fileSize = Long.valueOf(fileSize);
+ }
+ catch (NumberFormatException e)
+ {}
+
+ this.id = id;
+ }
+
+
+
+ /**
+ * Uniquie ID that is identifying the request and then the FileTransfer
+ * if the request has been accepted.
+ *
+ * @return the id.
+ */
+ public String getID()
+ {
+ return id;
+ }
+
+ /**
+ * Returns a String that represents the name of the file that is being
+ * received.
+ * If there is no name, returns null.
+ * @return a String that represents the name of the file
+ */
+ public String getFileName()
+ {
+ return fileName;
+ }
+
+ /**
+ * Returns a String that represents the description of the file that is
+ * being received.
+ * If there is no description available, returns null.
+ *
+ * @return a String that represents the description of the file
+ */
+ public String getFileDescription()
+ {
+ return "";
+ }
+
+ /**
+ * Returns a long that represents the size of the file that is being
+ * received.
+ * If there is no file size available, returns null.
+ *
+ * @return a long that represents the size of the file
+ */
+ public long getFileSize()
+ {
+ return fileSize;
+ }
+
+ /**
+ * Returns a String that represents the name of the sender of the file
+ * being received.
+ * If there is no sender name available, returns null.
+ *
+ * @return a String that represents the name of the sender
+ */
+ public Contact getSender()
+ {
+ return sender;
+ }
+
+ /**
+ * Function called to accept and receive the file.
+ *
+ * @param file the file to accept
+ * @return the <tt>FileTransfer</tt> object managing the transfer
+ */
+ public FileTransfer acceptFile(File file)
+ {
+ AbstractFileTransfer incomingTransfer = null;
+
+ incomingTransfer =
+ new FileTransferImpl(yahooProvider,
+ id, sender, file, FileTransfer.IN);
+
+ yahooProvider.getYahooSession().fileTransferAccept(id, file);
+
+ FileTransferCreatedEvent event
+ = new FileTransferCreatedEvent(incomingTransfer, new Date());
+
+ fileTransferOpSet.fireFileTransferCreated(event);
+
+ incomingTransfer.fireStatusChangeEvent(
+ FileTransferStatusChangeEvent.PREPARING);
+
+ return incomingTransfer;
+ }
+
+ /**
+ * Function called to refuse the file.
+ */
+ public void rejectFile()
+ {
+ yahooProvider.getYahooSession().fileTransferReject(id);
+
+ fileTransferOpSet.fireFileTransferRequestRejected(
+ new FileTransferRequestEvent(this, this.getDate()));
+ }
+
+ /**
+ * @return the date
+ */
+ public Date getDate()
+ {
+ return date;
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/protocol/yahoo/OperationSetFileTransferYahooImpl.java b/src/net/java/sip/communicator/impl/protocol/yahoo/OperationSetFileTransferYahooImpl.java
new file mode 100644
index 0000000..f213951
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/protocol/yahoo/OperationSetFileTransferYahooImpl.java
@@ -0,0 +1,407 @@
+/*
+ * 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.impl.protocol.yahoo;
+
+import java.io.*;
+import java.util.*;
+
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.service.protocol.event.*;
+import net.java.sip.communicator.util.*;
+
+import ymsg.network.event.*;
+
+/**
+ * The Yahoo protocol filetransfer OperationSet.
+ *
+ * @author Damian Minkov
+ */
+public class OperationSetFileTransferYahooImpl
+ implements OperationSetFileTransfer,
+ SessionFileTransferListener
+{
+ /**
+ * The logger for this class.
+ */
+ private static final Logger logger =
+ Logger.getLogger(OperationSetFileTransferYahooImpl.class);
+
+ /**
+ * The provider that created us.
+ */
+ private final ProtocolProviderServiceYahooImpl yahooProvider;
+
+ /**
+ * A list of listeners registered for file transfer events.
+ */
+ private ArrayList<FileTransferListener> fileTransferListeners
+ = new ArrayList<FileTransferListener>();
+
+ /**
+ * A list of active fileTransfers.
+ */
+ private Hashtable<String, Object> activeFileTransfers
+ = new Hashtable<String, Object>();
+
+ /**
+ * Constructor
+ * @param provider is the provider that created us
+ */
+ public OperationSetFileTransferYahooImpl(
+ ProtocolProviderServiceYahooImpl provider)
+ {
+ this.yahooProvider = provider;
+
+ provider.addRegistrationStateChangeListener(
+ new RegistrationStateListener());
+ }
+
+ /**
+ * Sends a file transfer request to the given <tt>toContact</tt> by
+ * specifying the local and remote file path and the <tt>fromContact</tt>,
+ * sending the file.
+ *
+ * @param toContact the contact that should receive the file
+ * @param file the file to send
+ *
+ * @return the transfer object
+ *
+ * @throws IllegalStateException if the protocol provider is not registered
+ * or connected
+ * @throws IllegalArgumentException if some of the arguments doesn't fit the
+ * protocol requirements
+ */
+ public FileTransfer sendFile( Contact toContact,
+ File file)
+ throws IllegalStateException,
+ IllegalArgumentException
+ {
+ try
+ {
+ assertConnected();
+
+ ArrayList<String> filesToSend = new ArrayList<String>();
+ filesToSend.add(file.getCanonicalPath());
+ Date sentDate = new Date();
+ String id = yahooProvider.getYahooSession().sendFiles(
+ filesToSend, toContact.getAddress());
+
+ FileTransferImpl ft =
+ new FileTransferImpl(yahooProvider,
+ id, toContact, file, FileTransfer.OUT);
+
+ // Notify all interested listeners that a file transfer has been
+ // created.
+ FileTransferCreatedEvent event
+ = new FileTransferCreatedEvent(ft, sentDate);
+
+ fireFileTransferCreated(event);
+
+ ft.fireStatusChangeEvent(FileTransferStatusChangeEvent.PREPARING);
+
+ return ft;
+ }
+ catch(IOException e)
+ {
+ logger.error("Cannot send fileTransfer", e);
+ return null;
+ }
+ }
+
+ /**
+ * Sends a file transfer request to the given <tt>toContact</tt> by
+ * specifying the local and remote file path and the <tt>fromContact</tt>,
+ * sending the file.
+ *
+ * @param toContact the contact that should receive the file
+ * @param fromContact the contact sending the file
+ * @param remotePath the remote file path
+ * @param localPath the local file path
+ *
+ * @return the transfer object
+ *
+ * @throws IllegalStateException if the protocol provider is not registered
+ * or connected
+ * @throws IllegalArgumentException if some of the arguments doesn't fit the
+ * protocol requirements
+ */
+ public FileTransfer sendFile( Contact toContact,
+ Contact fromContact,
+ String remotePath,
+ String localPath)
+ throws IllegalStateException,
+ IllegalArgumentException
+ {
+ return this.sendFile(toContact, new File(localPath));
+ }
+
+ /**
+ * Adds the given <tt>FileTransferListener</tt> that would listen for
+ * file transfer requests and created file transfers.
+ *
+ * @param listener the <tt>FileTransferListener</tt> to add
+ */
+ public void addFileTransferListener(
+ FileTransferListener listener)
+ {
+ synchronized(fileTransferListeners)
+ {
+ if(!fileTransferListeners.contains(listener))
+ {
+ this.fileTransferListeners.add(listener);
+ }
+ }
+ }
+
+ /**
+ * Removes the given <tt>FileTransferListener</tt> that listens for
+ * file transfer requests and created file transfers.
+ *
+ * @param listener the <tt>FileTransferListener</tt> to remove
+ */
+ public void removeFileTransferListener(
+ FileTransferListener listener)
+ {
+ synchronized(fileTransferListeners)
+ {
+ this.fileTransferListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Utility method throwing an exception if the stack is not properly
+ * initialized.
+ * @throws java.lang.IllegalStateException if the underlying stack is
+ * not registered and initialized.
+ */
+ private void assertConnected()
+ throws IllegalStateException
+ {
+ if (yahooProvider == null)
+ throw new IllegalStateException(
+ "The provider must be non-null and signed on the "
+ +"service before being able to send a file.");
+ else if (!yahooProvider.isRegistered())
+ throw new IllegalStateException(
+ "The provider must be signed on the service before "
+ +"being able to send a file.");
+ }
+
+ /**
+ * Delivers the file transfer to all registered listeners.
+ *
+ * @param fileTransfer the <tt>FileTransfer</tt> that we'd like delivered to
+ * all registered file transfer listeners.
+ */
+ void fireFileTransferCreated(FileTransferCreatedEvent event)
+ {
+ activeFileTransfers.put(
+ event.getFileTransfer().getID(), event.getFileTransfer());
+
+ Iterator<FileTransferListener> listeners = null;
+ synchronized (fileTransferListeners)
+ {
+ listeners = new ArrayList<FileTransferListener>
+ (fileTransferListeners).iterator();
+ }
+
+ while (listeners.hasNext())
+ {
+ FileTransferListener listener = listeners.next();
+ listener.fileTransferCreated(event);
+ }
+ }
+
+ /**
+ * Delivers the specified event to all registered file transfer listeners.
+ *
+ * @param event the <tt>EventObject</tt> that we'd like delivered to all
+ * registered file transfer listeners.
+ */
+ void fireFileTransferRequestRejected(FileTransferRequestEvent event)
+ {
+ Iterator<FileTransferListener> listeners = null;
+ synchronized (fileTransferListeners)
+ {
+ listeners = new ArrayList<FileTransferListener>
+ (fileTransferListeners).iterator();
+ }
+
+ while (listeners.hasNext())
+ {
+ FileTransferListener listener = listeners.next();
+
+ listener.fileTransferRequestRejected(event);
+ }
+ }
+
+ /**
+ * Delivers the specified event to all registered file transfer listeners.
+ *
+ * @param event the <tt>EventObject</tt> that we'd like delivered to all
+ * registered file transfer listeners.
+ */
+ private void fireFileTransferRequest(FileTransferRequestEvent event)
+ {
+ Iterator<FileTransferListener> listeners = null;
+ synchronized (fileTransferListeners)
+ {
+ listeners = new ArrayList<FileTransferListener>
+ (fileTransferListeners).iterator();
+ }
+
+ while (listeners.hasNext())
+ {
+ FileTransferListener listener = listeners.next();
+
+ listener.fileTransferRequestReceived(event);
+ }
+ }
+
+ private int getStateMapping(int s)
+ {
+ switch(s)
+ {
+ case SessionFileTransferEvent.REFUSED :
+ return FileTransferStatusChangeEvent.REFUSED;
+ case SessionFileTransferEvent.CANCEL :
+ return FileTransferStatusChangeEvent.CANCELED;
+ case SessionFileTransferEvent.FAILED :
+ return FileTransferStatusChangeEvent.FAILED;
+ case SessionFileTransferEvent.IN_PROGRESS :
+ return FileTransferStatusChangeEvent.IN_PROGRESS;
+ case SessionFileTransferEvent.RECEIVED :
+ return FileTransferStatusChangeEvent.COMPLETED;
+ case SessionFileTransferEvent.SENT :
+ return FileTransferStatusChangeEvent.COMPLETED;
+ default: return FileTransferStatusChangeEvent.WAITING;
+ }
+ }
+
+ /**
+ * Starting point for incoming filetransfer.
+ * @param ev
+ */
+ public void fileTransferRequestReceived(SessionFileTransferEvent ev)
+ {
+ OperationSetPersistentPresenceYahooImpl opSetPersPresence
+ = (OperationSetPersistentPresenceYahooImpl)
+ yahooProvider.getOperationSet(
+ OperationSetPersistentPresence.class);
+
+ Contact sender = opSetPersPresence.findContactByID(ev.getFrom());
+
+ if(sender == null)
+ return;
+
+ Date recvDate = new Date();
+
+ for(int i = 0; i < ev.getFileNames().size(); i++)
+ {
+ String fileName = ev.getFileNames().get(i);
+ String fileSize = ev.getFileSizes().get(i);
+
+ IncomingFileTransferRequest req =
+ new IncomingFileTransferRequestYahooImpl(
+ yahooProvider, this, sender, recvDate,
+ fileName, fileSize,
+ ev.getId());
+
+ activeFileTransfers.put(ev.getId(), req);
+ fireFileTransferRequest(
+ new FileTransferRequestEvent(req, recvDate));
+
+ }
+ }
+
+ /**
+ * Status changed for filetransfer.
+ * @param ev
+ */
+ public void statusChanged(SessionFileTransferEvent ev)
+ {
+ if(ev.getId() == null)
+ return;
+
+ Object ftObj = activeFileTransfers.get(ev.getId());
+
+ if(ftObj == null)
+ {
+ logger.warn("File Transfer or request not found. " + ev.getId() + "/ " + ev.getState());
+ return;
+ }
+
+ int newState = ev.getState();
+
+ if(ftObj instanceof IncomingFileTransferRequest)
+ {
+ if(newState == SessionFileTransferEvent.REFUSED)
+ {
+ IncomingFileTransferRequestYahooImpl req =
+ (IncomingFileTransferRequestYahooImpl)ftObj;
+ fireFileTransferRequestRejected(
+ new FileTransferRequestEvent(req, req.getDate()));
+ return;
+ }
+ }
+
+ if(!(ftObj instanceof FileTransferImpl))
+ {
+ logger.warn("File Transfer not found." + ftObj);
+ return;
+ }
+
+ FileTransferImpl ft = (FileTransferImpl)ftObj;
+
+ if( newState == SessionFileTransferEvent.IN_PROGRESS)
+ {
+ // if we start sending progress fire that we are in progress
+ if(ev.getProgress() == 0)
+ ft.fireStatusChangeEvent(
+ FileTransferStatusChangeEvent.IN_PROGRESS);
+
+ ft.setTransferedBytes(ev.getProgress());
+ ft.fireProgressChangeEvent((int)ev.getProgress());
+ }
+ else
+ ft.fireStatusChangeEvent(getStateMapping(newState));
+ }
+
+ /**
+ * Our listener that will tell us when we're registered to
+ */
+ private class RegistrationStateListener
+ implements RegistrationStateChangeListener
+ {
+ /**
+ * The method is called by a ProtocolProvider implementation whenever
+ * a change in the registration state of the corresponding provider had
+ * occurred.
+ * @param evt ProviderStatusChangeEvent the event describing the status
+ * change.
+ */
+ public void registrationStateChanged(RegistrationStateChangeEvent evt)
+ {
+ logger.debug("The provider changed state from: "
+ + evt.getOldState()
+ + " to: " + evt.getNewState());
+
+ if (evt.getNewState() == RegistrationState.REGISTERED)
+ {
+ yahooProvider.getYahooSession().addSessionFileListener(
+ OperationSetFileTransferYahooImpl.this);
+ }
+ else if (evt.getNewState() == RegistrationState.UNREGISTERED)
+ {
+ YahooSession ys = yahooProvider.getYahooSession();
+ if(ys != null)
+ ys.removeSessionFileListener(
+ OperationSetFileTransferYahooImpl.this);
+ }
+ }
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/protocol/yahoo/ProtocolProviderServiceYahooImpl.java b/src/net/java/sip/communicator/impl/protocol/yahoo/ProtocolProviderServiceYahooImpl.java
index d665b93..45baf65 100644
--- a/src/net/java/sip/communicator/impl/protocol/yahoo/ProtocolProviderServiceYahooImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/yahoo/ProtocolProviderServiceYahooImpl.java
@@ -352,6 +352,12 @@ public class ProtocolProviderServiceYahooImpl
OperationSetTypingNotifications.class.getName(),
typingNotifications);
+ OperationSetFileTransferYahooImpl fileTransferOpSet =
+ new OperationSetFileTransferYahooImpl(this);
+
+ supportedOperationSets.put(OperationSetFileTransfer.class.getName(),
+ fileTransferOpSet);
+
isInitialized = true;
}
}