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

KIO

  • 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
44class KFileMetaInfoGroupPrivate : public QSharedData {
45public:
46 QString name;
47};
48
49KFileMetaInfoGroup::~KFileMetaInfoGroup()
50{
51}
52
53KFileMetaInfoGroup::KFileMetaInfoGroup ( KFileMetaInfoGroup const& g )
54{
55 d = g.d;
56}
57
58QDataStream& operator >> ( QDataStream& s, KFileMetaInfo& )
59{
60 return s;
61}
62
63QDataStream& operator << ( QDataStream& s, const KFileMetaInfo& )
64{
65 return s;
66}
67#ifndef KIO_NO_STRIGI
71class QIODeviceInputStream : public Strigi::BufferedInputStream {
72private:
73 QIODevice& in;
74 const qint64 m_maxRead;
75 qint64 m_read;
76 int32_t fillBuffer ( char* start, int32_t space );
77public:
78 QIODeviceInputStream ( QIODevice& i, qint64 max );
79};
80
81int32_t
82QIODeviceInputStream::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
111QIODeviceInputStream::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
127class KMetaInfoWriter : public Strigi::IndexWriter {
128public:
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
212class KFileMetaInfoPrivate : public QSharedData
213{
214public:
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};
224static const KFileMetaInfoItem nullitem;
225
226class KFileMetaInfoAnalysisConfiguration : public Strigi::AnalyzerConfiguration
227{
228public:
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
242private:
243 KFileMetaInfo::WhatFlags m_indexDetail;
244};
245
246void 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
264void 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
277KFileMetaInfo::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
295KFileMetaInfo::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
308KFileMetaInfo::KFileMetaInfo() : d ( new KFileMetaInfoPrivate() )
309{
310}
311
312KFileMetaInfo::KFileMetaInfo ( const KFileMetaInfo& k ) : d ( k.d )
313{
314}
315
316KFileMetaInfo& KFileMetaInfo::operator= ( KFileMetaInfo const & kfmi )
317{
318 d = kfmi.d;
319 return *this;
320}
321
322KFileMetaInfo::~KFileMetaInfo()
323{
324}
325
326bool 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
346const KUrl& KFileMetaInfo::url() const
347{
348 return d->m_url;
349}
350
351const QHash<QString, KFileMetaInfoItem>& KFileMetaInfo::items() const
352{
353 return d->items;
354}
355
356const 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
362QStringList KFileMetaInfo::keys() const
363{
364 return d->items.keys();
365}
366
367KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key )
368{
369 return d->items[key];
370}
371
372bool KFileMetaInfo::isValid() const
373{
374 return !d->m_url.isEmpty();
375}
376
377QStringList KFileMetaInfo::preferredKeys() const
378{
379 return QStringList();
380}
381
382QStringList KFileMetaInfo::supportedKeys() const
383{
384 return QStringList();
385}
386
387#ifndef KDE_NO_DEPRECATED
388KFileMetaInfoGroupList KFileMetaInfo::preferredGroups() const
389{
390 return KFileMetaInfoGroupList();
391}
392#endif
393
394#ifndef KDE_NO_DEPRECATED
395KFileMetaInfoGroupList KFileMetaInfo::supportedGroups() const
396{
397 return KFileMetaInfoGroupList();
398}
399#endif
400#else //KIO_NO_STRIGI
401
402class KFileMetaInfoPrivate : public QSharedData
403{
404public:
405};
406
407KFileMetaInfo::KFileMetaInfo ( const QString& path, const QString& /*mimetype*/,
408 KFileMetaInfo::WhatFlags w )
409{
410}
411
412KFileMetaInfo::KFileMetaInfo ( const KUrl& url )
413{
414}
415
416KFileMetaInfo::KFileMetaInfo()
417{
418}
419
420KFileMetaInfo::KFileMetaInfo ( const KFileMetaInfo& k )
421{
422}
423
424KFileMetaInfo& KFileMetaInfo::operator= ( KFileMetaInfo const & kfmi )
425{
426 d = kfmi.d;
427 return *this;
428}
429
430KFileMetaInfo::~KFileMetaInfo()
431{
432}
433
434bool KFileMetaInfo::applyChanges()
435{
436 return false;
437}
438
439const KUrl& KFileMetaInfo::url() const
440{
441 static const KUrl item;
442 return item;
443}
444
445const QHash<QString, KFileMetaInfoItem>& KFileMetaInfo::items() const
446{
447 static const QHash<QString, KFileMetaInfoItem> items;
448 return items;
449}
450
451const KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key ) const
452{
453 static const KFileMetaInfoItem item;
454 return item;
455}
456
457QStringList KFileMetaInfo::keys() const
458{
459 return QStringList();
460}
461
462KFileMetaInfoItem& KFileMetaInfo::item ( const QString& key )
463{
464 static KFileMetaInfoItem item;
465 return item;
466}
467
468bool KFileMetaInfo::isValid() const
469{
470 return false;
471}
472
473QStringList KFileMetaInfo::preferredKeys() const
474{
475 return QStringList();
476}
477
478QStringList KFileMetaInfo::supportedKeys() const
479{
480 return QStringList();
481}
482
483#ifndef KDE_NO_DEPRECATED
484KFileMetaInfoGroupList KFileMetaInfo::preferredGroups() const
485{
486 return KFileMetaInfoGroupList();
487}
488#endif
489
490#ifndef KDE_NO_DEPRECATED
491KFileMetaInfoGroupList KFileMetaInfo::supportedGroups() const
492{
493 return KFileMetaInfoGroupList();
494}
495#endif
496#endif
497
498KFileMetaInfoItemList KFileMetaInfoGroup::items() const
499{
500 return KFileMetaInfoItemList();
501}
502
503const QString& KFileMetaInfoGroup::name() const
504{
505 return d->name;
506}
KFileMetaInfoGroup
Definition: kfilemetainfo.h:33
KFileMetaInfoGroup::items
KFileMetaInfoItemList items() const
Definition: kfilemetainfo.cpp:498
KFileMetaInfoGroup::~KFileMetaInfoGroup
~KFileMetaInfoGroup()
Definition: kfilemetainfo.cpp:49
KFileMetaInfoGroup::name
const QString & name() const
Definition: kfilemetainfo.cpp:503
KFileMetaInfoGroup::KFileMetaInfoGroup
KFileMetaInfoGroup()
KFileMetaInfoItem
Definition: kfilemetainfoitem.h:34
KFileMetaInfo
KFileMetaInfo provides metadata extracted from a file or other resource.
Definition: kfilemetainfo.h:56
KFileMetaInfo::items
const QHash< QString, KFileMetaInfoItem > & items() const
Retrieve all the items.
Definition: kfilemetainfo.cpp:351
KFileMetaInfo::item
KFileMetaInfoItem & item(const QString &key)
Definition: kfilemetainfo.cpp:367
KFileMetaInfo::operator=
KFileMetaInfo & operator=(KFileMetaInfo const &kfmi)
Copy a KFileMetaInfo instance from another one.
Definition: kfilemetainfo.cpp:316
KFileMetaInfo::keys
QStringList keys() const
Definition: kfilemetainfo.cpp:362
KFileMetaInfo::~KFileMetaInfo
~KFileMetaInfo()
Destructor.
Definition: kfilemetainfo.cpp:322
KFileMetaInfo::isValid
bool isValid() const
Definition: kfilemetainfo.cpp:372
KFileMetaInfo::preferredGroups
KFileMetaInfoGroupList preferredGroups() const
Deprecated.
Definition: kfilemetainfo.cpp:388
KFileMetaInfo::applyChanges
bool applyChanges()
Save the changes made to this KFileMetaInfo instance.
Definition: kfilemetainfo.cpp:326
KFileMetaInfo::supportedKeys
QStringList supportedKeys() const
Deprecated.
Definition: kfilemetainfo.cpp:382
KFileMetaInfo::supportedGroups
KFileMetaInfoGroupList supportedGroups() const
Deprecated.
Definition: kfilemetainfo.cpp:395
KFileMetaInfo::KFileMetaInfo
KFileMetaInfo()
Construct an empty, invalid KFileMetaInfo instance.
Definition: kfilemetainfo.cpp:308
KFileMetaInfo::url
const KUrl & url() const
Definition: kfilemetainfo.cpp:346
KFileMetaInfo::Everything
@ Everything
read everything, even if it might take a while
Definition: kfilemetainfo.h:86
KFileMetaInfo::preferredKeys
QStringList preferredKeys() const
Deprecated.
Definition: kfilemetainfo.cpp:377
KFileWritePlugin
Definition: kfilewriteplugin.h:28
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
KFileWriterProvider::loadPlugin
KFileWritePlugin * loadPlugin(const QString &key)
Definition: kfilewriteplugin.cpp:48
KUrl
KUrl::toLocalFile
QString toLocalFile(AdjustPathOption trailing=LeaveTrailingSlash) const
QHash
QIODevice
QList
kDebug
#define kDebug
kdebug.h
operator<<
QDataStream & operator<<(QDataStream &s, const KFileMetaInfo &)
Definition: kfilemetainfo.cpp:63
operator>>
QDataStream & operator>>(QDataStream &s, KFileMetaInfo &)
Definition: kfilemetainfo.cpp:58
nullitem
static const KFileMetaInfoItem nullitem
Definition: kfilemetainfo.cpp:224
kfilemetainfo.h
KFileMetaInfoGroupList
QList< KFileMetaInfoGroup > KFileMetaInfoGroupList
Definition: kfilemetainfo.h:46
KFileMetaInfoItemList
QList< KFileMetaInfoItem > KFileMetaInfoItemList
Definition: kfilemetainfo.h:30
kfilemetainfoitem.h
kfilemetainfoitem_p.h
kfilewriteplugin.h
kfilewriteplugin_p.h
kurl.h
name
const char * name(StandardAction id)
ok
KGuiItem ok()
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