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

kgpg

  • sources
  • kde-4.14
  • kdeutils
  • kgpg
  • core
KGpgRefNode.cpp
Go to the documentation of this file.
1 /* Copyright 2008,2009,2010,2013 Rolf Eike Beer <kde@opensource.sf-tec.de>
2  *
3  * This program is free software; you can redistribute it and/or
4  * modify it under the terms of the GNU General Public License as
5  * published by the Free Software Foundation; either version 2 of
6  * the License or (at your option) version 3 or any later version
7  * accepted by the membership of KDE e.V. (or its successor approved
8  * by the membership of KDE e.V.), which shall act as a proxy
9  * defined in Section 14 of version 3 of the license.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 #include "KGpgRefNode.h"
20 
21 #include <KLocale>
22 
23 #include "KGpgExpandableNode.h"
24 #include "KGpgRootNode.h"
25 
26 KGpgRefNode::KGpgRefNode(KGpgExpandableNode *parent, const QString &keyid)
27  : KGpgNode(parent),
28  m_id(keyid)
29 {
30  Q_ASSERT(!keyid.isEmpty());
31 
32  KGpgRootNode *root = getRootNode();
33  KGpgExpandableNode *pnd = parent;
34 
35  do {
36  m_selfsig = (pnd->getId().right(keyid.length()) == keyid);
37  if (m_selfsig)
38  m_keynode = pnd->toKeyNode();
39  else
40  pnd = pnd->getParentKeyNode();
41  } while (!m_selfsig && (pnd != root));
42 
43  // Self signatures do net need to get notified by their key: if the key is changed
44  // the key node is deleted, then those refnode would be deleted anyway. This avoids
45  // crashes when they would try to find the root node by iterating over their parent
46  // when the parents destructor is already called (see bug 208659).
47  if (!m_selfsig) {
48  m_keynode = root->findKey(keyid);
49 
50  if (m_keynode != NULL) {
51  m_keynode->addRef(this);
52  } else {
53  connect(root, SIGNAL(newKeyNode(KGpgKeyNode*)), this, SLOT(keyUpdated(KGpgKeyNode*)));
54  }
55  }
56 
57  parent->children.append(this);
58 }
59 
60 KGpgRefNode::KGpgRefNode(KGpgExpandableNode *parent, KGpgKeyNode *key)
61  : KGpgNode(parent),
62  m_id(key->getId()),
63  m_keynode(key)
64 {
65  Q_ASSERT(key != NULL);
66  Q_ASSERT(parent != NULL);
67  m_keynode->addRef(this);
68 
69  parent->children.append(this);
70 }
71 
72 KGpgRefNode::~KGpgRefNode()
73 {
74  if (m_keynode && !m_selfsig)
75  m_keynode->delRef(this);
76 }
77 
78 KGpgRootNode *
79 KGpgRefNode::getRootNode() const
80 {
81  KGpgExpandableNode *root;
82  KGpgExpandableNode *pt = m_parent;
83 
84  do {
85  root = pt;
86  pt = pt->getParentKeyNode();
87  } while (pt != NULL);
88 
89  return root->toRootNode();
90 }
91 
92 void
93 KGpgRefNode::keyUpdated(KGpgKeyNode *nkey)
94 {
95  Q_ASSERT(m_keynode == NULL);
96  Q_ASSERT(nkey != NULL);
97 
98  if (nkey->compareId(m_id)) {
99  disconnect(sender(), NULL, this, SLOT(keyUpdated(KGpgKeyNode*)));
100  m_keynode = nkey;
101  m_keynode->addRef(this);
102  }
103 }
104 
105 void
106 KGpgRefNode::unRef(KGpgRootNode *root)
107 {
108  if (root != NULL)
109  connect(root, SIGNAL(newKeyNode(KGpgKeyNode*)), this, SLOT(keyUpdated(KGpgKeyNode*)));
110 
111  m_keynode = NULL;
112 }
113 
114 QString
115 KGpgRefNode::getId() const
116 {
117  if (m_keynode != NULL)
118  return m_keynode->getFingerprint();
119  else
120  return m_id;
121 }
122 
123 QString
124 KGpgRefNode::getName() const
125 {
126  if (m_keynode != NULL)
127  return m_keynode->getName();
128  return i18n("[No user id found]");
129 }
130 
131 QString
132 KGpgRefNode::getEmail() const
133 {
134  if (m_keynode != NULL)
135  return m_keynode->getEmail();
136  return QString();
137 }
138 
139 bool
140 KGpgRefNode::isUnknown() const
141 {
142  return (m_keynode == NULL);
143 }
144 
145 KGpgKeyNode *
146 KGpgRefNode::getRefNode() const
147 {
148  return m_keynode;
149 }
150 
151 #include "KGpgRefNode.moc"
KGpgNode::toRootNode
KGpgRootNode * toRootNode()
Definition: KGpgNode.cpp:112
KGpgKeyNode::getName
virtual QString getName() const
Definition: KGpgKeyNode.cpp:89
KGpgKeyNode::delRef
void delRef(KGpgRefNode *node)
Remove a reference to this object.
Definition: KGpgKeyNode.cpp:218
KGpgNode::getParentKeyNode
KGpgExpandableNode * getParentKeyNode() const
Returns the parent node in the key hierarchy.
Definition: KGpgNode.cpp:330
KGpgRefNode.h
QObject::sender
QObject * sender() const
KGpgRefNode::isUnknown
bool isUnknown() const
Check if the referenced key exists.
Definition: KGpgRefNode.cpp:140
KGpgRefNode::unRef
void unRef(KGpgRootNode *root)
Break the current reference.
Definition: KGpgRefNode.cpp:106
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
KGpgRootNode.h
KGpgKeyNode
A public key with or without corresponding secret key.
Definition: KGpgKeyNode.h:33
KGpgRefNode::~KGpgRefNode
virtual ~KGpgRefNode()
Definition: KGpgRefNode.cpp:72
KGpgRootNode
The parent of all key data objects.
Definition: KGpgRootNode.h:38
KGpgRefNode::getRootNode
KGpgRootNode * getRootNode() const
Definition: KGpgRefNode.cpp:79
QList::append
void append(const T &value)
KGpgKeyNode::getFingerprint
const QString & getFingerprint() const
Definition: KGpgKeyNode.cpp:75
QString::isEmpty
bool isEmpty() const
QString
KGpgExpandableNode.h
KGpgExpandableNode::children
KGpgNode::List children
Definition: KGpgExpandableNode.h:41
QString::right
QString right(int n) const
KGpgRefNode::m_keynode
KGpgKeyNode * m_keynode
Definition: KGpgRefNode.h:48
KGpgRefNode::getRefNode
virtual KGpgKeyNode * getRefNode() const
Get the node of the primary key this node references to.
Definition: KGpgRefNode.cpp:146
KGpgRefNode::KGpgRefNode
KGpgRefNode(KGpgExpandableNode *parent, KGpgKeyNode *key)
Definition: KGpgRefNode.cpp:60
KGpgNode
The abstract base class for all classes representing keyring data.
Definition: KGpgNode.h:42
KGpgExpandableNode
The abstract base class for all classes that may have child objects.
Definition: KGpgExpandableNode.h:34
KGpgKeyNode::addRef
void addRef(KGpgRefNode *node)
Notify this key that a KGpgRefNode now references this key.
Definition: KGpgKeyNode.cpp:211
KGpgNode::toKeyNode
KGpgKeyNode * toKeyNode()
Definition: KGpgNode.cpp:94
KGpgNode::getId
virtual QString getId() const
Definition: KGpgNode.cpp:318
KGpgRefNode::getId
virtual QString getId() const
Definition: KGpgRefNode.cpp:115
KGpgKeyNode::getEmail
virtual QString getEmail() const
Definition: KGpgKeyNode.cpp:95
KGpgNode::m_parent
KGpgExpandableNode * m_parent
Definition: KGpgNode.h:50
QString::length
int length() const
KGpgKeyNode::compareId
bool compareId(const QString &other) const
compare the id of this node to the given other node
Definition: KGpgKeyNode.cpp:339
KGpgRefNode::getEmail
virtual QString getEmail() const
Definition: KGpgRefNode.cpp:132
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
KGpgRefNode::getName
virtual QString getName() const
Definition: KGpgRefNode.cpp:124
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kgpg

Skip menu "kgpg"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • sweeper

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