diff --git a/CustomModels/models.cpp b/CustomModels/models.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f9eed2d7f8c175f86deffd3b312b6156a72b9ada --- /dev/null +++ b/CustomModels/models.cpp @@ -0,0 +1,78 @@ +#include "models.h" + +UserModel *Models::mUserModel = nullptr; +LoginMethodsModel *Models::mLoginMethodsModel = nullptr; +ChannelModel *Models::mDirectChannelsModel = nullptr; +ChannelModel *Models::mPublicGroupsModel = nullptr; +ChannelModel *Models::mPrivateGroupsModel = nullptr; +MessagesModel *Models::mMessagesModel = nullptr; + +UserModel* Models::getUsersModel() +{ + return mUserModel; +} + +LoginMethodsModel* Models::getLoginMethodsModel() +{ + return mLoginMethodsModel; +} + +ChannelModel* Models::getDirectChannelsModel() +{ + return mDirectChannelsModel; +} + +ChannelModel* Models::getPublicGroupsModel() +{ + return mPublicGroupsModel; +} + +ChannelModel* Models::getPrivateGroupsModel() +{ + return mPrivateGroupsModel; +} + +MessagesModel *Models::getMessagesModel() +{ + return mMessagesModel; +} + +void Models::resetModels() +{ + mDirectChannelsModel->clear(); + mLoginMethodsModel->clear(); + mPublicGroupsModel->clear(); + mPrivateGroupsModel->clear(); +} + +void Models::init() +{ + if(mDirectChannelsModel == nullptr){ + mDirectChannelsModel = new ChannelModel(); + } + if(mLoginMethodsModel == nullptr){ + mLoginMethodsModel = new LoginMethodsModel(); + } + if(mPublicGroupsModel == nullptr){ + mPublicGroupsModel = new ChannelModel(); + } + if(mPrivateGroupsModel == nullptr){ + mPrivateGroupsModel = new ChannelModel(); + } + if(mMessagesModel == nullptr){ + mMessagesModel = new MessagesModel(); + } + if(mUserModel == nullptr){ + mUserModel = new UserModel(); + } +} + +Models::~Models() +{ + Models::mDirectChannelsModel->deleteLater(); + Models::mLoginMethodsModel->deleteLater(); + Models::mMessagesModel->deleteLater(); + Models::mPrivateGroupsModel->deleteLater(); + Models::mPublicGroupsModel->deleteLater(); + Models::mUserModel->deleteLater(); +} diff --git a/CustomModels/models.h b/CustomModels/models.h new file mode 100644 index 0000000000000000000000000000000000000000..0e216cb4ceb418636179fcdab818a0864200e7fb --- /dev/null +++ b/CustomModels/models.h @@ -0,0 +1,37 @@ +#ifndef MODELS_H +#define MODELS_H + +#include "channelmodel.h" +#include "loginmethodsmodel.h" +#include "messagemodel.h" +#include "usermodel.h" + +class ChannelModel; +class MessagesModel; +class Models +{ +public: + Models() = delete; + Models& operator=(const Models&) = delete; + + static UserModel* getUsersModel(); + static LoginMethodsModel* getLoginMethodsModel(); + static ChannelModel* getDirectChannelsModel(); + static ChannelModel* getPublicGroupsModel(); + static ChannelModel* getPrivateGroupsModel(); + static MessagesModel* getMessagesModel(); + static void resetModels(); + static void init(); + + ~Models(); + +private: + static UserModel *mUserModel; + static LoginMethodsModel *mLoginMethodsModel; + static ChannelModel *mDirectChannelsModel; + static ChannelModel *mPublicGroupsModel; + static ChannelModel *mPrivateGroupsModel; + static MessagesModel *mMessagesModel; +}; + +#endif // MODELS_H diff --git a/engine.pro b/engine.pro index b8a88425f3d5e335c6bf7ba9df2a8bd25623eaa7..5a218813118bd2d488ac4485e3fb177a7380815c 100644 --- a/engine.pro +++ b/engine.pro @@ -83,6 +83,7 @@ SOURCES += api/meteorddp.cpp \ ddpRequests/rocketchatchangeuserpresancedefaultstatus.cpp \ CustomModels/messagemodel.cpp \ CustomModels/loginmethodsmodel.cpp \ + CustomModels/models.cpp \ repos/loginmethodsrepository.cpp \ repos/entities/loginmethod.cpp \ restRequests/getserverinforequest.cpp \ @@ -177,6 +178,7 @@ HEADERS += \ config.h \ CustomModels/messagemodel.h \ CustomModels/loginmethodsmodel.h \ + CustomModels/models.h \ repos/loginmethodsrepository.h \ repos/entities/loginmethod.h \ restRequests/getserverinforequest.h \ diff --git a/repos/channelrepository.cpp b/repos/channelrepository.cpp index 87ff5df7159783ac15be143088c3b42b65cd7638..b6fa758285d7762664f521884e59e2614b9de9d2 100755 --- a/repos/channelrepository.cpp +++ b/repos/channelrepository.cpp @@ -21,9 +21,8 @@ #include "channelrepository.h" -ChannelRepository::ChannelRepository( ChannelModel &channelsModel, ChannelModel &groupsModel, - ChannelModel &directModel, MessagesModel &messagesModel ): - mChannelsModel( channelsModel ), mGroupsModel( groupsModel ), mDirectModel( directModel ), mMessagesModel( messagesModel ) +ChannelRepository::ChannelRepository( ): + mChannelsModel( Models::getPublicGroupsModel() ), mGroupsModel( Models::getPublicGroupsModel() ), mDirectModel( Models::getDirectChannelsModel() ), mMessagesModel( Models::getMessagesModel() ) { mElements.reserve( 50 ); } @@ -34,15 +33,15 @@ bool ChannelRepository::add( QString id, QSharedPointer<RocketChatChannel> msg ) QString type = msg->getType(); if ( type == "c" ) { - QMetaObject::invokeMethod( &mChannelsModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); + QMetaObject::invokeMethod( mChannelsModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); } else if ( type == "d" ) { - QMetaObject::invokeMethod( &mDirectModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); + QMetaObject::invokeMethod( mDirectModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); } else if ( type == "p" ) { - QMetaObject::invokeMethod( &mGroupsModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); + QMetaObject::invokeMethod( mGroupsModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); } mNameIndex[msg->getName()] = msg; - QMetaObject::invokeMethod( &mMessagesModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); + QMetaObject::invokeMethod( mMessagesModel, "addChannelSlot", Q_ARG( QSharedPointer<RocketChatChannel>, msg ) ); return AbstractBaseRepository::add( id, msg ); } diff --git a/repos/channelrepository.h b/repos/channelrepository.h index 86eaf6cada23403d5be29140d3c79e4b8c91d872..49e7396f17bed12a920809032d747778b40faf59 100755 --- a/repos/channelrepository.h +++ b/repos/channelrepository.h @@ -29,6 +29,7 @@ #include "repos/entities/rocketchatchannel.h" #include "CustomModels/channelmodel.h" #include "CustomModels/messagemodel.h" +#include "CustomModels/models.h" class MessagesModel; class RocketChatChannel; class ChannelModel; @@ -38,8 +39,7 @@ class ChannelRepository : public QObject, public AbstractBaseRepository<RocketCh Q_OBJECT public: - explicit ChannelRepository( ChannelModel &channelsModel, ChannelModel &groupsModel, ChannelModel &directModel, - MessagesModel &messagesModel ); + explicit ChannelRepository( ); unsigned long getYoungestMessageDate(); unsigned long getOldestMessageDate(); bool add( QString id, QSharedPointer<RocketChatChannel> ); @@ -50,9 +50,9 @@ class ChannelRepository : public QObject, public AbstractBaseRepository<RocketCh private: QHash<QSharedPointer<RocketChatChannel>, qint64 > mChannelTimeIndex; QMap<qint64, QSharedPointer<RocketChatChannel> > mTimestampIndex; - ChannelModel &mChannelsModel, &mGroupsModel, &mDirectModel; + ChannelModel *mChannelsModel, *mGroupsModel, *mDirectModel; QHash<QString, QSharedPointer<RocketChatChannel> > mNameIndex; - MessagesModel &mMessagesModel; + MessagesModel *mMessagesModel; signals: void orderChanged( QString channelId ); diff --git a/rocketchat.cpp b/rocketchat.cpp index f30c87e5800c7dddca0d6c47e5d79b5477827da5..92d1359d2da62c67977da220ab2a86c326daa0e7 100755 --- a/rocketchat.cpp +++ b/rocketchat.cpp @@ -28,6 +28,7 @@ #include <QDesktopServices> #include <QClipboard> +#include "CustomModels/models.h" #ifdef Q_OS_IOS @@ -47,8 +48,7 @@ * @param restApi * @param ddp */ -RocketChat::RocketChat( QGuiApplication *app, ChannelModel &channelModel, ChannelModel &groupsModel, ChannelModel &directmodel, MessagesModel &messagesModel, UserModel &userModel, LoginMethodsModel &loginMethodsModel ) - : channelModel( channelModel ), groupsModel( groupsModel ), directmodel( directmodel ), userModel( userModel ), messagesModel( messagesModel ), loginMethodsModel( loginMethodsModel ) +RocketChat::RocketChat( QGuiApplication *app ) { #ifdef Q_OS_IOS //UrlHandler *handler = new UrlHandler; @@ -262,19 +262,14 @@ bool RocketChat::newServerByDomain( const QString &domain ) auto self = this; connect( firstServer, &RocketChatServerData::destroyed, [ &, self, domain]() { - qDebug() << "test0"; qDebug() << "domain: " << domain; QString baseUrl = domain; QString apiUri = QStringLiteral( "https://" ) + domain + QStringLiteral( "/api/v1" ); - qDebug() << "test1"; - self->channelModel.clear(); - self->groupsModel.clear(); - self->directmodel.clear(); - self->loginMethodsModel.clear(); - - RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri, self->userModel, self->channelModel, self->groupsModel, self->directmodel, self->messagesModel, self->loginMethodsModel ); - qDebug() << "test2"; - qDebug() << "test3"; + + Models::resetModels(); + + RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri ); + registerServer( server ); newServerMutex.unlock(); } ); @@ -283,19 +278,16 @@ bool RocketChat::newServerByDomain( const QString &domain ) } else { QString baseUrl = domain; QString apiUri = QStringLiteral( "https://" ) + domain + QStringLiteral( "/api/v1" ); - this->channelModel.clear(); - this->groupsModel.clear(); - this->directmodel.clear(); - this->loginMethodsModel.clear(); - RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri, userModel, channelModel, groupsModel, directmodel, messagesModel, loginMethodsModel ); + + Models::resetModels(); + + RocketChatServerData *server = new RocketChatServerData( domain, baseUrl, apiUri ); registerServer( server ); newServerMutex.unlock(); } - - return 0; } @@ -636,12 +628,12 @@ void RocketChat::registerServer( RocketChatServerData *pServer ) void RocketChat::addLoginMethod( const QMap<QString, QVariant> &pMethod ) { - loginMethodsModel.addLoginMethod( pMethod ); + Models::getLoginMethodsModel()->addLoginMethod(pMethod); } void RocketChat::resetLoginMethods() { - loginMethodsModel.clear(); + Models::getLoginMethodsModel()->clear(); } void RocketChat::openIosFile( const QString &fileName ) diff --git a/rocketchat.h b/rocketchat.h index 5d3bfcb526207e5ac3980e48197af8981c6d62e5..e22ead31974eecebc08cf1551f5cb70f0144f489 100755 --- a/rocketchat.h +++ b/rocketchat.h @@ -44,9 +44,7 @@ class RocketChat : public QObject { Q_OBJECT public: - RocketChat( QGuiApplication *mApp, ChannelModel &channelModel, ChannelModel &groupsModel, - ChannelModel &directmodel, MessagesModel &messagesModel, UserModel &userModel, - LoginMethodsModel &LoginMethodsModel ); + RocketChat( QGuiApplication *mApp ); ~RocketChat(); //TODO: check for depricated methods @@ -226,13 +224,6 @@ class RocketChat : public QObject void onExternalChannelSwitchRequest( const QString &pName ); - ChannelModel &channelModel; - ChannelModel &groupsModel; - ChannelModel &directmodel; - UserModel &userModel; - MessagesModel &messagesModel; - LoginMethodsModel &loginMethodsModel; - signals: void fileRessourceProcessed( QString url, QString path, bool showInline ); diff --git a/rocketchatserver.cpp b/rocketchatserver.cpp index 86524d7776d873adf6450b28b5f9e61fe16d22f0..5d3d10b1afc684ebc38b11303a784455fbe6e048 100755 --- a/rocketchatserver.cpp +++ b/rocketchatserver.cpp @@ -21,18 +21,11 @@ #include "rocketchatserver.h" +#include "CustomModels/models.h" - -RocketChatServerData::RocketChatServerData( const QString &pId, QString pBaseUrl, - QString pApiUri, - UserModel &pUserModel, - ChannelModel &channelModel, - ChannelModel &groupsModel, - ChannelModel &directModel, - MessagesModel &messagesModel, - LoginMethodsModel &loginMethodsModel ) - : mBaseUrl( pBaseUrl ), mApiUri( pApiUri ), mServerId( pId ), userModel( pUserModel ), - channelsModel( channelModel ), groupsModel( groupsModel ), directModel( directModel ), mMessagesModel( messagesModel ), loginMethodsModel( loginMethodsModel ) +RocketChatServerData::RocketChatServerData( const QString &pId, QString pBaseUrl, + QString pApiUri ): mBaseUrl( pBaseUrl ), mApiUri( pApiUri ), mServerId( pId ),userModel(Models::getUsersModel()),loginMethodsModel(Models::getLoginMethodsModel()),channelsModel(Models::getPublicGroupsModel()), + directModel(Models::getDirectChannelsModel()),groupsModel(Models::getPublicGroupsModel()) { mStorage = PersistanceLayer::instance(); mEmojiRepo = new EmojiRepo; @@ -68,7 +61,7 @@ void RocketChatServerData::init() mDdpApi->moveToThread( QThread::currentThread() ); mUsername = mStorage->getUserName(); - mChannels = new ChannelRepository( channelsModel, channelsModel, groupsModel, mMessagesModel ); + mChannels = new ChannelRepository( ); RocketChatServerConfig::init(); @@ -94,7 +87,7 @@ void RocketChatServerData::init() loadEmojis(); //mMessageService = new MessageService( mStorage, this, mEmojisMap ); - mMessageService = new MessageService( mStorage, this, mEmojiRepo, &mMessagesModel ); + mMessageService = new MessageService( mStorage, this, mEmojiRepo ); mChannelService = new RocketChatChannelService( this, mMessageService ); mChannelService->setDdp( mDdpApi ); @@ -103,9 +96,9 @@ void RocketChatServerData::init() connect( mChannelService, &RocketChatChannelService::channelsLoaded, this, &RocketChatServerData::onChannelsLoaded, Qt::UniqueConnection ); connect( mChannelService, &RocketChatChannelService::usersLoaded, this, &RocketChatServerData::onUsersLoaded, Qt::UniqueConnection ); connect( mChannelService, &RocketChatChannelService::directChannelReady, this, &RocketChatServerData::switchChannelByRid, Qt::UniqueConnection ); - connect( &channelsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); - connect( &directModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); - connect( &groupsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); + connect( channelsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); + connect( directModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); + connect( groupsModel, &ChannelModel::unreadMessagesChanged, this, &RocketChatServerData::onUnreadCountChanged, Qt::UniqueConnection ); QString lastServer = mStorage->getSetting( QStringLiteral( "currentServer" ) ); @@ -459,7 +452,7 @@ void RocketChatServerData::onUsersLoaded( const QString &pChannelId, const QVect for ( const auto &user : pUserList ) { if ( !user.isNull() ) { channel->addUser( user ); - userModel.insertUser( pChannelId, user ); + userModel->insertUser( pChannelId, user ); } } } diff --git a/rocketchatserver.h b/rocketchatserver.h index 6b090b8af435ceb6df521650c8620ec4c74eab33..a66cb86c8eed9ce8e0b8bfdeaa49a361d5510d66 100755 --- a/rocketchatserver.h +++ b/rocketchatserver.h @@ -111,14 +111,8 @@ class RocketChatServerData : public QObject Q_OBJECT public: - RocketChatServerData( const QString &pId, QString pBaseUrl, - QString pApiUri, - UserModel &pUserModel, - ChannelModel &channelModel, - ChannelModel &groupsModel, - ChannelModel &directModel, - MessagesModel &messagesModel, - LoginMethodsModel &loginMethodsModel ); + RocketChatServerData( const QString &pId, QString pBaseUrl, + QString pApiUri); void setServerId( const QString &pValue ); @@ -279,12 +273,11 @@ class RocketChatServerData : public QObject QMap<QString, FileUploader *> mFileUploads; QString mCurrentChannel; QMutex mUnsentMutex; - UserModel &userModel; - ChannelModel &channelsModel; - ChannelModel &groupsModel; - ChannelModel &directModel; - MessagesModel &mMessagesModel; - LoginMethodsModel &loginMethodsModel; + UserModel *userModel; + ChannelModel *channelsModel; + ChannelModel *groupsModel; + ChannelModel *directModel; + LoginMethodsModel *loginMethodsModel; std::function<void ( QMultiMap<QString, QSharedPointer<RocketChatMessage>> *messages )> historyLoaded; QString mPendingSwitchRoomRequest; diff --git a/services/messageservice.cpp b/services/messageservice.cpp index a5bfaf813df2a2486019f993b5c6ddbea1c1475c..c441e85107b19604bd6b5db2e2f44595a1367224 100644 --- a/services/messageservice.cpp +++ b/services/messageservice.cpp @@ -34,8 +34,7 @@ MessageService::MessageService( PersistanceLayer *pPersistanceLayer, RocketChatServerData *pServer, - EmojiRepo *pEmojiRepo, - MessagesModel *pMessagesModel ): mEmojiRepo( pEmojiRepo ), mMessagesModel( pMessagesModel ) + EmojiRepo *pEmojiRepo): mEmojiRepo( pEmojiRepo ), mMessagesModel( Models::getMessagesModel() ) { this->mPersistanceLayer = pPersistanceLayer; this->mServer = pServer; diff --git a/services/messageservice.h b/services/messageservice.h index cff2513e511f3e2101fc92299f0c787206ad0086..56c84f6188b7f4a21149ebd06ed23a80ed2b097e 100644 --- a/services/messageservice.h +++ b/services/messageservice.h @@ -50,7 +50,7 @@ class MessageService : public QObject Q_OBJECT public: // MessageService(PersistanceLayer *pPersistanceLayer, RocketChatServerData* pServer,QHash<QString, QString> &pEmojisMap); - MessageService( PersistanceLayer *pPersistanceLayer, RocketChatServerData *pServer, EmojiRepo *mEmojiRepo, MessagesModel *pMessagesModel ); + MessageService( PersistanceLayer *pPersistanceLayer, RocketChatServerData *pServer, EmojiRepo *mEmojiRepo ); void loadHistory( QSharedPointer<LoadHistoryServiceRequest> ); void checkForMissingMessages( QSharedPointer<LoadMissedMessageServiceRequest> pRequest ); void sendMessage( QSharedPointer<RocketChatMessage> pMessage ); @@ -59,6 +59,7 @@ class MessageService : public QObject QSharedPointer<RocketChatMessage> parseMessage( const QJsonObject &pMessage, bool linkify = true ); void addUserToBlockList( const QString &pId ); void addChannelToBlockList( const QString &pId ); + void searchMessage(const QString &pTerm, const QString &pRoom); protected: const static int mExpectedSize = 50; PersistanceLayer *mPersistanceLayer;