summaryrefslogtreecommitdiffstats
path: root/Swift
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2016-10-04 14:57:36 (GMT)
committerKevin Smith <kevin.smith@isode.com>2016-10-21 08:19:16 (GMT)
commit300c78798c7b3efd558bc643671acdaa0704b18c (patch)
treeee3847a3bebeafea5722c1c8202a632524388d5f /Swift
parent223bdbe232d42e459d4e1b840fe91486e5b4b733 (diff)
downloadswift-300c78798c7b3efd558bc643671acdaa0704b18c.zip
swift-300c78798c7b3efd558bc643671acdaa0704b18c.tar.bz2
Fix potential nullptr dereference in QtVCardWidget
Test-Information: Unit tests pass in ASAN-enabled build on macOS 10.12. Change-Id: I2dd2ab79e70b0613550fd0eacb739f50627a192f
Diffstat (limited to 'Swift')
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp36
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.h1
2 files changed, 19 insertions, 18 deletions
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
index c5f99f0..290feca 100644
--- a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp
@@ -74,190 +74,190 @@ QtVCardWidget::~QtVCardWidget() {
QSize QtVCardWidget::sizeHint() const {
QSize newSizeHint = ui->photoAndName->sizeHint();
// use mininmal size that does not require scrolling
QSize fieldsWidgetSize = ui->scrollArea->widget()->minimumSize();
fieldsWidgetSize.setWidth(ui->scrollArea->widget()->sizeHint().width());
newSizeHint += QSize(0, ui->line->height());
newSizeHint = QSize(std::max(newSizeHint.width(), fieldsWidgetSize.width()), newSizeHint.height() + fieldsWidgetSize.height());
// add layout margin
newSizeHint += QSize(layout()->contentsMargins().left() + layout()->contentsMargins().right(), layout()->contentsMargins().top() + layout()->contentsMargins().bottom());
// the spaceing before and after the line between the profile header and its fields
newSizeHint += QSize(0, layout()->spacing() * 2);
return newSizeHint;
}
bool QtVCardWidget::isEditable() const {
return editable;
}
void QtVCardWidget::setEditable(bool editable) {
this->editable = editable;
ui->photoAndName->setProperty("editable", QVariant(editable));
- foreach(QtVCardGeneralField* field, fields) {
+ for (auto field : fields) {
field->setEditable(editable);
}
toolButton->setVisible(editable);
editableChanged(editable);
}
void QtVCardWidget::setVCard(VCard::ref vcard) {
clearFields();
this->vcard = std::make_shared<VCard>(*vcard);
ui->photoAndName->setFormattedName(P2QSTRING(vcard->getFullName()));
ui->photoAndName->setNickname(P2QSTRING(vcard->getNickname()));
ui->photoAndName->setPrefix(P2QSTRING(vcard->getPrefix()));
ui->photoAndName->setGivenName(P2QSTRING(vcard->getGivenName()));
ui->photoAndName->setMiddleName(P2QSTRING(vcard->getMiddleName()));
ui->photoAndName->setFamilyName(P2QSTRING(vcard->getFamilyName()));
ui->photoAndName->setSuffix(P2QSTRING(vcard->getSuffix()));
ui->photoAndName->setAvatar(vcard->getPhoto(), vcard->getPhotoType());
- foreach (const VCard::EMailAddress& address, vcard->getEMailAddresses()) {
+ for (const auto& address : vcard->getEMailAddresses()) {
if (address.isInternet) {
QtVCardInternetEMailField* internetEmailField = new QtVCardInternetEMailField(this, ui->cardFields);
internetEmailField->initialize();
internetEmailField->setInternetEMailAddress(address);
appendField(internetEmailField);
}
}
- foreach (const VCard::Telephone& telephone, vcard->getTelephones()) {
+ for (const auto& telephone : vcard->getTelephones()) {
QtVCardTelephoneField* telField = new QtVCardTelephoneField(this, ui->cardFields);
telField->initialize();
telField->setTelephone(telephone);
appendField(telField);
}
- foreach (const VCard::Address& address, vcard->getAddresses()) {
+ for (const auto& address : vcard->getAddresses()) {
QtVCardAddressField* addressField = new QtVCardAddressField(this, ui->cardFields);
addressField->initialize();
addressField->setAddress(address);
appendField(addressField);
}
- foreach (const VCard::AddressLabel& label, vcard->getAddressLabels()) {
+ for (const auto& label : vcard->getAddressLabels()) {
QtVCardAddressLabelField* addressLabelField = new QtVCardAddressLabelField(this, ui->cardFields);
addressLabelField->initialize();
addressLabelField->setAddressLabel(label);
appendField(addressLabelField);
}
if (!vcard->getBirthday().is_not_a_date_time()) {
QtVCardBirthdayField* bdayField = new QtVCardBirthdayField(this, ui->cardFields);
bdayField->initialize();
bdayField->setBirthday(vcard->getBirthday());
appendField(bdayField);
}
- foreach (const JID& jid, vcard->getJIDs()) {
+ for (const auto& jid : vcard->getJIDs()) {
QtVCardJIDField* jidField = new QtVCardJIDField(this, ui->cardFields);
jidField->initialize();
jidField->setJID(jid);
appendField(jidField);
}
if (!vcard->getDescription().empty()) {
QtVCardDescriptionField* descField = new QtVCardDescriptionField(this, ui->cardFields);
descField->initialize();
descField->setDescription(vcard->getDescription());
appendField(descField);
}
- foreach (const VCard::Organization& org, vcard->getOrganizations()) {
+ for (const auto& org : vcard->getOrganizations()) {
QtVCardOrganizationField* orgField = new QtVCardOrganizationField(this, ui->cardFields);
orgField->initialize();
orgField->setOrganization(org);
appendField(orgField);
}
- foreach (const std::string& role, vcard->getRoles()) {
+ for (const auto& role : vcard->getRoles()) {
QtVCardRoleField* roleField = new QtVCardRoleField(this, ui->cardFields);
roleField->initialize();
roleField->setRole(role);
appendField(roleField);
}
- foreach (const std::string& title, vcard->getTitles()) {
+ for (const auto& title : vcard->getTitles()) {
QtVCardTitleField* titleField = new QtVCardTitleField(this, ui->cardFields);
titleField->initialize();
titleField->setTitle(title);
appendField(titleField);
}
- foreach (const std::string& url, vcard->getURLs()) {
+ for (const auto& url : vcard->getURLs()) {
QtVCardURLField* urlField = new QtVCardURLField(this, ui->cardFields);
urlField->initialize();
urlField->setURL(url);
appendField(urlField);
}
relayoutToolButton();
setEditable(editable);
}
VCard::ref QtVCardWidget::getVCard() {
clearEmptyFields();
vcard->setFullName(Q2PSTRING(ui->photoAndName->getFormattedName()));
vcard->setNickname(Q2PSTRING(ui->photoAndName->getNickname()));
vcard->setPrefix(Q2PSTRING(ui->photoAndName->getPrefix()));
vcard->setGivenName(Q2PSTRING(ui->photoAndName->getGivenName()));
vcard->setMiddleName(Q2PSTRING(ui->photoAndName->getMiddleName()));
vcard->setFamilyName(Q2PSTRING(ui->photoAndName->getFamilyName()));
vcard->setSuffix(Q2PSTRING(ui->photoAndName->getSuffix()));
vcard->setPhoto(ui->photoAndName->getAvatarData());
vcard->setPhotoType(ui->photoAndName->getAvatarType());
vcard->clearEMailAddresses();
vcard->clearJIDs();
vcard->clearURLs();
vcard->clearTelephones();
vcard->clearRoles();
vcard->clearTitles();
vcard->clearOrganizations();
vcard->clearAddresses();
vcard->clearAddressLabels();
QtVCardBirthdayField* bdayField = nullptr;
QtVCardDescriptionField* descriptionField = nullptr;
- foreach(QtVCardGeneralField* field, fields) {
+ for (auto field : fields) {
QtVCardInternetEMailField* emailField;
if ((emailField = dynamic_cast<QtVCardInternetEMailField*>(field))) {
vcard->addEMailAddress(emailField->getInternetEMailAddress());
continue;
}
QtVCardTelephoneField* telephoneField;
if ((telephoneField = dynamic_cast<QtVCardTelephoneField*>(field))) {
vcard->addTelephone(telephoneField->getTelephone());
continue;
}
QtVCardAddressField* addressField;
if ((addressField = dynamic_cast<QtVCardAddressField*>(field))) {
vcard->addAddress(addressField->getAddress());
continue;
}
QtVCardAddressLabelField* addressLabelField;
if ((addressLabelField = dynamic_cast<QtVCardAddressLabelField*>(field))) {
vcard->addAddressLabel(addressLabelField->getAddressLabel());
continue;
}
if ((bdayField = dynamic_cast<QtVCardBirthdayField*>(field))) {
continue;
}
QtVCardJIDField* jidField;
if ((jidField = dynamic_cast<QtVCardJIDField*>(field))) {
@@ -290,137 +290,137 @@ VCard::ref QtVCardWidget::getVCard() {
QtVCardURLField* urlField;
if ((urlField = dynamic_cast<QtVCardURLField*>(field))) {
vcard->addURL(urlField->getURL());
continue;
}
}
if (bdayField) {
vcard->setBirthday(bdayField->getBirthday());
} else {
vcard->setBirthday(boost::posix_time::ptime());
}
if (descriptionField) {
vcard->setDescription(descriptionField->getDescription());
} else {
vcard->setDescription("");
}
return vcard;
}
void QtVCardWidget::addField() {
QAction* action = nullptr;
if ((action = dynamic_cast<QAction*>(sender()))) {
std::shared_ptr<QtVCardFieldInfo> fieldInfo = actionFieldInfo[action];
QWidget* newField = fieldInfo->createFieldInstance(this, ui->cardFields, true);
QtVCardGeneralField* newGeneralField = dynamic_cast<QtVCardGeneralField*>(newField);
if (newGeneralField) {
newGeneralField->initialize();
+ appendField(newGeneralField);
+ relayoutToolButton();
}
- appendField(newGeneralField);
- relayoutToolButton();
}
}
void QtVCardWidget::removeField(QtVCardGeneralField *field) {
int sameFields = 0;
QtVCardGeneralField* fieldToChange = nullptr;
- foreach (QtVCardGeneralField* vcardField, fields) {
+ for (auto vcardField : fields) {
if ((vcardField != field) && (typeid(*vcardField) == typeid(*field))) {
sameFields++;
fieldToChange = vcardField;
}
}
if ((sameFields == 1) && fieldToChange) {
fieldToChange->setStarVisible(false);
}
fields.remove(field);
delete field;
}
void QtVCardWidget::addFieldType(QMenu* menu, std::shared_ptr<QtVCardFieldInfo> fieldType) {
if (!fieldType->getMenuName().isEmpty()) {
QAction* action = new QAction(tr("Add %1").arg(fieldType->getMenuName()), this);
actionFieldInfo[action] = fieldType;
connect(action, SIGNAL(triggered()), this, SLOT(addField()));
menu->addAction(action);
}
}
int QtVCardWidget::fieldTypeInstances(std::shared_ptr<QtVCardFieldInfo> fieldType) {
int instances = 0;
for (int n = 0; n < ui->cardFields->count(); n++) {
if (fieldType->testInstance(ui->cardFields->itemAt(n)->widget())) instances++;
}
return instances;
}
void layoutDeleteChildren(QLayout *layout) {
while(layout->count() > 0) {
QLayoutItem* child;
if ((child = layout->takeAt(0)) != nullptr) {
if (child->layout()) {
layoutDeleteChildren(child->layout());
}
if (dynamic_cast<QToolButton*>(child->widget())) {
delete child;
break;
}
delete child->widget();
delete child;
}
}
}
void QtVCardWidget::clearFields() {
- foreach(QtVCardGeneralField* field, fields) {
+ for (auto field : fields) {
delete field;
}
fields.clear();
assert(ui->cardFields->count() >= 0);
layoutDeleteChildren(ui->cardFields);
}
void QtVCardWidget::clearEmptyFields() {
std::vector<QtVCardGeneralField*> items_to_remove;
- foreach (QtVCardGeneralField* field, fields) {
+ for (auto field : fields) {
if (field->property("empty").isValid() && field->property("empty").toBool()) {
ui->cardFields->removeWidget(field);
items_to_remove.push_back(field);
delete field;
}
}
- foreach(QtVCardGeneralField* field, items_to_remove) {
+ for (auto field : items_to_remove) {
fields.remove(field);
}
}
void QtVCardWidget::appendField(QtVCardGeneralField *field) {
connect(field, SIGNAL(deleteField(QtVCardGeneralField*)), SLOT(removeField(QtVCardGeneralField*)));
QtVCardGeneralField* fieldToChange = nullptr;
- foreach (QtVCardGeneralField* vcardField, fields) {
+ for (auto vcardField : fields) {
if (typeid(*vcardField) == typeid(*field)) {
fieldToChange = vcardField;
break;
}
}
if (fieldToChange) {
fieldToChange->setStarVisible(true);
field->setStarVisible(true);
}
fields.push_back(field);
}
void QtVCardWidget::relayoutToolButton() {
ui->cardFields->addWidget(toolButton, ui->cardFields->rowCount(), ui->cardFields->columnCount()-2, 1, 1, Qt::AlignRight);
}
}
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.h b/Swift/QtUI/QtVCardWidget/QtVCardWidget.h
index 5334016..9aae158 100644
--- a/Swift/QtUI/QtVCardWidget/QtVCardWidget.h
+++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.h
@@ -1,44 +1,45 @@
/*
* Copyright (c) 2012 Tobias Markmann
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
/*
* Copyright (c) 2015-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
+#include <list>
#include <memory>
#include <QToolButton>
#include <QWidget>
#include <Swiften/Elements/VCard.h>
#include <Swift/QtUI/QtVCardWidget/QtVCardFieldInfo.h>
#include <Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h>
#include <Swift/QtUI/QtVCardWidget/QtVCardPhotoAndNameFields.h>
namespace Ui {
class QtVCardWidget;
}
namespace Swift {
class QtVCardWidget : public QWidget {
Q_OBJECT
Q_PROPERTY(bool editable READ isEditable WRITE setEditable)
public :
explicit QtVCardWidget(QWidget* parent = nullptr);
~QtVCardWidget();
bool isEditable() const;
void setEditable(bool);
void setVCard(VCard::ref vcard);
VCard::ref getVCard();