diff --git a/HanoiTowers/Server/hanoiserver.cpp b/HanoiTowers/Server/hanoiserver.cpp index 5f1413c..2ac9c81 100644 --- a/HanoiTowers/Server/hanoiserver.cpp +++ b/HanoiTowers/Server/hanoiserver.cpp @@ -129,7 +129,7 @@ bool HanoiServer::workWirthUserData(const UserData *obj, return false; } - return sendData(userData.data(), sender->networkAddress()); + return sendData(userData.data(), sender->networkAddress(), oldHeader); } void HanoiServer::updateUserInWorld(const UserData *data) { diff --git a/HanoiTowers/client/backEnd.cpp b/HanoiTowers/client/backEnd.cpp index 15d8005..98c4872 100644 --- a/HanoiTowers/client/backEnd.cpp +++ b/HanoiTowers/client/backEnd.cpp @@ -45,7 +45,7 @@ BackEnd::BackEnd(QQmlApplicationEngine *engine): _recordsTable = new RecordListModel(this); _world = new RecordListModel(this); - _imageProvider = new HanoiImageProvider(&_profile); + _imageProvider = new HanoiImageProvider(_client->getUsersCache()); _dataConverter = new DataConverter; _loginModel->setComponents(LoginView::Nickname | @@ -321,7 +321,7 @@ void BackEnd::setNewAvatar(QString pathToAvatar) { img.save(&buf, "PNG"); buf.close(); - _profile.setAvatar(arr); + _client->setNewAvatar(_profile.getId().toString(), arr); } diff --git a/HanoiTowers/client/dataconverter.cpp b/HanoiTowers/client/dataconverter.cpp index ba6cc4b..421bbbc 100644 --- a/HanoiTowers/client/dataconverter.cpp +++ b/HanoiTowers/client/dataconverter.cpp @@ -54,6 +54,20 @@ QSharedPointer DataConverter::toUserDataPtr(const LocalUser &input) { return result; } +QSharedPointer DataConverter::toLocalUser(const QSharedPointer &input) { + return toLocalUser(*input.data()); +} + +QSharedPointer DataConverter::toLocalUser(const UserData &input) { + auto result = QSharedPointer::create(); + result->setId(input.getId()); + result->setUpdateTime(input.updateTime()); + result->setUserData(input.userData()); + result->setToken(input.getSignToken()); + + return result; +} + QH::PKG::UserMember DataConverter::toUserMember(const QSharedPointer &input) { return toUserMember(*input.data()); } diff --git a/HanoiTowers/client/dataconverter.h b/HanoiTowers/client/dataconverter.h index 502cc8e..6577421 100644 --- a/HanoiTowers/client/dataconverter.h +++ b/HanoiTowers/client/dataconverter.h @@ -27,6 +27,9 @@ public: static QSharedPointer toUserDataPtr(const QSharedPointer& input); static QSharedPointer toUserDataPtr(const LocalUser& input); + static QSharedPointer toLocalUser(const QSharedPointer& input); + static QSharedPointer toLocalUser(const UserData& input); + static QH::PKG::UserMember toUserMember(const QSharedPointer& input); static QH::PKG::UserMember toUserMember(const LocalUser& input); diff --git a/HanoiTowers/client/hanoiclient.cpp b/HanoiTowers/client/hanoiclient.cpp index 0b03049..bd19cd6 100644 --- a/HanoiTowers/client/hanoiclient.cpp +++ b/HanoiTowers/client/hanoiclient.cpp @@ -159,13 +159,18 @@ bool HanoiClient::isOnlineAndLoginned(const QSharedPointer &data) { } +void HanoiClient::updateLocalCache(const QSharedPointer& localUser) { + _usersCache[localUser->getId().toString()] = localUser; + + emit userDataChanged(localUser); + +} + bool HanoiClient::workWithUserData(const QSharedPointer& obj) { auto userId = getMember().getId(); - QSharedPointer localUser; - if (userId == obj->getId()) { - localUser = getLocalUser(obj->getId().toString()); + QSharedPointer localUser = getLocalUser(obj->getId().toString()); if (obj->updateTime() > localUser->updateTime()) { localUser->setUserData(obj->userData()); @@ -178,18 +183,21 @@ bool HanoiClient::workWithUserData(const QSharedPointer& obj) { QmlNotificationService::NotificationData::Normal); } + + emit userDataChanged(localUser); + } else { - localUser = QSharedPointer::create(); - localUser->setUserData(obj->userData()); - _usersCache[obj->getId().toString()] = localUser; + updateLocalCache(DataConverter::toLocalUser(obj)); } - emit userDataChanged(localUser); - - return true; } +const QHash>* +HanoiClient::getUsersCache() const { + return &_usersCache; +} + bool HanoiClient::setNewAvatar(const QString &userId, const QByteArray &image) { auto profile = LocalUser(); @@ -204,6 +212,7 @@ bool HanoiClient::setNewAvatar(const QString &userId, const QByteArray &image) { } obj->setAvatar(image); + updateLocalCache(obj); if (isOnlineAndLoginned(obj)) { return sendUserData(DataConverter::toUserDataPtr(obj)); @@ -224,6 +233,9 @@ bool HanoiClient::subscribeToWorld() { } bool HanoiClient::getUserData(const QString& userId) { + if (userId.isEmpty()) + return false; + if (_usersCache.contains(userId)) { emit userDataChanged(_usersCache[userId]); return true; @@ -270,6 +282,8 @@ bool HanoiClient::setProfile(const QString &userId, *selectedProfileData = user; } + _usersCache[user->getId().toString()] = user; + emit userDataChanged(user); resetUser(); @@ -278,6 +292,7 @@ bool HanoiClient::setProfile(const QString &userId, login(userMember); } + return true; } diff --git a/HanoiTowers/client/hanoiclient.h b/HanoiTowers/client/hanoiclient.h index feb71fb..bbc769e 100644 --- a/HanoiTowers/client/hanoiclient.h +++ b/HanoiTowers/client/hanoiclient.h @@ -64,6 +64,13 @@ public: */ bool getUserData(const QString &userId); + /** + * @brief getUsersCache return a pointer to the cache of users. + * @return + */ + const QHash >* + getUsersCache() const; + protected: QStringList SQLSources() const override; QH::HostAddress serverAddress() const override; @@ -89,6 +96,7 @@ private: bool isOnlineAndLoginned(const QSharedPointer& data); bool workWithUserData(const QSharedPointer & userData); + void updateLocalCache(const QSharedPointer &localUser); QHash> _usersCache; QSharedPointer _world; diff --git a/HanoiTowers/client/hanoiimageprovider.cpp b/HanoiTowers/client/hanoiimageprovider.cpp index fa6da05..a06b418 100644 --- a/HanoiTowers/client/hanoiimageprovider.cpp +++ b/HanoiTowers/client/hanoiimageprovider.cpp @@ -12,13 +12,13 @@ #include #include -HanoiImageProvider::HanoiImageProvider(const LocalUser *user) { +HanoiImageProvider::HanoiImageProvider(const QHash > *cache) { _pool = new QThreadPool(); - _currentUser = user; + _cache = cache; } void HanoiImageProvider::stop() { - _currentUser = nullptr; + _cache = nullptr; } HanoiImageProvider::~HanoiImageProvider() { @@ -28,15 +28,15 @@ HanoiImageProvider::~HanoiImageProvider() { QQuickImageResponse *HanoiImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize) { - AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize, _currentUser); + AsyncImageResponse *response = new AsyncImageResponse(id, requestedSize, _cache); _pool->start(response); return response; } AsyncImageResponse::AsyncImageResponse(const QString &id, const QSize &requestedSize, - const LocalUser *client) - : m_id(id), m_requestedSize(requestedSize), m_texture(0), _currentUser(client) { + const QHash > *cache) + : m_id(id), m_requestedSize(requestedSize), m_texture(0), _cache(cache) { setAutoDelete(false); } @@ -45,12 +45,18 @@ QQuickTextureFactory *AsyncImageResponse::textureFactory() const { } void AsyncImageResponse::run() { - if (!_currentUser) { + if (!_cache) { emit finished(); return; } - QByteArray imageData = _currentUser->avatarData(); + auto ids = m_id.split(":"); + QByteArray imageData; + + if (ids.size() && _cache->contains(ids[0])) { + imageData = _cache->value(ids[0])->avatarData(); + + } QImage image; if (imageData.size()) { diff --git a/HanoiTowers/client/hanoiimageprovider.h b/HanoiTowers/client/hanoiimageprovider.h index 30ec6e8..3aa978f 100644 --- a/HanoiTowers/client/hanoiimageprovider.h +++ b/HanoiTowers/client/hanoiimageprovider.h @@ -17,7 +17,9 @@ class LocalUser; class AsyncImageResponse : public QQuickImageResponse, public QRunnable { public: - AsyncImageResponse(const QString &id, const QSize &requestedSize, const LocalUser *client); + AsyncImageResponse(const QString &id, + const QSize &requestedSize, + const QHash>* cache); QQuickTextureFactory *textureFactory() const override; @@ -28,14 +30,14 @@ class AsyncImageResponse : public QQuickImageResponse, public QRunnable QQuickTextureFactory *m_texture; private: - const LocalUser *_currentUser = nullptr; + const QHash>* _cache = nullptr; }; class HanoiImageProvider: public QQuickAsyncImageProvider { public: - HanoiImageProvider(const LocalUser *user); + HanoiImageProvider(const QHash> *cache); void stop(); ~HanoiImageProvider() override; @@ -43,7 +45,7 @@ public: private: QThreadPool *_pool = nullptr; - const LocalUser *_currentUser = nullptr; + const QHash>* _cache = nullptr; }; #endif // HANOIIMAGEPROVIDER_H diff --git a/HanoiTowers/client/languages/en.ts b/HanoiTowers/client/languages/en.ts index 78bfb97..feeba87 100644 --- a/HanoiTowers/client/languages/en.ts +++ b/HanoiTowers/client/languages/en.ts @@ -191,7 +191,7 @@ Local user accept new data from the server. - + Internal Error, server send invalid data, and this data can't be saved into local database. Internal Error, server send invalid data, and this data can't be saved into local database. diff --git a/HanoiTowers/client/languages/ja.ts b/HanoiTowers/client/languages/ja.ts index 95ea1fa..37551fb 100644 --- a/HanoiTowers/client/languages/ja.ts +++ b/HanoiTowers/client/languages/ja.ts @@ -202,7 +202,7 @@ ローカルユーザはサーバからNBEWデータを受け入れます。 - + Internal Error, server send invalid data, and this data can't be saved into local database. 内部エラー、サーバーが無効なデータを送信し、このデータをローカルデータベースに保存することはできません。 diff --git a/HanoiTowers/client/languages/ru.ts b/HanoiTowers/client/languages/ru.ts index 235cc0f..e289a0e 100644 --- a/HanoiTowers/client/languages/ru.ts +++ b/HanoiTowers/client/languages/ru.ts @@ -202,7 +202,7 @@ Локальный пользователь принял новые данные с сервера. - + Internal Error, server send invalid data, and this data can't be saved into local database. Внутренняя ошибка, сервер отправил неверные данные, и эти данные не могут быть сохранены в локальной базе данных. diff --git a/HanoiTowers/client/languages/tr.ts b/HanoiTowers/client/languages/tr.ts index cd14148..0b6c10f 100644 --- a/HanoiTowers/client/languages/tr.ts +++ b/HanoiTowers/client/languages/tr.ts @@ -203,7 +203,7 @@ Bu seviye için minimum adımlar: %2 yerel kullanıcı sunucudan yeni verileri kabul eder. - + Internal Error, server send invalid data, and this data can't be saved into local database. Dahili Hata, sunucu geçersiz veri gönderdi ve bu veriler yerel veritabanına kaydedilemez. diff --git a/HanoiTowers/client/languages/ua.ts b/HanoiTowers/client/languages/ua.ts index 72f88f4..d94617c 100644 --- a/HanoiTowers/client/languages/ua.ts +++ b/HanoiTowers/client/languages/ua.ts @@ -203,7 +203,7 @@ локальний користувач приймає нові дані з сервера. - + Internal Error, server send invalid data, and this data can't be saved into local database. Внутрішня помилка, сервер надсилає недійсні дані, і ці дані не можна зберегти в локальній базі даних. diff --git a/HanoiTowers/client/localuser.cpp b/HanoiTowers/client/localuser.cpp index b20affc..440b1ff 100644 --- a/HanoiTowers/client/localuser.cpp +++ b/HanoiTowers/client/localuser.cpp @@ -163,6 +163,8 @@ ProfileData *LocalUser::userData() { void LocalUser::setUserData(const ProfileData &userData) { _userData = userData; + _avatarHash = qHash(_userData._avatar); + } QH::AccessToken LocalUser::token() const { @@ -205,11 +207,13 @@ void LocalUser::setRecord(int record) { } void LocalUser::setAvatar(const QByteArray& avatar) { - if (_userData._avatar == avatar) + auto hash = qHash(avatar); + + if (_avatarHash == hash) return; _userData._avatar = avatar; - _avatarHash = qHash(avatar); + _avatarHash = hash; emit avatarChanged(_avatarHash); } diff --git a/HanoiTowers/client/menu/UserView.qml b/HanoiTowers/client/menu/UserView.qml index bd74bf2..69a7194 100644 --- a/HanoiTowers/client/menu/UserView.qml +++ b/HanoiTowers/client/menu/UserView.qml @@ -22,7 +22,7 @@ GridLayout { Layout.rowSpan: 1 Image { id: userAvatar - source: "image://HanoiImages/" + ((userModel)? userModel.avatarHash: "") + source: "image://HanoiImages/" + ((userModel)? userModel.userId + ":" + userModel.avatarHash: "") anchors.fill: parent fillMode: Image.PreserveAspectFit diff --git a/HanoiTowers/client/menu/World.qml b/HanoiTowers/client/menu/World.qml index 4754f78..d422062 100644 --- a/HanoiTowers/client/menu/World.qml +++ b/HanoiTowers/client/menu/World.qml @@ -46,6 +46,10 @@ Item { id: privateRoot function showUser(id) { + if (backEnd) + backEnd.selectUserFromWorldTable(id); + + preview.open() } } diff --git a/Heart b/Heart index ec8c160..7b4fab5 160000 --- a/Heart +++ b/Heart @@ -1 +1 @@ -Subproject commit ec8c160ed3dc6dda9f88a564279b8fa97db6d936 +Subproject commit 7b4fab59425e740d0deabcf4fe95dec6c094146d diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index d2b6d1c..3912adf 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -26,12 +26,8 @@ parts: - libasn1-8-heimdal - libgssapi3-heimdal - libldap-2.4-2 - after: [libsgl, hanoi-tower-wrapper, qtlib] + after: [libsgl, qtlib] - - hanoi-tower-wrapper: - plugin: dump - source: QtNetworkProtocol/QuasarAppLib/Etalons/snap/wrapper qtlib: plugin: dump