mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 02:42:52 +00:00

this will reject URLs such as https://foobar.com/ because kget cannot handle such even tho KIO can get the page content (without the filename component there is no telling what kget should save the URLs as, the destination has to completed with filename manually) Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
310 lines
12 KiB
C++
310 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,
|
|
NoFileName,
|
|
|
|
//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. torrent files 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
|