aheinecke@404: /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik
aheinecke@404:  * Software engineering by Intevation GmbH
aheinecke@404:  *
aheinecke@404:  * This file is Free Software under the GNU GPL (v>=2)
aheinecke@404:  * and comes with ABSOLUTELY NO WARRANTY!
aheinecke@404:  * See LICENSE.txt for details.
aheinecke@404:  */
rrenkert@334: #include "certificatetablemodel.h"
rrenkert@334: 
rrenkert@397: #include <QFont>
rrenkert@397: 
rrenkert@334: CertificateTabelModel::CertificateTabelModel(QObject *parent)
rrenkert@334:     : QAbstractTableModel(parent)
rrenkert@334: {
rrenkert@342:     header.append("");
andre@380:     header.append(tr("Subject CN"));
andre@380:     header.append(tr("Subject O"));
rrenkert@416:     header.append(tr("Valid from"));
rrenkert@416:     header.append(tr("Valid to"));
emanuel@661:     header.append(tr("Fingerprint (SHA1)"));
rrenkert@334: 
rrenkert@334: }
rrenkert@334: 
rrenkert@358: void CertificateTabelModel::addCertificate(const Certificate& certificate,
rrenkert@358:     bool editable)
rrenkert@334: {
rrenkert@342:     beginInsertRows(QModelIndex(), rowCount(), rowCount());
aheinecke@463:     mCertificates.append(certificate);
aheinecke@463:     mCertificates.last().setEditable(editable);
rrenkert@342:     endInsertRows();
rrenkert@334: }
rrenkert@334: 
rrenkert@376: bool CertificateTabelModel::removeRows(int row, int count,
rrenkert@376:     const QModelIndex &index)
rrenkert@376: {
rrenkert@376:     beginRemoveRows(QModelIndex(), row, row + count - 1);
aheinecke@463:     if ((row + count - 1) > mCertificates.size()) {
rrenkert@376:         return false;
rrenkert@376:     }
rrenkert@376:     for (int i = row + count - 1; i >= row; i--) {
aheinecke@463:         mCertificates.removeAt(i);
rrenkert@376:     }
rrenkert@376:     endRemoveRows();
rrenkert@376:     return true;
rrenkert@376: }
rrenkert@376: 
rrenkert@396: bool CertificateTabelModel::removeAll()
rrenkert@396: {
aheinecke@463:     return removeRows(0, mCertificates.size(), QModelIndex());
rrenkert@396: }
rrenkert@396: 
rrenkert@334: QVariant CertificateTabelModel::data(const QModelIndex &index,
rrenkert@334:         int role) const
rrenkert@334: {
aheinecke@463:     if (index.row() > mCertificates.size() || index.row() < 0) {
rrenkert@334:         return QVariant();
rrenkert@334:     }
rrenkert@334: 
rrenkert@342:     if (role == Qt::DisplayRole) {
aheinecke@463:         Certificate cert = mCertificates.at(index.row());
rrenkert@342:         QVariant ret;
rrenkert@342:         switch(index.column()) {
rrenkert@342:         case 0: ret = cert.isInstallCert(); break;
rrenkert@342:         case 1: ret = cert.subjectCN(); break;
andre@380:         case 2: ret = cert.subjectO(); break;
emanuel@661:         case 3: ret = cert.validFrom(); break;
emanuel@661:         case 4: ret = cert.validTo(); break;
emanuel@661:         case 5: ret = cert.fingerprint(); break;
rrenkert@342:         default: ;
rrenkert@342:         }
rrenkert@342:         return ret;
rrenkert@334:     }
rrenkert@358:     if (role == Qt::UserRole) {
aheinecke@463:         Certificate cert = mCertificates.at(index.row());
rrenkert@358:         return cert.isEditable();
rrenkert@358:     }
rrenkert@397:     if (role == Qt::FontRole && index.column() == 7) {
rrenkert@397:         QFont block("DejaVu Sans Mono");
rrenkert@397:         return block;
rrenkert@397:     }
rrenkert@334: 
rrenkert@334:     return QVariant();
rrenkert@334: }
rrenkert@334: 
rrenkert@348: bool CertificateTabelModel::setData(const QModelIndex &index,
rrenkert@348:     const QVariant &value, int role)
rrenkert@348: {
aheinecke@463:     if (index.row() > mCertificates.size() || index.row() < 0) {
rrenkert@353:         return false;
rrenkert@353:     }
rrenkert@353: 
rrenkert@353:     bool newValue = value.toBool();
aheinecke@463:     Certificate &cert = mCertificates[index.row()];
rrenkert@358:     if (!cert.isEditable()) {
rrenkert@358:         return false;
rrenkert@358:     }
rrenkert@353:     cert.setInstallCert(newValue);
rrenkert@353: 
rrenkert@353:     emit dataChanged(index, index);
rrenkert@353: 
rrenkert@348:     return true;
rrenkert@348: }
rrenkert@348: 
rrenkert@334: QVariant CertificateTabelModel::headerData(int section,
rrenkert@334:         Qt::Orientation orientation, int role) const
rrenkert@334: {
rrenkert@334:     if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {
rrenkert@342:         return header.at(section);
rrenkert@334:     }
rrenkert@334:     return QVariant();
rrenkert@334: }
rrenkert@334: 
rrenkert@334: int CertificateTabelModel::rowCount(const QModelIndex&) const
rrenkert@334: {
aheinecke@463:     return mCertificates.size();
rrenkert@334: }
rrenkert@334: 
rrenkert@334: int CertificateTabelModel::columnCount(const QModelIndex&) const
rrenkert@334: {
rrenkert@342:     return header.size();
rrenkert@334: }
rrenkert@334: 
rrenkert@348: Qt::ItemFlags CertificateTabelModel::flags(const QModelIndex &index) const
rrenkert@348: {
rrenkert@348:     if (!index.isValid ())
rrenkert@348:         return Qt::ItemIsSelectable;
rrenkert@334: 
rrenkert@348:     if (index.column() == 0) {
rrenkert@348:         return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
rrenkert@348:     }
rrenkert@348: 
rrenkert@348:     return QAbstractTableModel::flags(index);
rrenkert@348: }