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>
42 #include <QStringList>
44 class KFileMetaInfoGroupPrivate :
public QSharedData {
71 class QIODeviceInputStream :
public Strigi::BufferedInputStream {
76 int32_t fillBuffer (
char* start, int32_t space );
82 QIODeviceInputStream::fillBuffer (
char* start, int32_t space )
84 if ( !in.isOpen() || !in.isReadable() )
96 int32_t nwritten = in.read ( start, max );
100 m_error =
"Could not read from QIODevice.";
104 if ( nwritten == 0 || in.atEnd() ) {
111 QIODeviceInputStream::QIODeviceInputStream (
QIODevice& i,
qint64 max )
118 if ( i.isSequential() ) {
127 class 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);
152 void addValue(
const Strigi::AnalysisResult* idx,
const Strigi::RegisteredField* field,
154 if (idx->writerData()) {
158 void addValue(
const Strigi::AnalysisResult* idx,
const Strigi::RegisteredField* field,
160 if (idx->writerData()) {
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());
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() {}
219 void initWriters (
const KUrl& );
220 void operator= (
const KFileMetaInfoPrivate& k ) {
226 class 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;
246 void 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 );
264 void KFileMetaInfoPrivate::initWriters (
const KUrl& file )
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();
387 #ifndef KDE_NO_DEPRECATED
394 #ifndef KDE_NO_DEPRECATED
400 #else //KIO_NO_STRIGI
408 KFileMetaInfo::WhatFlags w )