This library provides a simple and nice C++ wrapper around these libraries, so that programmers can concentrate on functionality. It offers general support for PCSC-lite, OpenSSL, PKCS#11, plus specific functionality for the SuisseID.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.0 KiB
122 lines
4.0 KiB
/*! @file |
|
|
|
@id $Id$ |
|
*/ |
|
// 1 2 3 4 5 6 7 8 |
|
// 45678901234567890123456789012345678901234567890123456789012345678901234567890 |
|
|
|
#ifndef CARDGUI_MODEL_HXX |
|
#define CARDGUI_MODEL_HXX |
|
|
|
#include <cardos.hxx> |
|
|
|
#include <QtCore/QAbstractItemModel> |
|
#include <QtGui/QFont> |
|
|
|
class CardGuiModel: public QAbstractItemModel { |
|
|
|
Q_OBJECT; |
|
|
|
public: |
|
|
|
CardGuiModel(cardos::Commands& cmd, const std::string& path): |
|
_rootItem(cmd, path) { |
|
} |
|
|
|
QVariant data(const QModelIndex &index, int role) const { |
|
if (!index.isValid()) return QVariant(); |
|
cardos::Object* o(static_cast<cardos::Object*>(index.internalPointer())); |
|
switch (role) { |
|
case Qt::TextAlignmentRole: |
|
return Qt::AlignTop; |
|
case Qt::FontRole: |
|
if (index.column() == 2) { |
|
QFont f("Monospaced"); |
|
f.setStyleHint(QFont::TypeWriter); |
|
return f; |
|
} else return QVariant(); |
|
case Qt::DisplayRole: |
|
switch (index.column()) { |
|
case 0: return QString::fromStdString(o->logicalName()); |
|
case 1: return QString::fromStdString(o->name()); |
|
case 3: return QString::fromStdString(o->contentInfo()); |
|
case 2: if (o->content().size()) |
|
return QString::fromStdString(crypto::readable(o->content())); |
|
default: return QVariant(); |
|
} |
|
default: return QVariant(); |
|
} |
|
} |
|
|
|
Qt::ItemFlags flags(const QModelIndex &index) const { |
|
if (!index.isValid()) return 0; |
|
return Qt::ItemIsEnabled | Qt::ItemIsSelectable; |
|
} |
|
|
|
QVariant headerData(int section, Qt::Orientation orientation, |
|
int role = Qt::DisplayRole) const { |
|
if (orientation!=Qt::Horizontal || role!=Qt::DisplayRole) |
|
return QVariant(); |
|
switch (section) { |
|
case 0: return "Object"; |
|
case 1: return "ID"; |
|
case 3: return "Logical Content"; |
|
case 2: return "Binary Content"; |
|
default: return QVariant(); |
|
} |
|
} |
|
|
|
QModelIndex index(int row, int column, |
|
const QModelIndex &parent = QModelIndex()) const { |
|
if (!hasIndex(row, column, parent)) return QModelIndex(); |
|
const cardos::Object* parentItem(0); |
|
if (!parent.isValid()) |
|
parentItem = &_rootItem; |
|
else |
|
parentItem = static_cast<cardos::Object*>(parent.internalPointer()); |
|
if (row<parentItem->size()) |
|
return |
|
createIndex(row, column, &(*parentItem->children().at(row))); |
|
return QModelIndex(); |
|
} |
|
|
|
std::pair<const cardos::Object*, int> scan(const cardos::Object& o, |
|
const cardos::Object* c) const { |
|
int i(0); |
|
for (cardos::Object::Children::const_iterator it(o.children().begin()); |
|
it!=o.children().end(); ++it, ++i) { |
|
if (it->get()==c) return std::make_pair(&o, i); |
|
std::pair<const cardos::Object*, int> res(scan(**it, c)); |
|
if (res.first) return res; |
|
} |
|
return std::make_pair((const cardos::Object*)0, 0); |
|
} |
|
|
|
QModelIndex parent(const QModelIndex &index) const { |
|
if (!index.isValid()) return QModelIndex(); |
|
cardos::Object* childItem |
|
(static_cast<cardos::Object*>(index.internalPointer())); |
|
if (childItem==&_rootItem) return QModelIndex(); |
|
std::pair<const cardos::Object*, int> |
|
parentItem(scan(_rootItem, childItem)); |
|
if (!parentItem.first) return QModelIndex(); |
|
return createIndex(parentItem.second, 0, |
|
const_cast<cardos::Object*>(parentItem.first)); |
|
} |
|
|
|
int rowCount(const QModelIndex &parent = QModelIndex()) const { |
|
if (parent.isValid() && parent.internalPointer()) |
|
return static_cast<cardos::Object*>(parent.internalPointer())->size(); |
|
else |
|
return _rootItem.size(); |
|
} |
|
|
|
int columnCount(const QModelIndex &parent = QModelIndex()) const { |
|
return 4; |
|
} |
|
|
|
protected: |
|
cardos::Dir _rootItem; |
|
}; |
|
|
|
#endif
|
|
|