firemail

标题: 数据更新流程逻辑 [打印本页]

作者: Qter    时间: 2020-3-14 12:07
标题: 数据更新流程逻辑
本帖最后由 Qter 于 2020-3-14 14:26 编辑

------用户名更新-------
App::main()->contactsList()
                                 \Telegram\SourceFiles\mainwidget.h
object_ptr<DialogsWidget> _dialogs;
_dialogs->contactsList()

                                  \Telegram\SourceFiles\dialogs\dialogs_widget.h
QPointer<DialogsInner> _inner;
_inner->contactsList();

                                  \Telegram\SourceFiles\dialogs\dialogs_inner_widget.h
std::unique_ptr<Dialogs::IndexedList> _contacts;
return _contacts.get();

void DialogsInner::handlePeerNameChange(...) {
_contacts->peerNameChanged(peer, oldLetters);
}

subscribe(Notify:: PeerUpdated(), Notify:: PeerUpdatedHandler(changes, [=](const Notify:: PeerUpdate &update) {
                  if (update.flags & UpdateFlag::NameChanged) {
                        handlePeerNameChange(update.peer, update.oldNameFirstLetters);
                }

}
                                                                       \Telegram\SourceFiles\data\data_peer.cpp
void PeerData::updateNameDelayed(...)
{
Notify:: PeerUpdated().notify(update, true);
}

                                                                   \Telegram\SourceFiles\data\data_user.cpp
void UserData::setName(...)
{
updateNameDelayed(newFullName, newPhoneName, newUsername);
}

客户端添加联系人等网络返回时也会调用,重点还是下面的调用
                                                           \Telegram\SourceFiles\mainwidget.cpp
void MainWidget::feedUpdate(const MTPUpdate &update) {
   case mtpc_updateUserName: {   -- 0xa7332b73, 对应scheme.tl中的updateUserName#a7332b73 user_id:int first_name:string last_name:string username:string = Update;
                                         user->setName(
                                        TextUtilities::SingleLine(user->firstName),
                                        TextUtilities::SingleLine(user->lastName),
                                        user->nameOrPhone,
                                        TextUtilities::SingleLine(qs(d.vusername)));
   }
}


void MainWidget::feedUpdates(const MTPUpdates &updates, uint64 randomId) {

              case mtpc_updateShort: {  = 0x78d4dec1, updateShort#78d4dec1 update:Update date:int = Updates;
                auto &d = updates.c_updateShort();
                feedUpdate(d.vupdate);
        } break;

}
                                            \Telegram\SourceFiles\apiwrap.cpp
void ApiWrap::applyUpdates(
                const MTPUpdates &updates,
                uint64 sentMessageRandomId) {
        App::main()->feedUpdates(updates, sentMessageRandomId);
}


这里调用地方比较多了 如下创建群组...
                                       \Telegram\SourceFiles\boxes\add_contact_box.cpp

_creationRequestId = request(MTPmessages_CreateChat(
                MTP_vector<MTPInputUser>(inputs),
                MTP_string(title)
        )).done([=](const MTPUpdates &result) {
                auto image = _photo->takeResultImage();
                Ui::hideLayer();

                Auth().api().applyUpdates(result);

即当一个地方发生了网络请求,等数据回来后,要通知到其它需要显示的地方,使数据显示同步



作者: Qter    时间: 2020-3-14 15:01
本帖最后由 Qter 于 2020-3-14 15:28 编辑

              \Telegram\SourceFiles\dialogs\dialogs_inner_widget.cpp
void DialogsInner::userIsContactUpdated(not_null<UserData*> user) {
_contacts->addByName(history);
}

构造函数中
subscribe(Notify:: PeerUpdated(), Notify:: PeerUpdatedHandler(changes, [=](const Notify:: PeerUpdate &update) {
    if (update.flags & UpdateFlag::UserIsContact) {
                        if (const auto user = update.peer->asUser()) {
                                userIsContactUpdated(user);
                        }
                }
}

                                                                     \Telegram\SourceFiles\data\data_peer.cpp
void PeerData::updateNameDelayed(...)
{
Notify:: PeerUpdated().notify(update, true);
}

搜索 PeerUpdated().notify

注意:\Telegram\SourceFiles\apiwrap.cpp
void ApiWrap::gotUserFull(
                not_null<UserData*> user,
                const MTPUserFull &result,
                mtpRequestId req) {

fullPeerUpdated().notify(user);                   ------------------当前登录的用户信息的获取
}


              \Telegram\SourceFiles\auth_session.cpp
AuthSession::AuthSession(const MTPUser &user){
        _api->requestFullPeer(_user);}

          \Telegram\SourceFiles\core\application.cpp
Application::authSessionCreate
Application::startMtp()
void Application::run()



作者: Qter    时间: 2020-3-14 15:35
本帖最后由 Qter 于 2020-3-16 10:21 编辑

重新搜索 PeerUpdated().notify           \Telegram\SourceFiles\observer_peer.cpp
void peerUpdatedSendDelayed() {for (auto &update : AllUpdates) {
                PeerUpdated().notify(std::move(update), true);
        }
}




void peerUpdatedDelayed(const PeerUpdate &update) {
AllUpdates->insert(update.peer, update);
}

peerUpdatedDelayed 这个函数调用的地方很多





\Telegram\SourceFiles\data\data_session.cpp
not_null<UserData*> Session::processUser(const MTPUser &data) {
if (App::main()) {
                if (update.flags) {
                        update.peer = result;
                        Notify::peerUpdatedDelayed(update);
                }
        }
}
UserData *Session::processUsers(const MTPVector<MTPUser> &data) {
        auto result = (UserData*)nullptr;
        for (const auto &user : data.v) {
                result = processUser(user);
        }
        return result;
}


\Telegram\SourceFiles\dialogs\dialogs_widget.cpp

void DialogsWidget::dialogsReceived(
                const MTPmessages_Dialogs &dialogs,
                mtpRequestId requestId) {

Auth().data().processUsers(data.vusers);
}

void DialogsWidget::loadDialogs() {
_dialogsRequestId = MTP::send(
                MTPmessages_GetDialogs(            --------- RPC method 'messages.getDialogs' messages.getDialogs#b098aee6 flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:int = messages.Dialogs;
                        MTP_flags(flags),
                        //MTP_int(feedId), // #feed
                        MTP_int(_dialogsOffsetDate),
                        MTP_int(_dialogsOffsetId),
                        _dialogsOffsetPeer
                                ? _dialogsOffsetPeer->input
                                : MTP_inputPeerEmpty(),
                        MTP_int(loadCount),
                        MTP_int(hash)),
                rpcDone(&DialogsWidget::dialogsReceived),
                rpcFail(&DialogsWidget::dialogsFailed));

}
  1. messages.dialogs#15ba6c40 dialogs:Vector<Dialog> messages:Vector<Message> chats:Vector<Chat> users:Vector<User> = messages.Dialogs;
  2. user#2e13f4c3 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true id:int access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?string bot_inline_placeholder:flags.19?string lang_code:flags.22?string = User;
  3. chat#3bda1bde flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true id:int title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;
  4. message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
  5. dialog#e4def5db flags:# pinned:flags.2?true unread_mark:flags.3?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage = Dialog;
复制代码





欢迎光临 firemail (http://firemail.wang:8088/) Powered by Discuz! X3