mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 19:02:53 +00:00
311 lines
12 KiB
C
311 lines
12 KiB
C
![]() |
/***************************************************************************
|
||
|
* Copyright (C) 2010 Matthias Fuchs <mat69@gmx.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 WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 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 Street, Fifth Floor, Boston, MA 02110-1301 USA . *
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef KGET_URL_CHECKER_H
|
||
|
#define KGET_URL_CHECKER_H
|
||
|
|
||
|
#include "../kget_export.h"
|
||
|
|
||
|
#include <KUrl>
|
||
|
|
||
|
class Transfer;
|
||
|
class TransferHandler;
|
||
|
|
||
|
/**
|
||
|
* This class provides static methods to check if urls are valid, and if not
|
||
|
* provides enums to see what is not valid and provides translated error messages
|
||
|
*/
|
||
|
class KGET_EXPORT UrlChecker
|
||
|
{
|
||
|
public:
|
||
|
enum UrlType {
|
||
|
Source,
|
||
|
Destination,
|
||
|
Folder
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Before using UrlChecker you have to specify a type
|
||
|
* You can either do that in the constructor and later
|
||
|
* via setType
|
||
|
*
|
||
|
* @see setType
|
||
|
*/
|
||
|
explicit UrlChecker(UrlType type);
|
||
|
~UrlChecker();
|
||
|
|
||
|
/**
|
||
|
* Removes duplicates of a list of urls
|
||
|
*/
|
||
|
static void removeDuplicates(KUrl::List &urls);
|
||
|
|
||
|
//NOTE only first found error is reported, i.e. NotWriteable before ExistingFile if both are the case
|
||
|
enum UrlError {
|
||
|
//General
|
||
|
NoError = 0,
|
||
|
Empty,
|
||
|
Invalid,
|
||
|
|
||
|
//Source only
|
||
|
NoProtocol,
|
||
|
NoHost,
|
||
|
|
||
|
//Destination and Folder only
|
||
|
NotWriteable
|
||
|
};
|
||
|
|
||
|
enum UrlWarning {
|
||
|
NoWarning = 0,
|
||
|
//Source and Destination only
|
||
|
ExistingFinishedTransfer,
|
||
|
ExistingTransfer,
|
||
|
|
||
|
//Destination only
|
||
|
ExistingFile
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Folder:
|
||
|
* Checks if the destination url points to is a folder that is writeable and existent.
|
||
|
*
|
||
|
* Destination:
|
||
|
* Checks if url points to a file (can be non-existent) and if the
|
||
|
* directory this file is (would) be in is existent and writeable
|
||
|
*
|
||
|
* @param type all types supported here
|
||
|
* @param showNotification true shows a notification if an error is found
|
||
|
* @note checkExisting is not done within this method
|
||
|
* @note you can use the convenience methods checkSource, checkDestination, checkFolder
|
||
|
* directly
|
||
|
* @see checkExisting
|
||
|
*/
|
||
|
static UrlError checkUrl(const KUrl &url, const UrlType type, bool showNotification = false);
|
||
|
|
||
|
/**
|
||
|
* Convenience method of checkUrl
|
||
|
* @param showNotification true shows a notification if an error is found
|
||
|
*/
|
||
|
static UrlError checkSource(const KUrl &source, bool showNotification = false);
|
||
|
|
||
|
/**
|
||
|
* Convenience method of checkUrl
|
||
|
* @param showNotification true shows a notification if an error is found
|
||
|
*/
|
||
|
static UrlError checkDestination(const KUrl &destination, bool showNotification = false);
|
||
|
|
||
|
/**
|
||
|
* Convenience method of checkUrl
|
||
|
* @param showNotification true shows a notification if an error is found
|
||
|
*/
|
||
|
static UrlError checkFolder(const KUrl &folder, bool showNotification = false);
|
||
|
|
||
|
/**
|
||
|
* Checks if source is local and exists already
|
||
|
* @note If both dest and source are the same and local, then false will be returned
|
||
|
* since it is assumed, that local files are either not handled by any
|
||
|
* transfer plugin or are e.g. metalink or torrent files otherwise and thus
|
||
|
* can have the same source/dest.
|
||
|
* Also keep in mind that false will be returned if dest is being removed
|
||
|
* at the moment. Avoid to ask a user twice in worst case.
|
||
|
*/
|
||
|
static bool wouldOverwrite(const KUrl &source, const KUrl &dest);
|
||
|
|
||
|
/**
|
||
|
* Checks if there is an existing transfer for url with type
|
||
|
* @param type *Source checks if there is a transfer with the same source
|
||
|
* *Destination checks if there is a transfer with the same destination
|
||
|
* @return if an existing transfer is found it will be returned,
|
||
|
* otherwise 0 will be returned
|
||
|
* @note checkUrl check is not done and UrlType Folder is not supported
|
||
|
* Keep in mind, that the same transfers could be found via Source and Destination!
|
||
|
* @see checkUrl
|
||
|
*/
|
||
|
static TransferHandler *existingTransfer(const KUrl &url, const UrlType type, UrlWarning *warning = 0);
|
||
|
|
||
|
/**
|
||
|
* @note UrlType folder is not supported, the result then is undefined!
|
||
|
*/
|
||
|
static KUrl::List hasExistingTransferMessages(const KUrl::List &urls, const UrlType type);
|
||
|
|
||
|
/**
|
||
|
* Get a describing message for UrlError
|
||
|
* @param url is only needed here to include it in some error messages,
|
||
|
* if url is empty, then it won't be used.
|
||
|
* @note this method does no checks, it only creates messages based on the error code
|
||
|
* @see checkUrl
|
||
|
*/
|
||
|
static QString message(const KUrl &url, const UrlType type, const UrlError error);
|
||
|
|
||
|
/**
|
||
|
* Get a describing message for UrlWarning
|
||
|
* @param url is only needed here to include it in some error messages,
|
||
|
* if url is empty, then it won't be used.
|
||
|
* @note this method does no checks, it only creates messages based on the warning code
|
||
|
* @see existingTransfer fileExists
|
||
|
*/
|
||
|
static QString message(const KUrl &url, const UrlType type, const UrlWarning warning);
|
||
|
|
||
|
/**
|
||
|
* Convenience method for multiple urls (urls can be empty)
|
||
|
* @see message
|
||
|
*/
|
||
|
static QString message(const KUrl::List &urls, const UrlType type, const UrlError error);
|
||
|
|
||
|
/**
|
||
|
* Convenience method for multiple urls (urls can be empty)
|
||
|
* @see message
|
||
|
*/
|
||
|
static QString message(const KUrl::List &urls, const UrlType type, const UrlWarning warning);
|
||
|
|
||
|
/**
|
||
|
* Takes an url to a source and an url to either the destination or a folder
|
||
|
* and returns a destination url.
|
||
|
*
|
||
|
* @param destOrFolder *is an existing folder then a file name derived from source
|
||
|
* will be appended to it and returned
|
||
|
* *otherwise no modification will be done and destOrFolder will be returned
|
||
|
* @note no checkUrl check happens!
|
||
|
* @see checkUrl
|
||
|
*/
|
||
|
static KUrl destUrl(const KUrl &destOrFolder, const KUrl &source, const QString &fileName = QString());
|
||
|
|
||
|
///Non static methods following
|
||
|
|
||
|
UrlType type() const;
|
||
|
|
||
|
/**
|
||
|
* Sets the type for the following operations to type
|
||
|
* @note calls clear
|
||
|
* @see clear
|
||
|
*/
|
||
|
void setType(UrlType type);
|
||
|
|
||
|
/**
|
||
|
* Clears all data, like correctUrls, errorUrls, responses from checkExistingFile ...
|
||
|
*/
|
||
|
void clear();
|
||
|
|
||
|
/**
|
||
|
* Checks url of type()
|
||
|
* @return UrlError, None if no error has been found
|
||
|
* @note checkExisting is not done within this method
|
||
|
* @note both this method and checkUrls() will store all correct
|
||
|
* urls in correctUrls() and the others in errorUrls() and
|
||
|
* splitErrorUrls()
|
||
|
*/
|
||
|
UrlError addUrl(const KUrl &url);
|
||
|
|
||
|
/**
|
||
|
* Does checkUrl for a list of urls.
|
||
|
* @return true if all urls are valid, false, if at least one url is invalid
|
||
|
* @note checkExisting is not done within this method
|
||
|
* @note both this method and checkUrl() will store all correct
|
||
|
* urls in correctUrls() and the others in errorUrls() and
|
||
|
* splitErrorUrls()
|
||
|
* @see addUrl
|
||
|
*/
|
||
|
bool addUrls(const KUrl::List &urls);
|
||
|
|
||
|
/**
|
||
|
* Displays error messages for the collected urls if any are needed
|
||
|
*/
|
||
|
void displayErrorMessages();
|
||
|
|
||
|
/**
|
||
|
* Returns the correct urls collected with the last call to urlCollectErrors
|
||
|
* @see urlCollectErrors
|
||
|
*/
|
||
|
KUrl::List correctUrls() const;
|
||
|
|
||
|
/**
|
||
|
* Checks all correctUrls() if there are existing Transfers
|
||
|
* for the specified UrlType and asks the user how to proceed.
|
||
|
*
|
||
|
* After this urls where the user decided that they should not be downloaded
|
||
|
* won't be in correctUrls anymore.
|
||
|
* @note UrlType folder is not supported, the result then is undefined!
|
||
|
* @return urls to download, after user interaction
|
||
|
* @see correctUrls errorUrls splitErrorUrls
|
||
|
*/
|
||
|
void existingTransfers();
|
||
|
|
||
|
/**
|
||
|
* Checks if the file at destination exists already, source needs to be defined
|
||
|
* to have a nice dialog and to make sure that both source and destination aren't
|
||
|
* the same
|
||
|
* @note This method does _not_ affect other methods like correctUrls or existingTransfers
|
||
|
* etc., though responses like overwrite all files are stored in case you call this method
|
||
|
* again you can clear that with clear.
|
||
|
* @return returns the destination to download the file to, if empty then the file
|
||
|
* should not be downloaded
|
||
|
* @see clear
|
||
|
*/
|
||
|
KUrl checkExistingFile(const KUrl &source, const KUrl &destination);
|
||
|
|
||
|
/**
|
||
|
* Returns all wrong urls
|
||
|
* @note the oder of the urls is not guaranteed to be the same as it initially was
|
||
|
* @see urlCollectErrors splitErrorUrls existingTransfers
|
||
|
*/
|
||
|
KUrl::List errorUrls()const;
|
||
|
|
||
|
/**
|
||
|
* Returns all wrong urls collected with the last call to urlCollectErrors
|
||
|
* or existingTransfers categorized by their errors
|
||
|
* @note urls without an error (UrlError == None) are not included
|
||
|
* @see urlCollectErrors correctUrls errorUrls existingTransfers
|
||
|
*/
|
||
|
QHash<UrlError, KUrl::List> splitErrorUrls() const;
|
||
|
|
||
|
private:
|
||
|
static TransferHandler *existingSource(const KUrl &url, UrlWarning &warning);
|
||
|
static TransferHandler *existingDestination(const KUrl &url, UrlWarning &warning);
|
||
|
static int hasExistingDialog(const KUrl &url, const UrlChecker::UrlType type, const UrlWarning warning);//TODO description --> returncode etc.!
|
||
|
static void removeTransfers(const QList<TransferHandler*> &toRemove);
|
||
|
|
||
|
enum ExistingDialogReturn {
|
||
|
Cancel = 0,
|
||
|
|
||
|
//old stuff is overwritten/deleted
|
||
|
Yes,
|
||
|
YesAll,
|
||
|
|
||
|
//new stuff is not used
|
||
|
No,
|
||
|
NoAll
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
UrlType m_type;
|
||
|
KUrl::List m_correctUrls;
|
||
|
QHash<UrlError, KUrl::List> m_splitErrorUrls;
|
||
|
|
||
|
QHash<UrlWarning, QPair<KUrl, Transfer*> > m_existingTransfers;
|
||
|
KUrl::List m_nonExistingUrls;
|
||
|
|
||
|
//Existing files stuff
|
||
|
bool m_cancle;
|
||
|
bool m_overwriteAll;
|
||
|
bool m_autoRenameAll;
|
||
|
bool m_skipAll;
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|