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

lokalize

  • sources
  • kde-4.14
  • kdesdk
  • lokalize
  • src
  • tm
tmscanapi.cpp
Go to the documentation of this file.
1 /* ****************************************************************************
2  This file is part of Lokalize
3 
4  Copyright (C) 2007-2009 by Nick Shaforostoff <shafff@ukr.net>
5 
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU General Public License as
8  published by the Free Software Foundation; either version 2 of
9  the License or (at your option) version 3 or any later version
10  accepted by the membership of KDE e.V. (or its successor approved
11  by the membership of KDE e.V.), which shall act as a proxy
12  defined in Section 14 of version 3 of the license.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>.
21 
22 **************************************************************************** */
23 
24 #include "tmscanapi.h"
25 #include "jobs.h"
26 #include "catalog.h"
27 #include "prefs_lokalize.h"
28 
29 #include <kdebug.h>
30 #include <kio/global.h>
31 #include <kjob.h>
32 #include <kjobtrackerinterface.h>
33 #include <threadweaver/ThreadWeaver.h>
34 #include "dbfilesmodel.h"
35 #include <project.h>
36 
37 namespace TM {
38  static QVector<ScanJob*> doScanRecursive(const QDir& dir, const QString& dbName, KJob* metaJob);
39 }
40 
41 using namespace TM;
42 
43 RecursiveScanJob::RecursiveScanJob(const QString& dbName, QObject* parent)
44  : KJob(parent)
45  , m_dbName(dbName)
46 {
47  setCapabilities(KJob::Killable);
48 }
49 
50 bool RecursiveScanJob::doKill()
51 {
52  foreach(ScanJob* job, m_jobs)
53  ThreadWeaver::Weaver::instance()->dequeue(job);
54  return true;
55 }
56 
57 void RecursiveScanJob::setJobs(const QVector<ScanJob*>& jobs)
58 {
59  m_jobs=jobs;
60  setTotalAmount(KJob::Files,jobs.size());
61 
62  if (!jobs.size())
63  kill(KJob::EmitResult);
64 }
65 
66 void RecursiveScanJob::scanJobFinished(ThreadWeaver::Job* j)
67 {
68  ScanJob* job=static_cast<ScanJob*>(j);
69 
70  setProcessedAmount(KJob::Files,processedAmount(KJob::Files)+1);
71  emitPercent(processedAmount(KJob::Files),totalAmount(KJob::Files));
72 
73  setProcessedAmount(KJob::Bytes,processedAmount(KJob::Bytes)+job->m_size);
74  if (m_time.elapsed()) emitSpeed(1000*processedAmount(KJob::Bytes)/m_time.elapsed());
75 
76 
77  if (processedAmount(KJob::Files)==totalAmount(KJob::Files))
78  {
79  emitResult();
80  kWarning()<<"finished in"<<m_time.elapsed()<<"msecs";
81  }
82 }
83 
84 void RecursiveScanJob::start()
85 {
86  m_time.start();
87  emit description(this,
88  i18n("Adding files to Lokalize translation memory"),
89  qMakePair(i18n("TM"), m_dbName));
90 }
91 
92 int TM::scanRecursive(const QList<QUrl>& urls, const QString& dbName)
93 {
94  RecursiveScanJob* metaJob = new RecursiveScanJob(dbName);
95  KIO::getJobTracker()->registerJob(metaJob);
96  metaJob->start();
97 
98  QVector<ScanJob*> result;
99  int i=urls.size();
100  while(--i>=0)
101  {
102  const QUrl& url=urls.at(i);
103  if (url.isEmpty() || url.path().isEmpty() ) //NOTE is this a Qt bug?
104  continue;
105  if (Catalog::extIsSupported(url.path()))
106  {
107  ScanJob* job=new ScanJob(KUrl(url),dbName);
108  QObject::connect(job,SIGNAL(done(ThreadWeaver::Job*)),job,SLOT(deleteLater()));
109  QObject::connect(job,SIGNAL(done(ThreadWeaver::Job*)),metaJob,SLOT(scanJobFinished(ThreadWeaver::Job*)));
110  ThreadWeaver::Weaver::instance()->enqueue(job);
111  result.append(job);
112  }
113  else
114  result+=doScanRecursive(QDir(url.toLocalFile()),dbName,metaJob);
115  }
116 
117  metaJob->setJobs(result);
118  DBFilesModel::instance()->openDB(dbName); //update stats after it finishes
119 
120  return result.size();
121 }
122 
123 //returns gross number of jobs started
124 static QVector<ScanJob*> TM::doScanRecursive(const QDir& dir, const QString& dbName,KJob* metaJob)
125 {
126  QVector<ScanJob*> result;
127  QStringList subDirs(dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot|QDir::Readable));
128  int i=subDirs.size();
129  while(--i>=0)
130  result+=TM::doScanRecursive(QDir(dir.filePath(subDirs.at(i))),dbName,metaJob);
131 
132  QStringList filters=Catalog::supportedExtensions();
133  i=filters.size();
134  while(--i>=0)
135  filters[i].prepend('*');
136  QStringList files(dir.entryList(filters,QDir::Files|QDir::NoDotAndDotDot|QDir::Readable));
137  i=files.size();
138 
139  while(--i>=0)
140  {
141  ScanJob* job=new ScanJob(KUrl(dir.filePath(files.at(i))),dbName);
142  QObject::connect(job,SIGNAL(done(ThreadWeaver::Job*)),job,SLOT(deleteLater()));
143  QObject::connect(job,SIGNAL(done(ThreadWeaver::Job*)),metaJob,SLOT(scanJobFinished(ThreadWeaver::Job*)));
144  ThreadWeaver::Weaver::instance()->enqueue(job);
145  result.append(job);
146  }
147 
148  return result;
149 }
150 
151 bool dragIsAcceptable(const QList<QUrl>& urls)
152 {
153  int i=urls.size();
154  while(--i>=0)
155  {
156  bool ok=Catalog::extIsSupported(urls.at(i).path());
157  if (!ok)
158  {
159  QFileInfo info(urls.at(i).toLocalFile());
160  ok=info.exists() && info.isDir();
161  }
162  if (ok)
163  return true;
164  }
165  return false;
166 }
167 
168 
169 QString shorterFilePath(const QString path)
170 {
171  QString pDir=Project::instance()->projectDir();
172  if (path.contains(pDir))//TODO cache projectDir?
173  return KUrl::relativePath(pDir,path).mid(2);
174  return path;
175 }
176 
177 
TM::scanRecursive
int scanRecursive(const QList< QUrl > &urls, const QString &dbName)
wrapper. returns gross number of jobs started
Definition: tmscanapi.cpp:92
project.h
TM::RecursiveScanJob::setJobs
void setJobs(const QVector< ScanJob * > &jobs)
Definition: tmscanapi.cpp:57
dragIsAcceptable
bool dragIsAcceptable(const QList< QUrl > &urls)
Definition: tmscanapi.cpp:151
Catalog::supportedExtensions
static QStringList supportedExtensions()
Definition: catalog.cpp:84
TM::ScanJob::m_size
int m_size
Definition: jobs.h:250
QVector::append
void append(const T &value)
QList::at
const T & at(int i) const
Project::instance
static Project * instance()
Definition: project.cpp:67
QDir::filePath
QString filePath(const QString &fileName) const
Project::projectDir
QString projectDir() const
Definition: project.h:67
dbfilesmodel.h
QUrl::isEmpty
bool isEmpty() const
QList::size
int size() const
TM::ScanJob
Definition: jobs.h:229
Catalog::extIsSupported
static bool extIsSupported(const QString &path)
Definition: catalog.cpp:93
TM::RecursiveScanJob::scanJobFinished
void scanJobFinished(ThreadWeaver::Job *)
Definition: tmscanapi.cpp:66
TM::RecursiveScanJob::doKill
bool doKill()
Definition: tmscanapi.cpp:50
QTime::elapsed
int elapsed() const
QObject
catalog.h
QString::isEmpty
bool isEmpty() const
QUrl::path
QString path() const
QString
QList
QStringList
QUrl::toLocalFile
QString toLocalFile() const
QFileInfo
QFileInfo::exists
bool exists() const
TM::DBFilesModel::openDB
void openDB(const QString &name)
Definition: dbfilesmodel.cpp:117
QString::contains
bool contains(QChar ch, Qt::CaseSensitivity cs) const
QUrl
QDir
jobs.h
QString::mid
QString mid(int position, int n) const
QVector
prefs_lokalize.h
TM::RecursiveScanJob::start
void start()
Definition: tmscanapi.cpp:84
QDir::entryList
QStringList entryList(QFlags< QDir::Filter > filters, QFlags< QDir::SortFlag > sort) const
tmscanapi.h
TM::RecursiveScanJob
Definition: tmscanapi.h:46
description
static const char description[]
Definition: main.cpp:55
QTime::start
void start()
TM::RecursiveScanJob::RecursiveScanJob
RecursiveScanJob(const QString &dbName, QObject *parent=0)
Definition: tmscanapi.cpp:43
shorterFilePath
QString shorterFilePath(const QString path)
Definition: tmscanapi.cpp:169
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QVector::size
int size() const
TM::doScanRecursive
static QVector< ScanJob * > doScanRecursive(const QDir &dir, const QString &dbName, KJob *metaJob)
Definition: tmscanapi.cpp:124
KJob
TM::DBFilesModel::instance
static DBFilesModel * instance()
Definition: dbfilesmodel.cpp:46
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:40:07 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

lokalize

Skip menu "lokalize"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdesdk API Reference

Skip menu "kdesdk API Reference"
  • kapptemplate
  • kcachegrind
  • kompare
  • lokalize
  • umbrello
  •   umbrello

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