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

Plasma

  • sources
  • kde-4.12
  • kdelibs
  • plasma
  • remote
accessmanager.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2009 by Rob Scheepmaker <r.scheepmaker@student.utwente.nl>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA 02110-1301 USA
18  */
19 
20 #include "accessmanager.h"
21 #include "private/accessmanager_p.h"
22 
23 #include "authorizationmanager.h"
24 #include "service.h"
25 #include "serviceaccessjob.h"
26 #include "private/authorizationmanager_p.h"
27 
28 #include "config-plasma.h"
29 
30 #include <QtCore/QMap>
31 #include <QtCore/QTimer>
32 
33 #include <dnssd/remoteservice.h>
34 #include <dnssd/servicebrowser.h>
35 #include <kdebug.h>
36 #include <kglobal.h>
37 #include <kstandarddirs.h>
38 #include <ktemporaryfile.h>
39 #include <kurl.h>
40 
41 #include <QtJolie/Message>
42 
43 namespace Plasma
44 {
45 
46 class AccessManagerSingleton
47 {
48  public:
49  AccessManager self;
50 };
51 
52 K_GLOBAL_STATIC(AccessManagerSingleton, privateAccessManagerSelf)
53 
54 AccessManager *AccessManager::self()
55 {
56  return &privateAccessManagerSelf->self;
57 }
58 
59 AccessManager::AccessManager()
60  : QObject(),
61  d(new AccessManagerPrivate(this))
62 {
63  KGlobal::dirs()->addResourceType("trustedkeys", "config", "trustedkeys/");
64 }
65 
66 AccessManager::~AccessManager()
67 {
68  delete d;
69 }
70 
71 AccessAppletJob *AccessManager::accessRemoteApplet(const KUrl &location) const
72 {
73  AuthorizationManager::self()->d->prepareForServiceAccess();
74 
75  KUrl resolvedLocation;
76  if (location.protocol() == "plasma+zeroconf") {
77  if (d->zeroconfServices.contains(location.host())) {
78  resolvedLocation = d->services[location.host()].remoteLocation();
79  } else {
80  kDebug() << "There's no zeroconf service with this name.";
81  }
82  } else {
83  resolvedLocation = location;
84  }
85 
86  AccessAppletJob *job = new AccessAppletJob(resolvedLocation);
87  connect(job, SIGNAL(finished(KJob*)), this, SLOT(slotJobFinished(KJob*)));
88  QTimer::singleShot(0, job, SLOT(slotStart()));
89  return job;
90 }
91 
92 QList<PackageMetadata> AccessManager::remoteApplets() const
93 {
94  return d->services.values();
95 }
96 
97 QStringList AccessManager::supportedProtocols()
98 {
99  QStringList list;
100  list << "plasma" << "plasma+zeroconf";
101  return list;
102 }
103 
104 AccessManagerPrivate::AccessManagerPrivate(AccessManager *manager)
105  : q(manager),
106  browser(new DNSSD::ServiceBrowser("_plasma._tcp"))
107 {
108 #ifdef ENABLE_REMOTE_WIDGETS
109  q->connect(browser, SIGNAL(serviceAdded(DNSSD::RemoteService::Ptr)),
110  q, SLOT(slotAddService(DNSSD::RemoteService::Ptr)));
111  q->connect(browser, SIGNAL(serviceRemoved(DNSSD::RemoteService::Ptr)),
112  q, SLOT(slotRemoveService(DNSSD::RemoteService::Ptr)));
113  browser->startBrowse();
114 #else
115  kWarning() << "libplasma is compiled without support for remote widgets. not monitoring remote widgets on the network";
116 #endif
117 }
118 
119 AccessManagerPrivate::~AccessManagerPrivate()
120 {
121  delete browser;
122 }
123 
124 void AccessManagerPrivate::slotJobFinished(KJob *job)
125 {
126  emit q->finished(static_cast<AccessAppletJob*>(job));
127 }
128 
129 void AccessManagerPrivate::slotAddService(DNSSD::RemoteService::Ptr service)
130 {
131  kDebug();
132  if (!service->resolve()) {
133  kDebug() << "Zeroconf service can't be resolved";
134  return;
135  }
136 
137  if (!services.contains(service->serviceName())) {
138  PackageMetadata metadata;
139  kDebug() << "textdata = " << service->textData();
140  kDebug() << "hostname: " << service->hostName();
141  QHostAddress address = DNSSD::ServiceBrowser::resolveHostName(service->hostName());
142  QString ip = address.toString();
143  kDebug() << "result for resolve = " << ip;
144 
145  KUrl url(QString("plasma://%1:%2/%3").arg(ip)
146  .arg(service->port())
147  .arg(service->serviceName()));
148 
149  if (!service->textData().isEmpty()) {
150  kDebug() << "service has got textdata";
151  QMap<QString, QByteArray> textData = service->textData();
152  metadata.setName(textData["name"]);
153  metadata.setDescription(textData["description"]);
154  metadata.setIcon(textData["icon"]);
155  metadata.setRemoteLocation(url.prettyUrl());
156  } else {
157  kDebug() << "no textdata?";
158  metadata.setName(service->serviceName());
159  metadata.setRemoteLocation(url.prettyUrl());
160  }
161 
162  kDebug() << "location = " << metadata.remoteLocation();
163  kDebug() << "name = " << metadata.name();
164  kDebug() << "description = " << metadata.name();
165 
166  services[service->serviceName()] = metadata;
167  zeroconfServices[service->serviceName()] = service;
168  emit q->remoteAppletAnnounced(metadata);
169  }
170 }
171 
172 void AccessManagerPrivate::slotRemoveService(DNSSD::RemoteService::Ptr service)
173 {
174  kDebug();
175  emit q->remoteAppletUnannounced(services[service->serviceName()]);
176  services.remove(service->serviceName());
177  zeroconfServices.remove(service->serviceName());
178 }
179 
180 } // Plasma namespace
181 
182 #include "accessmanager.moc"
authorizationmanager.h
Plasma::AccessManager::remoteApplets
QList< PackageMetadata > remoteApplets() const
Definition: accessmanager.cpp:92
Plasma::AccessManager::finished
void finished(Plasma::AccessAppletJob *)
fires when an AccessAppletJob is finished.
QObject
Plasma::AuthorizationManager::self
static AuthorizationManager * self()
Singleton pattern accessor.
Definition: authorizationmanager.cpp:64
serviceaccessjob.h
Plasma::AccessManager
Allows access to remote Plasma::Applet classes.
Definition: accessmanager.h:54
accessmanager.h
Plasma::AccessManager::supportedProtocols
static QStringList supportedProtocols()
Definition: accessmanager.cpp:97
Plasma::AccessManager::self
static AccessManager * self()
Singleton pattern accessor.
Definition: accessmanager.cpp:54
Plasma::AccessAppletJob
This class is used for asynchronously accessing an applet published on a remote system.
Definition: accessappletjob.h:42
Plasma::AccessManager::accessRemoteApplet
AccessAppletJob * accessRemoteApplet(const KUrl &location) const
Access a native plasmoid hosted on another machine.
Definition: accessmanager.cpp:71
service.h
KJob
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:48:32 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

Plasma

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

kdelibs API Reference

Skip menu "kdelibs API Reference"
  • DNSSD
  • Interfaces
  •   KHexEdit
  •   KMediaPlayer
  •   KSpeech
  •   KTextEditor
  • kconf_update
  • KDE3Support
  •   KUnitTest
  • KDECore
  • KDED
  • KDEsu
  • KDEUI
  • KDEWebKit
  • KDocTools
  • KFile
  • KHTML
  • KImgIO
  • KInit
  • kio
  • KIOSlave
  • KJS
  •   KJS-API
  • kjsembed
  •   WTF
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Nepomuk-Core
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal