Skip to content
Snippets Groups Projects
Commit d3370f5c authored by Emmanuel Lepage Vallée's avatar Emmanuel Lepage Vallée Committed by Stepan Salenikovich
Browse files

credentials: Remove the union

It was an experiment, it failed. The number of cache fault
avoided by it is negligeable. It make debugging a pain and
prevent the use of "new" and "delete". Then, there is still
a crash in the freeing sequence.

I could have fixed it, but would rather fix the cause: unions

Issue: #80868
Change-Id: I107102f05d151055617fd4256e07ed5aaa196b2e
parent ca72f3e6
No related branches found
No related tags found
No related merge requests found
...@@ -35,16 +35,10 @@ typedef void (CredentialModelPrivate::*CredModelFct)(); ...@@ -35,16 +35,10 @@ typedef void (CredentialModelPrivate::*CredModelFct)();
struct CredentialNode final struct CredentialNode final
{ {
union { Credential* m_pCredential {nullptr};
struct { CredentialNode* m_pParent {nullptr};
Credential* m_pCredential = {nullptr}; QString* m_CategoryName {nullptr};
CredentialNode* m_pParent = {nullptr}; QVector<CredentialNode*> m_lChildren ;
} m_Cred;
struct {
QString* m_CategoryName = {nullptr};
QVector<CredentialNode*>* m_lChildren;
} m_Category;
} m_uContent;
enum class Level { enum class Level {
CATEGORY, CATEGORY,
...@@ -54,7 +48,6 @@ struct CredentialNode final ...@@ -54,7 +48,6 @@ struct CredentialNode final
short int m_Index = {-1}; short int m_Index = {-1};
Level m_Level; Level m_Level;
}; };
void free_node(CredentialNode* n);
/** /**
* Display the types of credentials that can be added * Display the types of credentials that can be added
...@@ -92,9 +85,9 @@ public: ...@@ -92,9 +85,9 @@ public:
CredentialModel* q_ptr ; CredentialModel* q_ptr ;
uint m_TopLevelCount = {3}; uint m_TopLevelCount = {3};
static Matrix2D<CredentialModel::EditState, CredentialModel::EditAction,CredModelFct> m_mStateMachine; static Matrix2D<CredentialModel::EditState, CredentialModel::EditAction,CredModelFct> m_mStateMachine;
CredentialNode* m_pSipCat = {nullptr}; CredentialNode* m_pSipCat {nullptr};
CredentialNode* m_pTurnCat = {nullptr}; CredentialNode* m_pTurnCat {nullptr};
CredentialNode* m_pStunCat = {nullptr}; CredentialNode* m_pStunCat {nullptr};
NewCredentialTypeModel* m_pTypeModel {nullptr}; NewCredentialTypeModel* m_pTypeModel {nullptr};
//Callbacks //Callbacks
...@@ -136,7 +129,7 @@ d_ptr(new CredentialModelPrivate()) ...@@ -136,7 +129,7 @@ d_ptr(new CredentialModelPrivate())
CredentialModel::~CredentialModel() CredentialModel::~CredentialModel()
{ {
foreach (CredentialNode* data, d_ptr->m_lCategories) { foreach (CredentialNode* data, d_ptr->m_lCategories) {
free(data); //delete doesn't support non-trivial structures delete data;
} }
} }
...@@ -164,7 +157,7 @@ QModelIndex CredentialModel::parent( const QModelIndex& index) const ...@@ -164,7 +157,7 @@ QModelIndex CredentialModel::parent( const QModelIndex& index) const
if ((!node) || node->m_Level == CredentialNode::Level::CATEGORY) if ((!node) || node->m_Level == CredentialNode::Level::CATEGORY)
return QModelIndex(); return QModelIndex();
return createIndex(node->m_uContent.m_Cred.m_pParent->m_Index,0,node->m_uContent.m_Cred.m_pParent); return createIndex(node->m_pParent->m_Index,0,node->m_pParent);
} }
///Get the column count ///Get the column count
...@@ -184,10 +177,10 @@ QModelIndex CredentialModel::index( int row, int column, const QModelIndex& pare ...@@ -184,10 +177,10 @@ QModelIndex CredentialModel::index( int row, int column, const QModelIndex& pare
const CredentialNode* node = static_cast<CredentialNode*>(parent.internalPointer()); const CredentialNode* node = static_cast<CredentialNode*>(parent.internalPointer());
if (node->m_Level != CredentialNode::Level::CATEGORY if (node->m_Level != CredentialNode::Level::CATEGORY
|| row >= node->m_uContent.m_Category.m_lChildren->size()) || row >= node->m_lChildren.size())
return QModelIndex(); return QModelIndex();
return createIndex(row, column, node->m_uContent.m_Category.m_lChildren->at(row)); return createIndex(row, column, node->m_lChildren.at(row));
} }
if (row >= d_ptr->m_lCategories.size()) if (row >= d_ptr->m_lCategories.size())
...@@ -207,18 +200,18 @@ QVariant CredentialModel::data(const QModelIndex& idx, int role) const { ...@@ -207,18 +200,18 @@ QVariant CredentialModel::data(const QModelIndex& idx, int role) const {
case CredentialNode::Level::CATEGORY: case CredentialNode::Level::CATEGORY:
switch(role) { switch(role) {
case Qt::DisplayRole: case Qt::DisplayRole:
return *node->m_uContent.m_Category.m_CategoryName; return *node->m_CategoryName;
} }
break; break;
case CredentialNode::Level::CREDENTIAL: case CredentialNode::Level::CREDENTIAL:
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
case CredentialModel::Role::NAME: case CredentialModel::Role::NAME:
return node->m_uContent.m_Cred.m_pCredential->username(); return node->m_pCredential->username();
case CredentialModel::Role::PASSWORD: case CredentialModel::Role::PASSWORD:
return node->m_uContent.m_Cred.m_pCredential->password(); return node->m_pCredential->password();
case CredentialModel::Role::REALM: case CredentialModel::Role::REALM:
return node->m_uContent.m_Cred.m_pCredential->realm(); return node->m_pCredential->realm();
default: default:
break; break;
} }
...@@ -237,7 +230,7 @@ int CredentialModel::rowCount(const QModelIndex& par) const { ...@@ -237,7 +230,7 @@ int CredentialModel::rowCount(const QModelIndex& par) const {
if (node->m_Level == CredentialNode::Level::CREDENTIAL) if (node->m_Level == CredentialNode::Level::CREDENTIAL)
return 0; return 0;
return d_ptr->m_lCategories[par.row()]->m_uContent.m_Category.m_lChildren->size(); return d_ptr->m_lCategories[par.row()]->m_lChildren.size();
} }
///Model flags ///Model flags
...@@ -270,21 +263,21 @@ bool CredentialModel::setData( const QModelIndex& idx, const QVariant &value, in ...@@ -270,21 +263,21 @@ bool CredentialModel::setData( const QModelIndex& idx, const QVariant &value, in
return false; return false;
if (idx.column() == 0 && role == CredentialModel::Role::NAME) { if (idx.column() == 0 && role == CredentialModel::Role::NAME) {
node->m_uContent.m_Cred.m_pCredential->setUsername(value.toString()); node->m_pCredential->setUsername(value.toString());
emit dataChanged(idx, idx); emit dataChanged(idx, idx);
this << EditAction::MODIFY; this << EditAction::MODIFY;
return true; return true;
} }
else if (idx.column() == 0 && role == CredentialModel::Role::PASSWORD) { else if (idx.column() == 0 && role == CredentialModel::Role::PASSWORD) {
if (node->m_uContent.m_Cred.m_pCredential->password() != value.toString()) { if (node->m_pCredential->password() != value.toString()) {
node->m_uContent.m_Cred.m_pCredential->setPassword(value.toString()); node->m_pCredential->setPassword(value.toString());
emit dataChanged(idx, idx); emit dataChanged(idx, idx);
this << EditAction::MODIFY; this << EditAction::MODIFY;
return true; return true;
} }
} }
else if (idx.column() == 0 && role == CredentialModel::Role::REALM) { else if (idx.column() == 0 && role == CredentialModel::Role::REALM) {
node->m_uContent.m_Cred.m_pCredential->setRealm(value.toString()); node->m_pCredential->setRealm(value.toString());
emit dataChanged(idx, idx); emit dataChanged(idx, idx);
this << EditAction::MODIFY; this << EditAction::MODIFY;
return true; return true;
...@@ -294,11 +287,10 @@ bool CredentialModel::setData( const QModelIndex& idx, const QVariant &value, in ...@@ -294,11 +287,10 @@ bool CredentialModel::setData( const QModelIndex& idx, const QVariant &value, in
CredentialNode* CredentialModelPrivate::createCat(const QString& name) CredentialNode* CredentialModelPrivate::createCat(const QString& name)
{ {
CredentialNode* n = (CredentialNode*) malloc(sizeof(CredentialNode)); CredentialNode* n = new CredentialNode();
n->m_Level = CredentialNode::Level::CATEGORY; n->m_Level = CredentialNode::Level::CATEGORY;
n->m_Index = q_ptr->rowCount(); n->m_Index = q_ptr->rowCount();
n->m_uContent.m_Category.m_CategoryName = new QString(name); n->m_CategoryName = new QString(name);
n->m_uContent.m_Category.m_lChildren = new QVector<CredentialNode*>();
q_ptr->beginInsertRows(QModelIndex(),m_lCategories.size(),0); q_ptr->beginInsertRows(QModelIndex(),m_lCategories.size(),0);
m_lCategories << n; m_lCategories << n;
...@@ -307,20 +299,6 @@ CredentialNode* CredentialModelPrivate::createCat(const QString& name) ...@@ -307,20 +299,6 @@ CredentialNode* CredentialModelPrivate::createCat(const QString& name)
return n; return n;
} }
void free_node(CredentialNode* n)
{
switch (n->m_Level) {
case CredentialNode::Level::CATEGORY:
delete n->m_uContent.m_Category.m_CategoryName;
delete n->m_uContent.m_Category.m_lChildren;
break;
case CredentialNode::Level::CREDENTIAL:
delete n->m_uContent.m_Cred.m_pCredential;
break;
}
free(n);
}
CredentialNode* CredentialModelPrivate::getCategory(Credential::Type type) CredentialNode* CredentialModelPrivate::getCategory(Credential::Type type)
{ {
switch (type) { switch (type) {
...@@ -361,24 +339,24 @@ QModelIndex CredentialModel::addCredentials() ...@@ -361,24 +339,24 @@ QModelIndex CredentialModel::addCredentials()
QModelIndex CredentialModel::addCredentials(Credential::Type type) QModelIndex CredentialModel::addCredentials(Credential::Type type)
{ {
CredentialNode* par = d_ptr->getCategory(type); CredentialNode* par = d_ptr->getCategory(type);
const int count = par->m_uContent.m_Category.m_lChildren->size(); const int count = par->m_lChildren.size();
const QModelIndex parIdx = index(par->m_Index,0); const QModelIndex parIdx = index(par->m_Index,0);
beginInsertRows(parIdx, count, count); beginInsertRows(parIdx, count, count);
CredentialNode* node = (CredentialNode*) malloc(sizeof(CredentialNode)); CredentialNode* node = new CredentialNode();
node->m_Level = CredentialNode::Level::CREDENTIAL; node->m_Level = CredentialNode::Level::CREDENTIAL;
node->m_uContent.m_Cred.m_pCredential = new Credential(type); node->m_pCredential = new Credential(type);
node->m_uContent.m_Cred.m_pParent = par; node->m_pParent = par;
node->m_Index = par->m_uContent.m_Category.m_lChildren->size(); node->m_Index = par->m_lChildren.size();
par->m_uContent.m_Category.m_lChildren->append(node); par->m_lChildren.append(node);
connect(node->m_uContent.m_Cred.m_pCredential, &Credential::changed,[this, node, par, type]() { connect(node->m_pCredential, &Credential::changed,[this, node, par, type]() {
const QModelIndex parIdx = index(par->m_Index,0); const QModelIndex parIdx = index(par->m_Index,0);
const QModelIndex idx = index(node->m_Index,0,parIdx); const QModelIndex idx = index(node->m_Index,0,parIdx);
emit dataChanged(idx, idx); emit dataChanged(idx, idx);
if (!node->m_Index) { if (!node->m_Index) {
Credential* c = node->m_uContent.m_Cred.m_pCredential; Credential* c = node->m_pCredential;
emit primaryCredentialChanged(type, c); emit primaryCredentialChanged(type, c);
} }
}); });
...@@ -398,11 +376,11 @@ void CredentialModel::removeCredentials(const QModelIndex& idx) ...@@ -398,11 +376,11 @@ void CredentialModel::removeCredentials(const QModelIndex& idx)
CredentialNode* node = static_cast<CredentialNode*>(idx.internalPointer()); CredentialNode* node = static_cast<CredentialNode*>(idx.internalPointer());
for (int i = node->m_Index+1; i < node->m_uContent.m_Cred.m_pParent->m_uContent.m_Category.m_lChildren->size();i++) { for (int i = node->m_Index+1; i < node->m_pParent->m_lChildren.size();i++) {
node->m_uContent.m_Cred.m_pParent->m_uContent.m_Category.m_lChildren->at(i)->m_Index--; node->m_pParent->m_lChildren.at(i)->m_Index--;
} }
node->m_uContent.m_Cred.m_pParent->m_uContent.m_Category.m_lChildren->removeAt(node->m_Index); node->m_pParent->m_lChildren.removeAt(node->m_Index);
free_node(node); delete node;
endRemoveRows(); endRemoveRows();
this << EditAction::MODIFY; this << EditAction::MODIFY;
...@@ -416,8 +394,11 @@ void CredentialModel::removeCredentials(const QModelIndex& idx) ...@@ -416,8 +394,11 @@ void CredentialModel::removeCredentials(const QModelIndex& idx)
void CredentialModelPrivate::clear() void CredentialModelPrivate::clear()
{ {
q_ptr->beginRemoveRows(QModelIndex(),0,q_ptr->rowCount()); q_ptr->beginRemoveRows(QModelIndex(),0,q_ptr->rowCount());
m_pSipCat = nullptr;
m_pTurnCat = nullptr;
m_pSipCat = nullptr;
foreach(CredentialNode* data2, m_lCategories) { foreach(CredentialNode* data2, m_lCategories) {
free_node(data2); delete data2;
} }
m_lCategories.clear(); m_lCategories.clear();
q_ptr->endRemoveRows(); q_ptr->endRemoveRows();
...@@ -433,8 +414,8 @@ void CredentialModelPrivate::save() ...@@ -433,8 +414,8 @@ void CredentialModelPrivate::save()
if (m_pSipCat) { if (m_pSipCat) {
VectorMapStringString toReturn; VectorMapStringString toReturn;
foreach (CredentialNode* n, *m_pSipCat->m_uContent.m_Category.m_lChildren) { foreach (CredentialNode* n, m_pSipCat->m_lChildren) {
Credential* cred = n->m_uContent.m_Cred.m_pCredential; Credential* cred = n->m_pCredential;
if (cred->username().isEmpty()) if (cred->username().isEmpty())
cred->setUsername(m_pAccount->username()); cred->setUsername(m_pAccount->username());
...@@ -453,8 +434,8 @@ void CredentialModelPrivate::save() ...@@ -453,8 +434,8 @@ void CredentialModelPrivate::save()
//TURN creds //TURN creds
if (m_pTurnCat) { if (m_pTurnCat) {
foreach (CredentialNode* n, *m_pSipCat->m_uContent.m_Category.m_lChildren) { foreach (CredentialNode* n, m_pSipCat->m_lChildren) {
Credential* cred = n->m_uContent.m_Cred.m_pCredential; Credential* cred = n->m_pCredential;
m_pAccount->d_ptr->setAccountProperty(DRing::Account::ConfProperties::TURN::SERVER_UNAME , cred->username()); m_pAccount->d_ptr->setAccountProperty(DRing::Account::ConfProperties::TURN::SERVER_UNAME , cred->username());
m_pAccount->d_ptr->setAccountProperty(DRing::Account::ConfProperties::TURN::SERVER_PWD , cred->password()); m_pAccount->d_ptr->setAccountProperty(DRing::Account::ConfProperties::TURN::SERVER_PWD , cred->password());
...@@ -538,16 +519,16 @@ Credential* CredentialModel::primaryCredential(Credential::Type type) const ...@@ -538,16 +519,16 @@ Credential* CredentialModel::primaryCredential(Credential::Type type) const
{ {
switch(type) { switch(type) {
case Credential::Type::STUN: case Credential::Type::STUN:
if (d_ptr->m_pStunCat && d_ptr->m_pStunCat->m_uContent.m_Category.m_lChildren->size()) if (d_ptr->m_pStunCat && d_ptr->m_pStunCat->m_lChildren.size())
return d_ptr->m_pStunCat->m_uContent.m_Category.m_lChildren->first()->m_uContent.m_Cred.m_pCredential; return d_ptr->m_pStunCat->m_lChildren.first()->m_pCredential;
break; break;
case Credential::Type::TURN: case Credential::Type::TURN:
if (d_ptr->m_pTurnCat && d_ptr->m_pTurnCat->m_uContent.m_Category.m_lChildren->size()) if (d_ptr->m_pTurnCat && d_ptr->m_pTurnCat->m_lChildren.size())
return d_ptr->m_pTurnCat->m_uContent.m_Category.m_lChildren->first()->m_uContent.m_Cred.m_pCredential; return d_ptr->m_pTurnCat->m_lChildren.first()->m_pCredential;
break; break;
case Credential::Type::SIP: case Credential::Type::SIP:
if (d_ptr->m_pSipCat && d_ptr->m_pSipCat->m_uContent.m_Category.m_lChildren->size()) if (d_ptr->m_pSipCat && d_ptr->m_pSipCat->m_lChildren.size())
return d_ptr->m_pSipCat->m_uContent.m_Category.m_lChildren->first()->m_uContent.m_Cred.m_pCredential; return d_ptr->m_pSipCat->m_lChildren.first()->m_pCredential;
break; break;
case Credential::Type::COUNT__: case Credential::Type::COUNT__:
break; break;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment