diff options
author | Damian Minkov <damencho@jitsi.org> | 2009-07-13 12:42:15 +0000 |
---|---|---|
committer | Damian Minkov <damencho@jitsi.org> | 2009-07-13 12:42:15 +0000 |
commit | 0ebdce1c3672f4aadaec715095b97d24ee0ae41b (patch) | |
tree | 60988e2ae93a9b6ec492eb0d29faf82fdf08fc24 /src/net/java/sip/communicator/impl/protocol | |
parent | 431d5a850d5b36d48cdec2e5e5f937b2eb2b93d3 (diff) | |
download | jitsi-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')
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; } } |