• Skip to content
  • Skip to link menu
KDE 4.6 API Reference
  • KDE API Reference
  • kdelibs
  • KDE Home
  • Contact Us
 

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"

Plasma

Skip menu "Plasma"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

kdelibs

Skip menu "kdelibs"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • Kate
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
Generated for kdelibs by doxygen 1.7.3
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal