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>
44class KFileMetaInfoGroupPrivate :
public QSharedData {
71class QIODeviceInputStream :
public Strigi::BufferedInputStream {
74 const qint64 m_maxRead;
76 int32_t fillBuffer (
char* start, int32_t space );
78 QIODeviceInputStream (
QIODevice& i, qint64 max );
82QIODeviceInputStream::fillBuffer (
char* start, int32_t space )
84 if ( !in.isOpen() || !in.isReadable() )
89 qint64 max = m_maxRead;
93 max = qMin(qint64(space), qMax(max-m_read,qint64(0)));
96 int32_t nwritten = in.read ( start, max );
100 m_error =
"Could not read from QIODevice.";
104 if ( nwritten == 0 || in.atEnd() ) {
111QIODeviceInputStream::QIODeviceInputStream (
QIODevice& i, qint64 max )
118 if ( i.isSequential() ) {
127class KMetaInfoWriter :
public Strigi::IndexWriter {
130 void startAnalysis(
const Strigi::AnalysisResult*) {
135 void addText(
const Strigi::AnalysisResult*,
const char* , int32_t ) {
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);
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));
152 void addValue(
const Strigi::AnalysisResult* idx,
const Strigi::RegisteredField* field,
154 if (idx->writerData()) {
155 addValue(idx, field, QVariant((quint32)value));
158 void addValue(
const Strigi::AnalysisResult* idx,
const Strigi::RegisteredField* field,
160 if (idx->writerData()) {
161 addValue(idx, field, QVariant((qint32)value));
164 void addValue(
const Strigi::AnalysisResult* idx,
const Strigi::RegisteredField* field,
166 if (idx->writerData()) {
167 addValue(idx, field, QVariant(value));
170 void addValue(
const Strigi::AnalysisResult* idx,
171 const Strigi::RegisteredField* field,
const QVariant& value) {
176 std::string
name(field->key());
177 QString key = QString::fromUtf8(
name.c_str(),
name.size());
179 if (i == info->end()) {
182 i.value().addValue(value);
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()) {
191 m.insert (
name.c_str(), value.c_str() );
192 addValue ( ar, field, m );
199 void addTriplet (
const std::string& ,
200 const std::string& ,
const std::string& ) {
204 void finishAnalysis(
const Strigi::AnalysisResult*) {}
206 void deleteEntries(
const std::vector<std::string>&) {}
208 void deleteAllEntries() {}
212class KFileMetaInfoPrivate :
public QSharedData
219 void initWriters (
const KUrl& );
220 void operator= (
const KFileMetaInfoPrivate& k ) {
226class KFileMetaInfoAnalysisConfiguration :
public Strigi::AnalyzerConfiguration
229 KFileMetaInfoAnalysisConfiguration( KFileMetaInfo::WhatFlags indexDetail )
230 : m_indexDetail(indexDetail) {
233 int64_t maximalStreamReadLength (
const Strigi::AnalysisResult& ar ) {
243 KFileMetaInfo::WhatFlags m_indexDetail;
246void KFileMetaInfoPrivate::init (
QIODevice& stream,
const KUrl& url, time_t mtime, KFileMetaInfo::WhatFlags w )
251 KFileMetaInfoAnalysisConfiguration c( w );
252 Strigi::StreamAnalyzer indexer ( c );
253 KMetaInfoWriter writer;
255 Strigi::AnalysisResult idx ( url.
toLocalFile().toUtf8().constData(), mtime, writer, indexer );
256 idx.setWriterData ( &items );
258 QIODeviceInputStream strigiStream ( stream, c.maximalStreamReadLength(idx) );
259 indexer.analyze ( idx, &strigiStream );
264void KFileMetaInfoPrivate::initWriters (
const KUrl& file )
266 QStringList mimetypes;
268 for ( i = items.begin(); i != items.end(); ++i ) {
271 if ( w && w->
canWrite ( file, i.key() ) ) {
272 i.value().d->writer = w;
278 KFileMetaInfo::WhatFlags w )
279 : d ( new KFileMetaInfoPrivate() )
281 QFileInfo fileinfo ( path );
285 if ( ( fileinfo.isFile() || fileinfo.isDir() || fileinfo.isSymLink() )
286 && file.open ( QIODevice::ReadOnly ) ) {
288 d->init ( file, u, fileinfo.lastModified().toTime_t(), w );
289 if ( fileinfo.isWritable() ) {
290 d->initWriters ( u );
296 : d ( new KFileMetaInfoPrivate() )
300 if ( file.open ( QIODevice::ReadOnly ) ) {
301 d->init ( file, url, fileinfo.lastModified().toTime_t() );
302 if ( fileinfo.isWritable() ) {
303 d->initWriters ( url );
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();
340 for ( j = data.constBegin(); j != data.constEnd(); ++j ) {
341 ok &= j.key()->write ( d->m_url, j.value() );
359 return ( i == d->items.constEnd() ) ?
nullitem : i.value();
364 return d->items.keys();
369 return d->items[key];
374 return !d->m_url.isEmpty();
379 return QStringList();
384 return QStringList();
387#ifndef KDE_NO_DEPRECATED
394#ifndef KDE_NO_DEPRECATED
402class KFileMetaInfoPrivate :
public QSharedData
408 KFileMetaInfo::WhatFlags w )
459 return QStringList();
475 return QStringList();
480 return QStringList();
483#ifndef KDE_NO_DEPRECATED
490#ifndef KDE_NO_DEPRECATED
virtual bool canWrite(const KUrl &file, const QString &key)=0
determine if this plugin can write a value into a particular resource.
static KFileWriterProvider * self()
KFileWritePlugin * loadPlugin(const QString &key)
QString toLocalFile(AdjustPathOption trailing=LeaveTrailingSlash) const
const char * name(StandardAction id)