Support file reference refresh in IV.

This commit is contained in:
John Preston 2024-03-12 13:50:40 +04:00
parent 5f7c3ae20e
commit 1252accef7
9 changed files with 67 additions and 22 deletions

View file

@ -2548,6 +2548,10 @@ void ApiWrap::refreshFileReference(
request(MTPaccount_GetSavedRingtones(MTP_long(0))); request(MTPaccount_GetSavedRingtones(MTP_long(0)));
}, [&](Data::FileOriginPremiumPreviews data) { }, [&](Data::FileOriginPremiumPreviews data) {
request(MTPhelp_GetPremiumPromo()); request(MTPhelp_GetPremiumPromo());
}, [&](Data::FileOriginWebPage data) {
request(MTPmessages_GetWebPage(
MTP_string(data.url),
MTP_int(0)));
}, [&](Data::FileOriginStory data) { }, [&](Data::FileOriginStory data) {
request(MTPstories_GetStoriesByID( request(MTPstories_GetStoriesByID(
_session->data().peer(data.peer)->input, _session->data().peer(data.peer)->input,

View file

@ -164,6 +164,9 @@ struct FileReferenceAccumulator {
void push(const MTPhelp_PremiumPromo &data) { void push(const MTPhelp_PremiumPromo &data) {
push(data.data().vvideos()); push(data.data().vvideos());
} }
void push(const MTPmessages_WebPage &data) {
push(data.data().vwebpage());
}
void push(const MTPstories_Stories &data) { void push(const MTPstories_Stories &data) {
push(data.data().vstories()); push(data.data().vstories());
} }
@ -228,6 +231,10 @@ UpdatedFileReferences GetFileReferences(const MTPhelp_PremiumPromo &data) {
return GetFileReferencesHelper(data); return GetFileReferencesHelper(data);
} }
UpdatedFileReferences GetFileReferences(const MTPmessages_WebPage &data) {
return GetFileReferencesHelper(data);
}
UpdatedFileReferences GetFileReferences(const MTPstories_Stories &data) { UpdatedFileReferences GetFileReferences(const MTPstories_Stories &data) {
return GetFileReferencesHelper(data); return GetFileReferencesHelper(data);
} }

View file

@ -121,6 +121,14 @@ struct FileOriginPremiumPreviews {
} }
}; };
struct FileOriginWebPage {
QString url;
inline bool operator<(const FileOriginWebPage &other) const {
return url < other.url;
}
};
struct FileOrigin { struct FileOrigin {
using Variant = std::variant< using Variant = std::variant<
v::null_t, v::null_t,
@ -134,6 +142,7 @@ struct FileOrigin {
FileOriginTheme, FileOriginTheme,
FileOriginRingtones, FileOriginRingtones,
FileOriginPremiumPreviews, FileOriginPremiumPreviews,
FileOriginWebPage,
FileOriginStory>; FileOriginStory>;
FileOrigin() = default; FileOrigin() = default;
@ -157,6 +166,8 @@ struct FileOrigin {
} }
FileOrigin(FileOriginPremiumPreviews data) : data(data) { FileOrigin(FileOriginPremiumPreviews data) : data(data) {
} }
FileOrigin(FileOriginWebPage data) : data(data) {
}
FileOrigin(FileOriginStory data) : data(data) { FileOrigin(FileOriginStory data) : data(data) {
} }
@ -208,6 +219,7 @@ UpdatedFileReferences GetFileReferences(const MTPTheme &data);
UpdatedFileReferences GetFileReferences( UpdatedFileReferences GetFileReferences(
const MTPaccount_SavedRingtones &data); const MTPaccount_SavedRingtones &data);
UpdatedFileReferences GetFileReferences(const MTPhelp_PremiumPromo &data); UpdatedFileReferences GetFileReferences(const MTPhelp_PremiumPromo &data);
UpdatedFileReferences GetFileReferences(const MTPmessages_WebPage &data);
UpdatedFileReferences GetFileReferences(const MTPstories_Stories &data); UpdatedFileReferences GetFileReferences(const MTPstories_Stories &data);
// Admin Log Event. // Admin Log Event.

View file

@ -281,10 +281,6 @@ void Controller::initControls() {
_subtitleLeft.stop(); _subtitleLeft.stop();
} }
bool Controller::showFast(const QString &url, const QString &hash) {
return false;
}
void Controller::show( void Controller::show(
const QString &dataPath, const QString &dataPath,
Prepared page, Prepared page,

View file

@ -65,7 +65,6 @@ public:
QString context; QString context;
}; };
[[nodiscard]] bool showFast(const QString &url, const QString &hash);
void show( void show(
const QString &dataPath, const QString &dataPath,
Prepared page, Prepared page,

View file

@ -41,6 +41,7 @@ Geo GeoPointFromId(QByteArray data) {
Data::Data(const MTPDwebPage &webpage, const MTPPage &page) Data::Data(const MTPDwebPage &webpage, const MTPPage &page)
: _source(std::make_unique<Source>(Source{ : _source(std::make_unique<Source>(Source{
.pageId = webpage.vid().v,
.page = page, .page = page,
.webpagePhoto = (webpage.vphoto() .webpagePhoto = (webpage.vphoto()
? *webpage.vphoto() ? *webpage.vphoto()

View file

@ -124,8 +124,10 @@ private:
void showWindowed(Prepared result); void showWindowed(Prepared result);
[[nodiscard]] ShareBoxResult shareBox(ShareBoxDescriptor &&descriptor); [[nodiscard]] ShareBoxResult shareBox(ShareBoxDescriptor &&descriptor);
void streamPhoto(PhotoId photoId, Webview::DataRequest request); [[nodiscard]] ::Data::FileOrigin fileOrigin(
void streamFile(DocumentId documentId, Webview::DataRequest request); not_null<WebPageData*> page) const;
void streamPhoto(QStringView idWithPageId, Webview::DataRequest request);
void streamFile(QStringView idWithPageId, Webview::DataRequest request);
void streamFile(FileStream &file, Webview::DataRequest request); void streamFile(FileStream &file, Webview::DataRequest request);
void processPartInFile( void processPartInFile(
FileStream &file, FileStream &file,
@ -414,9 +416,9 @@ void Shown::createController() {
const auto requested = QString::fromStdString(request.id); const auto requested = QString::fromStdString(request.id);
const auto id = QStringView(requested); const auto id = QStringView(requested);
if (id.startsWith(u"photo/")) { if (id.startsWith(u"photo/")) {
streamPhoto(id.mid(6).toULongLong(), std::move(request)); streamPhoto(id.mid(6), std::move(request));
} else if (id.startsWith(u"document/"_q)) { } else if (id.startsWith(u"document/"_q)) {
streamFile(id.mid(9).toULongLong(), std::move(request)); streamFile(id.mid(9), std::move(request));
} else if (id.startsWith(u"map/"_q)) { } else if (id.startsWith(u"map/"_q)) {
streamMap(id.mid(4).toUtf8(), std::move(request)); streamMap(id.mid(4).toUtf8(), std::move(request));
} else if (id.startsWith(u"html/"_q)) { } else if (id.startsWith(u"html/"_q)) {
@ -437,16 +439,28 @@ void Shown::showWindowed(Prepared result) {
base::duplicate(_inChannelValues)); base::duplicate(_inChannelValues));
} }
void Shown::streamPhoto(PhotoId photoId, Webview::DataRequest request) { ::Data::FileOrigin Shown::fileOrigin(not_null<WebPageData*> page) const {
return ::Data::FileOriginWebPage{ page->url };
}
void Shown::streamPhoto(
QStringView idWithPageId,
Webview::DataRequest request) {
using namespace Data; using namespace Data;
const auto photo = _session->data().photo(photoId); const auto parts = idWithPageId.split('/');
if (photo->isNull()) { if (parts.size() != 2) {
requestFail(std::move(request));
return;
}
const auto photo = _session->data().photo(parts[0].toULongLong());
const auto page = _session->data().webpage(parts[1].toULongLong());
if (photo->isNull() || page->url.isEmpty()) {
requestFail(std::move(request)); requestFail(std::move(request));
return; return;
} }
const auto media = photo->createMediaView(); const auto media = photo->createMediaView();
media->wanted(PhotoSize::Large, FileOrigin()); media->wanted(PhotoSize::Large, fileOrigin(page));
const auto check = [=] { const auto check = [=] {
if (!media->loaded() && !media->owner()->failed(PhotoSize::Large)) { if (!media->loaded() && !media->owner()->failed(PhotoSize::Large)) {
return false; return false;
@ -466,17 +480,28 @@ void Shown::streamPhoto(PhotoId photoId, Webview::DataRequest request) {
} }
void Shown::streamFile( void Shown::streamFile(
DocumentId documentId, QStringView idWithPageId,
Webview::DataRequest request) { Webview::DataRequest request) {
using namespace Data; using namespace Data;
const auto parts = idWithPageId.split('/');
if (parts.size() != 2) {
requestFail(std::move(request));
return;
}
const auto documentId = DocumentId(parts[0].toULongLong());
const auto i = _streams.find(documentId); const auto i = _streams.find(documentId);
if (i != end(_streams)) { if (i != end(_streams)) {
streamFile(i->second, std::move(request)); streamFile(i->second, std::move(request));
return; return;
} }
const auto document = _session->data().document(documentId); const auto document = _session->data().document(documentId);
auto loader = document->createStreamingLoader(FileOrigin(), false); const auto page = _session->data().webpage(parts[1].toULongLong());
if (page->url.isEmpty()) {
requestFail(std::move(request));
return;
}
auto loader = document->createStreamingLoader(fileOrigin(page), false);
if (!loader) { if (!loader) {
if (document->size >= Storage::kMaxFileInMemory) { if (document->size >= Storage::kMaxFileInMemory) {
requestFail(std::move(request)); requestFail(std::move(request));
@ -493,7 +518,7 @@ void Shown::streamFile(
file.media = std::move(media); file.media = std::move(media);
file.requests.push_back(std::move(request)); file.requests.push_back(std::move(request));
document->forceToCache(true); document->forceToCache(true);
document->save(::Data::FileOrigin(), QString()); document->save(fileOrigin(page), QString());
} }
} }
return; return;
@ -747,9 +772,7 @@ bool Shown::active() const {
} }
void Shown::moveTo(not_null<Data*> data, QString hash) { void Shown::moveTo(not_null<Data*> data, QString hash) {
if (!_controller || !_controller->showFast(data->id(), hash)) { prepare(data, hash);
prepare(data, hash);
}
} }
void Shown::update(not_null<Data*> data) { void Shown::update(not_null<Data*> data) {

View file

@ -160,6 +160,7 @@ private:
const QVector<MTPPageBlock> &items); const QVector<MTPPageBlock> &items);
const Options _options; const Options _options;
const QByteArray _fileOriginPostfix;
base::flat_set<QByteArray> _resources; base::flat_set<QByteArray> _resources;
@ -202,7 +203,8 @@ private:
} }
Parser::Parser(const Source &source, const Options &options) Parser::Parser(const Source &source, const Options &options)
: _options(options) { : _options(options)
, _fileOriginPostfix('/' + Number(source.pageId)) {
process(source); process(source);
_result.name = source.name; _result.name = source.name;
_result.rtl = source.page.data().is_rtl(); _result.rtl = source.page.data().is_rtl();
@ -1146,11 +1148,11 @@ Document Parser::documentById(uint64 id) {
} }
QByteArray Parser::photoFullUrl(const Photo &photo) { QByteArray Parser::photoFullUrl(const Photo &photo) {
return resource("photo/" + Number(photo.id)); return resource("photo/" + Number(photo.id) + _fileOriginPostfix);
} }
QByteArray Parser::documentFullUrl(const Document &document) { QByteArray Parser::documentFullUrl(const Document &document) {
return resource("document/" + Number(document.id)); return resource("document/" + Number(document.id) + _fileOriginPostfix);
} }
QByteArray Parser::embedUrl(const QByteArray &html) { QByteArray Parser::embedUrl(const QByteArray &html) {

View file

@ -13,6 +13,7 @@ struct Options;
struct Prepared; struct Prepared;
struct Source { struct Source {
uint64 pageId = 0;
MTPPage page; MTPPage page;
std::optional<MTPPhoto> webpagePhoto; std::optional<MTPPhoto> webpagePhoto;
std::optional<MTPDocument> webpageDocument; std::optional<MTPDocument> webpageDocument;