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

KDECore

  • kdecore
  • sycoca
kprotocolinfo.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2  Copyright (C) 1999 Torben Weis <weis@kde.org>
3  Copyright (C) 2003 Waldo Bastian <bastian@kde.org>
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 "kprotocolinfo.h"
21 #include "kprotocolinfo_p.h"
22 #include "kprotocolinfofactory.h"
23 
24 #include <kmimetypetrader.h>
25 #include <kstandarddirs.h>
26 #include <kconfig.h>
27 #include <kconfiggroup.h>
28 
29 //
30 // Internal functions:
31 //
32 KProtocolInfo::KProtocolInfo(const QString &path)
33  : KSycocaEntry(*new KProtocolInfoPrivate(path, this))
34 {
35  Q_D(KProtocolInfo);
36  QString fullPath = KStandardDirs::locate("services", path);
37 
38  KConfig sconfig( fullPath );
39  KConfigGroup config(&sconfig, "Protocol" );
40 
41  m_name = config.readEntry( "protocol" );
42  m_exec = config.readPathEntry( "exec", QString() );
43  m_isSourceProtocol = config.readEntry( "source", true );
44  m_isHelperProtocol = config.readEntry( "helper", false );
45  m_supportsReading = config.readEntry( "reading", false );
46  m_supportsWriting = config.readEntry( "writing", false );
47  m_supportsMakeDir = config.readEntry( "makedir", false );
48  m_supportsDeleting = config.readEntry( "deleting", false );
49  m_supportsLinking = config.readEntry( "linking", false );
50  m_supportsMoving = config.readEntry( "moving", false );
51  m_supportsOpening = config.readEntry( "opening", false );
52  m_canCopyFromFile = config.readEntry( "copyFromFile", false );
53  m_canCopyToFile = config.readEntry( "copyToFile", false );
54  d->canRenameFromFile = config.readEntry( "renameFromFile", false );
55  d->canRenameToFile = config.readEntry( "renameToFile", false );
56  d->canDeleteRecursive = config.readEntry( "deleteRecursive", false );
57  const QString fnu = config.readEntry( "fileNameUsedForCopying", "FromURL" );
58  d->fileNameUsedForCopying = FromUrl;
59  if (fnu == QLatin1String("Name"))
60  d->fileNameUsedForCopying = Name;
61  else if (fnu == QLatin1String("DisplayName"))
62  d->fileNameUsedForCopying = DisplayName;
63 
64  m_listing = config.readEntry( "listing", QStringList() );
65  // Many .protocol files say "Listing=false" when they really mean "Listing=" (i.e. unsupported)
66  if ( m_listing.count() == 1 && m_listing.first() == QLatin1String("false") )
67  m_listing.clear();
68  m_supportsListing = ( m_listing.count() > 0 );
69  m_defaultMimetype = config.readEntry( "defaultMimetype" );
70  m_determineMimetypeFromExtension = config.readEntry( "determineMimetypeFromExtension", true );
71  d->archiveMimetype = config.readEntry("archiveMimetype", QStringList());
72  m_icon = config.readEntry( "Icon" );
73  m_config = config.readEntry( "config", m_name );
74  m_maxSlaves = config.readEntry( "maxInstances", 1);
75  d->maxSlavesPerHost = config.readEntry( "maxInstancesPerHost", 0);
76 
77  QString tmp = config.readEntry( "input" );
78  if ( tmp == QLatin1String("filesystem") )
79  m_inputType = KProtocolInfo::T_FILESYSTEM;
80  else if ( tmp == QLatin1String("stream") )
81  m_inputType = KProtocolInfo::T_STREAM;
82  else
83  m_inputType = KProtocolInfo::T_NONE;
84 
85  tmp = config.readEntry( "output" );
86  if ( tmp == QLatin1String("filesystem") )
87  m_outputType = KProtocolInfo::T_FILESYSTEM;
88  else if ( tmp == QLatin1String("stream") )
89  m_outputType = KProtocolInfo::T_STREAM;
90  else
91  m_outputType = KProtocolInfo::T_NONE;
92 
93  d->docPath = config.readPathEntry( "X-DocPath", QString() );
94  if (d->docPath.isEmpty())
95  d->docPath = config.readPathEntry( "DocPath", QString() );
96  d->protClass = config.readEntry( "Class" ).toLower();
97  if (d->protClass[0] != QLatin1Char(':'))
98  d->protClass.prepend(QLatin1Char(':'));
99 
100  const QStringList extraNames = config.readEntry( "ExtraNames", QStringList() );
101  const QStringList extraTypes = config.readEntry( "ExtraTypes", QStringList() );
102  QStringList::const_iterator it = extraNames.begin();
103  QStringList::const_iterator typeit = extraTypes.begin();
104  for( ; it != extraNames.end() && typeit != extraTypes.end(); ++it, ++typeit ) {
105  QVariant::Type type = QVariant::nameToType( (*typeit).toLatin1() );
106  // currently QVariant::Type and ExtraField::Type use the same subset of values, so we can just cast.
107  d->extraFields.append( ExtraField( *it, static_cast<ExtraField::Type>(type) ) );
108  }
109 
110  d->showPreviews = config.readEntry( "ShowPreviews", d->protClass == QLatin1String(":local") );
111 
112  d->capabilities = config.readEntry( "Capabilities", QStringList() );
113  d->proxyProtocol = config.readEntry( "ProxiedBy" );
114 }
115 
116 KProtocolInfo::KProtocolInfo( QDataStream& _str, int offset) :
117  KSycocaEntry(*new KProtocolInfoPrivate( _str, offset, this) )
118 {
119  load( _str );
120 }
121 
122 KProtocolInfo::~KProtocolInfo()
123 {
124 }
125 
126 void
127 KProtocolInfo::load( QDataStream& _str)
128 {
129  Q_D(KProtocolInfo);
130  // You may add new fields at the end. Make sure to update the version
131  // number in ksycoca.h
132  qint32 i_inputType, i_outputType;
133  qint8 i_isSourceProtocol, i_isHelperProtocol,
134  i_supportsListing, i_supportsReading,
135  i_supportsWriting, i_supportsMakeDir,
136  i_supportsDeleting, i_supportsLinking,
137  i_supportsMoving, i_supportsOpening,
138  i_determineMimetypeFromExtension,
139  i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
140  i_uriMode, i_canRenameFromFile, i_canRenameToFile,
141  i_canDeleteRecursive, i_fileNameUsedForCopying;
142 
143  _str >> m_name >> m_exec >> m_listing >> m_defaultMimetype
144  >> i_determineMimetypeFromExtension
145  >> m_icon
146  >> i_inputType >> i_outputType
147  >> i_isSourceProtocol >> i_isHelperProtocol
148  >> i_supportsListing >> i_supportsReading
149  >> i_supportsWriting >> i_supportsMakeDir
150  >> i_supportsDeleting >> i_supportsLinking
151  >> i_supportsMoving >> i_supportsOpening
152  >> i_canCopyFromFile >> i_canCopyToFile
153  >> m_config >> m_maxSlaves >> d->docPath >> d->protClass
154  >> d->extraFields >> i_showPreviews >> i_uriMode
155  >> d->capabilities >> d->proxyProtocol
156  >> i_canRenameFromFile >> i_canRenameToFile
157  >> i_canDeleteRecursive >> i_fileNameUsedForCopying
158  >> d->archiveMimetype >> d->maxSlavesPerHost;
159 
160  m_inputType = (Type) i_inputType;
161  m_outputType = (Type) i_outputType;
162  m_isSourceProtocol = (i_isSourceProtocol != 0);
163  m_isHelperProtocol = (i_isHelperProtocol != 0);
164  m_supportsListing = (i_supportsListing != 0);
165  m_supportsReading = (i_supportsReading != 0);
166  m_supportsWriting = (i_supportsWriting != 0);
167  m_supportsMakeDir = (i_supportsMakeDir != 0);
168  m_supportsDeleting = (i_supportsDeleting != 0);
169  m_supportsLinking = (i_supportsLinking != 0);
170  m_supportsMoving = (i_supportsMoving != 0);
171  m_supportsOpening = (i_supportsOpening != 0);
172  m_canCopyFromFile = (i_canCopyFromFile != 0);
173  m_canCopyToFile = (i_canCopyToFile != 0);
174  d->canRenameFromFile = (i_canRenameFromFile != 0);
175  d->canRenameToFile = (i_canRenameToFile != 0);
176  d->canDeleteRecursive = (i_canDeleteRecursive != 0);
177  d->fileNameUsedForCopying = FileNameUsedForCopying(i_fileNameUsedForCopying);
178  m_determineMimetypeFromExtension = (i_determineMimetypeFromExtension != 0);
179  d->showPreviews = (i_showPreviews != 0);
180 }
181 
182 void
183 KProtocolInfoPrivate::save( QDataStream& _str)
184 {
185  KSycocaEntryPrivate::save( _str );
186 
187  // You may add new fields at the end. Make sure to update the version
188  // number in ksycoca.h
189  qint32 i_inputType, i_outputType;
190  qint8 i_isSourceProtocol, i_isHelperProtocol,
191  i_supportsListing, i_supportsReading,
192  i_supportsWriting, i_supportsMakeDir,
193  i_supportsDeleting, i_supportsLinking,
194  i_supportsMoving, i_supportsOpening,
195  i_determineMimetypeFromExtension,
196  i_canCopyFromFile, i_canCopyToFile, i_showPreviews,
197  i_uriMode, i_canRenameFromFile, i_canRenameToFile,
198  i_canDeleteRecursive, i_fileNameUsedForCopying;
199 
200  i_inputType = (qint32) q->m_inputType;
201  i_outputType = (qint32) q->m_outputType;
202  i_isSourceProtocol = q->m_isSourceProtocol ? 1 : 0;
203  i_isHelperProtocol = q->m_isHelperProtocol ? 1 : 0;
204  i_supportsListing = q->m_supportsListing ? 1 : 0;
205  i_supportsReading = q->m_supportsReading ? 1 : 0;
206  i_supportsWriting = q->m_supportsWriting ? 1 : 0;
207  i_supportsMakeDir = q->m_supportsMakeDir ? 1 : 0;
208  i_supportsDeleting = q->m_supportsDeleting ? 1 : 0;
209  i_supportsLinking = q->m_supportsLinking ? 1 : 0;
210  i_supportsMoving = q->m_supportsMoving ? 1 : 0;
211  i_supportsOpening = q->m_supportsOpening ? 1 : 0;
212  i_canCopyFromFile = q->m_canCopyFromFile ? 1 : 0;
213  i_canCopyToFile = q->m_canCopyToFile ? 1 : 0;
214  i_canRenameFromFile = canRenameFromFile ? 1 : 0;
215  i_canRenameToFile = canRenameToFile ? 1 : 0;
216  i_canDeleteRecursive = canDeleteRecursive ? 1 : 0;
217  i_fileNameUsedForCopying = int(fileNameUsedForCopying);
218  i_determineMimetypeFromExtension = q->m_determineMimetypeFromExtension ? 1 : 0;
219  i_showPreviews = showPreviews ? 1 : 0;
220  i_uriMode = 0;
221 
222  _str << q->m_name << q->m_exec << q->m_listing << q->m_defaultMimetype
223  << i_determineMimetypeFromExtension
224  << q->m_icon
225  << i_inputType << i_outputType
226  << i_isSourceProtocol << i_isHelperProtocol
227  << i_supportsListing << i_supportsReading
228  << i_supportsWriting << i_supportsMakeDir
229  << i_supportsDeleting << i_supportsLinking
230  << i_supportsMoving << i_supportsOpening
231  << i_canCopyFromFile << i_canCopyToFile
232  << q->m_config << q->m_maxSlaves << docPath << protClass
233  << extraFields << i_showPreviews << i_uriMode
234  << capabilities << proxyProtocol
235  << i_canRenameFromFile << i_canRenameToFile
236  << i_canDeleteRecursive << i_fileNameUsedForCopying
237  << archiveMimetype << maxSlavesPerHost;
238 }
239 
240 
241 //
242 // Static functions:
243 //
244 
245 QStringList KProtocolInfo::protocols()
246 {
247  return KProtocolInfoFactory::self()->protocols();
248 }
249 
250 bool KProtocolInfo::isFilterProtocol( const QString& _protocol )
251 {
252  // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
253  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
254  if ( !prot )
255  return false;
256 
257  return !prot->m_isSourceProtocol;
258 }
259 
260 QString KProtocolInfo::icon( const QString& _protocol )
261 {
262  // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
263  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
264  if ( !prot )
265  return QString();
266 
267  return prot->m_icon;
268 }
269 
270 QString KProtocolInfo::config( const QString& _protocol )
271 {
272  // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
273  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
274  if ( !prot )
275  return QString();
276 
277  return QString::fromLatin1("kio_%1rc").arg(prot->m_config);
278 }
279 
280 int KProtocolInfo::maxSlaves( const QString& _protocol )
281 {
282  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
283  if ( !prot )
284  return 1;
285 
286  return prot->m_maxSlaves;
287 }
288 
289 int KProtocolInfo::maxSlavesPerHost( const QString& _protocol )
290 {
291  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
292  if ( !prot )
293  return 0;
294 
295  return prot->d_func()->maxSlavesPerHost;
296 }
297 
298 bool KProtocolInfo::determineMimetypeFromExtension( const QString &_protocol )
299 {
300  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol( _protocol );
301  if ( !prot )
302  return true;
303 
304  return prot->m_determineMimetypeFromExtension;
305 }
306 
307 QString KProtocolInfo::exec(const QString& protocol)
308 {
309  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
310  if ( prot ) {
311  return prot->m_exec;
312  }
313 
314  // Maybe it's "helper protocol", i.e. launches an app?
315  const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol);
316  if (service)
317  return service->exec();
318 
319  return QString();
320 }
321 
322 KProtocolInfo::ExtraFieldList KProtocolInfo::extraFields( const KUrl &url )
323 {
324  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(url.protocol());
325  if ( !prot )
326  return ExtraFieldList();
327 
328  return prot->d_func()->extraFields;
329 }
330 
331 QString KProtocolInfo::docPath( const QString& _protocol )
332 {
333  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
334  if ( !prot )
335  return QString();
336 
337  return prot->d_func()->docPath;
338 }
339 
340 QString KProtocolInfo::protocolClass( const QString& _protocol )
341 {
342  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
343  if ( !prot )
344  return QString();
345 
346  return prot->d_func()->protClass;
347 }
348 
349 bool KProtocolInfo::showFilePreview( const QString& _protocol )
350 {
351  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
352  if ( !prot )
353  return false;
354 
355  return prot->d_func()->showPreviews;
356 }
357 
358 QStringList KProtocolInfo::capabilities( const QString& _protocol )
359 {
360  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
361  if ( !prot )
362  return QStringList();
363 
364  return prot->d_func()->capabilities;
365 }
366 
367 QString KProtocolInfo::proxiedBy( const QString& _protocol )
368 {
369  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(_protocol);
370  if ( !prot )
371  return QString();
372 
373  return prot->d_func()->proxyProtocol;
374 }
375 
376 QString KProtocolInfo::defaultMimeType() const
377 {
378  return m_defaultMimetype;
379 }
380 
381 
382 QStringList KProtocolInfo::archiveMimeTypes() const
383 {
384  Q_D(const KProtocolInfo);
385  return d->archiveMimetype;
386 }
387 
388 bool KProtocolInfo::supportsListing() const
389 {
390  return m_supportsListing;
391 }
392 
393 bool KProtocolInfo::canRenameFromFile() const
394 {
395  Q_D(const KProtocolInfo);
396  return d->canRenameFromFile;
397 }
398 
399 bool KProtocolInfo::canRenameToFile() const
400 {
401  Q_D(const KProtocolInfo);
402  return d->canRenameToFile;
403 }
404 
405 bool KProtocolInfo::canDeleteRecursive() const
406 {
407  Q_D(const KProtocolInfo);
408  return d->canDeleteRecursive;
409 }
410 
411 KProtocolInfo::FileNameUsedForCopying KProtocolInfo::fileNameUsedForCopying() const
412 {
413  Q_D(const KProtocolInfo);
414  return d->fileNameUsedForCopying;
415 }
416 
417 bool KProtocolInfo::isFilterProtocol( const KUrl &url )
418 {
419  return isFilterProtocol (url.protocol());
420 }
421 
422 bool KProtocolInfo::isHelperProtocol( const KUrl &url )
423 {
424  return isHelperProtocol (url.protocol());
425 }
426 
427 bool KProtocolInfo::isHelperProtocol( const QString &protocol )
428 {
429  // We call the findProtocol directly (not via KProtocolManager) to bypass any proxy settings.
430  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
431  if ( prot )
432  return prot->m_isHelperProtocol;
433 
434  const KService::Ptr service = KMimeTypeTrader::self()->preferredService(QString::fromLatin1("x-scheme-handler/") + protocol);
435  return !service.isNull();
436 }
437 
438 bool KProtocolInfo::isKnownProtocol( const KUrl &url )
439 {
440  return isKnownProtocol (url.protocol());
441 }
442 
443 bool KProtocolInfo::isKnownProtocol( const QString &protocol )
444 {
445  // We call the findProtocol (const QString&) to bypass any proxy settings.
446  KProtocolInfo::Ptr prot = KProtocolInfoFactory::self()->findProtocol(protocol);
447  return prot || isHelperProtocol(protocol);
448 }
449 
450 QDataStream& operator>>( QDataStream& s, KProtocolInfo::ExtraField& field ) {
451  s >> field.name;
452  int type;
453  s >> type;
454  field.type = static_cast<KProtocolInfo::ExtraField::Type>( type );
455  return s;
456 }
457 
458 QDataStream& operator<<( QDataStream& s, const KProtocolInfo::ExtraField& field ) {
459  s << field.name;
460  s << static_cast<int>( field.type );
461  return s;
462 }
This file is part of the KDE documentation.
Documentation copyright © 1996-2013 The KDE developers.
Generated on Thu Feb 21 2013 11:01:06 by doxygen 1.8.1 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

KDECore

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

kdelibs-4.8.5 API Reference

Skip menu "kdelibs-4.8.5 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