[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdenetwork/kdnssd/ioslave
From: Jakub Stachowski <qbast () go2 ! pl>
Date: 2008-03-03 20:03:38
Message-ID: 1204574618.772935.27194.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 781887 by qbast:
Make it actually work. Also some changes:
- removed support for helper protocols. They don't belong to ioslave - maybe plasma \
applet
- use hardcoded protocols. Configurability is good but let's not go overboard.
- added fish:// support
- temporarily removed support for multiple domains (default domain is always used) - \
kdirmodel does not like listing zeroconf://domain/_ftp._tcp/name from inside \
zeroconf:/_ftp._tcp/
BUGS: 158703, 121292
M +0 -1 CMakeLists.txt
D CONFIG_FORMAT
D _ftp._tcp
D _http._tcp
D _ldap._tcp
D _nfs._tcp
D _sftp-ssh._tcp
D _ssh._tcp
D _telnet._tcp
D _webdav._tcp
M +51 -127 dnssd.cpp
M +23 -17 dnssd.h
--- trunk/KDE/kdenetwork/kdnssd/ioslave/CMakeLists.txt #781886:781887
@@ -15,6 +15,5 @@
########### install files ###############
install( FILES zeroconf.protocol DESTINATION ${SERVICES_INSTALL_DIR})
-install( FILES _http._tcp _ftp._tcp _ldap._tcp _webdav._tcp _nfs._tcp _ssh._tcp \
_sftp-ssh._tcp DESTINATION ${DATA_INSTALL_DIR}/zeroconf) install( FILES \
zeroconf.desktop DESTINATION ${DATA_INSTALL_DIR}/remoteview)
--- trunk/KDE/kdenetwork/kdnssd/ioslave/dnssd.cpp #781886:781887
@@ -30,7 +30,6 @@
#include <kconfig.h>
#include <kconfiggroup.h>
-#include <kdebug.h>
#include <kmessagebox.h>
#include <kcomponentdata.h>
#include <kglobal.h>
@@ -45,38 +44,26 @@
#include <kprotocolmanager.h>
ZeroConfProtocol::ZeroConfProtocol(const QByteArray& protocol, const QByteArray \
&pool_socket, const QByteArray &app_socket)
- : SlaveBase(protocol, pool_socket, app_socket), browser(0),toResolve(0),
- configData(0)
-{}
+ : SlaveBase(protocol, pool_socket, app_socket), browser(0),toResolve(0)
+{
+ knownProtocols["_ftp._tcp"]=ProtocolData(i18n("FTP \
servers"),"ftp","path","u","p"); + \
knownProtocols["_webdav._tcp"]=ProtocolData(i18n("WebDav remote \
directory"),"webdav","path"); + \
knownProtocols["_sftp-ssh._tcp"]=ProtocolData(i18n("Remote disk \
(sftp)"),"sftp",QString(),"u","p"); + \
knownProtocols["_ssh._tcp"]=ProtocolData(i18n("Remote disk \
(fish)"),"fish",QString(),"u","p"); + \
knownProtocols["_nfs._tcp"]=ProtocolData(i18n("NFS remote directory"),"nfs","path"); \
+}
ZeroConfProtocol::~ZeroConfProtocol()
{
- delete configData;
}
void ZeroConfProtocol::get(const KUrl& url )
{
if (!dnssdOK()) return;
UrlType t = checkURL(url);
- switch (t) {
- case HelperProtocol:
- {
- resolveAndRedirect(url,true);
- mimeType("text/html");
- QString reply= "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; \
charset=utf-8\">\n";
- reply+="</head>\n<body>\n<h2>"+i18n("Requested service has been launched in \
separate window.");
- reply+="</h2>\n</body></html>";
- data(reply.toUtf8());
- data(QByteArray());
- finished();
- break;
- }
- case Service:
- resolveAndRedirect(url);
- break;
- default:
- error(ERR_MALFORMED_URL,i18n("invalid URL"));
- }
+ if (t==Service) resolveAndRedirect(url);
+ else error(ERR_MALFORMED_URL,i18n("invalid URL"));
+
}
void ZeroConfProtocol::mimetype(const KUrl& url )
{
@@ -86,26 +73,21 @@
UrlType ZeroConfProtocol::checkURL(const KUrl& url)
{
if (url.path()=="/") return RootDir;
- QString service, type, domain;
- dissect(url,service,type,domain);
+ QString service, type;
+ dissect(url,service,type);
const QString& proto = type.section('.',1,-1);
if (type[0]!='_' || (proto!="_udp" && proto!="_tcp")) return Invalid;
if (service.isEmpty()) return ServiceDir;
- if (!domain.isEmpty()) {
- if (!setConfig(type)) return Invalid;
- if (!configData->group("").readEntry("Exec").isNull()) return HelperProtocol;
- return (KProtocolInfo::isHelperProtocol( configData->group("").readEntry( \
"Protocol",
- type.section(".",0,0).mid(1)))) ? HelperProtocol : Service;
- }
- return Invalid;
+ if (!knownProtocols.contains(type)) return Invalid;
+ return Service;
}
-// URL zeroconf://domain/_http._tcp/some%20service
-// URL invitation://host:port/_http._tcp/some%20service?u=username&root=directory
-void ZeroConfProtocol::dissect(const KUrl& url,QString& name,QString& type,QString& \
domain) +// URL zeroconf:/_http._tcp/some%20service
+void ZeroConfProtocol::dissect(const KUrl& url,QString& name,QString& type)
{
+ // FIXME: encode domain name into url to support many services with the same name \
on + // different domains
type = url.path().section("/",1,1);
- domain = url.host();
name = url.path().section("/",2,-1);
}
@@ -141,80 +123,39 @@
case Service:
resolveAndRedirect(url);
break;
- case HelperProtocol:
- {
- QString name,type,domain;
- dissect(url,name,type,domain);
- buildServiceEntry(entry,name,type,domain);
- statEntry(entry);
- finished();
- break;
- }
default:
error(ERR_MALFORMED_URL,i18n("invalid URL"));
}
}
-QString ZeroConfProtocol::getAttribute(const QString& name)
-{
- QString entry = configData->group("").readEntry(name,QString());
- return (entry.isNull()) ? QString() : toResolve->textData()[entry];
-}
-void ZeroConfProtocol::resolveAndRedirect(const KUrl& url, bool useKRun)
+void ZeroConfProtocol::resolveAndRedirect(const KUrl& url)
{
- QString name,type,domain;
- dissect(url,name,type,domain);
- kDebug() << "Resolve for " << name << ", " << type << ", " << domain << "\n";
- if (toResolve!=0)
- if (toResolve->serviceName()==name && toResolve->type()==type &&
- toResolve->domain()==domain && toResolve->isResolved()) {
- } else {
- delete toResolve;
- toResolve = 0;
- }
+ QString name,type;
+ dissect(url,name,type);
+ if (toResolve!=0 && (toResolve->serviceName()!=name || toResolve->type()!=type)) {
+ delete toResolve;
+ toResolve = 0;
+ }
if (toResolve==0) {
- toResolve = new RemoteService(name,type,domain);
- // or maybe HOST_NOT_FOUND?
- if (!toResolve->resolve()) error(ERR_SERVICE_NOT_AVAILABLE,i18n("Unable to resolve \
service")); + toResolve = new RemoteService(name,type,"");
+ if (!toResolve->resolve()) error(ERR_DOES_NOT_EXIST,name);
}
KUrl destUrl;
- kDebug() << "Resolved: " << toResolve->hostName() << "\n";
- destUrl.setProtocol(getProtocol(type));
- destUrl.setUser(getAttribute("UserEntry"));
- destUrl.setPass(getAttribute("PasswordEntry"));
- destUrl.setPath(getAttribute("PathEntry"));
+ destUrl.setProtocol(knownProtocols[type].protocol);
+ if (!knownProtocols[type].userEntry.isNull())
+ destUrl.setUser(toResolve->textData()[knownProtocols[type].userEntry]);
+ if (!knownProtocols[type].passwordEntry.isNull())
+ destUrl.setPass(toResolve->textData()[knownProtocols[type].passwordEntry]);
+ if (!knownProtocols[type].pathEntry.isNull())
+ destUrl.setPath(toResolve->textData()[knownProtocols[type].pathEntry]);
destUrl.setHost(toResolve->hostName());
destUrl.setPort(toResolve->port());
- // get exec from config or try getting it from helper protocol
- if (useKRun)
- KRun::run(configData->group("").readEntry("Exec",
- KProtocolInfo::exec(getProtocol(type))),
- destUrl, 0);
- else {
- redirection(destUrl);
- finished();
- }
+ redirection(destUrl);
+ finished();
}
-bool ZeroConfProtocol::setConfig(const QString& type)
+void ZeroConfProtocol::buildDirEntry(UDSEntry& entry,const QString& name,const \
QString& type) {
- kDebug() << "Setting config for " << type;
- if (configData)
- if (configData->group("").readEntry("Type")!=type)
- {
- delete configData;
- configData =0L;
- }
- else
- return true;
- configData = new KConfig("zeroconf/"+type, KConfig::NoGlobals );
-
- return (configData->group("").readEntry("Type")==type);
-}
-
-
-void ZeroConfProtocol::buildDirEntry(UDSEntry& entry,const QString& name,const \
QString& type, const QString& host)
-{
entry.clear();
entry.insert(UDSEntry::UDS_NAME,name);
entry.insert(UDSEntry::UDS_ACCESS,0555);
@@ -222,31 +163,21 @@
entry.insert(UDSEntry::UDS_FILE_TYPE,S_IFDIR);
entry.insert(UDSEntry::UDS_MIME_TYPE,QString::fromUtf8("inode/directory"));
if (!type.isNull())
- entry.insert(UDSEntry::UDS_URL,"zeroconf:/"+((!host.isNull()) ? '/'+host+'/' : "" \
)+type+'/'); + entry.insert(UDSEntry::UDS_URL,"zeroconf:/"+type+'/');
}
-QString ZeroConfProtocol::getProtocol(const QString& type)
-{
- setConfig(type);
- return configData->group("").readEntry("Protocol",type.section(".",0,0).mid(1));
-}
-void ZeroConfProtocol::buildServiceEntry(UDSEntry& entry,const QString& name,const \
QString& type,const QString& domain) +void \
ZeroConfProtocol::buildServiceEntry(UDSEntry& entry,const QString& name,const \
QString& type) {
- setConfig(type);
entry.clear();
entry.insert(UDSEntry::UDS_NAME,name);
entry.insert(UDSEntry::UDS_ACCESS,0666);
- QString icon=configData->group("").readEntry("Icon",KProtocolInfo::icon(getProtocol(type)));
+ QString icon=KProtocolInfo::icon(knownProtocols[type].protocol);
if (!icon.isNull())
entry.insert(UDSEntry::UDS_ICON_NAME,icon);
KUrl protourl;
- protourl.setProtocol(getProtocol(type));
- QString encname = "zeroconf://" + domain +"/" +type+ "/" + name;
- if (KProtocolManager::supportsListing(protourl)) {
- entry.insert(UDSEntry::UDS_FILE_TYPE,S_IFDIR);
- encname+='/';
- } else
- entry.insert(UDSEntry::UDS_FILE_TYPE,S_IFREG);
+ protourl.setProtocol(knownProtocols[type].protocol);
+ QString encname = "zeroconf:/" +type+ "/" + name;
+ entry.insert(UDSEntry::UDS_FILE_TYPE,S_IFDIR);
entry.insert(UDSEntry::UDS_URL,encname);
}
@@ -256,12 +187,9 @@
if (!dnssdOK()) return;
UrlType t = checkURL(url);
UDSEntry entry;
- currentDomain=url.host();
switch (t) {
case RootDir:
- if (currentDomain.isEmpty())
- typebrowser = new ServiceTypeBrowser();
- else typebrowser = new ServiceTypeBrowser(url.host());
+ typebrowser = new ServiceTypeBrowser();
connect(typebrowser,SIGNAL(serviceTypeAdded(const QString&)),
this,SLOT(newType(const QString&)));
connect(typebrowser,SIGNAL(finished()),this,SLOT(allReported()));
@@ -291,9 +219,9 @@
UDSEntry entry;
listEntry(entry,true);
finished();
- delete browser;
+ browser->deleteLater();
browser=0;
- delete typebrowser;
+ typebrowser->deleteLater();
typebrowser=0;
mergedtypes.clear();
emit leaveModality();
@@ -303,18 +231,14 @@
if (mergedtypes.contains(type)>0) return;
mergedtypes << type;
UDSEntry entry;
- kDebug() << "Got new entry " << type;
- if (!setConfig(type)) return;
- QString name = configData->group("").readEntry("Name");
- if (!name.isNull()) {
- buildDirEntry(entry,name,type, (currentDomain.isEmpty()) ? QString::null : \
currentDomain); //krazy:exclude=nullstrassign for old broken gcc
- listEntry(entry,false);
- }
+ if (!knownProtocols.contains(type)) return;
+ buildDirEntry(entry,knownProtocols[type].name,type);
+ listEntry(entry,false);
}
void ZeroConfProtocol::newService(DNSSD::RemoteService::Ptr srv)
{
UDSEntry entry;
- buildServiceEntry(entry,srv->serviceName(),srv->type(),srv->domain());
+ buildServiceEntry(entry,srv->serviceName(),srv->type());
listEntry(entry,false);
}
void ZeroConfProtocol::enterLoop()
--- trunk/KDE/kdenetwork/kdnssd/ioslave/dnssd.h #781886:781887
@@ -36,8 +36,21 @@
using namespace KIO;
using namespace DNSSD;
-enum UrlType { RootDir, ServiceDir, Service, HelperProtocol, Invalid };
+enum UrlType { RootDir, ServiceDir, Service, Invalid };
+struct ProtocolData {
+ ProtocolData() {}
+ ProtocolData(const QString& _name, const QString& proto, const QString& \
path=QString(), + const QString& user=QString(), const QString& passwd=QString()) : \
pathEntry(path), + name(_name), userEntry(user), passwordEntry(passwd), \
protocol(proto) {} +
+ QString pathEntry;
+ QString name;
+ QString userEntry;
+ QString passwordEntry;
+ QString protocol;
+};
+
class ZeroConfProtocol : public QObject, public KIO::SlaveBase
{
Q_OBJECT
@@ -52,22 +65,16 @@
void leaveModality();
private:
// Create UDSEntry for zeroconf:/ or zeroconf:/type/ paths
- void buildDirEntry(UDSEntry& entry,const QString& name,const QString& \
type=QString(),
- const QString& host=QString());
+ void buildDirEntry(UDSEntry& entry,const QString& name,const QString& \
type=QString()); // Create UDSEntry for single services: dnssd:/type/service
- void buildServiceEntry(UDSEntry& entry,const QString& name,const QString& type,
- const QString& domain);
+ void buildServiceEntry(UDSEntry& entry,const QString& name,const QString& type);
// Returns root dir, service dir, service or invalid
UrlType checkURL(const KUrl& url);
- // extract name, type and domain from URL
- void dissect(const KUrl& url,QString& name,QString& type,QString& domain);
- // resolve given service and redirect() to it or use KRun on it (used for helper \
protocols)
- void resolveAndRedirect(const KUrl& url, bool useKRun = false);
+ // extract name and type from URL
+ void dissect(const KUrl& url,QString& name,QString& type);
+ // resolve given service and redirect() to it
+ void resolveAndRedirect(const KUrl& url);
bool dnssdOK();
- QString getAttribute(const QString& name);
- QString getProtocol(const QString& type);
- // try to load config file for given service type (or just return if already \
loaded)
- bool setConfig(const QString& type);
void enterLoop();
@@ -75,11 +82,10 @@
ServiceTypeBrowser* typebrowser;
// service types merged from all domains - to avoid duplicates
QStringList mergedtypes;
- // last resolved or still being resolved services - acts as one-entry cache
+
RemoteService *toResolve;
- // Config file for service - also acts as one-entry cache
- KConfig *configData;
- QString currentDomain;
+ QHash<QString,ProtocolData> knownProtocols;
+
private slots:
void newType(const QString&);
void newService(DNSSD::RemoteService::Ptr);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic