Repair file_reference in UpdateProfilePhoto.
GitOrigin-RevId: 1edb98b56d2af603ac51d7ba6ee9e6cd08e12595
This commit is contained in:
parent
d18f89c071
commit
595eb119d7
@ -708,12 +708,17 @@ class UploadProfilePhotoQuery : public Td::ResultHandler {
|
|||||||
|
|
||||||
class UpdateProfilePhotoQuery : public Td::ResultHandler {
|
class UpdateProfilePhotoQuery : public Td::ResultHandler {
|
||||||
Promise<Unit> promise_;
|
Promise<Unit> promise_;
|
||||||
|
FileId file_id_;
|
||||||
|
string file_reference_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit UpdateProfilePhotoQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
explicit UpdateProfilePhotoQuery(Promise<Unit> &&promise) : promise_(std::move(promise)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send(tl_object_ptr<telegram_api::InputPhoto> &&input_photo) {
|
void send(FileId file_id, tl_object_ptr<telegram_api::InputPhoto> &&input_photo) {
|
||||||
|
CHECK(input_photo != nullptr);
|
||||||
|
file_id_ = file_id;
|
||||||
|
file_reference_ = FileManager::extract_file_reference(input_photo);
|
||||||
send_query(G()->net_query_creator().create(
|
send_query(G()->net_query_creator().create(
|
||||||
create_storer(telegram_api::photos_updateProfilePhoto(std::move(input_photo)))));
|
create_storer(telegram_api::photos_updateProfilePhoto(std::move(input_photo)))));
|
||||||
}
|
}
|
||||||
@ -731,6 +736,16 @@ class UpdateProfilePhotoQuery : public Td::ResultHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void on_error(uint64 id, Status status) override {
|
void on_error(uint64 id, Status status) override {
|
||||||
|
if (FileReferenceManager::is_file_reference_error(status)) {
|
||||||
|
if (file_id_.is_valid()) {
|
||||||
|
td->file_manager_->delete_file_reference(file_id_, file_reference_);
|
||||||
|
td->contacts_manager_->upload_profile_photo(file_id_, std::move(promise_));
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
LOG(ERROR) << "Receive file reference error, but file_id = " << file_id_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
promise_.set_error(std::move(status));
|
promise_.set_error(std::move(status));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -3912,23 +3927,26 @@ void ContactsManager::set_profile_photo(const tl_object_ptr<td_api::InputFile> &
|
|||||||
CHECK(!file_view.is_encrypted());
|
CHECK(!file_view.is_encrypted());
|
||||||
if (file_view.has_remote_location() && !file_view.remote_location().is_web()) {
|
if (file_view.has_remote_location() && !file_view.remote_location().is_web()) {
|
||||||
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
||||||
->send(file_view.remote_location().as_input_photo());
|
->send(file_id, file_view.remote_location().as_input_photo());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto upload_file_id = td_->file_manager_->dup_file_id(file_id);
|
upload_profile_photo(td_->file_manager_->dup_file_id(file_id), std::move(promise));
|
||||||
CHECK(upload_file_id.is_valid());
|
}
|
||||||
CHECK(uploaded_profile_photos_.find(upload_file_id) == uploaded_profile_photos_.end());
|
|
||||||
uploaded_profile_photos_.emplace(upload_file_id, std::move(promise));
|
void ContactsManager::upload_profile_photo(FileId file_id, Promise<Unit> &&promise) {
|
||||||
LOG(INFO) << "Ask to upload profile photo " << upload_file_id;
|
CHECK(file_id.is_valid());
|
||||||
td_->file_manager_->upload(upload_file_id, upload_profile_photo_callback_, 1, 0);
|
CHECK(uploaded_profile_photos_.find(file_id) == uploaded_profile_photos_.end());
|
||||||
|
uploaded_profile_photos_.emplace(file_id, std::move(promise));
|
||||||
|
LOG(INFO) << "Ask to upload profile photo " << file_id;
|
||||||
|
td_->file_manager_->upload(file_id, upload_profile_photo_callback_, 1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContactsManager::delete_profile_photo(int64 profile_photo_id, Promise<Unit> &&promise) {
|
void ContactsManager::delete_profile_photo(int64 profile_photo_id, Promise<Unit> &&promise) {
|
||||||
const User *u = get_user(get_my_id());
|
const User *u = get_user(get_my_id());
|
||||||
if (u != nullptr && u->photo.id == profile_photo_id) {
|
if (u != nullptr && u->photo.id == profile_photo_id) {
|
||||||
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
||||||
->send(make_tl_object<telegram_api::inputPhotoEmpty>());
|
->send(FileId(), make_tl_object<telegram_api::inputPhotoEmpty>());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -9752,7 +9770,7 @@ void ContactsManager::on_upload_profile_photo(FileId file_id, tl_object_ptr<tele
|
|||||||
}
|
}
|
||||||
|
|
||||||
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
td_->create_handler<UpdateProfilePhotoQuery>(std::move(promise))
|
||||||
->send(file_view.remote_location().as_input_photo());
|
->send(file_id, file_view.remote_location().as_input_photo());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CHECK(input_file != nullptr);
|
CHECK(input_file != nullptr);
|
||||||
|
@ -283,6 +283,8 @@ class ContactsManager : public Actor {
|
|||||||
|
|
||||||
void delete_profile_photo(int64 profile_photo_id, Promise<Unit> &&promise);
|
void delete_profile_photo(int64 profile_photo_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
|
void upload_profile_photo(FileId file_id, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void set_name(const string &first_name, const string &last_name, Promise<Unit> &&promise);
|
void set_name(const string &first_name, const string &last_name, Promise<Unit> &&promise);
|
||||||
|
|
||||||
void set_bio(const string &bio, Promise<Unit> &&promise);
|
void set_bio(const string &bio, Promise<Unit> &&promise);
|
||||||
|
@ -2476,29 +2476,48 @@ bool FileManager::extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_ap
|
|||||||
}
|
}
|
||||||
|
|
||||||
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media) {
|
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media) {
|
||||||
if (input_media != nullptr) {
|
if (input_media == nullptr) {
|
||||||
switch (input_media->get_id()) {
|
|
||||||
case telegram_api::inputMediaDocument::ID: {
|
|
||||||
const auto *id = static_cast<const telegram_api::inputMediaDocument *>(input_media.get())->id_.get();
|
|
||||||
CHECK(id != nullptr);
|
|
||||||
if (id->get_id() == telegram_api::inputDocument::ID) {
|
|
||||||
return static_cast<const telegram_api::inputDocument *>(id)->file_reference_.as_slice().str();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case telegram_api::inputMediaPhoto::ID: {
|
|
||||||
const auto *id = static_cast<const telegram_api::inputMediaPhoto *>(input_media.get())->id_.get();
|
|
||||||
CHECK(id != nullptr);
|
|
||||||
if (id->get_id() == telegram_api::inputPhoto::ID) {
|
|
||||||
return static_cast<const telegram_api::inputPhoto *>(id)->file_reference_.as_slice().str();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return string();
|
return string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch (input_media->get_id()) {
|
||||||
|
case telegram_api::inputMediaDocument::ID:
|
||||||
|
return extract_file_reference(static_cast<const telegram_api::inputMediaDocument *>(input_media.get())->id_);
|
||||||
|
case telegram_api::inputMediaPhoto::ID:
|
||||||
|
return extract_file_reference(static_cast<const telegram_api::inputMediaPhoto *>(input_media.get())->id_);
|
||||||
|
default:
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputDocument> &input_document) {
|
||||||
|
if (input_document == nullptr || input_document->get_id() != telegram_api::inputDocument::ID) {
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
|
||||||
|
return static_cast<const telegram_api::inputDocument *>(input_document.get())->file_reference_.as_slice().str();
|
||||||
|
}
|
||||||
|
|
||||||
|
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputPhoto> &input_photo) {
|
||||||
|
if (input_photo == nullptr || input_photo->get_id() != telegram_api::inputPhoto::ID) {
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
|
||||||
|
return static_cast<const telegram_api::inputPhoto *>(input_photo.get())->file_reference_.as_slice().str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FileManager::extract_was_uploaded(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
||||||
|
return input_chat_photo != nullptr && input_chat_photo->get_id() == telegram_api::inputChatUploadedPhoto::ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
string FileManager::extract_file_reference(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo) {
|
||||||
|
if (input_chat_photo == nullptr || input_chat_photo->get_id() != telegram_api::inputChatPhoto::ID) {
|
||||||
|
return string();
|
||||||
|
}
|
||||||
|
|
||||||
|
return extract_file_reference(static_cast<const telegram_api::inputChatPhoto *>(input_chat_photo.get())->id_);
|
||||||
|
}
|
||||||
|
|
||||||
FileId FileManager::next_file_id() {
|
FileId FileManager::next_file_id() {
|
||||||
if (!empty_file_ids_.empty()) {
|
if (!empty_file_ids_.empty()) {
|
||||||
auto res = empty_file_ids_.back();
|
auto res = empty_file_ids_.back();
|
||||||
|
@ -396,6 +396,13 @@ class FileManager : public FileLoadManager::Callback {
|
|||||||
static bool extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
static bool extract_was_thumbnail_uploaded(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
static string extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
static string extract_file_reference(const tl_object_ptr<telegram_api::InputMedia> &input_media);
|
||||||
|
|
||||||
|
static string extract_file_reference(const tl_object_ptr<telegram_api::InputDocument> &input_document);
|
||||||
|
|
||||||
|
static string extract_file_reference(const tl_object_ptr<telegram_api::InputPhoto> &input_photo);
|
||||||
|
|
||||||
|
static bool extract_was_uploaded(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
||||||
|
static string extract_file_reference(const tl_object_ptr<telegram_api::InputChatPhoto> &input_chat_photo);
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void store_file(FileId file_id, T &storer, int32 ttl = 5) const;
|
void store_file(FileId file_id, T &storer, int32 ttl = 5) const;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user