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

Plasma

  • 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
43namespace Plasma
44{
45
46class AccessManagerSingleton
47{
48 public:
49 AccessManager self;
50};
51
52K_GLOBAL_STATIC(AccessManagerSingleton, privateAccessManagerSelf)
53
54AccessManager *AccessManager::self()
55{
56 return &privateAccessManagerSelf->self;
57}
58
59AccessManager::AccessManager()
60 : QObject(),
61 d(new AccessManagerPrivate(this))
62{
63 KGlobal::dirs()->addResourceType("trustedkeys", "config", "trustedkeys/");
64}
65
66AccessManager::~AccessManager()
67{
68 delete d;
69}
70
71AccessAppletJob *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
92QList<PackageMetadata> AccessManager::remoteApplets() const
93{
94 return d->services.values();
95}
96
97QStringList AccessManager::supportedProtocols()
98{
99 QStringList list;
100 list << "plasma" << "plasma+zeroconf";
101 return list;
102}
103
104AccessManagerPrivate::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
119AccessManagerPrivate::~AccessManagerPrivate()
120{
121 delete browser;
122}
123
124void AccessManagerPrivate::slotJobFinished(KJob *job)
125{
126 emit q->finished(static_cast<AccessAppletJob*>(job));
127}
128
129void 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
172void 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"
accessmanager.h
authorizationmanager.h
KJob
Plasma::AccessAppletJob
This class is used for asynchronously accessing an applet published on a remote system.
Definition: accessappletjob.h:43
Plasma::AccessManager
Allows access to remote Plasma::Applet classes.
Definition: accessmanager.h:55
Plasma::AccessManager::finished
void finished(Plasma::AccessAppletJob *)
fires when an AccessAppletJob is finished.
Plasma::AccessManager::self
static AccessManager * self()
Singleton pattern accessor.
Definition: accessmanager.cpp:54
Plasma::AuthorizationManager::self
static AuthorizationManager * self()
Singleton pattern accessor.
Definition: authorizationmanager.cpp:64
QObject
Plasma
Namespace for everything in libplasma.
Definition: abstractdialogmanager.cpp:25
service.h
serviceaccessjob.h
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Mon Feb 20 2023 00:00:00 by doxygen 1.9.6 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-4.14.38 API Reference

Skip menu "kdelibs-4.14.38 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
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • Nepomuk
  • Plasma
  • Solid
  • Sonnet
  • ThreadWeaver
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