[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs
From: David Faure <faure () kde ! org>
Date: 2010-10-11 21:52:51
Message-ID: 20101011215251.DA7FAAC894 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1184941 by dfaure:
Add support for defining "helper protocols" (e.g. "mailto URLs should launch the \
executable kmailservice") using .desktop files (with a custom mimetype, \
x-scheme-handler/mailto, as added to shared-mime-info recently) rather than using \
.protocol files (which are KDE-specific). Converted the two in KIO, but the code can \
still handle old-style .protocol files. Unit-tested.
M +1 -0 kdecore/services/kmimetype.cpp
M +1 -0 kdecore/services/kmimetypetrader.cpp
M +17 -9 kdecore/sycoca/kprotocolinfo.cpp
M +18 -0 kdecore/tests/kmimetypetest.cpp
M +1 -0 kdecore/tests/kmimetypetest.h
M +13 -10 kded/kbuildmimetypefactory.cpp
M +2 -0 kded/kbuildmimetypefactory.h
M +10 -3 kded/kbuildservicefactory.cpp
M +3 -3 kio/misc/CMakeLists.txt
A kio/misc/kmailservice.desktop kio/misc/kmailservice.protocol#1184154
D kio/misc/kmailservice.protocol
A kio/misc/ktelnetservice.desktop kio/misc/telnet.protocol#1184154
D kio/misc/rlogin.protocol
D kio/misc/ssh.protocol
D kio/misc/telnet.protocol
--- trunk/KDE/kdelibs/kdecore/services/kmimetype.cpp #1184940:1184941
@@ -66,6 +66,7 @@
// This could be done faster...
KMimeType::List lst;
Q_FOREACH(const QString& mimeType, KMimeTypeFactory::self()->allMimeTypes()) {
+ if (!mimeType.startsWith("x-scheme-handler"))
lst.append(KMimeType::mimeType(mimeType));
}
return lst;
--- trunk/KDE/kdelibs/kdecore/services/kmimetypetrader.cpp #1184940:1184941
@@ -59,6 +59,7 @@
KMimeTypeFactory *factory = KMimeTypeFactory::self();
const int offset = factory->entryOffset(mime);
if ( !offset ) {
+ if (!mimeType.startsWith("x-scheme-handler/")) // don't warn for unknown \
scheme handler mimetypes
kWarning(7014) << "KMimeTypeTrader: mimeType" << mimeType << "not found";
return lst; // empty
}
--- trunk/KDE/kdelibs/kdecore/sycoca/kprotocolinfo.cpp #1184940:1184941
@@ -21,6 +21,7 @@
#include "kprotocolinfo_p.h"
#include "kprotocolinfofactory.h"
+#include <kmimetypetrader.h>
#include <kstandarddirs.h>
#include <kglobal.h>
#include <kdebug.h>
@@ -301,15 +302,21 @@
return prot->m_determineMimetypeFromExtension;
}
-QString KProtocolInfo::exec( const QString& _protocol )
+QString KProtocolInfo::exec(const QString& protocol)
{
- KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
- if ( !prot )
- return QString();
-
+ KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
+ if ( prot ) {
return prot->m_exec;
}
+ // Maybe it's "helper protocol", i.e. launches an app?
+ const KService::Ptr service = \
KMimeTypeTrader::self()->preferredService("x-scheme-handler/" + protocol); + if \
(service) + return service->exec();
+
+ return QString();
+}
+
KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KUrl &url )
{
KProtocolInfo::Ptr prot = \
KProtocolInfoFactory::self()->findProtocol(url.protocol()); @@ -419,10 +426,11 @@
{
// We call the findProtocol directly (not via KProtocolManager) to bypass any \
proxy settings. KProtocolInfo::Ptr prot = \
KProtocolInfoFactory::self()->findProtocol(protocol);
- if ( !prot )
- return false;
+ if ( prot )
+ return prot->m_isHelperProtocol;
- return prot->m_isHelperProtocol;
+ const KService::Ptr service = \
KMimeTypeTrader::self()->preferredService("x-scheme-handler/" + protocol); + return \
!service.isNull(); }
bool KProtocolInfo::isKnownProtocol( const KUrl &url )
@@ -434,7 +442,7 @@
{
// We call the findProtocol (const QString&) to bypass any proxy settings.
KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
- return prot;
+ return prot || isHelperProtocol(protocol);
}
QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field ) {
--- trunk/KDE/kdelibs/kdecore/tests/kmimetypetest.cpp #1184940:1184941
@@ -892,4 +892,22 @@
f.waitForFinished();
}
+void KMimeTypeTest::testHelperProtocols()
+{
+ QVERIFY(KProtocolInfo::isKnownProtocol("mailto"));
+ QVERIFY(KProtocolInfo::isHelperProtocol("mailto"));
+ QVERIFY(KProtocolInfo::isHelperProtocol(KUrl("mailto:faure@kde.org")));
+ QCOMPARE(KProtocolInfo::exec("mailto"), QString::fromLatin1("kmailservice %u"));
+ QVERIFY(!KProtocolInfo::isHelperProtocol("http"));
+ QVERIFY(!KProtocolInfo::isHelperProtocol("ftp"));
+ QVERIFY(!KProtocolInfo::isHelperProtocol("file"));
+ QVERIFY(!KProtocolInfo::isHelperProtocol("unknown"));
+ QVERIFY(KProtocolInfo::isHelperProtocol("telnet"));
+
+ // To test that compat still works
+ if (KProtocolInfo::isKnownProtocol("tel")) {
+ QVERIFY(KProtocolInfo::isHelperProtocol("tel"));
+ }
+}
+
#include "kmimetypetest.moc"
--- trunk/KDE/kdelibs/kdecore/tests/kmimetypetest.h #1184940:1184941
@@ -58,6 +58,7 @@
void testExtractKnownExtension();
void testParseMagicFile_data();
void testParseMagicFile();
+ void testHelperProtocols();
void testThreads();
private:
--- trunk/KDE/kdelibs/kded/kbuildmimetypefactory.cpp #1184940:1184941
@@ -101,16 +101,6 @@
void KBuildMimeTypeFactory::saveHeader(QDataStream &str)
{
KSycocaFactory::saveHeader(str);
-#if 0
- // This header is read by old KMimeTypeFactory's constructor
- // KDE5: remove
- str << (qint32) 0; // m_fastPatternOffset
- str << (qint32) 0; // old "other pattern offset"
- str << (qint32) 0;
- str << (qint32) 0; // m_highWeightPatternOffset
- str << (qint32) 0; // m_lowWeightPatternOffset
- str << (qint32) 0;
-#endif
}
void KBuildMimeTypeFactory::save(QDataStream &str)
@@ -127,3 +117,16 @@
// Seek to end.
str.device()->seek(endOfFactoryData);
}
+
+void KBuildMimeTypeFactory::createFakeMimeType(const QString& name)
+{
+ const QString file = name; // hack
+ KSycocaEntry::Ptr entry = m_entryDict->value(file);
+ if (!entry) {
+ MimeTypeEntry* e = new MimeTypeEntry(file, name);
+ entry = e;
+ }
+
+ Q_ASSERT(entry && entry->isValid());
+ addEntry(entry);
+}
--- trunk/KDE/kdelibs/kded/kbuildmimetypefactory.h #1184940:1184941
@@ -54,6 +54,8 @@
virtual MimeTypeEntry * createEntry( int ) const { assert(0); return 0L; }
+ void createFakeMimeType(const QString& name);
+
/**
* Write out mime type specific index files.
*/
--- trunk/KDE/kdelibs/kded/kbuildservicefactory.cpp #1184940:1184941
@@ -253,18 +253,22 @@
m_offerHash.addServiceOffer(stName, KServiceOffer(service, \
preference, 0, service->allowAsDefault()) ); } else {
KMimeType::Ptr mime = KMimeType::mimeType(stName, \
KMimeType::ResolveAliases);
- if (mime) {
- m_offerHash.addServiceOffer(stName, KServiceOffer(service, \
serviceTypeList[i].preference, 0, service->allowAsDefault()) ); + if \
(!mime) { + if (stName.startsWith("x-scheme-handler/")) {
+ // Create those on demand
+ m_mimeTypeFactory->createFakeMimeType(stName);
} else {
kDebug(7021) << service->entryPath() << "specifies undefined \
mimetype/servicetype" << stName;
- continue;
// technically we could call addServiceOffer here, 'mime' isn't \
used. But it
// would be useless, since the loops for writing out the offers \
iterate
// over all known servicetypes and mimetypes. Unknown -> never \
written out. + continue;
}
}
+ m_offerHash.addServiceOffer(stName, KServiceOffer(service, \
serviceTypeList[i].preference, 0, service->allowAsDefault()) ); }
}
+ }
// Read user preferences (added/removed associations) and add/remove \
serviceoffers to m_offerHash KMimeAssociations mimeAssociations(m_offerHash);
@@ -278,6 +282,9 @@
int offersOffset = 0;
const int offerEntrySize = sizeof( qint32 ) * 4; // four qint32s, see \
saveOfferList.
+ // TODO: idea: we could iterate over m_offerHash, and look up the servicetype or \
mimetype. + // Would that be faster than iterating over all servicetypes and \
mimetypes? +
KSycocaEntryDict::const_iterator itstf = \
m_serviceTypeFactory->entryDict()->constBegin();
const KSycocaEntryDict::const_iterator endstf = \
m_serviceTypeFactory->entryDict()->constEnd(); for( ; itstf != endstf; ++itstf ) {
--- trunk/KDE/kdelibs/kio/misc/CMakeLists.txt #1184940:1184941
@@ -19,8 +19,8 @@
target_link_libraries(kmailservice ${KDE4_KDEUI_LIBS} )
install(TARGETS kmailservice DESTINATION ${LIBEXEC_INSTALL_DIR} )
+install(FILES kmailservice.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
-
########### next target ###############
set(ktelnetservice_SRCS ktelnetservice.cpp )
@@ -31,11 +31,11 @@
target_link_libraries(ktelnetservice ${KDE4_KDEUI_LIBS} )
install(TARGETS ktelnetservice DESTINATION ${LIBEXEC_INSTALL_DIR} )
+install(FILES ktelnetservice.desktop DESTINATION ${XDG_APPS_INSTALL_DIR})
-
########### install files ###############
-install( FILES kmailservice.protocol telnet.protocol rlogin.protocol rtsp.protocol \
ssh.protocol mms.protocol mmst.protocol mmsu.protocol pnm.protocol rtspt.protocol \
rtspu.protocol DESTINATION ${SERVICES_INSTALL_DIR} ) +install( FILES rtsp.protocol \
mms.protocol mmst.protocol mmsu.protocol pnm.protocol rtspt.protocol rtspu.protocol \
DESTINATION ${SERVICES_INSTALL_DIR} )
# install the fileshareset and filesharelist scripts, they are not required on \
windows if (UNIX)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic