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

KIO

  • sources
  • kde-4.14
  • kdelibs
  • kio
  • kio
kfilemetainfo.cpp
Go to the documentation of this file.
1 /* This file is part of the KDE libraries
2 
3  Copyright (c) 2001,2002 Carsten Pfeiffer <pfeiffer@kde.org>
4  2007 Jos van den Oever <jos@vandenoever.info>
5  2010 Sebastian Trueg <trueg@kde.org>
6 
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Library General Public
9  License (LGPL) as published by the Free Software Foundation; either
10  version 2 of the License, or (at your option) any later version.
11 
12  This library is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  Library General Public License for more details.
16 
17  You should have received a copy of the GNU Library General Public License
18  along with this library; see the file COPYING.LIB. If not, write to
19  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  Boston, MA 02110-1301, USA.
21 */
22 
23 #include "kfilemetainfo.h"
24 #include "kfilemetainfoitem.h"
25 #include "kfilemetainfoitem_p.h"
26 #include "kfilewriteplugin.h"
27 #include "kfilewriteplugin_p.h"
28 
29 #ifndef KIO_NO_STRIGI
30 #include <strigi/bufferedstream.h>
31 #include <strigi/analyzerconfiguration.h>
32 #include <strigi/indexwriter.h>
33 #include <strigi/analysisresult.h>
34 #include <strigi/fieldtypes.h>
35 #endif
36 
37 #include <kurl.h>
38 #include <kdebug.h>
39 
40 #include <QFileInfo>
41 #include <QDateTime>
42 #include <QStringList>
43 
44 class KFileMetaInfoGroupPrivate : public QSharedData {
45 public:
46  QString name;
47 };
48 
49 KFileMetaInfoGroup::~KFileMetaInfoGroup()
50 {
51 }
52 
53 KFileMetaInfoGroup::KFileMetaInfoGroup ( KFileMetaInfoGroup const& g )
54 {
55  d = g.d;
56 }
57 
58 QDataStream& operator >> ( QDataStream& s, KFileMetaInfo& )
59 {
60  return s;
61 }
62 
63 QDataStream& operator << ( QDataStream& s, const KFileMetaInfo& )
64 {
65  return s;
66 }
67 #ifndef KIO_NO_STRIGI
68 
71 class QIODeviceInputStream : public Strigi::BufferedInputStream {
72 private:
73  QIODevice& in;
74  const qint64 m_maxRead;
75  qint64 m_read;
76  int32_t fillBuffer ( char* start, int32_t space );
77 public:
78  QIODeviceInputStream ( QIODevice& i, qint64 max );
79 };
80 
81 int32_t
82 QIODeviceInputStream::fillBuffer ( char* start, int32_t space )
83 {
84  if ( !in.isOpen() || !in.isReadable() )
85  return -1;
86 
87  // we force a max stream read length according to the config since some Strigi
88  // plugins simply ignore the value which will lead to frozen client apps
89  qint64 max = m_maxRead;
90  if(max < 0)
91  max = space;
92  else
93  max = qMin(qint64(space), qMax(max-m_read,qint64(0)));
94 
95  // read into the buffer
96  int32_t nwritten = in.read ( start, max );
97 
98  // check the file stream status
99  if ( nwritten < 0 ) {
100  m_error = "Could not read from QIODevice.";
101  in.close();
102  return -1;
103  }
104  if ( nwritten == 0 || in.atEnd() ) {
105  in.close();
106  }
107  m_read += nwritten;
108  return nwritten;
109 }
110 
111 QIODeviceInputStream::QIODeviceInputStream ( QIODevice& i, qint64 max )
112  : in ( i ),
113  m_maxRead(max),
114  m_read(0)
115 {
116  // determine if we have a character device, which will likely never eof and thereby
117  // potentially cause an infinite loop.
118  if ( i.isSequential() ) {
119  in.close(); // cause fillBuffer to return -1
120  }
121 }
122 
127 class KMetaInfoWriter : public Strigi::IndexWriter {
128 public:
129  // irrelevant for KFileMetaInfo
130  void startAnalysis(const Strigi::AnalysisResult*) {
131  }
132 
133  // irrelevant for KFileMetaInfo
134  // we do not store text as metainfo
135  void addText(const Strigi::AnalysisResult*, const char* /*s*/, int32_t /*n*/) {
136  }
137  void addValue(const Strigi::AnalysisResult* idx, const Strigi::RegisteredField* field,
138  const std::string& value) {
139  if (idx->writerData()) {
140  QString val = QString::fromUtf8(value.c_str(), value.size());
141  if( !val.startsWith(':') )
142  addValue(idx, field, val);
143  }
144  }
145  void addValue(const Strigi::AnalysisResult* idx, const Strigi::RegisteredField* field,
146  const unsigned char* data, uint32_t size) {
147  if (idx->writerData()) {
148  QByteArray d((const char*)data, size);
149  addValue(idx, field, QVariant(d));
150  }
151  }
152  void addValue(const Strigi::AnalysisResult* idx, const Strigi::RegisteredField* field,
153  uint32_t value) {
154  if (idx->writerData()) {
155  addValue(idx, field, QVariant((quint32)value));
156  }
157  }
158  void addValue(const Strigi::AnalysisResult* idx, const Strigi::RegisteredField* field,
159  int32_t value) {
160  if (idx->writerData()) {
161  addValue(idx, field, QVariant((qint32)value));
162  }
163  }
164  void addValue(const Strigi::AnalysisResult* idx, const Strigi::RegisteredField* field,
165  double value) {
166  if (idx->writerData()) {
167  addValue(idx, field, QVariant(value));
168  }
169  }
170  void addValue(const Strigi::AnalysisResult* idx,
171  const Strigi::RegisteredField* field, const QVariant& value) {
172  QHash<QString, KFileMetaInfoItem>* info
173  = static_cast<QHash<QString, KFileMetaInfoItem>*>(
174  idx->writerData());
175  if (info) {
176  std::string name(field->key());
177  QString key = QString::fromUtf8(name.c_str(), name.size());
178  QHash<QString, KFileMetaInfoItem>::iterator i = info->find(key);
179  if (i == info->end()) {
180  info->insert(key, KFileMetaInfoItem(key, value, 0, true));
181  } else {
182  i.value().addValue(value);
183  }
184  }
185  }
186  void addValue(const Strigi::AnalysisResult* ar,
187  const Strigi::RegisteredField* field, const std::string& name,
188  const std::string& value) {
189  if (ar->writerData()) {
190  QVariantMap m;
191  m.insert ( name.c_str(), value.c_str() );
192  addValue ( ar, field, m );
193  }
194  }
195 
196  /* irrelevant for KFileMetaInfo: These triples does not convey information
197  * about this file, so we ignore it
198  */
199  void addTriplet ( const std::string& /*subject*/,
200  const std::string& /*predicate*/, const std::string& /*object*/ ) {
201  }
202 
203  // irrelevant for KFileMetaInfo
204  void finishAnalysis(const Strigi::AnalysisResult*) {}
205  // irrelevant for KFileMetaInfo
206  void deleteEntries(const std::vector<std::string>&) {}
207  // irrelevant for KFileMetaInfo
208  void deleteAllEntries() {}
209 };
210 
211 
212 class KFileMetaInfoPrivate : public QSharedData
213 {
214 public:
215  QHash<QString, KFileMetaInfoItem> items;
216  KUrl m_url;
217 
218  void init ( QIODevice& stream, const KUrl& url, time_t mtime, KFileMetaInfo::WhatFlags w = KFileMetaInfo::Everything );
219  void initWriters ( const KUrl& /*file*/ );
220  void operator= ( const KFileMetaInfoPrivate& k ) {
221  items = k.items;
222  }
223 };
224 static const KFileMetaInfoItem nullitem;
225 
226 class KFileMetaInfoAnalysisConfiguration : public Strigi::AnalyzerConfiguration
227 {
228 public:
229  KFileMetaInfoAnalysisConfiguration( KFileMetaInfo::WhatFlags indexDetail )
230  : m_indexDetail(indexDetail) {
231  }
232 
233  int64_t maximalStreamReadLength ( const Strigi::AnalysisResult& ar ) {
234  if(ar.depth() > 0)
235  return 0; // ignore all data that has a depth > 0, i.e. files in archives
236  else if(m_indexDetail == KFileMetaInfo::Everything)
237  return -1;
238  else
239  return 65536; // do not read the whole file - this is used for on-the-fly analysis
240  }
241 
242 private:
243  KFileMetaInfo::WhatFlags m_indexDetail;
244 };
245 
246 void KFileMetaInfoPrivate::init ( QIODevice& stream, const KUrl& url, time_t mtime, KFileMetaInfo::WhatFlags w )
247 {
248  m_url = url;
249 
250  // get data from Strigi
251  KFileMetaInfoAnalysisConfiguration c( w );
252  Strigi::StreamAnalyzer indexer ( c );
253  KMetaInfoWriter writer;
254  kDebug ( 7033 ) << url;
255  Strigi::AnalysisResult idx ( url.toLocalFile().toUtf8().constData(), mtime, writer, indexer );
256  idx.setWriterData ( &items );
257 
258  QIODeviceInputStream strigiStream ( stream, c.maximalStreamReadLength(idx) );
259  indexer.analyze ( idx, &strigiStream );
260 
261  // TODO: get data from Nepomuk
262 }
263 
264 void KFileMetaInfoPrivate::initWriters ( const KUrl& file )
265 {
266  QStringList mimetypes;
267  QHash<QString, KFileMetaInfoItem>::iterator i;
268  for ( i = items.begin(); i != items.end(); ++i ) {
269  KFileWritePlugin *w =
270  KFileWriterProvider::self()->loadPlugin ( i.key() );
271  if ( w && w->canWrite ( file, i.key() ) ) {
272  i.value().d->writer = w;
273  }
274  }
275 }
276 
277 KFileMetaInfo::KFileMetaInfo ( const QString& path, const QString& /*mimetype*/,
278  KFileMetaInfo::WhatFlags w )
279  : d ( new KFileMetaInfoPrivate() )
280 {
281  QFileInfo fileinfo ( path );
282  QFile file ( path );
283  // only open the file if it is a filetype Qt understands
284  // if e.g. the path points to a pipe, it is not opened
285  if ( ( fileinfo.isFile() || fileinfo.isDir() || fileinfo.isSymLink() )
286  && file.open ( QIODevice::ReadOnly ) ) {
287  KUrl u ( path );
288  d->init ( file, u, fileinfo.lastModified().toTime_t(), w );
289  if ( fileinfo.isWritable() ) {
290  d->initWriters ( u );
291  }
292  }
293 }
294 
295 KFileMetaInfo::KFileMetaInfo ( const KUrl& url )
296  : d ( new KFileMetaInfoPrivate() )
297 {
298  QFileInfo fileinfo ( url.toLocalFile() );
299  QFile file ( url.toLocalFile() );
300  if ( file.open ( QIODevice::ReadOnly ) ) {
301  d->init ( file, url, fileinfo.lastModified().toTime_t() );
302  if ( fileinfo.isWritable() ) {
303  d->initWriters ( url );
304  }
305  }
306 }
307 
308 KFileMetaInfo::KFileMetaInfo() : d ( new KFileMetaInfoPrivate() )
309 {
310 }
311 
312 KFileMetaInfo::KFileMetaInfo ( const KFileMetaInfo& k ) : d ( k.d )
313 {
314 }
315 
316 KFileMetaInfo& KFileMetaInfo::operator= ( KFileMetaInfo const & kfmi )
317 {
318  d = kfmi.d;
319  return *this;
320 }
321 
322 KFileMetaInfo::~KFileMetaInfo()
323 {
324 }
325 
326 bool KFileMetaInfo::applyChanges()
327 {
328  // go through all editable fields and group them by writer
329  QHash<KFileWritePlugin*, QVariantMap> data;
330  QHash<QString, KFileMetaInfoItem>::const_iterator i;
331  for ( i = d->items.constBegin(); i != d->items.constEnd(); ++i ) {
332  if ( i.value().isModified() && i.value().d->writer ) {
333  data[i.value().d->writer][i.key() ] = i.value().value();
334  }
335  }
336 
337  // call the writers on the data they can write
338  bool ok = true;
339  QHash<KFileWritePlugin*, QVariantMap>::const_iterator j;
340  for ( j = data.constBegin(); j != data.constEnd(); ++j ) {
341  ok &= j.key()->write ( d->m_url, j.value() );
342  }
343  return ok;
344 }
345 
346 const KUrl& KFileMetaInfo::url() const
347 {
348  return d->m_url;
349 }
350 
351 const QHash<QString, KFileMetaInfoItem>& KFileMetaInfo::items() const
352 {
353  return d->items;
354 }
355 
356 const KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key ) const
357 {
358  QHash<QString, KFileMetaInfoItem>::const_iterator i = d->items.constFind ( key );
359  return ( i == d->items.constEnd() ) ? nullitem : i.value();
360 }
361 
362 QStringList KFileMetaInfo::keys() const
363 {
364  return d->items.keys();
365 }
366 
367 KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key )
368 {
369  return d->items[key];
370 }
371 
372 bool KFileMetaInfo::isValid() const
373 {
374  return !d->m_url.isEmpty();
375 }
376 
377 QStringList KFileMetaInfo::preferredKeys() const
378 {
379  return QStringList();
380 }
381 
382 QStringList KFileMetaInfo::supportedKeys() const
383 {
384  return QStringList();
385 }
386 
387 #ifndef KDE_NO_DEPRECATED
388 KFileMetaInfoGroupList KFileMetaInfo::preferredGroups() const
389 {
390  return KFileMetaInfoGroupList();
391 }
392 #endif
393 
394 #ifndef KDE_NO_DEPRECATED
395 KFileMetaInfoGroupList KFileMetaInfo::supportedGroups() const
396 {
397  return KFileMetaInfoGroupList();
398 }
399 #endif
400 #else //KIO_NO_STRIGI
401 
402 class KFileMetaInfoPrivate : public QSharedData
403 {
404 public:
405 };
406 
407 KFileMetaInfo::KFileMetaInfo ( const QString& path, const QString& /*mimetype*/,
408  KFileMetaInfo::WhatFlags w )
409 {
410 }
411 
412 KFileMetaInfo::KFileMetaInfo ( const KUrl& url )
413 {
414 }
415 
416 KFileMetaInfo::KFileMetaInfo()
417 {
418 }
419 
420 KFileMetaInfo::KFileMetaInfo ( const KFileMetaInfo& k )
421 {
422 }
423 
424 KFileMetaInfo& KFileMetaInfo::operator= ( KFileMetaInfo const & kfmi )
425 {
426  d = kfmi.d;
427  return *this;
428 }
429 
430 KFileMetaInfo::~KFileMetaInfo()
431 {
432 }
433 
434 bool KFileMetaInfo::applyChanges()
435 {
436  return false;
437 }
438 
439 const KUrl& KFileMetaInfo::url() const
440 {
441  static const KUrl item;
442  return item;
443 }
444 
445 const QHash<QString, KFileMetaInfoItem>& KFileMetaInfo::items() const
446 {
447  static const QHash<QString, KFileMetaInfoItem> items;
448  return items;
449 }
450 
451 const KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key ) const
452 {
453  static const KFileMetaInfoItem item;
454  return item;
455 }
456 
457 QStringList KFileMetaInfo::keys() const
458 {
459  return QStringList();
460 }
461 
462 KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key )
463 {
464  static KFileMetaInfoItem item;
465  return item;
466 }
467 
468 bool KFileMetaInfo::isValid() const
469 {
470  return false;
471 }
472 
473 QStringList KFileMetaInfo::preferredKeys() const
474 {
475  return QStringList();
476 }
477 
478 QStringList KFileMetaInfo::supportedKeys() const
479 {
480  return QStringList();
481 }
482 
483 #ifndef KDE_NO_DEPRECATED
484 KFileMetaInfoGroupList KFileMetaInfo::preferredGroups() const
485 {
486  return KFileMetaInfoGroupList();
487 }
488 #endif
489 
490 #ifndef KDE_NO_DEPRECATED
491 KFileMetaInfoGroupList KFileMetaInfo::supportedGroups() const
492 {
493  return KFileMetaInfoGroupList();
494 }
495 #endif
496 #endif
497 
498 KFileMetaInfoItemList KFileMetaInfoGroup::items() const
499 {
500  return KFileMetaInfoItemList();
501 }
502 
503 const QString& KFileMetaInfoGroup::name() const
504 {
505  return d->name;
506 }
QIODevice
KFileMetaInfo::items
const QHash< QString, KFileMetaInfoItem > & items() const
Retrieve all the items.
Definition: kfilemetainfo.cpp:351
qint64
QHash::insert
iterator insert(const Key &key, const T &value)
KFileMetaInfo::isValid
bool isValid() const
Definition: kfilemetainfo.cpp:372
KFileMetaInfoItem
Definition: kfilemetainfoitem.h:34
kdebug.h
QHash::key
const Key key(const T &value) const
KFileMetaInfo::supportedGroups
KFileMetaInfoGroupList supportedGroups() const
Deprecated.
Definition: kfilemetainfo.cpp:395
kurl.h
KFileMetaInfo::Everything
read everything, even if it might take a while
Definition: kfilemetainfo.h:86
kfilewriteplugin_p.h
QByteArray
KFileMetaInfoGroup
Definition: kfilemetainfo.h:33
QDataStream
nullitem
static const KFileMetaInfoItem nullitem
Definition: kfilemetainfo.cpp:224
kfilemetainfoitem_p.h
name
const char * name(StandardAction id)
KUrl::toLocalFile
QString toLocalFile(AdjustPathOption trailing=LeaveTrailingSlash) const
quint32
kDebug
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
KFileWriterProvider::loadPlugin
KFileWritePlugin * loadPlugin(const QString &key)
Definition: kfilewriteplugin.cpp:48
QIODevice::isSequential
virtual bool isSequential() const
QFile
KUrl
KFileMetaInfoItemList
QList< KFileMetaInfoItem > KFileMetaInfoItemList
Definition: kfilemetainfo.h:28
QSharedData
QString::fromUtf8
QString fromUtf8(const char *str, int size)
QHash::constEnd
const_iterator constEnd() const
KFileMetaInfo
KFileMetaInfo provides metadata extracted from a file or other resource.
Definition: kfilemetainfo.h:56
KFileMetaInfo::applyChanges
bool applyChanges()
Save the changes made to this KFileMetaInfo instance.
Definition: kfilemetainfo.cpp:326
QHash< QString, KFileMetaInfoItem >
KFileMetaInfoGroup::name
const QString & name() const
Definition: kfilemetainfo.cpp:503
KFileMetaInfo::url
const KUrl & url() const
Definition: kfilemetainfo.cpp:346
QByteArray::constData
const char * constData() const
QHash::begin
iterator begin()
QString::startsWith
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const
QString
QList
KFileMetaInfoGroup::items
KFileMetaInfoItemList items() const
Definition: kfilemetainfo.cpp:498
QStringList
QFileInfo
kfilemetainfoitem.h
QHash::value
const T value(const Key &key) const
QHash::find
iterator find(const Key &key)
operator<<
QDataStream & operator<<(QDataStream &s, const KFileMetaInfo &)
Definition: kfilemetainfo.cpp:63
KFileMetaInfoGroup::~KFileMetaInfoGroup
~KFileMetaInfoGroup()
Definition: kfilemetainfo.cpp:49
ok
KGuiItem ok()
QHash::const_iterator
KFileMetaInfo::preferredGroups
KFileMetaInfoGroupList preferredGroups() const
Deprecated.
Definition: kfilemetainfo.cpp:388
QHash::constBegin
const_iterator constBegin() const
kfilemetainfo.h
operator>>
QDataStream & operator>>(QDataStream &s, KFileMetaInfo &)
Definition: kfilemetainfo.cpp:58
KFileMetaInfo::item
KFileMetaInfoItem & item(const QString &key)
Definition: kfilemetainfo.cpp:367
KFileMetaInfoGroup::KFileMetaInfoGroup
KFileMetaInfoGroup()
KFileWritePlugin::canWrite
virtual bool canWrite(const KUrl &file, const QString &key)=0
determine if this plugin can write a value into a particular resource.
KFileWriterProvider::self
static KFileWriterProvider * self()
Definition: kfilewriteplugin.cpp:38
KFileMetaInfo::keys
QStringList keys() const
Definition: kfilemetainfo.cpp:362
KFileMetaInfo::KFileMetaInfo
KFileMetaInfo()
Construct an empty, invalid KFileMetaInfo instance.
Definition: kfilemetainfo.cpp:308
qint32
QHash::end
iterator end()
KFileMetaInfo::preferredKeys
QStringList preferredKeys() const
Deprecated.
Definition: kfilemetainfo.cpp:377
KFileMetaInfoGroupList
QList< KFileMetaInfoGroup > KFileMetaInfoGroupList
Definition: kfilemetainfo.h:46
KFileMetaInfo::~KFileMetaInfo
~KFileMetaInfo()
Destructor.
Definition: kfilemetainfo.cpp:322
kfilewriteplugin.h
KFileMetaInfo::operator=
KFileMetaInfo & operator=(KFileMetaInfo const &kfmi)
Copy a KFileMetaInfo instance from another one.
Definition: kfilemetainfo.cpp:316
KFileWritePlugin
Definition: kfilewriteplugin.h:28
KFileMetaInfo::supportedKeys
QStringList supportedKeys() const
Deprecated.
Definition: kfilemetainfo.cpp:382
QVariant
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:24:53 by doxygen 1.8.7 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 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
  •   WTF
  • kjsembed
  • KNewStuff
  • KParts
  • KPty
  • Kross
  • KUnitConversion
  • KUtils
  • 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