aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDamian Minkov <damencho@jitsi.org>2009-06-23 15:51:00 +0000
committerDamian Minkov <damencho@jitsi.org>2009-06-23 15:51:00 +0000
commitab6e04cdcf2df326e13469c0a46ef1b52d6d43e6 (patch)
tree371b4f71aa1bf56874509d72a74519dd7eccbb65 /src
parent8a7cd18b2b8b0fbd0164ff7369f6868260304813 (diff)
downloadjitsi-ab6e04cdcf2df326e13469c0a46ef1b52d6d43e6.zip
jitsi-ab6e04cdcf2df326e13469c0a46ef1b52d6d43e6.tar.gz
jitsi-ab6e04cdcf2df326e13469c0a46ef1b52d6d43e6.tar.bz2
FileHistory Service impl.
Diffstat (limited to 'src')
-rw-r--r--src/net/java/sip/communicator/impl/filehistory/FileHistoryActivator.java69
-rw-r--r--src/net/java/sip/communicator/impl/filehistory/FileHistoryServiceImpl.java760
-rw-r--r--src/net/java/sip/communicator/impl/filehistory/filehistory.manifest.mf15
-rw-r--r--src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/ReceiveFileConversationComponent.java12
-rw-r--r--src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/SendFileConversationComponent.java12
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferJabberImpl.java34
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferRequestJabberImpl.java3
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/OperationSetFileTransferJabberImpl.java28
-rw-r--r--src/net/java/sip/communicator/impl/protocol/jabber/OutgoingFileTransferJabberImpl.java40
-rw-r--r--src/net/java/sip/communicator/impl/protocol/ssh/FileTransferSSHImpl.java16
-rw-r--r--src/net/java/sip/communicator/service/filehistory/FileHistoryService.java15
-rw-r--r--src/net/java/sip/communicator/service/filehistory/FileRecord.java7
-rw-r--r--src/net/java/sip/communicator/service/protocol/AbstractFileTransfer.java4
-rw-r--r--src/net/java/sip/communicator/service/protocol/FileTransfer.java53
-rw-r--r--src/net/java/sip/communicator/service/protocol/event/FileTransferStatusChangeEvent.java36
15 files changed, 1036 insertions, 68 deletions
diff --git a/src/net/java/sip/communicator/impl/filehistory/FileHistoryActivator.java b/src/net/java/sip/communicator/impl/filehistory/FileHistoryActivator.java
new file mode 100644
index 0000000..8384528
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/filehistory/FileHistoryActivator.java
@@ -0,0 +1,69 @@
+/*
+ * 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.filehistory;
+
+import org.osgi.framework.*;
+import net.java.sip.communicator.service.history.*;
+import net.java.sip.communicator.service.filehistory.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ *
+ * @author Damian Minkov
+ */
+public class FileHistoryActivator
+ implements BundleActivator
+{
+ private static Logger logger =
+ Logger.getLogger(FileHistoryActivator.class);
+
+ private FileHistoryServiceImpl fileHistoryService = null;
+
+ /**
+ * Initialize and start file history
+ *
+ * @param bundleContext BundleContext
+ * @throws Exception
+ */
+ public void start(BundleContext bundleContext) throws Exception
+ {
+ try{
+
+ logger.logEntry();
+
+ ServiceReference refHistory = bundleContext.getServiceReference(
+ HistoryService.class.getName());
+
+ HistoryService historyService = (HistoryService)
+ bundleContext.getService(refHistory);
+
+ //Create and start the file history service.
+ fileHistoryService =
+ new FileHistoryServiceImpl();
+ // set the history service
+ fileHistoryService.setHistoryService(historyService);
+
+ fileHistoryService.start(bundleContext);
+
+ bundleContext.registerService(
+ FileHistoryService.class.getName(), fileHistoryService, null);
+
+ logger.info("File History Service ...[REGISTERED]");
+ }
+ finally
+ {
+ logger.logExit();
+ }
+
+ }
+
+ public void stop(BundleContext bundleContext) throws Exception
+ {
+ if(fileHistoryService != null)
+ fileHistoryService.stop(bundleContext);
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/filehistory/FileHistoryServiceImpl.java b/src/net/java/sip/communicator/impl/filehistory/FileHistoryServiceImpl.java
new file mode 100644
index 0000000..b71059a
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/filehistory/FileHistoryServiceImpl.java
@@ -0,0 +1,760 @@
+/*
+ * 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.filehistory;
+
+import java.io.*;
+import java.util.*;
+import org.osgi.framework.*;
+import net.java.sip.communicator.service.contactlist.*;
+import net.java.sip.communicator.service.filehistory.*;
+import net.java.sip.communicator.service.history.*;
+import net.java.sip.communicator.service.history.records.*;
+import net.java.sip.communicator.service.protocol.*;
+import net.java.sip.communicator.service.protocol.event.*;
+import net.java.sip.communicator.util.*;
+
+/**
+ * File History Service stores info for file transfers from various protocols.
+ * Uses History Service.
+ *
+ * @author Damian Minkov
+ */
+public class FileHistoryServiceImpl
+ implements FileHistoryService,
+ ServiceListener,
+ FileTransferStatusListener,
+ FileTransferListener
+{
+ /**
+ * The logger for this class.
+ */
+ private static final Logger logger =
+ Logger.getLogger(FileHistoryServiceImpl.class);
+
+ private static String[] STRUCTURE_NAMES =
+ new String[] { "file", "dir", "date", "status"};
+
+ private static HistoryRecordStructure recordStructure =
+ new HistoryRecordStructure(STRUCTURE_NAMES);
+
+ // the field used to search by keywords
+ private static final String SEARCH_FIELD = "file";
+
+ /**
+ * The BundleContext that we got from the OSGI bus.
+ */
+ private BundleContext bundleContext = null;
+
+ private HistoryService historyService = null;
+
+ /**
+ * Starts the service. Check the current registerd protocol providers
+ * which supports FileTransfer and adds a listener to them.
+ *
+ * @param bc BundleContext
+ */
+ public void start(BundleContext bc)
+ {
+ logger.debug("Starting the file history implementation.");
+ this.bundleContext = bc;
+
+ // start listening for newly register or removed protocol providers
+ bc.addServiceListener(this);
+
+ ServiceReference[] protocolProviderRefs = null;
+ try
+ {
+ protocolProviderRefs = bc.getServiceReferences(
+ ProtocolProviderService.class.getName(),
+ null);
+ }
+ catch (InvalidSyntaxException ex)
+ {
+ // this shouldn't happen since we're providing no parameter string
+ // but let's log just in case.
+ logger.error(
+ "Error while retrieving service refs", ex);
+ return;
+ }
+
+ // in case we found any
+ if (protocolProviderRefs != null)
+ {
+ logger.debug("Found "
+ + protocolProviderRefs.length
+ + " already installed providers.");
+ for (int i = 0; i < protocolProviderRefs.length; i++)
+ {
+ ProtocolProviderService provider = (ProtocolProviderService) bc
+ .getService(protocolProviderRefs[i]);
+
+ this.handleProviderAdded(provider);
+ }
+ }
+ }
+
+ /**
+ * Stops the service.
+ *
+ * @param bc BundleContext
+ */
+ public void stop(BundleContext bc)
+ {
+ bc.removeServiceListener(this);
+
+ ServiceReference[] protocolProviderRefs = null;
+ try
+ {
+ protocolProviderRefs = bc.getServiceReferences(
+ ProtocolProviderService.class.getName(),
+ null);
+ }
+ catch (InvalidSyntaxException ex)
+ {
+ // this shouldn't happen since we're providing no parameter string
+ // but let's log just in case.
+ logger.error("Error while retrieving service refs", ex);
+ return;
+ }
+
+ // in case we found any
+ if (protocolProviderRefs != null)
+ {
+ for (int i = 0; i < protocolProviderRefs.length; i++)
+ {
+ ProtocolProviderService provider = (ProtocolProviderService) bc
+ .getService(protocolProviderRefs[i]);
+
+ this.handleProviderRemoved(provider);
+ }
+ }
+ }
+
+ /**
+ * Used to attach the File History Service to existing or
+ * just registered protocol provider. Checks if the provider has implementation
+ * of OperationSetFileTransfer
+ *
+ * @param provider ProtocolProviderService
+ */
+ private void handleProviderAdded(ProtocolProviderService provider)
+ {
+ logger.debug("Adding protocol provider " + provider.getProtocolName());
+
+ // check whether the provider has a file transfer operation set
+ OperationSetFileTransfer opSetFileTransfer =
+ (OperationSetFileTransfer) provider
+ .getOperationSet(OperationSetFileTransfer.class);
+
+ if (opSetFileTransfer != null)
+ {
+ opSetFileTransfer.addFileTransferListener(this);
+ }
+ else
+ {
+ logger.trace("Service did not have a file transfer op. set.");
+ }
+ }
+
+ /**
+ * Removes the specified provider from the list of currently known providers
+ *
+ * @param provider the ProtocolProviderService that has been unregistered.
+ */
+ private void handleProviderRemoved(ProtocolProviderService provider)
+ {
+ OperationSetFileTransfer opSetFileTransfer =
+ (OperationSetFileTransfer) provider
+ .getOperationSet(OperationSetFileTransfer.class);
+
+ if (opSetFileTransfer != null)
+ {
+ opSetFileTransfer.addFileTransferListener(this);
+ }
+ }
+
+ /**
+ * Set the history service.
+ *
+ * @param historyService HistoryService
+ */
+ public void setHistoryService(HistoryService historyService)
+ {
+ this.historyService = historyService;
+ }
+
+ /**
+ * Gets all the history readers for the contacts in the given MetaContact
+ * @param contact MetaContact
+ * @return Hashtable
+ */
+ private Map<Contact, HistoryReader> getHistoryReaders(MetaContact contact)
+ {
+ Map<Contact, HistoryReader> readers = new Hashtable<Contact, HistoryReader>();
+ Iterator<Contact> iter = contact.getContacts();
+ while (iter.hasNext())
+ {
+ Contact item = iter.next();
+
+ try
+ {
+ History history = this.getHistory(null, item);
+ readers.put(item, history.getReader());
+ }
+ catch (IOException e)
+ {
+ logger.error("Could not read history", e);
+ }
+ }
+ return readers;
+ }
+
+ private FileRecord createFileRecordFromHistoryRecord(HistoryRecord hr)
+ {
+ String file = null;
+ String dir = null;
+ long date = 0;
+ String status = null;
+
+ for (int i = 0; i < hr.getPropertyNames().length; i++)
+ {
+ String propName = hr.getPropertyNames()[i];
+
+ if (propName.equals(STRUCTURE_NAMES[0]))
+ file = hr.getPropertyValues()[i];
+ else if (propName.equals(STRUCTURE_NAMES[1]))
+ dir = hr.getPropertyValues()[i];
+ else if (propName.equals(STRUCTURE_NAMES[2]))
+ {
+ try
+ {
+ date = Long.valueOf(hr.getPropertyValues()[i]);
+ }
+ catch (NumberFormatException e)
+ {
+ logger.error("Wrong date : " + hr.getPropertyValues()[i]);
+ }
+ }
+ else if (propName.equals(STRUCTURE_NAMES[3]))
+ status = hr.getPropertyValues()[i];
+ }
+
+ return new FileRecord(dir, date, new File(file), status);
+ }
+
+ /**
+ * Returns all the file transfers made after the given date
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param startDate Date the start date of the transfers
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByStartDate(
+ MetaContact contact, Date startDate)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs = reader.findByStartDate(startDate);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns all the file transfers made before the given date
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param endDate Date the end date of the transfers
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByEndDate(MetaContact contact, Date endDate)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs = reader.findByEndDate(endDate);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns all the file transfers made between the given dates and
+ * having the given keywords in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param startDate Date the start date of the transfers
+ * @param endDate Date the end date of the transfers
+ * @param keywords array of keywords
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByPeriod(MetaContact contact,
+ Date startDate, Date endDate, String[] keywords)
+ throws RuntimeException
+ {
+ return findByPeriod(contact, startDate, endDate, keywords, false);
+ }
+
+ /**
+ * Returns all the file transfers made between the given dates
+ * and having the given keywords in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param startDate Date the start date of the transfers
+ * @param endDate Date the end date of the transfers
+ * @param keywords array of keywords
+ * @param caseSensitive is keywords search case sensitive
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByPeriod(MetaContact contact, Date startDate, Date endDate,
+ String[] keywords, boolean caseSensitive)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs = reader.findByPeriod(
+ startDate, endDate, keywords, SEARCH_FIELD, caseSensitive);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns all the file transfers made between the given dates
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param startDate Date the start date of the transfers
+ * @param endDate Date the end date of the transfers
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByPeriod(
+ MetaContact contact, Date startDate, Date endDate)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs = reader.findByPeriod(startDate, endDate);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns the supplied number of file transfers
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param count filetransfer count
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findLast(MetaContact contact, int count)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs = reader.findLast(count);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns all the file transfers having the given keyword in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param keyword keyword
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByKeyword(
+ MetaContact contact, String keyword)
+ throws RuntimeException
+ {
+ return findByKeyword(contact, keyword, false);
+ }
+
+ /**
+ * Returns all the file transfers having the given keyword in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param keyword keyword
+ * @param caseSensitive is keywords search case sensitive
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByKeyword(
+ MetaContact contact, String keyword, boolean caseSensitive)
+ throws RuntimeException
+ {
+ return findByKeywords(contact, new String[]{keyword}, caseSensitive);
+ }
+
+ /**
+ * Returns all the file transfers having the given keywords in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param keywords keyword
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByKeywords(
+ MetaContact contact, String[] keywords)
+ throws RuntimeException
+ {
+ return findByKeywords(contact, keywords, false);
+ }
+
+ /**
+ * Returns all the file transfershaving the given keywords in the filename
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param keywords keyword
+ * @param caseSensitive is keywords search case sensitive
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findByKeywords(
+ MetaContact contact, String[] keywords, boolean caseSensitive)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs =
+ reader.findByKeywords(keywords, SEARCH_FIELD, caseSensitive);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Returns the supplied number of recent file transfers after the given date
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param date transfers after date
+ * @param count transfers count
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findFirstRecordsAfter(
+ MetaContact contact, Date date, int count)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs =
+ reader.findFirstRecordsAfter(date, count);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ LinkedList<FileRecord> resultAsList = new LinkedList<FileRecord>(result);
+
+ int toIndex = count;
+ if(toIndex > resultAsList.size())
+ toIndex = resultAsList.size();
+
+ return resultAsList.subList(0, toIndex);
+ }
+
+ /**
+ * Returns the supplied number of recent file transfers before the given date
+ *
+ * @param contact MetaContact the receiver or sender of the file
+ * @param date transfers before date
+ * @param count transfers count
+ * @return Collection of FileRecords
+ * @throws RuntimeException
+ */
+ public Collection<FileRecord> findLastRecordsBefore(
+ MetaContact contact, Date date, int count)
+ throws RuntimeException
+ {
+ TreeSet<FileRecord> result =
+ new TreeSet<FileRecord>(new FileRecordComparator());
+ // get the readers for this contact
+ Map<Contact, HistoryReader> readers = getHistoryReaders(contact);
+
+ for (Map.Entry<Contact, HistoryReader> readerEntry : readers.entrySet())
+ {
+ HistoryReader reader = readerEntry.getValue();
+
+ // add the progress listeners
+ Iterator<HistoryRecord> recs =
+ reader.findLastRecordsBefore(date, count);
+ while (recs.hasNext())
+ {
+ result.add(createFileRecordFromHistoryRecord(recs.next()));
+ }
+ }
+
+ LinkedList<FileRecord> resultAsList = new LinkedList<FileRecord>(result);
+ int startIndex = resultAsList.size() - count;
+
+ if(startIndex < 0)
+ startIndex = 0;
+
+ return resultAsList.subList(startIndex, resultAsList.size());
+ }
+
+ /**
+ * When new protocol provider is registered we check
+ * does it supports FileTransfer and if so add a listener to it
+ *
+ * @param serviceEvent ServiceEvent
+ */
+ public void serviceChanged(ServiceEvent serviceEvent)
+ {
+ Object sService = bundleContext.getService(serviceEvent.getServiceReference());
+
+ logger.trace("Received a service event for: " + sService.getClass().getName());
+
+ // we don't care if the source service is not a protocol provider
+ if (! (sService instanceof ProtocolProviderService))
+ {
+ return;
+ }
+
+ logger.debug("Service is a protocol provider.");
+ if (serviceEvent.getType() == ServiceEvent.REGISTERED)
+ {
+ logger.debug("Handling registration of a new Protocol Provider.");
+
+ this.handleProviderAdded((ProtocolProviderService)sService);
+ }
+ else if (serviceEvent.getType() == ServiceEvent.UNREGISTERING)
+ {
+ this.handleProviderRemoved( (ProtocolProviderService) sService);
+ }
+ }
+
+ /**
+ * Returns the history by specified local and remote contact
+ * if one of them is null the default is used
+ *
+ * @param localContact Contact
+ * @param remoteContact Contact
+ * @return History
+ * @throws IOException
+ */
+ private History getHistory(Contact localContact, Contact remoteContact)
+ throws IOException
+ {
+ History retVal = null;
+
+ String localId = localContact == null ? "default" : localContact
+ .getAddress();
+ String remoteId = remoteContact == null ? "default" : remoteContact
+ .getAddress();
+
+ String account = "unkown";
+ if (remoteContact != null)
+ account = remoteContact.getProtocolProvider().getAccountID().
+ getAccountUniqueID();
+
+ HistoryID historyId = HistoryID.createFromRawID(
+ new String[] { "filehistory",
+ localId,
+ account,
+ remoteId });
+
+ if (this.historyService.isHistoryExisting(historyId))
+ {
+ retVal = this.historyService.getHistory(historyId);
+ } else
+ {
+ retVal = this.historyService.createHistory(historyId,
+ recordStructure);
+ }
+
+ return retVal;
+ }
+
+ /**
+ * Listens for changes in filetransfers.
+ * @param event
+ */
+ public void statusChanged(FileTransferStatusChangeEvent event)
+ {
+ try
+ {
+ FileTransfer ft = event.getFileTransfer();
+ String status = getStatus(ft.getStatus());
+
+ // ignore events we don't need
+ if(status == null)
+ return;
+
+ History history = getHistory(null, ft.getContact());
+ HistoryWriter historyWriter = history.getWriter();
+
+ historyWriter.addRecord(new String[]{
+ ft.getFile().getCanonicalPath(),
+ getDirection(ft.getDirection()),
+ String.valueOf(new Date().getTime()),
+ status
+ });
+
+ } catch (IOException e)
+ {
+ logger.error("Could not add file transfer log to history", e);
+ }
+ }
+
+ private static String getDirection(int direction)
+ {
+ switch(direction)
+ {
+ case FileTransfer.IN :
+ return FileRecord.IN;
+ case FileTransfer.OUT :
+ return FileRecord.OUT;
+ default: return null;
+ }
+ }
+
+ /**
+ * Maps only the statuses we are interested in, otherwise returns null.
+ * @param status the status as receive from FileTransfer
+ * @return the corresponding status of FileRecord.
+ */
+ private static String getStatus(int status)
+ {
+ switch(status)
+ {
+ case FileTransferStatusChangeEvent.CANCELED :
+ return FileRecord.CANCELED;
+ case FileTransferStatusChangeEvent.COMPLETED :
+ return FileRecord.COMPLETED;
+ case FileTransferStatusChangeEvent.FAILED :
+ return FileRecord.FAILED;
+ case FileTransferStatusChangeEvent.REFUSED :
+ return FileRecord.REFUSED;
+ default: return null;
+ }
+ }
+
+ /**
+ * We ignore filetransfer requests.
+ * @param event
+ */
+ public void fileTransferRequestReceived(FileTransferRequestEvent event)
+ {
+ }
+
+ /**
+ * New filetransfer was created.
+ * @param fileTransfer
+ */
+ public void fileTransferCreated(FileTransfer fileTransfer)
+ {
+ fileTransfer.addStatusListener(this);
+ }
+
+ /**
+ * Used to compare FileRecords
+ * and to be ordered in TreeSet according their timestamp
+ */
+ private static class FileRecordComparator
+ implements Comparator
+ {
+ public int compare(Object o1, Object o2)
+ {
+ long date1 = ((FileRecord)o1).getDate();
+ long date2 = ((FileRecord)o2).getDate();
+
+ return (date1 < date2) ? -1 : ((date1 == date2) ? 0 : 1);
+ }
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/filehistory/filehistory.manifest.mf b/src/net/java/sip/communicator/impl/filehistory/filehistory.manifest.mf
new file mode 100644
index 0000000..50d8e76
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/filehistory/filehistory.manifest.mf
@@ -0,0 +1,15 @@
+Bundle-Activator: net.java.sip.communicator.impl.filehistory.FileHistoryActivator
+Bundle-Name: File History Service Provider
+Bundle-Description: A bundle that implements the file history package.
+Bundle-Vendor: sip-communicator.org
+Bundle-Version: 0.0.1
+System-Bundle: yes
+Import-Package: org.osgi.framework,
+ net.java.sip.communicator.service.history,
+ net.java.sip.communicator.service.history.records,
+ net.java.sip.communicator.service.history.event,
+ net.java.sip.communicator.service.contactlist,
+ net.java.sip.communicator.util,
+ net.java.sip.communicator.service.protocol,
+ net.java.sip.communicator.service.protocol.event
+Export-Package: net.java.sip.communicator.service.filehistory
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/ReceiveFileConversationComponent.java b/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/ReceiveFileConversationComponent.java
index 656cbfc..16053c4 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/ReceiveFileConversationComponent.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/ReceiveFileConversationComponent.java
@@ -373,14 +373,14 @@ public class ReceiveFileConversationComponent
String fromContactName
= fileTransferRequest.getSender().getDisplayName();
- if (status == FileTransfer.PREPARING)
+ if (status == FileTransferStatusChangeEvent.PREPARING)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
"service.gui.FILE_TRANSFER_PREPARING",
new String[]{fromContactName}));
}
- else if (status == FileTransfer.FAILED)
+ else if (status == FileTransferStatusChangeEvent.FAILED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
@@ -389,7 +389,7 @@ public class ReceiveFileConversationComponent
setWarningStyle(true);
}
- else if (status == FileTransfer.IN_PROGRESS)
+ else if (status == FileTransferStatusChangeEvent.IN_PROGRESS)
{
titleLabel.setText(resources.getI18NString(
"service.gui.FILE_RECEIVING_FROM",
@@ -401,7 +401,7 @@ public class ReceiveFileConversationComponent
progressBar.setVisible(true);
}
}
- else if (status == FileTransfer.COMPLETED)
+ else if (status == FileTransferStatusChangeEvent.COMPLETED)
{
if (downloadFile != null)
{
@@ -432,7 +432,7 @@ public class ReceiveFileConversationComponent
}
});
}
- else if (status == FileTransfer.CANCELED)
+ else if (status == FileTransferStatusChangeEvent.CANCELED)
{
progressBar.setVisible(false);
cancelButton.setVisible(false);
@@ -441,7 +441,7 @@ public class ReceiveFileConversationComponent
"service.gui.FILE_TRANSFER_CANCELED"));
setWarningStyle(true);
}
- else if (status == FileTransfer.REFUSED)
+ else if (status == FileTransferStatusChangeEvent.REFUSED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
diff --git a/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/SendFileConversationComponent.java b/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/SendFileConversationComponent.java
index 5967e52..3e983a4 100644
--- a/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/SendFileConversationComponent.java
+++ b/src/net/java/sip/communicator/impl/gui/main/chat/filetransfer/SendFileConversationComponent.java
@@ -249,7 +249,7 @@ public class SendFileConversationComponent
{
int status = event.getNewStatus();
- if (status == FileTransfer.PREPARING)
+ if (status == FileTransferStatusChangeEvent.PREPARING)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
@@ -258,7 +258,7 @@ public class SendFileConversationComponent
cancelButton.setVisible(true);
retryButton.setVisible(false);
}
- else if (status == FileTransfer.FAILED)
+ else if (status == FileTransferStatusChangeEvent.FAILED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
@@ -268,7 +268,7 @@ public class SendFileConversationComponent
retryButton.setVisible(true);
setWarningStyle(true);
}
- else if (status == FileTransfer.IN_PROGRESS)
+ else if (status == FileTransferStatusChangeEvent.IN_PROGRESS)
{
titleLabel.setText(resources.getI18NString(
"service.gui.FILE_SENDING_TO",
@@ -280,7 +280,7 @@ public class SendFileConversationComponent
progressBar.setVisible(true);
}
}
- else if (status == FileTransfer.COMPLETED)
+ else if (status == FileTransferStatusChangeEvent.COMPLETED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
@@ -289,7 +289,7 @@ public class SendFileConversationComponent
cancelButton.setVisible(false);
retryButton.setVisible(false);
}
- else if (status == FileTransfer.CANCELED)
+ else if (status == FileTransferStatusChangeEvent.CANCELED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
@@ -298,7 +298,7 @@ public class SendFileConversationComponent
retryButton.setVisible(true);
setWarningStyle(true);
}
- else if (status == FileTransfer.REFUSED)
+ else if (status == FileTransferStatusChangeEvent.REFUSED)
{
progressBar.setVisible(false);
titleLabel.setText(resources.getI18NString(
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferJabberImpl.java
index ba2dcb9..b0adf28 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferJabberImpl.java
@@ -6,6 +6,8 @@
*/
package net.java.sip.communicator.impl.protocol.jabber;
+import java.io.*;
+
import org.jivesoftware.smackx.filetransfer.*;
import net.java.sip.communicator.service.protocol.*;
@@ -18,14 +20,21 @@ import net.java.sip.communicator.service.protocol.*;
public class IncomingFileTransferJabberImpl
extends AbstractFileTransfer
{
+ private Contact sender = null;
+ private File file = null;
+
/**
* The jabber incoming file transfer.
*/
private IncomingFileTransfer jabberTransfer;
- public IncomingFileTransferJabberImpl(IncomingFileTransfer jabberTransfer)
+ public IncomingFileTransferJabberImpl(Contact sender,
+ File file,
+ IncomingFileTransfer jabberTransfer)
{
this.jabberTransfer = jabberTransfer;
+ this.sender = sender;
+ this.file = file;
}
/**
@@ -45,4 +54,27 @@ public class IncomingFileTransferJabberImpl
{
return jabberTransfer.getAmountWritten();
}
+
+ /**
+ * The direction is incoming.
+ * @return IN.
+ */
+ public int getDirection()
+ {
+ return IN;
+ }
+
+ /**
+ * The file we are receiving.
+ * @return the file.
+ */
+ public File getFile()
+ {
+ return file;
+ }
+
+ public Contact getContact()
+ {
+ return sender;
+ }
}
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferRequestJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferRequestJabberImpl.java
index f12f7dc..2e37b5c 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferRequestJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/IncomingFileTransferRequestJabberImpl.java
@@ -121,7 +121,8 @@ public class IncomingFileTransferRequestJabberImpl
try
{
incomingTransfer
- = new IncomingFileTransferJabberImpl(jabberTransfer);
+ = new IncomingFileTransferJabberImpl(
+ sender, file, jabberTransfer);
fileTransferOpSet.fireFileTransferCreated(incomingTransfer);
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetFileTransferJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetFileTransferJabberImpl.java
index a51cafa..0f01dee 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetFileTransferJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetFileTransferJabberImpl.java
@@ -102,7 +102,7 @@ public class OperationSetFileTransferJabberImpl
= manager.createOutgoingFileTransfer(presence.getFrom());
outgoingTransfer
- = new OutgoingFileTransferJabberImpl(transfer);
+ = new OutgoingFileTransferJabberImpl(toContact, file, transfer);
// Notify all interested listeners that a file transfer has been
// created.
@@ -363,10 +363,10 @@ public class OperationSetFileTransferJabberImpl
status = parseJabberStatus(jabberTransfer.getStatus());
progress = fileTransfer.getTransferedBytes();
- if (status == FileTransfer.FAILED
- || status == FileTransfer.COMPLETED
- || status == FileTransfer.CANCELED
- || status == FileTransfer.REFUSED)
+ if (status == FileTransferStatusChangeEvent.FAILED
+ || status == FileTransferStatusChangeEvent.COMPLETED
+ || status == FileTransferStatusChangeEvent.CANCELED
+ || status == FileTransferStatusChangeEvent.REFUSED)
{
break;
}
@@ -381,10 +381,10 @@ public class OperationSetFileTransferJabberImpl
}
if (initialFileSize > 0
- && status == FileTransfer.COMPLETED
+ && status == FileTransferStatusChangeEvent.COMPLETED
&& fileTransfer.getTransferedBytes() < initialFileSize)
{
- status = FileTransfer.CANCELED;
+ status = FileTransferStatusChangeEvent.CANCELED;
}
fileTransfer.fireStatusChangeEvent(status);
@@ -402,21 +402,21 @@ public class OperationSetFileTransferJabberImpl
private static int parseJabberStatus(Status jabberStatus)
{
if (jabberStatus.equals(Status.complete))
- return FileTransfer.COMPLETED;
+ return FileTransferStatusChangeEvent.COMPLETED;
else if (jabberStatus.equals(Status.cancelled))
- return FileTransfer.CANCELED;
+ return FileTransferStatusChangeEvent.CANCELED;
else if (jabberStatus.equals(Status.in_progress)
|| jabberStatus.equals(Status.negotiated))
- return FileTransfer.IN_PROGRESS;
+ return FileTransferStatusChangeEvent.IN_PROGRESS;
else if (jabberStatus.equals(Status.error))
- return FileTransfer.FAILED;
+ return FileTransferStatusChangeEvent.FAILED;
else if (jabberStatus.equals(Status.refused))
- return FileTransfer.REFUSED;
+ return FileTransferStatusChangeEvent.REFUSED;
else if (jabberStatus.equals(Status.negotiating_transfer)
|| jabberStatus.equals(Status.negotiating_stream))
- return FileTransfer.PREPARING;
+ return FileTransferStatusChangeEvent.PREPARING;
else
// FileTransfer.Status.initial
- return FileTransfer.WAITING;
+ return FileTransferStatusChangeEvent.WAITING;
}
}
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OutgoingFileTransferJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OutgoingFileTransferJabberImpl.java
index 6ad8dd6..19d7771 100644
--- a/src/net/java/sip/communicator/impl/protocol/jabber/OutgoingFileTransferJabberImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/jabber/OutgoingFileTransferJabberImpl.java
@@ -6,6 +6,8 @@
*/
package net.java.sip.communicator.impl.protocol.jabber;
+import java.io.*;
+
import net.java.sip.communicator.service.protocol.*;
import org.jivesoftware.smackx.filetransfer.*;
@@ -18,6 +20,9 @@ import org.jivesoftware.smackx.filetransfer.*;
public class OutgoingFileTransferJabberImpl
extends AbstractFileTransfer
{
+ private Contact receiver;
+
+ private File file;
/**
* The jabber outgoing file transfer.
*/
@@ -30,9 +35,13 @@ public class OutgoingFileTransferJabberImpl
* @param jabberTransfer the Jabber transfer object, containing all transfer
* information
*/
- public OutgoingFileTransferJabberImpl(OutgoingFileTransfer jabberTransfer)
+ public OutgoingFileTransferJabberImpl(Contact receiver,
+ File file,
+ OutgoingFileTransfer jabberTransfer)
{
this.jabberTransfer = jabberTransfer;
+ this.receiver = receiver;
+ this.file = file;
}
/**
@@ -52,4 +61,31 @@ public class OutgoingFileTransferJabberImpl
{
return jabberTransfer.getBytesSent();
}
-} \ No newline at end of file
+
+ /**
+ * The direction is outgoing.
+ * @return OUT.
+ */
+ public int getDirection()
+ {
+ return OUT;
+ }
+
+ /**
+ * The file we are sending.
+ * @return the file.
+ */
+ public File getFile()
+ {
+ return file;
+ }
+
+ /**
+ * The contact we are sending the file.
+ * @return the receiver.
+ */
+ public Contact getContact()
+ {
+ return receiver;
+ }
+}
diff --git a/src/net/java/sip/communicator/impl/protocol/ssh/FileTransferSSHImpl.java b/src/net/java/sip/communicator/impl/protocol/ssh/FileTransferSSHImpl.java
index 58c36ab..b69b751 100644
--- a/src/net/java/sip/communicator/impl/protocol/ssh/FileTransferSSHImpl.java
+++ b/src/net/java/sip/communicator/impl/protocol/ssh/FileTransferSSHImpl.java
@@ -6,6 +6,7 @@
*/
package net.java.sip.communicator.impl.protocol.ssh;
+import java.io.*;
import net.java.sip.communicator.service.protocol.*;
/**
@@ -47,4 +48,19 @@ public class FileTransferSSHImpl
// TODO: Implement getTransferedBytes() for SSH file transfer.
return 0;
}
+
+ public int getDirection()
+ {
+ return IN;
+ }
+
+ public File getFile()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ public Contact getContact()
+ {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
}
diff --git a/src/net/java/sip/communicator/service/filehistory/FileHistoryService.java b/src/net/java/sip/communicator/service/filehistory/FileHistoryService.java
index 52c2490..0f88836 100644
--- a/src/net/java/sip/communicator/service/filehistory/FileHistoryService.java
+++ b/src/net/java/sip/communicator/service/filehistory/FileHistoryService.java
@@ -25,7 +25,8 @@ public interface FileHistoryService
* @return Collection of FileRecords
* @throws RuntimeException
*/
- public Collection<FileRecord> findByStartDate(MetaContact contact, Date startDate)
+ public Collection<FileRecord> findByStartDate(
+ MetaContact contact, Date startDate)
throws RuntimeException;
/**
@@ -36,7 +37,8 @@ public interface FileHistoryService
* @return Collection of FileRecords
* @throws RuntimeException
*/
- public Collection<FileRecord> findByEndDate(MetaContact contact, Date endDate)
+ public Collection<FileRecord> findByEndDate(
+ MetaContact contact, Date endDate)
throws RuntimeException;
/**
@@ -48,7 +50,8 @@ public interface FileHistoryService
* @return Collection of FileRecords
* @throws RuntimeException
*/
- public Collection<FileRecord> findByPeriod(MetaContact contact, Date startDate, Date endDate)
+ public Collection<FileRecord> findByPeriod(
+ MetaContact contact, Date startDate, Date endDate)
throws RuntimeException;
/**
@@ -103,7 +106,8 @@ public interface FileHistoryService
* @return Collection of FileRecords
* @throws RuntimeException
*/
- public Collection<FileRecord> findByKeyword(MetaContact contact, String keyword)
+ public Collection<FileRecord> findByKeyword(
+ MetaContact contact, String keyword)
throws RuntimeException;
/**
@@ -127,7 +131,8 @@ public interface FileHistoryService
* @return Collection of FileRecords
* @throws RuntimeException
*/
- public Collection<FileRecord> findByKeywords(MetaContact contact, String[] keywords)
+ public Collection<FileRecord> findByKeywords(
+ MetaContact contact, String[] keywords)
throws RuntimeException;
/**
diff --git a/src/net/java/sip/communicator/service/filehistory/FileRecord.java b/src/net/java/sip/communicator/service/filehistory/FileRecord.java
index 0c909ff..7ceb550 100644
--- a/src/net/java/sip/communicator/service/filehistory/FileRecord.java
+++ b/src/net/java/sip/communicator/service/filehistory/FileRecord.java
@@ -7,7 +7,6 @@
package net.java.sip.communicator.service.filehistory;
import java.io.*;
-import java.util.*;
/**
* Structure used for encapsulating data when writing or reading
@@ -45,7 +44,7 @@ public class FileRecord
private String direction = null;
- private Date date = null;
+ private long date;
private File file = null;
private String status;
@@ -60,7 +59,7 @@ public class FileRecord
*/
public FileRecord(
String direction,
- Date date,
+ long date,
File file,
String status)
{
@@ -83,7 +82,7 @@ public class FileRecord
* The date of the record.
* @return the date
*/
- public Date getDate()
+ public long getDate()
{
return date;
}
diff --git a/src/net/java/sip/communicator/service/protocol/AbstractFileTransfer.java b/src/net/java/sip/communicator/service/protocol/AbstractFileTransfer.java
index 18a85f9..8da643e 100644
--- a/src/net/java/sip/communicator/service/protocol/AbstractFileTransfer.java
+++ b/src/net/java/sip/communicator/service/protocol/AbstractFileTransfer.java
@@ -127,6 +127,10 @@ public abstract class AbstractFileTransfer
*/
public void fireStatusChangeEvent(int newStatus)
{
+ // ignore if status is the same
+ if(this.status == newStatus)
+ return;
+
Collection<FileTransferStatusListener> listeners = null;
synchronized (statusListeners)
{
diff --git a/src/net/java/sip/communicator/service/protocol/FileTransfer.java b/src/net/java/sip/communicator/service/protocol/FileTransfer.java
index d0f7d23..f904009 100644
--- a/src/net/java/sip/communicator/service/protocol/FileTransfer.java
+++ b/src/net/java/sip/communicator/service/protocol/FileTransfer.java
@@ -6,6 +6,8 @@
*/
package net.java.sip.communicator.service.protocol;
+import java.io.*;
+
import net.java.sip.communicator.service.protocol.event.*;
/**
@@ -18,46 +20,39 @@ import net.java.sip.communicator.service.protocol.event.*;
public interface FileTransfer
{
/**
- * Indicates that the file transfer has been completed.
+ * File transfer is incoming.
*/
- public static final int COMPLETED = 0;
+ public static final int IN = 1;
/**
- * Indicates that the file transfer has been canceled.
+ * File transfer is outgoing.
*/
- public static final int CANCELED = 1;
+ public static final int OUT = 2;
/**
- * Indicates that the file transfer has failed.
- */
- public static final int FAILED = 2;
-
- /**
- * Indicates that the file transfer has been refused.
- */
- public static final int REFUSED = 3;
-
- /**
- * Indicates that the file transfer is in progress.
+ * Cancels this file transfer. When this method is called transfer should
+ * be interrupted.
*/
- public static final int IN_PROGRESS = 4;
+ public void cancel();
/**
- * Indicates that the file transfer waits for the recipient to accept the
- * file.
+ * The file transfer direction.
+ * @return returns the direction of the file transfer : IN or OUT.
*/
- public static final int WAITING = 5;
+ public int getDirection();
/**
- * Indicates that the file transfer is in negotiation.
+ * Returns the file that is transfered.
+ *
+ * @return the file
*/
- public static final int PREPARING = 6;
+ public File getFile();
/**
- * Cancels this file transfer. When this method is called transfer should
- * be interrupted.
+ * Returns the contact that we are transfering files with.
+ * @return the contact.
*/
- public void cancel();
+ public Contact getContact();
/**
* Returns the current status of the transfer. This information could be
@@ -72,7 +67,7 @@ public interface FileTransfer
/**
* 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();
@@ -80,14 +75,14 @@ public interface FileTransfer
/**
* Adds the given <tt>FileTransferStatusListener</tt> to listen for
* status changes on this file transfer.
- *
+ *
* @param listener the listener to add
*/
public void addStatusListener(FileTransferStatusListener listener);
/**
* Removes the given <tt>FileTransferStatusListener</tt>.
- *
+ *
* @param listener the listener to remove
*/
public void removeStatusListener(FileTransferStatusListener listener);
@@ -95,14 +90,14 @@ public interface FileTransfer
/**
* Adds the given <tt>FileTransferProgressListener</tt> to listen for
* status changes on this file transfer.
- *
+ *
* @param listener the listener to add
*/
public void addProgressListener(FileTransferProgressListener listener);
/**
* Removes the given <tt>FileTransferProgressListener</tt>.
- *
+ *
* @param listener the listener to remove
*/
public void removeProgressListener(FileTransferProgressListener listener);
diff --git a/src/net/java/sip/communicator/service/protocol/event/FileTransferStatusChangeEvent.java b/src/net/java/sip/communicator/service/protocol/event/FileTransferStatusChangeEvent.java
index b3056ba..36b9a97 100644
--- a/src/net/java/sip/communicator/service/protocol/event/FileTransferStatusChangeEvent.java
+++ b/src/net/java/sip/communicator/service/protocol/event/FileTransferStatusChangeEvent.java
@@ -20,6 +20,42 @@ public class FileTransferStatusChangeEvent
extends EventObject
{
/**
+ * Indicates that the file transfer has been completed.
+ */
+ public static final int COMPLETED = 0;
+
+ /**
+ * Indicates that the file transfer has been canceled.
+ */
+ public static final int CANCELED = 1;
+
+ /**
+ * Indicates that the file transfer has failed.
+ */
+ public static final int FAILED = 2;
+
+ /**
+ * Indicates that the file transfer has been refused.
+ */
+ public static final int REFUSED = 3;
+
+ /**
+ * Indicates that the file transfer is in progress.
+ */
+ public static final int IN_PROGRESS = 4;
+
+ /**
+ * Indicates that the file transfer waits for the recipient to accept the
+ * file.
+ */
+ public static final int WAITING = 5;
+
+ /**
+ * Indicates that the file transfer is in negotiation.
+ */
+ public static final int PREPARING = 6;
+
+ /**
* The state of the file transfer before this event occured.
*/
private final int oldStatus;