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

KIO

  • kio
  • kio
ksambashare.cpp
Go to the documentation of this file.
1/* This file is part of the KDE project
2 Copyright (c) 2004 Jan Schaefer <j_schaef@informatik.uni-kl.de>
3 Copyright 2010 Rodrigo Belem <rclbelem@gmail.com>
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License version 2 as published by the Free Software Foundation.
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 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA.
18*/
19
20#include "ksambashare.h"
21#include "ksambashare_p.h"
22#include "ksambasharedata.h"
23#include "ksambasharedata_p.h"
24
25#include <QtCore/QMap>
26#include <QtCore/QMutableMapIterator>
27#include <QtCore/QFile>
28#include <QtCore/QRegExp>
29#include <QtCore/QFileInfo>
30#include <QtCore/QTextStream>
31#include <QtCore/QStringList>
32
33#include <kdirwatch.h>
34#include <kdebug.h>
35#include <kglobal.h>
36#include <kprocess.h>
37#include <kuser.h>
38
39// Default smb.conf locations
40// sorted by priority, most priority first
41static const char * const DefaultSambaConfigFilePathList[] =
42{
43 "/etc/samba/smb.conf",
44 "/etc/smb.conf",
45 "/usr/local/etc/smb.conf",
46 "/usr/local/samba/lib/smb.conf",
47 "/usr/samba/lib/smb.conf",
48 "/usr/lib/smb.conf",
49 "/usr/local/lib/smb.conf"
50};
51static const int DefaultSambaConfigFilePathListSize = sizeof(DefaultSambaConfigFilePathList)
52 / sizeof(char*);
53
54KSambaSharePrivate::KSambaSharePrivate(KSambaShare *parent)
55 : q_ptr(parent)
56 , data()
57 , smbConf()
58 , userSharePath()
59 , skipUserShare(false)
60{
61 setUserSharePath();
62 findSmbConf();
63 sync();
64}
65
66KSambaSharePrivate::~KSambaSharePrivate()
67{
68}
69
70bool KSambaSharePrivate::isSambaInstalled()
71{
72 if (QFile::exists("/usr/sbin/smbd")
73 || QFile::exists("/usr/local/sbin/smbd")) {
74 return true;
75 }
76
77 kDebug() << "Samba is not installed!";
78
79 return false;
80}
81
82// Try to find the samba config file path
83// in several well-known paths
84bool KSambaSharePrivate::findSmbConf()
85{
86 for (int i = 0; i < DefaultSambaConfigFilePathListSize; ++i) {
87 const QString filePath(DefaultSambaConfigFilePathList[i]);
88 if (QFile::exists(filePath)) {
89 smbConf = filePath;
90 return true;
91 }
92 }
93
94 kWarning() << "KSambaShare: Could not find smb.conf!";
95
96 return false;
97}
98
99void KSambaSharePrivate::setUserSharePath()
100{
101 const QString rawString = testparmParamValue(QLatin1String("usershare path"));
102 const QFileInfo fileInfo(rawString);
103 if (fileInfo.isDir()) {
104 userSharePath = rawString;
105 }
106}
107
108int KSambaSharePrivate::runProcess(const QString &progName, const QStringList &args,
109 QByteArray &stdOut, QByteArray &stdErr)
110{
111 KProcess process;
112
113 process.setProgram(progName, args);
114 process.setOutputChannelMode(KProcess::SeparateChannels);
115 process.start();
116 //TODO: make it async in future
117 process.waitForFinished();
118
119 stdOut = process.readAllStandardOutput();
120 stdErr = process.readAllStandardError();
121 return process.exitCode();
122}
123
124QString KSambaSharePrivate::testparmParamValue(const QString &parameterName)
125{
126 if (!isSambaInstalled()) {
127 return QString();
128 }
129
130 QStringList args;
131 QByteArray stdErr;
132 QByteArray stdOut;
133
134 args << QLatin1String("-d0") << QLatin1String("-s") << QLatin1String("--parameter-name")
135 << parameterName;
136
137 runProcess(QLatin1String("testparm"), args, stdOut, stdErr);
138
139 //TODO: parse and process error messages.
140 // create a parser for the error output and
141 // send error message somewhere
142 if (!stdErr.isEmpty()) {
143 QList<QByteArray> err;
144 err << stdErr.trimmed().split('\n');
145 if ((err.count() == 2)
146 && err.at(0).startsWith("Load smb config files from")
147 && err.at(1).startsWith("Loaded services file OK.")) {
148 kDebug() << "Running testparm" << args;
149 } else {
150 kWarning() << "We got some errors while running testparm" << stdErr;
151 }
152 }
153
154 if (!stdOut.isEmpty()) {
155 return QString::fromLocal8Bit(stdOut.trimmed());
156 }
157
158 return QString();
159}
160
161QByteArray KSambaSharePrivate::getNetUserShareInfo()
162{
163 if (skipUserShare || !isSambaInstalled()) {
164 return QByteArray();
165 }
166
167 QStringList args;
168 QByteArray stdOut;
169 QByteArray stdErr;
170
171 args << QLatin1String("usershare") << QLatin1String("info");
172
173 runProcess(QLatin1String("net"), args, stdOut, stdErr);
174
175 if (!stdErr.isEmpty()) {
176 if (stdErr.contains("You do not have permission to create a usershare")) {
177 skipUserShare = true;
178 } else if (stdErr.contains("usershares are currently disabled")) {
179 skipUserShare = true;
180 } else {
181 //TODO: parse and process other error messages.
182 // create a parser for the error output and
183 // send error message somewhere
184 kWarning() << "We got some errors while running 'net usershare info'";
185 kWarning() << stdErr;
186 }
187 }
188
189 return stdOut;
190}
191
192QStringList KSambaSharePrivate::shareNames() const
193{
194 return data.keys();
195}
196
197QStringList KSambaSharePrivate::sharedDirs() const
198{
199 QStringList dirs;
200
201 QMap<QString, KSambaShareData>::ConstIterator i;
202 for (i = data.constBegin(); i != data.constEnd(); ++i) {
203 if (!dirs.contains(i.value().path())) {
204 dirs << i.value().path();
205 }
206 }
207
208 return dirs;
209}
210
211KSambaShareData KSambaSharePrivate::getShareByName(const QString &shareName) const
212{
213 return data.value(shareName);
214}
215
216QList<KSambaShareData> KSambaSharePrivate::getSharesByPath(const QString &path) const
217{
218 QList<KSambaShareData> shares;
219
220 QMap<QString, KSambaShareData>::ConstIterator i;
221 for (i = data.constBegin(); i != data.constEnd(); ++i) {
222 if (i.value().path() == path) {
223 shares << i.value();
224 }
225 }
226
227 return shares;
228}
229
230bool KSambaSharePrivate::isShareNameValid(const QString &name) const
231{
232 // Samba forbidden chars
233 const QRegExp notToMatchRx(QLatin1String("[%<>*\?|/\\+=;:\",]"));
234 return (notToMatchRx.indexIn(name) == -1);
235}
236
237bool KSambaSharePrivate::isDirectoryShared(const QString &path) const
238{
239 QMap<QString, KSambaShareData>::ConstIterator i;
240 for (i = data.constBegin(); i != data.constEnd(); ++i) {
241 if (i.value().path() == path) {
242 return true;
243 }
244 }
245
246 return false;
247}
248
249bool KSambaSharePrivate::isShareNameAvailable(const QString &name) const
250{
251 // Samba does not allow to name a share with a user name registered in the system
252 return (!KUser::allUserNames().contains(name) || !data.keys().contains(name));
253}
254
255KSambaShareData::UserShareError KSambaSharePrivate::isPathValid(const QString &path) const
256{
257 QFileInfo pathInfo = path;
258
259 if (!pathInfo.exists()) {
260 return KSambaShareData::UserSharePathNotExists;
261 }
262
263 if (!pathInfo.isDir()) {
264 return KSambaShareData::UserSharePathNotDirectory;
265 }
266
267 if (pathInfo.isRelative()) {
268 if (pathInfo.makeAbsolute()) {
269 return KSambaShareData::UserSharePathNotAbsolute;
270 }
271 }
272
273 // TODO: check if the user is root
274 if (KSambaSharePrivate::testparmParamValue(QLatin1String("usershare owner only"))
275 == QLatin1String("Yes")) {
276 if (!pathInfo.permission(QFile::ReadUser | QFile::WriteUser)) {
277 return KSambaShareData::UserSharePathNotAllowed;
278 }
279 }
280
281 return KSambaShareData::UserSharePathOk;
282}
283
284KSambaShareData::UserShareError KSambaSharePrivate::isAclValid(const QString &acl) const
285{
286 const QRegExp aclRx("(?:(?:(\\w+\\s*)\\\\|)(\\w+\\s*):([fFrRd]{1})(?:,|))*");
287 // TODO: check if user is a valid smb user
288 return aclRx.exactMatch(acl) ? KSambaShareData::UserShareAclOk
289 : KSambaShareData::UserShareAclInvalid;
290}
291
292KSambaShareData::UserShareError KSambaSharePrivate::guestsAllowed(const
293 KSambaShareData::GuestPermission &guestok) const
294{
295 if (guestok == KSambaShareData::GuestsAllowed) {
296 if (KSambaSharePrivate::testparmParamValue("usershare allow guests")
297 == QLatin1String("No")) {
298 return KSambaShareData::UserShareGuestsNotAllowed;
299 }
300 }
301
302 return KSambaShareData::UserShareGuestsOk;
303}
304
305KSambaShareData::UserShareError KSambaSharePrivate::add(const KSambaShareData &shareData)
306{
307 // TODO:
308 // * check for usershare max shares
309
310 if (!isSambaInstalled()) {
311 return KSambaShareData::UserShareSystemError;
312 }
313
314 QStringList args;
315 QByteArray stdOut;
316 QByteArray stdErr;
317
318 if (data.contains(shareData.name())) {
319 if (data.value(shareData.name()).path() != shareData.path()) {
320 return KSambaShareData::UserShareNameInUse;
321 }
322 } else {
323 // It needs to be added here, otherwise another instance of KSambaShareDataPrivate
324 // will be created and added to data.
325 data.insert(shareData.name(), shareData);
326 }
327
328 QString guestok = QString("guest_ok=%1").arg(
329 (shareData.guestPermission() == KSambaShareData::GuestsNotAllowed)
330 ? QLatin1String("n") : QLatin1String("y"));
331
332 args << QLatin1String("usershare") << QLatin1String("add") << shareData.name()
333 << shareData.path() << shareData.comment() << shareData.acl() << guestok;
334
335 int ret = runProcess(QLatin1String("net"), args, stdOut, stdErr);
336
337 //TODO: parse and process error messages.
338 if (!stdErr.isEmpty()) {
339 // create a parser for the error output and
340 // send error message somewhere
341 kWarning() << "We got some errors while running 'net usershare add'" << args;
342 kWarning() << stdErr;
343 }
344
345 return (ret == 0) ? KSambaShareData::UserShareOk : KSambaShareData::UserShareSystemError;
346}
347
348KSambaShareData::UserShareError KSambaSharePrivate::remove(const KSambaShareData &shareData) const
349{
350 if (!isSambaInstalled()) {
351 return KSambaShareData::UserShareSystemError;
352 }
353
354 QStringList args;
355
356 if (!data.contains(shareData.name())) {
357 return KSambaShareData::UserShareNameInvalid;
358 }
359
360 args << QLatin1String("usershare") << QLatin1String("delete") << shareData.name();
361
362 int result = KProcess::execute(QLatin1String("net"), args);
363 return (result == 0) ? KSambaShareData::UserShareOk : KSambaShareData::UserShareSystemError;
364}
365
366bool KSambaSharePrivate::sync()
367{
368 const QRegExp headerRx(QLatin1String("^\\s*\\["
369 "([^%<>*\?|/\\+=;:\",]+)"
370 "\\]"));
371
372 const QRegExp OptValRx(QLatin1String("^\\s*([\\w\\d\\s]+)"
373 "="
374 "(.*)$"));
375
376 QTextStream stream(getNetUserShareInfo());
377 QString currentShare;
378 QStringList shareList;
379
380 while (!stream.atEnd()) {
381 const QString line = stream.readLine().trimmed();
382
383 if (headerRx.exactMatch(line)) {
384 currentShare = headerRx.cap(1).trimmed();
385 shareList << currentShare;
386
387 if (!data.contains(currentShare)) {
388 KSambaShareData shareData;
389 shareData.dd->name = currentShare;
390 data.insert(currentShare, shareData);
391 }
392 } else if (OptValRx.exactMatch(line)) {
393 const QString key = OptValRx.cap(1).trimmed();
394 const QString value = OptValRx.cap(2).trimmed();
395 KSambaShareData shareData = getShareByName(currentShare);
396
397 if (key == QLatin1String("path")) {
398 shareData.dd->path = value;
399 } else if (key == QLatin1String("comment")) {
400 shareData.dd->comment = value;
401 } else if (key == QLatin1String("usershare_acl")) {
402 shareData.dd->acl = value;
403 } else if (key == QLatin1String("guest_ok")) {
404 shareData.dd->guestPermission = value;
405 } else {
406 kWarning() << "Something nasty happen while parsing 'net usershare info'"
407 << "share:" << currentShare << "key:" << key;
408 }
409 } else if (line.trimmed().isEmpty()) {
410 continue;
411 } else {
412 return false;
413 }
414 }
415
416 QMutableMapIterator<QString, KSambaShareData> i(data);
417 while (i.hasNext()) {
418 i.next();
419 if (!shareList.contains(i.key())) {
420 i.remove();
421 }
422 }
423
424 return true;
425}
426
427void KSambaSharePrivate::_k_slotFileChange(const QString &path)
428{
429 sync();
430 kDebug() << "path changed:" << path;
431 Q_Q(KSambaShare);
432 emit q->changed();
433}
434
435KSambaShare::KSambaShare()
436 : QObject(0)
437 , d_ptr(new KSambaSharePrivate(this))
438{
439 Q_D(const KSambaShare);
440 if (QFile::exists(d->userSharePath)) {
441 KDirWatch::self()->addDir(d->userSharePath, KDirWatch::WatchFiles);
442 connect(KDirWatch::self(), SIGNAL(dirty(QString)), this,
443 SLOT(_k_slotFileChange(QString)));
444 }
445}
446
447KSambaShare::~KSambaShare()
448{
449 Q_D(const KSambaShare);
450 if (KDirWatch::exists() && KDirWatch::self()->contains(d->userSharePath)) {
451 KDirWatch::self()->removeDir(d->userSharePath);
452 }
453 delete d_ptr;
454}
455
456QString KSambaShare::smbConfPath() const
457{
458 Q_D(const KSambaShare);
459 return d->smbConf;
460}
461
462bool KSambaShare::isDirectoryShared(const QString &path) const
463{
464 Q_D(const KSambaShare);
465 return d->isDirectoryShared(path);
466}
467
468bool KSambaShare::isShareNameAvailable(const QString &name) const
469{
470 Q_D(const KSambaShare);
471 return d->isShareNameValid(name) && d->isShareNameAvailable(name);
472}
473
474QStringList KSambaShare::shareNames() const
475{
476 Q_D(const KSambaShare);
477 return d->shareNames();
478}
479
480QStringList KSambaShare::sharedDirectories() const
481{
482 Q_D(const KSambaShare);
483 return d->sharedDirs();
484}
485
486KSambaShareData KSambaShare::getShareByName(const QString &name) const
487{
488 Q_D(const KSambaShare);
489 return d->getShareByName(name);
490}
491
492QList<KSambaShareData> KSambaShare::getSharesByPath(const QString &path) const
493{
494 Q_D(const KSambaShare);
495 return d->getSharesByPath(path);
496}
497
498KSambaShare *KSambaShare::instance()
499{
500 K_GLOBAL_STATIC(KSambaShare, _instance)
501 return _instance;
502}
503
504#include "moc_ksambashare.cpp"
KDirWatch::self
static KDirWatch * self()
KDirWatch::removeDir
void removeDir(const QString &path)
KDirWatch::exists
static bool exists()
KDirWatch::addDir
void addDir(const QString &path, WatchModes watchModes=WatchDirOnly)
KDirWatch::WatchFiles
WatchFiles
KProcess
KProcess::start
void start()
KProcess::SeparateChannels
SeparateChannels
KProcess::setOutputChannelMode
void setOutputChannelMode(OutputChannelMode mode)
KProcess::execute
int execute(int msecs=-1)
KProcess::setProgram
void setProgram(const QString &exe, const QStringList &args=QStringList())
KSambaShareData
This class represents a Samba user share.
Definition: ksambasharedata.h:40
KSambaShareData::GuestPermission
GuestPermission
Definition: ksambasharedata.h:43
KSambaShareData::GuestsNotAllowed
@ GuestsNotAllowed
Definition: ksambasharedata.h:44
KSambaShareData::GuestsAllowed
@ GuestsAllowed
Definition: ksambasharedata.h:45
KSambaShareData::acl
QString acl() const
Returns a containing a string describing the permission added to the users, such as "[DOMAIN\]usernam...
Definition: ksambasharedata.cpp:68
KSambaShareData::comment
QString comment() const
Definition: ksambasharedata.cpp:63
KSambaShareData::UserShareError
UserShareError
Definition: ksambasharedata.h:48
KSambaShareData::UserSharePathOk
@ UserSharePathOk
Definition: ksambasharedata.h:54
KSambaShareData::UserShareNameInUse
@ UserShareNameInUse
Definition: ksambasharedata.h:53
KSambaShareData::UserShareSystemError
@ UserShareSystemError
Definition: ksambasharedata.h:67
KSambaShareData::UserShareGuestsOk
@ UserShareGuestsOk
Definition: ksambasharedata.h:64
KSambaShareData::UserShareAclOk
@ UserShareAclOk
Definition: ksambasharedata.h:60
KSambaShareData::UserShareAclInvalid
@ UserShareAclInvalid
Definition: ksambasharedata.h:61
KSambaShareData::UserShareNameInvalid
@ UserShareNameInvalid
Definition: ksambasharedata.h:52
KSambaShareData::UserSharePathNotAbsolute
@ UserSharePathNotAbsolute
Definition: ksambasharedata.h:58
KSambaShareData::UserSharePathNotExists
@ UserSharePathNotExists
Definition: ksambasharedata.h:56
KSambaShareData::UserSharePathNotAllowed
@ UserSharePathNotAllowed
Definition: ksambasharedata.h:59
KSambaShareData::UserShareOk
@ UserShareOk
Definition: ksambasharedata.h:49
KSambaShareData::UserShareGuestsNotAllowed
@ UserShareGuestsNotAllowed
Definition: ksambasharedata.h:66
KSambaShareData::UserSharePathNotDirectory
@ UserSharePathNotDirectory
Definition: ksambasharedata.h:57
KSambaShareData::guestPermission
KSambaShareData::GuestPermission guestPermission() const
Definition: ksambasharedata.cpp:73
KSambaShareData::path
QString path() const
Definition: ksambasharedata.cpp:58
KSambaShareData::name
QString name() const
Definition: ksambasharedata.cpp:53
KSambaSharePrivate
Definition: ksambashare_p.h:32
KSambaSharePrivate::_k_slotFileChange
void _k_slotFileChange(const QString &path)
Definition: ksambashare.cpp:427
KSambaSharePrivate::isShareNameAvailable
bool isShareNameAvailable(const QString &name) const
Definition: ksambashare.cpp:249
KSambaSharePrivate::add
KSambaShareData::UserShareError add(const KSambaShareData &shareData)
Definition: ksambashare.cpp:305
KSambaSharePrivate::isSambaInstalled
static bool isSambaInstalled()
Definition: ksambashare.cpp:70
KSambaSharePrivate::setUserSharePath
void setUserSharePath()
Definition: ksambashare.cpp:99
KSambaSharePrivate::isDirectoryShared
bool isDirectoryShared(const QString &path) const
Definition: ksambashare.cpp:237
KSambaSharePrivate::sharedDirs
QStringList sharedDirs() const
Definition: ksambashare.cpp:197
KSambaSharePrivate::findSmbConf
bool findSmbConf()
Definition: ksambashare.cpp:84
KSambaSharePrivate::KSambaSharePrivate
KSambaSharePrivate(KSambaShare *parent)
Definition: ksambashare.cpp:54
KSambaSharePrivate::getNetUserShareInfo
QByteArray getNetUserShareInfo()
Definition: ksambashare.cpp:161
KSambaSharePrivate::remove
KSambaShareData::UserShareError remove(const KSambaShareData &shareName) const
Definition: ksambashare.cpp:348
KSambaSharePrivate::getShareByName
KSambaShareData getShareByName(const QString &shareName) const
Definition: ksambashare.cpp:211
KSambaSharePrivate::testparmParamValue
static QString testparmParamValue(const QString &parameterName)
Definition: ksambashare.cpp:124
KSambaSharePrivate::isAclValid
KSambaShareData::UserShareError isAclValid(const QString &acl) const
Definition: ksambashare.cpp:284
KSambaSharePrivate::isShareNameValid
bool isShareNameValid(const QString &name) const
Definition: ksambashare.cpp:230
KSambaSharePrivate::isPathValid
KSambaShareData::UserShareError isPathValid(const QString &path) const
Definition: ksambashare.cpp:255
KSambaSharePrivate::getSharesByPath
QList< KSambaShareData > getSharesByPath(const QString &path) const
Definition: ksambashare.cpp:216
KSambaSharePrivate::runProcess
static int runProcess(const QString &progName, const QStringList &args, QByteArray &stdOut, QByteArray &stdErr)
Definition: ksambashare.cpp:108
KSambaSharePrivate::sync
bool sync()
Definition: ksambashare.cpp:366
KSambaSharePrivate::~KSambaSharePrivate
~KSambaSharePrivate()
Definition: ksambashare.cpp:66
KSambaSharePrivate::shareNames
QStringList shareNames() const
Definition: ksambashare.cpp:192
KSambaSharePrivate::guestsAllowed
KSambaShareData::UserShareError guestsAllowed(const KSambaShareData::GuestPermission &guestok) const
Definition: ksambashare.cpp:292
KSambaShare
This class lists Samba user shares and monitors them for addition, update and removal.
Definition: ksambashare.h:34
KSambaShare::smbConfPath
QString smbConfPath() const
Returns the path to the used smb.conf file or empty string if no file was found.
Definition: ksambashare.cpp:456
KSambaShare::isShareNameAvailable
bool isShareNameAvailable(const QString &name) const
Tests that a share name is valid and does not conflict with system users names or shares.
Definition: ksambashare.cpp:468
KSambaShare::~KSambaShare
virtual ~KSambaShare()
Definition: ksambashare.cpp:447
KSambaShare::getShareByName
KSambaShareData getShareByName(const QString &name) const
Returns the KSambaShareData object of the share name.
Definition: ksambashare.cpp:486
KSambaShare::getSharesByPath
QList< KSambaShareData > getSharesByPath(const QString &path) const
Returns a list of KSambaShareData matching the path.
Definition: ksambashare.cpp:492
KSambaShare::shareNames
QStringList shareNames() const
Returns the list of available shares.
Definition: ksambashare.cpp:474
KSambaShare::isDirectoryShared
bool isDirectoryShared(const QString &path) const
Whether or not the given path is shared by Samba.
Definition: ksambashare.cpp:462
KSambaShare::sharedDirectories
QStringList sharedDirectories() const
Returns a list of all directories shared by local users in Samba.
Definition: ksambashare.cpp:480
KSambaShare::instance
static KSambaShare * instance()
Definition: ksambashare.cpp:498
KUser::allUserNames
static QStringList allUserNames()
QList
QMap
QObject
K_GLOBAL_STATIC
#define K_GLOBAL_STATIC(TYPE, NAME)
kDebug
#define kDebug
kWarning
#define kWarning
kdebug.h
kdirwatch.h
kglobal.h
kprocess.h
DefaultSambaConfigFilePathListSize
static const int DefaultSambaConfigFilePathListSize
Definition: ksambashare.cpp:51
DefaultSambaConfigFilePathList
static const char *const DefaultSambaConfigFilePathList[]
Definition: ksambashare.cpp:41
ksambashare.h
ksambashare_p.h
ksambasharedata.h
ksambasharedata_p.h
kuser.h
dirs
KStandardDirs * dirs()
name
const char * name(StandardAction id)
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.

KIO

Skip menu "KIO"
  • 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