summaryrefslogtreecommitdiffstats
path: root/kftpgrabber/src/kftpqueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'kftpgrabber/src/kftpqueue.h')
-rw-r--r--kftpgrabber/src/kftpqueue.h531
1 files changed, 531 insertions, 0 deletions
diff --git a/kftpgrabber/src/kftpqueue.h b/kftpgrabber/src/kftpqueue.h
new file mode 100644
index 0000000..d20d817
--- /dev/null
+++ b/kftpgrabber/src/kftpqueue.h
@@ -0,0 +1,531 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUE_H
+#define KFTPQUEUE_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <qcache.h>
+#include <qmap.h>
+#include <qpair.h>
+
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kprocess.h>
+
+#include "kftpqueueprocessor.h"
+#include "kftpqueueconverter.h"
+#include "kftpfileexistsactions.h"
+#include "misc.h"
+
+#include "engine/directorylisting.h"
+#include "engine/event.h"
+
+#include "directoryscanner.h"
+#include "kftptransfer.h"
+#include "kftptransferfile.h"
+#include "kftptransferdir.h"
+#include "site.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPSession {
+ class Session;
+ class Connection;
+}
+
+class KFTPQueueConverter;
+
+typedef QPtrList<KFTPQueue::Transfer> KFTPQueueTransfers;
+
+namespace KFTPQueue {
+
+class FailedTransfer;
+
+/**
+ * This class represents an opened remote file. The file is stored locally
+ * while its being displayed to the user.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class OpenedFile {
+public:
+ OpenedFile() {}
+
+ /**
+ * Creates a new OpenedFile object.
+ *
+ * @param transfer The transfer used to transfer the file
+ */
+ OpenedFile(TransferFile *transfer);
+
+ /**
+ * Get file's source (remote).
+ *
+ * @return File's remote source URL
+ */
+ KURL source() { return m_source; }
+
+ /**
+ * Get file's destination (local).
+ *
+ * @return File's local destination URL
+ */
+ KURL destination() { return m_dest; }
+
+ /**
+ * Has the file changed since the transfer ?
+ *
+ * @return True if the file has been changed since being transfered
+ */
+ bool hasChanged();
+private:
+ KURL m_source;
+ KURL m_dest;
+
+ QString m_hash;
+};
+
+/**
+ * This class represents a request for "file already exists" dialog
+ * display request.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class UserDialogRequest {
+public:
+ /**
+ * Class constructor.
+ */
+ UserDialogRequest(TransferFile *transfer, filesize_t srcSize, time_t srcTime,
+ filesize_t dstSize, time_t dstTime);
+
+ /**
+ * Sends a response to this request.
+ *
+ * @param event A valid file exists wakeup event
+ */
+ void sendResponse(KFTPEngine::FileExistsWakeupEvent *event);
+
+ /**
+ * Returns the transfer that initiated the request.
+ */
+ TransferFile *getTransfer() const { return m_transfer; }
+
+ /**
+ * Returns source file size.
+ */
+ filesize_t sourceSize() const { return m_srcSize; }
+
+ /**
+ * Returns source file time.
+ */
+ time_t sourceTime() const { return m_srcTime; }
+
+ /**
+ * Returns destination file size.
+ */
+ filesize_t destinationSize() const { return m_dstSize; }
+
+ /**
+ * Returns destination file time.
+ */
+ time_t destinationTime() const { return m_dstTime; }
+private:
+ TransferFile *m_transfer;
+ filesize_t m_srcSize;
+ time_t m_srcTime;
+ filesize_t m_dstSize;
+ time_t m_dstTime;
+};
+
+/**
+ * This class is responsible for managing the complete queue hierarchy. All
+ * queued items descend from QueueObject and are contained in a simple tree
+ * model. Statistics and abort requests propagate from bottom to top and exec
+ * requests go in the other direction.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class Manager : public QObject {
+Q_OBJECT
+friend class KFTPSession::Session;
+friend class KFTPSession::Connection;
+friend class ::KFTPQueueConverter;
+friend class DirectoryScanner::ScannerThread;
+friend class KFTPQueue::FailedTransfer;
+public:
+ /**
+ * Returns the global manager instance.
+ */
+ static Manager *self();
+
+ /**
+ * Class destructor.
+ */
+ ~Manager();
+
+ /**
+ * Stop all queued transfers.
+ */
+ void stopAllTransfers();
+
+ /**
+ * Get the toplevel queue object. The direct children of this object are different
+ * KFTPQueue::Site objects that represent separate sites.
+ *
+ * @return A QueueObject representing the toplevel object
+ */
+ QueueObject *topLevelObject() const { return m_topLevel; }
+
+ /**
+ * Queues a new transfer by looking at the URL drag data.
+ *
+ * @param drag The drag data
+ */
+ void insertTransfer(KURLDrag *drag);
+
+ /**
+ * Queues a new transfer. This method will create the site if one doesn't exist yet
+ * for this transfer. The object will be reparented under the assigned site.
+ *
+ * @param transfer The transfer to be queued
+ */
+ void insertTransfer(Transfer *transfer);
+
+ /**
+ * Remove a transfer from the queue. The faceDestruction method will be called on the
+ * transfer object before removal. After calling this method, you shouldn't use the
+ * object anymore!
+ *
+ * @param transfer The transfer to be removed from queue
+ * @param abortSession If true any session that this transfer is using is aborted
+ */
+ void removeTransfer(Transfer *transfer, bool abortSession = true);
+
+ /**
+ * This method removes all the transfers from the queue.
+ */
+ void clearQueue();
+
+ /**
+ * Check if the transfer is under the correct site and move it if not.
+ *
+ * @param transfer The transfer to check
+ */
+ void revalidateTransfer(Transfer *transfer);
+
+ /**
+ * Finds a transfer by its id.
+ *
+ * @param id The transfer's id
+ * @return The transfer object
+ */
+ Transfer *findTransfer(long id);
+
+ /**
+ * Finds a site by its URL.
+ *
+ * @param url The site's URL
+ * @param noCreate If set to true the site will not be created when not found
+ * and NULL will be returned
+ * @return The site object
+ */
+ Site *findSite(KURL url, bool noCreate = false);
+
+ /**
+ * Remove a failed transfer from the list.
+ *
+ * @param transfer The failed transfer object to be removed
+ */
+ void removeFailedTransfer(FailedTransfer *transfer);
+
+ /**
+ * Remove all failed transfers from the list. This method actually calls the
+ * removeFailedTransfer for every failed transfer present.
+ */
+ void clearFailedTransferList();
+
+ /**
+ * Moves the specified transfer up in the queue.
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferUp(QueueObject *object);
+
+ /**
+ * Moves the specified transfer down in the queue.
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferDown(QueueObject *object);
+
+ /**
+ * Moves the specified transfer to the top of the queue (only within the
+ * parent boundaries).
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferTop(QueueObject *object);
+
+ /**
+ * Moves the specified transfer to the bottom of the queue (only within the
+ * parent boundaries).
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferBottom(QueueObject *object);
+
+ /**
+ * Can the transfer be moved up ?
+ *
+ * @param object The queue object to be moved
+ * @return True if the transfer can be moved
+ */
+ bool canBeMovedUp(QueueObject *object);
+
+ /**
+ * Can the transfer be moved down ?
+ *
+ * @param object The queue object to be moved
+ * @return True if the transfer can be moved
+ */
+ bool canBeMovedDown(QueueObject *object);
+
+ /**
+ * Returns the list of failed transfers.
+ *
+ * @return The QPtrList of FailedTransfer objects
+ */
+ QPtrList<KFTPQueue::FailedTransfer> *getFailedTransferList() { return &m_failedTransfers; }
+
+ /**
+ * Return the queue converter (exporter).
+ *
+ * @return the KFTPQueueConverter object
+ */
+ KFTPQueueConverter *getConverter() const { return m_converter; }
+
+ /**
+ * Opens the file with the registred application for it's MIME type and waits
+ * for the process to exit (then it will reupload the file if it has changed).
+ *
+ * @param transfer The transfer whose destination should be opened
+ */
+ void openAfterTransfer(TransferFile *transfer);
+
+ /**
+ * Should the update() be emitted on changes ?
+ *
+ * @param value True if the value should be emitted, false otherwise
+ */
+ void setEmitUpdate(bool value) { m_emitUpdate = value; }
+
+ /**
+ * Does a global queue update and removes all transfers that have the "delete me"
+ * variable set.
+ */
+ void doEmitUpdate();
+
+ /**
+ * Get the current download speed.
+ *
+ * @return The current download speed
+ */
+ filesize_t getDownloadSpeed() const { return m_curDownSpeed; }
+
+ /**
+ * Get the current upload speed.
+ *
+ * @return The current upload speed
+ */
+ filesize_t getUploadSpeed() const { return m_curUpSpeed; }
+
+ /**
+ * Get the percentage of the queue's completion.
+ *
+ * @return The percentage of the queue's completion
+ */
+ int getTransferPercentage();
+
+ /**
+ * Get the number of currently running transfers.
+ *
+ * @param onlyDirs Should only directories be counted
+ * @return The number of currently running transfers
+ */
+ int getNumRunning(bool onlyDirs = false);
+
+ /**
+ * Get the number of currently running transfers under a specific
+ * site.
+ *
+ * @param url The remote URL
+ * @return The number of currently running transfers
+ */
+ int getNumRunning(const KURL &remoteUrl);
+
+ /**
+ * Start the queue processing.
+ */
+ void start();
+
+ /**
+ * Abort the queue processing.
+ */
+ void abort();
+
+ /**
+ * Is the queue being processed ?
+ *
+ * @return True if the queue is being processed, false otherwise
+ */
+ bool isProcessing() { return m_queueProc->isRunning(); }
+
+ /**
+ * Return the next available transfer id and reserve it.
+ *
+ * @return The next available transfer id
+ */
+ long nextTransferId() { return m_lastQID++; }
+
+ /**
+ * Set a default action to take when encountering an existing file situation. Note that
+ * the action set here will override any preconfigured user actions unless set to the
+ * value of FE_DISABLE_ACT.
+ *
+ * @param action The action to take
+ */
+ void setDefaultFileExistsAction(FEAction action = FE_DISABLE_ACT) { m_defaultFeAction = action; }
+
+ /**
+ * Get the default action preset for situations where a file already exists.
+ *
+ * @return A valid FEAction
+ */
+ FEAction getDefaultFileExistsAction() const { return m_defaultFeAction; }
+
+ /**
+ * Decides what to do with the existing file. It will return a valid wakeup event to
+ * dispatch. It will first consider the pre-configured "on file exists" action matrix.
+ *
+ * @param transfer The transfer object
+ * @param srcStat Source file information (if remote)
+ * @param dstStat Destination file information (if remote)
+ * @return A FileExistsWakeupEvent that will be sent to the engine
+ */
+ KFTPEngine::FileExistsWakeupEvent *fileExistsAction(KFTPQueue::TransferFile *transfer,
+ QValueList<KFTPEngine::DirectoryEntry> stat);
+
+ /**
+ * Spawn a new transfer.
+ *
+ * @param sourceUrl Source URL
+ * @param destinationUrl Destination URL
+ * @param size Filesize
+ * @param dir True if this transfer represents a directory
+ * @param ignoreSkip Ignore skiplist for this transfer
+ * @param insertToQueue Should the new transfer be queued
+ * @param parent Optional parent object
+ * @param noScan True if directory transfers shouldn't be scanned
+ * @return A valid KFTPQueue::Transfer instance
+ */
+ KFTPQueue::Transfer *spawnTransfer(KURL sourceUrl, KURL destinationUrl, filesize_t size, bool dir,
+ bool ignoreSkip = false, bool insertToQueue = true, QObject *parent = 0L, bool noScan = false);
+protected:
+ /**
+ * Global class instance.
+ */
+ static Manager *m_self;
+
+ /**
+ * Class constructor.
+ */
+ Manager();
+
+ /**
+ * Appends a new user dialog request.
+ *
+ * @param request Request instance
+ */
+ void appendUserDialogRequest(UserDialogRequest *request);
+
+ /**
+ * Processes the top user dialog request by opening the desired "file
+ * already exists" dialog.
+ */
+ void processUserDialogRequest();
+private:
+ QueueObject *m_topLevel;
+ QCache<QueueObject> m_queueObjectCache;
+
+ QMap<pid_t, OpenedFile> m_editProcessList;
+ QPtrList<KFTPQueue::FailedTransfer> m_failedTransfers;
+ KFTPQueueProcessor *m_queueProc;
+ KFTPQueueConverter *m_converter;
+
+ long m_lastQID;
+ bool m_emitUpdate;
+ bool m_processingQueue;
+
+ filesize_t m_curDownSpeed;
+ filesize_t m_curUpSpeed;
+
+ bool m_feDialogOpen;
+ FEAction m_defaultFeAction;
+ QPtrList<UserDialogRequest> m_userDialogRequests;
+private slots:
+ void slotQueueProcessingComplete();
+ void slotQueueProcessingAborted();
+
+ void slotEditProcessTerminated(KProcess *p);
+signals:
+ void newSite(KFTPQueue::Site*);
+ void newTransfer(KFTPQueue::Transfer*);
+
+ void transferRemoved(long);
+ void siteRemoved(long);
+
+ void queueUpdate();
+
+ void failedTransferNew(KFTPQueue::FailedTransfer*);
+ void failedTransferRemoved(long);
+};
+
+}
+
+#endif