Plasma
accessmanager.cpp
Go to the documentation of this file.
00001 /* 00002 * Copyright 2009 by Rob Scheepmaker <r.scheepmaker@student.utwente.nl> 00003 * 00004 * This library is free software; you can redistribute it and/or 00005 * modify it under the terms of the GNU Lesser General Public 00006 * License as published by the Free Software Foundation; either 00007 * version 2.1 of the License, or (at your option) any later version. 00008 * 00009 * This library is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 * Lesser General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU Lesser General Public 00015 * License along with this library; if not, write to the Free Software 00016 * Foundation, Inc., 51 Franklin St, Fifth Floor, 00017 * Boston, MA 02110-1301 USA 00018 */ 00019 00020 #include "accessmanager.h" 00021 #include "private/accessmanager_p.h" 00022 00023 #include "authorizationmanager.h" 00024 #include "service.h" 00025 #include "serviceaccessjob.h" 00026 #include "private/authorizationmanager_p.h" 00027 00028 #include "config-plasma.h" 00029 00030 #include <QtCore/QMap> 00031 #include <QtCore/QTimer> 00032 00033 #include <dnssd/remoteservice.h> 00034 #include <dnssd/servicebrowser.h> 00035 #include <kdebug.h> 00036 #include <kglobal.h> 00037 #include <kstandarddirs.h> 00038 #include <ktemporaryfile.h> 00039 #include <kurl.h> 00040 00041 #include <QtJolie/Message> 00042 00043 namespace Plasma 00044 { 00045 00046 class AccessManagerSingleton 00047 { 00048 public: 00049 AccessManager self; 00050 }; 00051 00052 K_GLOBAL_STATIC(AccessManagerSingleton, privateAccessManagerSelf) 00053 00054 AccessManager *AccessManager::self() 00055 { 00056 return &privateAccessManagerSelf->self; 00057 } 00058 00059 AccessManager::AccessManager() 00060 : QObject(), 00061 d(new AccessManagerPrivate(this)) 00062 { 00063 KGlobal::dirs()->addResourceType("trustedkeys", "config", "trustedkeys/"); 00064 } 00065 00066 AccessManager::~AccessManager() 00067 { 00068 delete d; 00069 } 00070 00071 AccessAppletJob *AccessManager::accessRemoteApplet(const KUrl &location) const 00072 { 00073 AuthorizationManager::self()->d->prepareForServiceAccess(); 00074 00075 KUrl resolvedLocation; 00076 if (location.protocol() == "plasma+zeroconf") { 00077 if (d->zeroconfServices.contains(location.host())) { 00078 resolvedLocation = d->services[location.host()].remoteLocation(); 00079 } else { 00080 kDebug() << "There's no zeroconf service with this name."; 00081 } 00082 } else { 00083 resolvedLocation = location; 00084 } 00085 00086 AccessAppletJob *job = new AccessAppletJob(resolvedLocation); 00087 connect(job, SIGNAL(finished(KJob*)), this, SLOT(slotJobFinished(KJob*))); 00088 QTimer::singleShot(0, job, SLOT(slotStart())); 00089 return job; 00090 } 00091 00092 QList<PackageMetadata> AccessManager::remoteApplets() const 00093 { 00094 return d->services.values(); 00095 } 00096 00097 QStringList AccessManager::supportedProtocols() 00098 { 00099 QStringList list; 00100 list << "plasma" << "plasma+zeroconf"; 00101 return list; 00102 } 00103 00104 AccessManagerPrivate::AccessManagerPrivate(AccessManager *manager) 00105 : q(manager), 00106 browser(new DNSSD::ServiceBrowser("_plasma._tcp")) 00107 { 00108 #ifdef ENABLE_REMOTE_WIDGETS 00109 q->connect(browser, SIGNAL(serviceAdded(DNSSD::RemoteService::Ptr)), 00110 q, SLOT(slotAddService(DNSSD::RemoteService::Ptr))); 00111 q->connect(browser, SIGNAL(serviceRemoved(DNSSD::RemoteService::Ptr)), 00112 q, SLOT(slotRemoveService(DNSSD::RemoteService::Ptr))); 00113 browser->startBrowse(); 00114 #else 00115 kWarning() << "libplasma is compiled without support for remote widgets. not monitoring remote widgets on the network"; 00116 #endif 00117 } 00118 00119 AccessManagerPrivate::~AccessManagerPrivate() 00120 { 00121 delete browser; 00122 } 00123 00124 void AccessManagerPrivate::slotJobFinished(KJob *job) 00125 { 00126 emit q->finished(static_cast<AccessAppletJob*>(job)); 00127 } 00128 00129 void AccessManagerPrivate::slotAddService(DNSSD::RemoteService::Ptr service) 00130 { 00131 kDebug(); 00132 if (!service->resolve()) { 00133 kDebug() << "Zeroconf service can't be resolved"; 00134 return; 00135 } 00136 00137 if (!services.contains(service->serviceName())) { 00138 PackageMetadata metadata; 00139 kDebug() << "textdata = " << service->textData(); 00140 kDebug() << "hostname: " << service->hostName(); 00141 QHostAddress address = DNSSD::ServiceBrowser::resolveHostName(service->hostName()); 00142 QString ip = address.toString(); 00143 kDebug() << "result for resolve = " << ip; 00144 00145 KUrl url(QString("plasma://%1:%2/%3").arg(ip) 00146 .arg(service->port()) 00147 .arg(service->serviceName())); 00148 00149 if (!service->textData().isEmpty()) { 00150 kDebug() << "service has got textdata"; 00151 QMap<QString, QByteArray> textData = service->textData(); 00152 metadata.setName(textData["name"]); 00153 metadata.setDescription(textData["description"]); 00154 metadata.setRemoteLocation(url.prettyUrl()); 00155 } else { 00156 kDebug() << "no textdata?"; 00157 metadata.setName(service->serviceName()); 00158 metadata.setRemoteLocation(url.prettyUrl()); 00159 } 00160 00161 kDebug() << "location = " << metadata.remoteLocation(); 00162 kDebug() << "name = " << metadata.name(); 00163 kDebug() << "description = " << metadata.name(); 00164 00165 services[service->serviceName()] = metadata; 00166 zeroconfServices[service->serviceName()] = service; 00167 emit q->remoteAppletAnnounced(metadata); 00168 } 00169 } 00170 00171 void AccessManagerPrivate::slotRemoveService(DNSSD::RemoteService::Ptr service) 00172 { 00173 kDebug(); 00174 emit q->remoteAppletUnannounced(services[service->serviceName()]); 00175 services.remove(service->serviceName()); 00176 zeroconfServices.remove(service->serviceName()); 00177 } 00178 00179 } // Plasma namespace 00180 00181 #include "accessmanager.moc"
KDE 4.6 API Reference