diff --git a/src/core/autotests/usersforroomfilterproxymodeltest.cpp b/src/core/autotests/usersforroomfilterproxymodeltest.cpp --- a/src/core/autotests/usersforroomfilterproxymodeltest.cpp +++ b/src/core/autotests/usersforroomfilterproxymodeltest.cpp @@ -57,13 +57,13 @@ proxy.setSourceModel(&model); QCOMPARE(proxy.rowCount(), 0); - QVector users; + QVector users; for (int i = 0; i < 10; i++) { - User *user = new User; - user->setName(QStringLiteral("name%1").arg(i)); - user->setStatus(QStringLiteral("status%1").arg(i)); - user->setUserId(QStringLiteral("userId%1").arg(i)); - user->setUserName(QStringLiteral("username%1").arg(i)); + User user; + user.setName(QStringLiteral("name%1").arg(i)); + user.setStatus(QStringLiteral("status%1").arg(i)); + user.setUserId(QStringLiteral("userId%1").arg(i)); + user.setUserName(QStringLiteral("username%1").arg(i)); users.append(user); } model.setUsers(users); diff --git a/src/core/autotests/usersforroommodeltest.cpp b/src/core/autotests/usersforroommodeltest.cpp --- a/src/core/autotests/usersforroommodeltest.cpp +++ b/src/core/autotests/usersforroommodeltest.cpp @@ -53,15 +53,15 @@ void UsersForRoomModelTest::shouldAddValues() { UsersForRoomModel w; - QVector users; + QVector users; QSignalSpy rowInsertedSpy(&w, &UsersForRoomModel::rowsInserted); QSignalSpy rowABTInserted(&w, &UsersForRoomModel::rowsAboutToBeInserted); for (int i = 0; i < 10; i++) { - User *user = new User; - user->setName(QStringLiteral("name%1").arg(i)); - user->setStatus(QStringLiteral("status%1").arg(i)); - user->setUserId(QStringLiteral("userId%1").arg(i)); - user->setUserName(QStringLiteral("username%1").arg(i)); + User user; + user.setName(QStringLiteral("name%1").arg(i)); + user.setStatus(QStringLiteral("status%1").arg(i)); + user.setUserId(QStringLiteral("userId%1").arg(i)); + user.setUserName(QStringLiteral("username%1").arg(i)); users.append(user); } w.setUsers(users); @@ -76,11 +76,11 @@ users.clear(); for (int i = 0; i < 3; ++i) { - User *user = new User; - user->setName(QStringLiteral("name%1").arg(i)); - user->setStatus(QStringLiteral("status%1").arg(i)); - user->setUserId(QStringLiteral("userId%1").arg(i)); - user->setUserName(QStringLiteral("username%1").arg(i)); + User user; + user.setName(QStringLiteral("name%1").arg(i)); + user.setStatus(QStringLiteral("status%1").arg(i)); + user.setUserId(QStringLiteral("userId%1").arg(i)); + user.setUserName(QStringLiteral("username%1").arg(i)); users.append(user); } w.clear(); @@ -107,13 +107,13 @@ void UsersForRoomModelTest::shouldVerifyData() { UsersForRoomModel w; - QVector users; + QVector users; for (int i = 0; i < 10; i++) { - User *user = new User; - user->setName(QStringLiteral("name%1").arg(i)); - user->setStatus(QStringLiteral("online")); - user->setUserId(QStringLiteral("userId%1").arg(i)); - user->setUserName(QStringLiteral("username%1").arg(i)); + User user; + user.setName(QStringLiteral("name%1").arg(i)); + user.setStatus(QStringLiteral("online")); + user.setUserId(QStringLiteral("userId%1").arg(i)); + user.setUserName(QStringLiteral("username%1").arg(i)); users.append(user); } w.setUsers(users); diff --git a/src/core/autotests/usertest.cpp b/src/core/autotests/usertest.cpp --- a/src/core/autotests/usertest.cpp +++ b/src/core/autotests/usertest.cpp @@ -183,8 +183,8 @@ // const QJsonDocument doc = QJsonDocument::fromJson(content); // const QJsonObject fields = doc.object(); -// User *user = new User; -// user->parseUser(fields); +// User user; +// user.parseUser(fields); // const bool equal = (*user == *expectedUser); // if (!equal) { // qDebug() << " current value " << user; diff --git a/src/core/model/roommodel.h b/src/core/model/roommodel.h --- a/src/core/model/roommodel.h +++ b/src/core/model/roommodel.h @@ -103,7 +103,7 @@ void removeRoom(const QString &roomId); void getUnreadAlertFromAccount(bool &hasAlert, int &nbUnread); - void userStatusChanged(User *user); + void userStatusChanged(const User &user); UsersForRoomModel *usersModelForRoom(const QString &roomId) const; diff --git a/src/core/model/roommodel.cpp b/src/core/model/roommodel.cpp --- a/src/core/model/roommodel.cpp +++ b/src/core/model/roommodel.cpp @@ -396,12 +396,12 @@ } } -void RoomModel::userStatusChanged(User *user) +void RoomModel::userStatusChanged(const User &user) { const int roomCount = mRoomsList.count(); for (int i = 0; i < roomCount; ++i) { Room *room = mRoomsList.at(i); - if (room->name() == user->userName()) { + if (room->name() == user.userName()) { const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); } diff --git a/src/core/model/usersforroommodel.h b/src/core/model/usersforroommodel.h --- a/src/core/model/usersforroommodel.h +++ b/src/core/model/usersforroommodel.h @@ -43,14 +43,14 @@ explicit UsersForRoomModel(QObject *parent = nullptr); ~UsersForRoomModel() override; - void setUsers(const QVector &users); + void setUsers(const QVector &users); void clear(); Q_INVOKABLE int rowCount(const QModelIndex &parent = {}) const override; Q_REQUIRED_RESULT QVariant data(const QModelIndex &index, int role) const override; void parseUsersForRooms(const QJsonObject &root, UsersModel *model, bool restapi); - void userStatusChanged(User *newuser); + void userStatusChanged(const User &newuser); void removeUser(const QString &userId); void addUser(const User &users); @@ -72,7 +72,7 @@ private: QString generateDisplayName(const User &user) const; void checkFullList(); - QVector mUsers; + QVector mUsers; int mTotal = 0; int mOffset = 0; bool mHasFullList = false; diff --git a/src/core/model/usersforroommodel.cpp b/src/core/model/usersforroommodel.cpp --- a/src/core/model/usersforroommodel.cpp +++ b/src/core/model/usersforroommodel.cpp @@ -32,7 +32,6 @@ UsersForRoomModel::~UsersForRoomModel() { - qDeleteAll(mUsers); } void UsersForRoomModel::removeUser(const QString &userId) @@ -45,12 +44,11 @@ //TODO verify if it } -void UsersForRoomModel::setUsers(const QVector &users) +void UsersForRoomModel::setUsers(const QVector &users) { if (mUsers.isEmpty()) { if (rowCount() != 0) { beginRemoveRows(QModelIndex(), 0, mUsers.count() - 1); - qDeleteAll(mUsers); mUsers.clear(); endRemoveRows(); } @@ -72,7 +70,6 @@ { if (!mUsers.isEmpty()) { beginRemoveRows(QModelIndex(), 0, mUsers.count() - 1); - qDeleteAll(mUsers); mUsers.clear(); endRemoveRows(); } @@ -90,18 +87,18 @@ return QVariant(); } - User *user = mUsers.at(index.row()); + const User &user = mUsers.at(index.row()); switch (role) { case DisplayName: - return generateDisplayName(*user); + return generateDisplayName(user); case UserName: - return user->userName(); + return user.userName(); case IconStatus: - return user->iconFromStatus(); + return user.iconFromStatus(); case UserId: - return user->userId(); + return user.userId(); case Name: - return user->name(); + return user.name(); } return {}; @@ -173,7 +170,7 @@ mTotal = root[QLatin1String("total")].toInt(); mOffset = root[QLatin1String("offset")].toInt(); const QJsonArray members = root[QStringLiteral("members")].toArray(); - QVector users; + QVector users; users.reserve(members.count()); for (const QJsonValue ¤t : members) { if (current.type() == QJsonValue::Object) { @@ -183,16 +180,16 @@ const QString id = userObject[QStringLiteral("_id")].toString(); const double utcOffset = userObject[QStringLiteral("utcOffset")].toDouble(); const QString status = userObject[QStringLiteral("status")].toString(); - QScopedPointer user(new User); - user->setName(name); - user->setUserName(userName); - user->setUserId(id); - user->setUtcOffset(utcOffset); - user->setStatus(status); - if (user->isValid()) { - users.append(user.take()); + User user; + user.setName(name); + user.setUserName(userName); + user.setUserId(id); + user.setUtcOffset(utcOffset); + user.setStatus(status); + if (user.isValid()) { + users.append(user); } else { - qCWarning(RUQOLA_LOG) << "Invalid user" << *user; + qCWarning(RUQOLA_LOG) << "Invalid user" << user; mTotal--; } } else { @@ -207,26 +204,26 @@ mTotal = result[QLatin1String("total")].toInt(); mOffset = root[QLatin1String("offset")].toInt(); //TODO verify if a day we use no rest api - QVector users; + QVector users; users.reserve(records.count()); for (const QJsonValue ¤t : records) { if (current.type() == QJsonValue::Object) { const QJsonObject userObject = current.toObject(); const QString userName = userObject[QStringLiteral("username")].toString(); const QString name = userObject[QStringLiteral("name")].toString(); const QString id = userObject[QStringLiteral("_id")].toString(); - User *user = new User; - user->setName(name); - user->setUserName(userName); - user->setUserId(id); + User user; + user.setName(name); + user.setUserName(userName); + user.setUserId(id); if (model) { - user->setStatus(model->status(id)); + user.setStatus(model->status(id)); } //Add status! - if (user->isValid()) { + if (user.isValid()) { users.append(user); } else { - qCWarning(RUQOLA_LOG) << "Invalid user" << *user; + qCWarning(RUQOLA_LOG) << "Invalid user" << user; mTotal--; } } else { @@ -240,13 +237,13 @@ } } -void UsersForRoomModel::userStatusChanged(User *newuser) +void UsersForRoomModel::userStatusChanged(const User &newuser) { const int roomCount = mUsers.count(); for (int i = 0; i < roomCount; ++i) { - User *user = mUsers.at(i); - if (newuser->userId() == user->userId()) { - user->setStatus(newuser->status()); + User &user = mUsers[i]; + if (newuser.userId() == user.userId()) { + user.setStatus(newuser.status()); const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); } diff --git a/src/core/model/usersmodel.h b/src/core/model/usersmodel.h --- a/src/core/model/usersmodel.h +++ b/src/core/model/usersmodel.h @@ -43,23 +43,23 @@ Q_REQUIRED_RESULT int rowCount(const QModelIndex &parent = QModelIndex()) const override; Q_REQUIRED_RESULT QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - void addUser(User *userFromUserId); + void addUser(const User &userFromUserId); void removeUser(const QString &userId); void updateUser(const QJsonObject &array); Q_REQUIRED_RESULT QString userStatusIconFileName(const QString &name) const; Q_REQUIRED_RESULT QString status(const QString &userId) const; Q_SIGNALS: - void userStatusChanged(User *user); - void userNameChanged(User *user); - void nameChanged(User *user); - void statusMessageChanged(User *user); + void userStatusChanged(const User &user); + void userNameChanged(const User &user); + void nameChanged(const User &user); + void statusMessageChanged(const User &user); private: Q_DISABLE_COPY(UsersModel) - QVector mUsers; + QVector mUsers; }; #endif // USERSMODEL_H diff --git a/src/core/model/usersmodel.cpp b/src/core/model/usersmodel.cpp --- a/src/core/model/usersmodel.cpp +++ b/src/core/model/usersmodel.cpp @@ -30,7 +30,6 @@ UsersModel::~UsersModel() { - qDeleteAll(mUsers); } int UsersModel::rowCount(const QModelIndex &parent) const @@ -44,18 +43,18 @@ if (index.row() < 0 || index.row() >= mUsers.count()) { return QVariant(); } - const User *user = mUsers.at(index.row()); + const User &user = mUsers.at(index.row()); switch (role) { case UserName: - return user->name(); + return user.name(); case UserId: - return user->userId(); + return user.userId(); case UserStatus: - return user->status(); + return user.status(); case UserIcon: - return user->iconFromStatus(); + return user.iconFromStatus(); case UserStatusText: - return user->statusText(); + return user.statusText(); } return {}; @@ -65,8 +64,8 @@ { const int userCount = mUsers.count(); for (int i = 0; i < userCount; ++i) { - if (mUsers.at(i)->userName() == name) { - return mUsers.at(i)->iconFromStatus(); + if (mUsers.at(i).userName() == name) { + return mUsers.at(i).iconFromStatus(); } } @@ -79,8 +78,8 @@ const int userCount = mUsers.count(); for (int i = 0; i < userCount; ++i) { - if (mUsers.at(i)->userId() == userId) { - return mUsers.at(i)->status(); + if (mUsers.at(i).userId() == userId) { + return mUsers.at(i).status(); } } //Return offline as default; @@ -92,35 +91,34 @@ qCDebug(RUQOLA_LOG) << " User removed " << userId; const int userCount = mUsers.count(); for (int i = 0; i < userCount; ++i) { - if (mUsers.at(i)->userId() == userId) { - qCDebug(RUQOLA_LOG) << " User removed " << mUsers.at(i)->name(); + if (mUsers.at(i).userId() == userId) { + qCDebug(RUQOLA_LOG) << " User removed " << mUsers.at(i).name(); //Send info as it's disconnected. But don't remove it from list - User *user = mUsers.at(i); - user->setStatus(QStringLiteral("offline")); + User &user = mUsers[i]; + user.setStatus(QStringLiteral("offline")); const QModelIndex idx = createIndex(i, 0); Q_EMIT userStatusChanged(user); Q_EMIT dataChanged(idx, idx); break; } } } -void UsersModel::addUser(User *newuser) +void UsersModel::addUser(const User &newuser) { //It can be duplicate as we don't remove user from list when user is disconnected. Otherwise it will not sync with // user for room list qCDebug(RUQOLA_LOG) << " User added " << newuser; const int userCount = mUsers.count(); bool found = false; for (int i = 0; i < userCount; ++i) { - if (mUsers.at(i)->userId() == newuser->userId()) { + if (mUsers.at(i).userId() == newuser.userId()) { found = true; - User *user = mUsers.at(i); - user->setStatus(newuser->status()); + User &user = mUsers[i]; + user.setStatus(newuser.status()); const QModelIndex idx = createIndex(i, 0); Q_EMIT userStatusChanged(user); Q_EMIT dataChanged(idx, idx); - delete newuser; break; } } @@ -137,38 +135,38 @@ const QString id = array.value(QLatin1String("id")).toString(); const int userCount = mUsers.count(); for (int i = 0; i < userCount; ++i) { - if (mUsers.at(i)->userId() == id) { - User *user = mUsers.at(i); + if (mUsers.at(i).userId() == id) { + User &user = mUsers[i]; const QJsonObject fields = array.value(QLatin1String("fields")).toObject(); const QString newStatus = fields.value(QLatin1String("status")).toString(); bool userDataChanged = false; if (!newStatus.isEmpty()) { - user->setStatus(newStatus); + user.setStatus(newStatus); const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); Q_EMIT userStatusChanged(user); userDataChanged = true; } const QString newName = fields.value(QLatin1String("name")).toString(); if (!newName.isEmpty()) { - user->setName(newName); + user.setName(newName); const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); Q_EMIT userNameChanged(user); userDataChanged = true; } const QString newuserName = fields.value(QLatin1String("username")).toString(); if (!newuserName.isEmpty()) { - user->setUserName(newuserName); + user.setUserName(newuserName); const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); Q_EMIT nameChanged(user); userDataChanged = true; } const QString statusMessage = fields.value(QLatin1String("statusText")).toString(); if (!statusMessage.isEmpty()) { - user->setStatusText(statusMessage); + user.setStatusText(statusMessage); const QModelIndex idx = createIndex(i, 0); Q_EMIT dataChanged(idx, idx); Q_EMIT statusMessageChanged(user); diff --git a/src/core/rocketchataccount.h b/src/core/rocketchataccount.h --- a/src/core/rocketchataccount.h +++ b/src/core/rocketchataccount.h @@ -439,7 +439,7 @@ void fillOauthModel(); void initializeAuthenticationPlugins(); void setDefaultAuthentication(AuthenticationManager::OauthType type); - void userStatusChanged(User *user); + void userStatusChanged(const User &user); void setChannelJoinDone(const RocketChatRestApi::ChannelBaseJob::ChannelInfo &channelInfo); void openArchivedRoom(const RocketChatRestApi::ChannelBaseJob::ChannelInfo &channelInfo); diff --git a/src/core/rocketchataccount.cpp b/src/core/rocketchataccount.cpp --- a/src/core/rocketchataccount.cpp +++ b/src/core/rocketchataccount.cpp @@ -1773,10 +1773,10 @@ mUserModel->updateUser(object); } -void RocketChatAccount::userStatusChanged(User *user) +void RocketChatAccount::userStatusChanged(const User &user) { - if (user->userId() == userID()) { - const User::PresenceStatus status = Utils::presenceStatusFromString(user->status()); + if (user.userId() == userID()) { + const User::PresenceStatus status = Utils::presenceStatusFromString(user.status()); statusModel()->setCurrentPresenceStatus(status); Q_EMIT userStatusUpdated(status); } diff --git a/src/core/rocketchatbackend.cpp b/src/core/rocketchatbackend.cpp --- a/src/core/rocketchatbackend.cpp +++ b/src/core/rocketchatbackend.cpp @@ -187,11 +187,11 @@ { //Move code in rocketchataccount directly ? //qDebug() << "replyJson " << replyJson; - User *user = new User; - user->setUserId(replyObject.value(QLatin1String("_id")).toString()); - user->setUserName(replyObject.value(QLatin1String("username")).toString()); - user->setStatus(replyObject.value(QLatin1String("status")).toString()); - if (user->isValid()) { + User user; + user.setUserId(replyObject.value(QLatin1String("_id")).toString()); + user.setUserName(replyObject.value(QLatin1String("username")).toString()); + user.setStatus(replyObject.value(QLatin1String("status")).toString()); + if (user.isValid()) { mRocketChatAccount->usersModel()->addUser(user); } else { qCWarning(RUQOLA_LOG) << " Error during parsing user" << replyObject; @@ -267,8 +267,8 @@ qCDebug(RUQOLA_LOG) << "User id set to " << mRocketChatAccount->settings()->userId(); } else { //TODO add current user ? me ? - User *user = new User; - user->parseUser(object); + User user; + user.parseUser(object); if (mRocketChatAccount->ruqolaLogger()) { QJsonDocument d; d.setObject(object); diff --git a/src/core/user.h b/src/core/user.h --- a/src/core/user.h +++ b/src/core/user.h @@ -78,6 +78,8 @@ QString mStatusText; double mUtcOffset = 0.0; }; +Q_DECLARE_METATYPE(User) +Q_DECLARE_TYPEINFO(User, Q_MOVABLE_TYPE); LIBRUQOLACORE_EXPORT QDebug operator <<(QDebug d, const User &t); #endif // USER_H