[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdenetwork/kget
From: David Narváez <david.narvaez () computer ! org>
Date: 2013-06-04 23:37:57
Message-ID: 20130604233757.98B0CAC85D () svn ! kde ! org
[Download RAW message or body]
SVN commit 1356916 by narvaez:
Merging work from GSoC 2011 on Metalink HTTP
Headers as planned feature for KDE SC 4.11
CCEMAIL: dahalaishraj@gmail.com
M +1 -1 core/transferhandler.h
M +2 -1 main.cpp
M +4 -2 transfer-plugins/metalink/CMakeLists.txt
A transfer-plugins/metalink/abstractmetalink.cpp [License: GPL (v2+)]
A transfer-plugins/metalink/abstractmetalink.h [License: GPL (v2+)]
M +1 -1 transfer-plugins/metalink/kget_metalinkfactory.desktop
D transfer-plugins/metalink/metalink.cpp
D transfer-plugins/metalink/metalink.h
M +17 -9 transfer-plugins/metalink/metalinkfactory.cpp
M +15 -4 transfer-plugins/metalink/metalinkfactory.h
A transfer-plugins/metalink/metalinkhttp.cpp [License: GPL (v2+)]
A transfer-plugins/metalink/metalinkhttp.h [License: GPL (v2+)]
A transfer-plugins/metalink/metalinkxml.cpp [License: GPL (v2+)]
A transfer-plugins/metalink/metalinkxml.h [License: GPL (v2+)]
M +165 -0 ui/metalinkcreator/metalinker.cpp
M +87 -1 ui/metalinkcreator/metalinker.h
--- trunk/KDE/kdenetwork/kget/core/transferhandler.h #1356915:1356916
@@ -28,7 +28,7 @@
* Class TransferHandler:
*
* --- Overview ---
- * This class is the rapresentation of a Transfer object from the views'
+ * This class is the representation of a Transfer object from the views'
* perspective (proxy pattern). In fact the views never handle directly the
* Transfer objects themselves (because this would break the model/view policy).
* As a general rule, all the code strictly related to the views should placed
--- trunk/KDE/kdenetwork/kget/main.cpp #1356915:1356916
@@ -105,7 +105,7 @@
QByteArray("2." + QByteArray::number(KDE_VERSION_MINOR) + \
'.' + QByteArray::number(KDE_VERSION_RELEASE)), ki18n("An advanced download manager \
for KDE"), KAboutData::License_GPL,
- ki18n("(C) 2005 - 2011, The KGet developers\n"
+ ki18n("(C) 2005 - 2012, The KGet developers\n"
"(C) 2001 - 2002, Patrick Charbonnier\n"
"(C) 2002, Carsten Pfeiffer\n"
"(C) 1998 - 2000, Matej Koss"),
@@ -117,6 +117,7 @@
aboutData.addAuthor(ki18n("Manolo Valdes"), ki18n("Core Developer, Multithreaded \
Plugin Author"), "nolis71cu@gmail.com");
aboutData.addAuthor(ki18n("Matthias Fuchs"), ki18n("Core Developer"), \
"mat69@gmx.net");
aboutData.addAuthor(ki18n("Javier Goday"), ki18n("Developer"), \
"jgoday@gmail.com"); + aboutData.addAuthor(ki18n("Aish Raj Dahal"), ki18n("Google \
Summer of Code Student"));
aboutData.addAuthor(ki18n("Ernesto Rodriguez Ortiz"), ki18n("Mms Plugin \
Author"), "eortiz@uci.cu");
aboutData.addAuthor(ki18n("Patrick Charbonnier"), ki18n("Former Developer"), \
"pch@freeshell.org");
aboutData.addAuthor(ki18n("Carsten Pfeiffer"), ki18n("Former Developer"), \
"pfeiffer@kde.org");
--- trunk/KDE/kdenetwork/kget/transfer-plugins/metalink/CMakeLists.txt \
#1356915:1356916 @@ -7,7 +7,9 @@
set(kget_metalinkfactory_PART_SRCS
metalinkfactory.cpp
- metalink.cpp
+ abstractmetalink.cpp
+ metalinkxml.cpp
+ metalinkhttp.cpp
fileselectiondlg.cpp
../../ui/metalinkcreator/metalinker.cpp
)
@@ -43,4 +45,4 @@
target_link_libraries(kcm_kget_metalinkfactory ${KDE4_KDEUI_LIBS} ${KDE4_KIO_LIBS})
install(TARGETS kcm_kget_metalinkfactory DESTINATION ${PLUGIN_INSTALL_DIR})
-install(FILES kget_metalinkfactory_config.desktop DESTINATION \
${SERVICES_INSTALL_DIR}) \ No newline at end of file
+install(FILES kget_metalinkfactory_config.desktop DESTINATION \
${SERVICES_INSTALL_DIR})
--- trunk/KDE/kdenetwork/kget/transfer-plugins/metalink/kget_metalinkfactory.desktop \
#1356915:1356916 @@ -115,7 +115,7 @@
# options for library loader
X-KDE-Library=kget_metalinkfactory
X-KDE-KGet-plugintype=TransferFactory
-X-KDE-KGet-rank=90
+X-KDE-KGet-rank=110
X-KDE-KGet-framework-version=1
X-KDE-PluginInfo-Author=Manolo Valdes
--- trunk/KDE/kdenetwork/kget/transfer-plugins/metalink/metalinkfactory.cpp \
#1356915:1356916 @@ -2,6 +2,7 @@
Copyright (C) 2004 Dario Massarin <nekkar@libero.it>
Copyright (C) 2007 Manolo Valdes <nolis71cu@gmail.com>
+ Copyright (C) 2012 Aish Raj Dahal <dahalaishraj@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
@@ -13,36 +14,43 @@
#include "core/scheduler.h"
#include "core/transfergroup.h"
-#include "metalink.h"
+#include "metalinkhttp.h"
+#include "metalinkxml.h"
#include <kdebug.h>
-KGET_EXPORT_PLUGIN( metalinkFactory )
+KGET_EXPORT_PLUGIN( MetalinkFactory )
-metalinkFactory::metalinkFactory(QObject *parent, const QVariantList &args)
+MetalinkFactory::MetalinkFactory(QObject *parent, const QVariantList &args)
: TransferFactory(parent, args)
{
}
-metalinkFactory::~metalinkFactory()
+MetalinkFactory::~MetalinkFactory()
{
}
-Transfer * metalinkFactory::createTransfer( const KUrl &srcUrl, const KUrl &destUrl,
+Transfer * MetalinkFactory::createTransfer( const KUrl &srcUrl, const KUrl &destUrl,
TransferGroup * parent,
Scheduler * scheduler,
const QDomElement * e )
{
kDebug(5001) << "metalinkFactory::createTransfer";
- if (isSupported(srcUrl))
- {
- return new Metalink(parent, this, scheduler, srcUrl, destUrl, e);
+ m_metalinkHttpChecker = new KGetMetalink::MetalinkHttpParser(srcUrl);
+
+ if (m_metalinkHttpChecker->isMetalinkHttp()) {
+ //kDebug(5001) << "createtransfer:: This is metalinkhttp";
+ return new MetalinkHttp(parent,this,scheduler,srcUrl,destUrl,m_metalinkHttpChecker,e);
}
+ else if (isSupported(srcUrl)) {
+ //kDebug(5001) << "createtransfer:: This is metalink / xml";
+ return new MetalinkXml(parent, this, scheduler, srcUrl, destUrl, e);
+ }
return 0;
}
-bool metalinkFactory::isSupported(const KUrl &url) const
+bool MetalinkFactory::isSupported(const KUrl &url) const
{
return (url.fileName().endsWith(QLatin1String(".metalink")) || \
url.fileName().endsWith(QLatin1String(".meta4"))); }
--- trunk/KDE/kdenetwork/kget/transfer-plugins/metalink/metalinkfactory.h \
#1356915:1356916 @@ -1,6 +1,7 @@
/* This file is part of the KDE project
Copyright (C) 2004 Dario Massarin <nekkar@libero.it>
+ Copyright (C) 2012 Aish Raj Dahal <dahalaishraj@gmail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
@@ -12,25 +13,35 @@
#define METALINK_FACTORY_H
#include "core/plugin/transferfactory.h"
+#include "ui/metalinkcreator/metalinker.h"
class Transfer;
class TransferGroup;
class Scheduler;
-class metalinkFactory : public TransferFactory
+
+class MetalinkFactory : public TransferFactory
{
Q_OBJECT
public:
- metalinkFactory(QObject *parent, const QVariantList &args);
- ~metalinkFactory();
+ MetalinkFactory(QObject *parent, const QVariantList &args);
+ ~MetalinkFactory();
Transfer * createTransfer( const KUrl &srcUrl, const KUrl &destUrl,
TransferGroup * parent, Scheduler * scheduler,
const QDomElement * e = 0 );
QString displayName(){return "MetaLink";}
+ /**
+ * Checks if a URL is supported by this plugin.
+ *
+ * @param The Url to be tested
+ * @return True if the URL is a metalink (xml or http).
+ */
+ bool isSupported(const KUrl &url) const;
- bool isSupported(const KUrl &url) const;
+ private:
+ KGetMetalink::MetalinkHttpParser *m_metalinkHttpChecker;
};
#endif
--- trunk/KDE/kdenetwork/kget/ui/metalinkcreator/metalinker.cpp #1356915:1356916
@@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net> *
+* Copyright (C) 2012 Aish Raj Dahal <dahalaishraj@gmail.com> *
* *
* 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 *
@@ -1334,3 +1335,167 @@
}
}
#endif //HAVE_NEPOMUK
+
+
+KGetMetalink::MetalinkHttpParser::~MetalinkHttpParser()
+{
+
+}
+
+QString* KGetMetalink::MetalinkHttpParser::getEtag()
+{
+ return &m_EtagValue;
+}
+
+void KGetMetalink::MetalinkHttpParser::checkMetalinkHttp()
+{
+ if (!m_Url.isValid()) {
+ kDebug() << "Url not valid";
+ return;
+ }
+
+ KIO::TransferJob *job;
+ job = KIO::get(m_Url);
+ job->addMetaData("PropagateHttpHeader", "true");
+ job->setRedirectionHandlingEnabled(false);
+ connect(job, SIGNAL(result(KJob*)), this, SLOT(slotHeaderResult(KJob*))); // \
Finished + connect(job, SIGNAL(redirection(KIO::Job*,KUrl)), this, \
SLOT(slotRedirection(KIO::Job*,KUrl))); // Redirection + \
connect(job,SIGNAL(mimetype(KIO::Job*,QString)),this,SLOT(detectMime(KIO::Job*,QString))); \
// Mime detection. + kDebug() << " Verifying Metalink/HTTP Status" ;
+ m_loop.exec();
+}
+
+void KGetMetalink::MetalinkHttpParser::detectMime(KIO::Job *job, const QString \
&type) +{
+ kDebug() << "Mime Type: " << type ;
+ job->kill();
+ m_loop.exit();
+}
+
+void KGetMetalink::MetalinkHttpParser::slotHeaderResult(KJob* kjob)
+{
+ KIO::Job* job = qobject_cast<KIO::Job*>(kjob);
+ const QString httpHeaders = job ? job->queryMetaData("HTTP-Headers") : \
QString(); + parseHeaders(httpHeaders);
+ setMetalinkHSatus();
+
+ // Handle the redirection... (Comment out if not desired)
+ if (m_redirectionUrl.isValid()) {
+ m_Url = m_redirectionUrl;
+ m_redirectionUrl = KUrl();
+ checkMetalinkHttp();
+ }
+
+}
+
+void KGetMetalink::MetalinkHttpParser::slotRedirection(KIO::Job *job, const KUrl & \
url) +{
+ Q_UNUSED(job)
+ m_redirectionUrl = url;
+}
+
+bool KGetMetalink::MetalinkHttpParser::isMetalinkHttp()
+{
+ if (m_MetalinkHSatus) {
+ kDebug() << "Metalink Http detected" ;
+ }
+ else {
+ kDebug() << "No Metalink HTTP response found" ;
+ }
+ return m_MetalinkHSatus;
+}
+
+void KGetMetalink::MetalinkHttpParser::parseHeaders(const QString &httpHeader)
+{
+ QString trimedHeader = httpHeader.mid(httpHeader.indexOf('\n') + 1).trimmed();
+
+ foreach(QString line, trimedHeader.split('\n')) {
+ int colon = line.indexOf(':');
+ QString headerName = line.left(colon).trimmed();
+ QString headerValue = line.mid(colon + 1).trimmed();
+ m_headerInfo.insertMulti(headerName, headerValue);
+ }
+
+ m_EtagValue = m_headerInfo.value("ETag");
+}
+
+void KGetMetalink::MetalinkHttpParser::setMetalinkHSatus()
+{
+ bool linkStatus, digestStatus;
+ linkStatus = digestStatus = false;
+ if (m_headerInfo.contains("link")) {
+ QList<QString> linkValues = m_headerInfo.values("link");
+
+ foreach(QString linkVal, linkValues) {
+ if (linkVal.contains("rel=duplicate")) {
+ linkStatus = true;
+ break;
+ }
+ }
+ }
+
+ if (m_headerInfo.contains("digest")) {
+ QList<QString> digestValues = m_headerInfo.values("digest");
+
+ foreach(QString digestVal, digestValues) {
+ if (digestVal.contains("sha-256", Qt::CaseInsensitive)) {
+ digestStatus = true;
+ break;
+ }
+ }
+ }
+
+ if ((linkStatus) && (digestStatus)) {
+ m_MetalinkHSatus = true;
+ }
+
+}
+
+KUrl KGetMetalink::MetalinkHttpParser::getUrl()
+{
+ return m_Url;
+}
+
+QMultiMap<QString, QString>* KGetMetalink::MetalinkHttpParser::getHeaderInfo()
+{
+ return & m_headerInfo;
+}
+
+bool KGetMetalink::httpLinkHeader::operator<(const httpLinkHeader &other) const
+{
+ return m_depth < other.m_depth;
+}
+
+void KGetMetalink::httpLinkHeader::headerBuilder(const QString &line)
+{
+ url = line.mid(line.indexOf("<") + 1,line.indexOf(">") -1).trimmed();
+ QList<QString> attribList = line.split(";");
+ foreach ( QString str, attribList) {
+ QString attribId = str.mid(0,str.indexOf("=")).trimmed();
+ QString attribValue = str.mid(str.indexOf("=")+1).trimmed();
+ if (attribId == "rel") {
+ m_reltype = attribValue;
+ }
+ if (attribId == "depth") {
+ m_depth = attribValue.toInt();
+ }
+ if (attribId == "geo") {
+ m_geo = attribValue;
+ }
+ if (attribId == "pref") {
+ m_pref = true;
+ }
+ if (attribId == "pri") {
+ priority = attribValue.toUInt();
+ }
+ if (attribId == "type") {
+ type = attribValue;
+ }
+
+ if (attribId == "name") {
+ name = attribValue;
+ }
+ }
+}
+
+#include "metalinker.moc"
--- trunk/KDE/kdenetwork/kget/ui/metalinkcreator/metalinker.h #1356915:1356916
@@ -1,5 +1,6 @@
/***************************************************************************
* Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net> *
+* Copyright (C) 2012 Aish Raj Dahal <dahalaishraj@gmail.com> *
* *
* 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 *
@@ -25,6 +26,9 @@
#include <KUrl>
#include <QDate>
#include <QDomElement>
+#include <QtCore/QEventLoop>
+#include <QtCore/QString>
+#include <QtCore/QObject>
#ifdef HAVE_NEPOMUK
namespace Nepomuk
@@ -248,7 +252,7 @@
bool isValid() const;
/**
- * Controlls if the name attribute is valid, i.e. it is not empty and
+ * Controls if the name attribute is valid, i.e. it is not empty and
* does not contain any directory traversal directives or information,
* as described in the Metalink 4.0 specification 4.1.2.1.
*/
@@ -412,6 +416,88 @@
#endif //HAVE_NEPOMUK
};
+class MetalinkHttpParser : public QObject
+{
+ Q_OBJECT
+ public:
+ MetalinkHttpParser(const KUrl& Url)
+ : m_Url(Url), m_MetalinkHSatus(false) , m_EtagValue(QString(""))
+ {
+ checkMetalinkHttp();
}
+ ~MetalinkHttpParser();
+
+ /**
+ * @return true if m_Url is a metalink/http supported URL.
+ */
+
+ bool isMetalinkHttp();
+
+ /**
+ * @return the Url m_Url which is being tested for metalink
+ */
+
+ KUrl getUrl();
+ QMultiMap<QString, QString>* getHeaderInfo();
+
+ /**
+ * @return Returns the ETag if present in the HTTP headers
+ */
+
+ QString* getEtag();
+
+ private slots:
+ void slotHeaderResult(KJob* kjob);
+ void checkMetalinkHttp();
+ void detectMime(KIO::Job * job, const QString & type);
+ void slotRedirection(KIO::Job*, const KUrl&);
+
+
+ private:
+ KUrl m_Url;
+ KUrl m_redirectionUrl;
+ bool m_MetalinkHSatus;
+ QEventLoop m_loop;
+ QMultiMap<QString, QString> m_headerInfo;
+ QString m_EtagValue ;
+
+ /**
+ * Parsees the Metalink values from QString to the Map
+ * @param Value of the QString ie raw HTTP headers
+ */
+ void parseHeaders(const QString&);
+
+ /**
+ * Sets the status of m_MetalinkHStatus to true if the URL is a Metalink
+ */
+ void setMetalinkHSatus();
+
+};
+
+class httpLinkHeader : public Metaurl
+{
+ public:
+ httpLinkHeader()
+ : m_pref(false)
+ {
+ }
+
+ QString m_reltype;
+ bool m_pref;
+ int m_depth;
+ QString m_geo;
+
+ /**
+ * Loads information from a header value into metalink header structure.
+ * @param Value of the "link" HTTP header response.
+ */
+ void headerBuilder(const QString &);
+
+ bool operator<(const httpLinkHeader &) const;
+
+};
+
+}
+
#endif // Metalinker_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic