20 #include <QStringList>
32 SearchResult(
const QString &line);
36 void addUid(
const QString &
id);
37 const QString &getName(
const int &index)
const;
38 const QString &getEmail(
const int &index)
const;
39 int getUidCount()
const;
41 QString m_fingerprint;
42 unsigned int m_uatCount;
44 QVariant summary()
const;
50 KgpgCore::KgpgKeyAlgo m_algo;
53 class KGpgSearchResultModelPrivate {
55 explicit KGpgSearchResultModelPrivate();
56 ~KGpgSearchResultModelPrivate();
60 QString urlDecode(
const QString &line);
63 SearchResult::SearchResult(
const QString &line)
69 const QStringList parts(line.split(QLatin1Char(
':' )));
71 if (parts.count() < 6)
74 if (parts.at(1).isEmpty())
77 m_fingerprint = parts.at(1);
79 m_bits = parts.at(3).toUInt();
80 m_creation.setTime_t(parts.at(4).toULongLong());
81 m_revoked = (parts.at(6) == QLatin1String(
"r" ));
87 SearchResult::addUid(
const QString &
id)
89 Q_ASSERT(m_emails.count() == m_names.count());
90 QRegExp hasmail( QLatin1String(
"(.*) <(.*)>" ));
92 if (hasmail.exactMatch(
id)) {
93 m_names.append(hasmail.capturedTexts().at(1));
94 m_emails.append(hasmail.capturedTexts().at(2));
97 m_emails.append(QString());
102 SearchResult::getName(
const int &index)
const
104 return m_names.at(index);
108 SearchResult::getEmail(
const int &index)
const
110 return m_emails.at(index);
114 SearchResult::getUidCount()
const
116 Q_ASSERT(m_emails.count() == m_names.count());
118 return m_emails.count();
122 SearchResult::summary()
const
125 return i18nc(
"example: ID abc123xy, 1024-bit RSA key, created Jan 12 2009, revoked",
126 "ID %1, %2-bit %3 key, created %4, revoked", m_fingerprint,
128 m_creation.toString(KDateTime::LocalDate));
130 return i18nc(
"example: ID abc123xy, 1024-bit RSA key, created Jan 12 2009",
131 "ID %1, %2-bit %3 key, created %4", m_fingerprint,
133 m_creation.toString(KDateTime::LocalDate));
137 KGpgSearchResultModelPrivate::KGpgSearchResultModelPrivate()
141 KGpgSearchResultModelPrivate::~KGpgSearchResultModelPrivate()
143 foreach (SearchResult *item, m_items)
148 KGpgSearchResultModelPrivate::urlDecode(
const QString &line)
150 if (!line.contains(QLatin1Char(
'%' )))
153 QByteArray tmp(line.toAscii());
154 const QRegExp hex( QLatin1String(
"[A-F0-9]{2}" ));
157 while ((pos = tmp.indexOf(
"%", pos + 1)) >= 0) {
158 const QByteArray hexnum(tmp.mid(pos + 1, 2));
161 if (!hex.exactMatch(QLatin1String( hexnum )))
166 n[0] = hexnum.toUShort(NULL, 16);
169 tmp.replace(pos, 3, n);
172 return QTextCodec::codecForName(
"utf8")->toUnicode(tmp);
188 if (!index.isValid())
191 if (role != Qt::DisplayRole)
197 SearchResult *tmp =
static_cast<SearchResult *
>(index.internalPointer());
202 if (index.row() >= d->m_items.count())
205 tmp = d->m_items.at(index.row());
208 row = index.row() + 1;
209 int summaryRow = tmp->getUidCount();
211 if (tmp->m_uatCount != 0) {
219 if (index.column() == 0)
220 return i18np(
"One Photo ID",
"%1 Photo IDs", tmp->m_uatCount);
223 }
else if (row == summaryRow) {
224 if (index.column() == 0)
225 return tmp->summary();
229 Q_ASSERT(row < tmp->getUidCount());
232 switch (index.column()) {
234 return tmp->getName(row);
236 return tmp->getEmail(row);
245 if (parent.isValid()) {
246 if (parent.column() != 0)
249 SearchResult *tmp =
static_cast<SearchResult *
>(parent.internalPointer());
268 if (parent.isValid()) {
269 if (parent.internalPointer() != NULL) {
270 return QModelIndex();
272 if (parent.row() >= d->m_items.count())
273 return QModelIndex();
274 SearchResult *tmp = d->m_items.at(parent.row());
275 int maxRow = tmp->getUidCount();
276 if (tmp->m_uatCount != 0)
278 if ((row >= maxRow) || (column > 1))
279 return QModelIndex();
280 return createIndex(row, column, tmp);
283 if ((row >= d->m_items.count()) || (column > 1) || (row < 0) || (column < 0))
284 return QModelIndex();
285 return createIndex(row, column);
292 if (!index.isValid())
293 return QModelIndex();
295 SearchResult *tmp =
static_cast<SearchResult *
>(index.internalPointer());
298 return QModelIndex();
300 return createIndex(d->m_items.indexOf(tmp), 0);
306 if (!parent.isValid()) {
307 return d->m_items.count();
308 }
else if (parent.column() == 0) {
309 if (parent.internalPointer() != NULL)
312 SearchResult *item = d->m_items.at(parent.row());
313 int cnt = item->getUidCount();
314 if (item->m_uatCount != 0)
326 if (role != Qt::DisplayRole)
329 if (orientation != Qt::Horizontal)
336 return QString(i18nc(
"@title:column Title of a column of emails",
"Email"));
345 Q_ASSERT(index.isValid());
347 SearchResult *tmp =
static_cast<SearchResult *
>(index.internalPointer());
349 tmp = d->m_items.at(index.row());
351 return tmp->m_fingerprint;
357 Q_ASSERT(!lines.isEmpty());
358 Q_ASSERT(lines.first().startsWith(QLatin1String(
"pub:")));
360 if (lines.count() == 1)
363 SearchResult *nkey =
new SearchResult(lines.takeFirst());
364 if (!nkey->m_validPub) {
369 foreach (
const QString &line, lines) {
370 if (line.startsWith(QLatin1String(
"uid:"))) {
371 QString kid = d->urlDecode(line.section(QLatin1Char(
':' ), 1, 1));
374 }
else if (line.startsWith(QLatin1String(
"uat:"))) {
377 kDebug(2100) <<
"ignored search result line" << line;
381 if (nkey->getUidCount() > 0) {
382 beginInsertRows(QModelIndex(), d->m_items.count(), d->m_items.count());
383 d->m_items.append(nkey);
391 #include "kgpgsearchresultmodel.moc"
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
void slotAddKey(QStringList lines)
QString toString(const KgpgKeyAlgo algorithm)
KGpgSearchResultModel(QObject *parent=NULL)
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
const QString & idForIndex(const QModelIndex &index) const
get the key fingerprint for the given index
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
virtual QModelIndex parent(const QModelIndex &index) const
KgpgKeyAlgo toAlgo(const uint v)