mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-08-30 22:16:14 +00:00
complex layouts for context gifs started
This commit is contained in:
@@ -5559,207 +5559,6 @@ HistoryWebPage::~HistoryWebPage() {
|
||||
deleteAndMark(_attach);
|
||||
}
|
||||
|
||||
namespace {
|
||||
ImageLinkManager manager;
|
||||
}
|
||||
|
||||
void ImageLinkManager::init() {
|
||||
if (manager) delete manager;
|
||||
manager = new QNetworkAccessManager();
|
||||
App::setProxySettings(*manager);
|
||||
|
||||
connect(manager, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), this, SLOT(onFailed(QNetworkReply*)));
|
||||
connect(manager, SIGNAL(sslErrors(QNetworkReply*, const QList<QSslError>&)), this, SLOT(onFailed(QNetworkReply*)));
|
||||
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(onFinished(QNetworkReply*)));
|
||||
|
||||
if (black) delete black;
|
||||
QImage b(cIntRetinaFactor(), cIntRetinaFactor(), QImage::Format_ARGB32_Premultiplied);
|
||||
{
|
||||
QPainter p(&b);
|
||||
p.fillRect(QRect(0, 0, cIntRetinaFactor(), cIntRetinaFactor()), st::white->b);
|
||||
}
|
||||
QPixmap p = QPixmap::fromImage(b, Qt::ColorOnly);
|
||||
p.setDevicePixelRatio(cRetinaFactor());
|
||||
black = new ImagePtr(p, "PNG");
|
||||
}
|
||||
|
||||
void ImageLinkManager::reinit() {
|
||||
if (manager) App::setProxySettings(*manager);
|
||||
}
|
||||
|
||||
void ImageLinkManager::deinit() {
|
||||
if (manager) {
|
||||
delete manager;
|
||||
manager = 0;
|
||||
}
|
||||
if (black) {
|
||||
delete black;
|
||||
black = 0;
|
||||
}
|
||||
dataLoadings.clear();
|
||||
imageLoadings.clear();
|
||||
}
|
||||
|
||||
void initImageLinkManager() {
|
||||
manager.init();
|
||||
}
|
||||
|
||||
void reinitImageLinkManager() {
|
||||
manager.reinit();
|
||||
}
|
||||
|
||||
void deinitImageLinkManager() {
|
||||
manager.deinit();
|
||||
}
|
||||
|
||||
void ImageLinkManager::getData(ImageLinkData *data) {
|
||||
if (!manager) {
|
||||
DEBUG_LOG(("App Error: getting image link data without manager init!"));
|
||||
return failed(data);
|
||||
}
|
||||
QString url;
|
||||
switch (data->type) {
|
||||
case GoogleMapsLink: {
|
||||
int32 w = st::locationSize.width(), h = st::locationSize.height();
|
||||
int32 zoom = 13, scale = 1;
|
||||
if (cScale() == dbisTwo || cRetina()) {
|
||||
scale = 2;
|
||||
} else {
|
||||
w = convertScale(w);
|
||||
h = convertScale(h);
|
||||
}
|
||||
url = qsl("https://maps.googleapis.com/maps/api/staticmap?center=") + data->id.mid(9) + qsl("&zoom=%1&size=%2x%3&maptype=roadmap&scale=%4&markers=color:red|size:big|").arg(zoom).arg(w).arg(h).arg(scale) + data->id.mid(9) + qsl("&sensor=false");
|
||||
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
|
||||
imageLoadings[reply] = data;
|
||||
} break;
|
||||
default: {
|
||||
failed(data);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
void ImageLinkManager::onFinished(QNetworkReply *reply) {
|
||||
if (!manager) return;
|
||||
if (reply->error() != QNetworkReply::NoError) return onFailed(reply);
|
||||
|
||||
QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
|
||||
if (statusCode.isValid()) {
|
||||
int status = statusCode.toInt();
|
||||
if (status == 301 || status == 302) {
|
||||
QString loc = reply->header(QNetworkRequest::LocationHeader).toString();
|
||||
if (!loc.isEmpty()) {
|
||||
QMap<QNetworkReply*, ImageLinkData*>::iterator i = dataLoadings.find(reply);
|
||||
if (i != dataLoadings.cend()) {
|
||||
ImageLinkData *d = i.value();
|
||||
if (serverRedirects.constFind(d) == serverRedirects.cend()) {
|
||||
serverRedirects.insert(d, 1);
|
||||
} else if (++serverRedirects[d] > MaxHttpRedirects) {
|
||||
DEBUG_LOG(("Network Error: Too many HTTP redirects in onFinished() for image link: %1").arg(loc));
|
||||
return onFailed(reply);
|
||||
}
|
||||
dataLoadings.erase(i);
|
||||
dataLoadings.insert(manager->get(QNetworkRequest(loc)), d);
|
||||
return;
|
||||
} else if ((i = imageLoadings.find(reply)) != imageLoadings.cend()) {
|
||||
ImageLinkData *d = i.value();
|
||||
if (serverRedirects.constFind(d) == serverRedirects.cend()) {
|
||||
serverRedirects.insert(d, 1);
|
||||
} else if (++serverRedirects[d] > MaxHttpRedirects) {
|
||||
DEBUG_LOG(("Network Error: Too many HTTP redirects in onFinished() for image link: %1").arg(loc));
|
||||
return onFailed(reply);
|
||||
}
|
||||
imageLoadings.erase(i);
|
||||
imageLoadings.insert(manager->get(QNetworkRequest(loc)), d);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (status != 200) {
|
||||
DEBUG_LOG(("Network Error: Bad HTTP status received in onFinished() for image link: %1").arg(status));
|
||||
return onFailed(reply);
|
||||
}
|
||||
}
|
||||
|
||||
ImageLinkData *d = 0;
|
||||
QMap<QNetworkReply*, ImageLinkData*>::iterator i = dataLoadings.find(reply);
|
||||
if (i != dataLoadings.cend()) {
|
||||
d = i.value();
|
||||
dataLoadings.erase(i);
|
||||
|
||||
QJsonParseError e;
|
||||
QJsonDocument doc = QJsonDocument::fromJson(reply->readAll(), &e);
|
||||
if (e.error != QJsonParseError::NoError) {
|
||||
DEBUG_LOG(("JSON Error: Bad json received in onFinished() for image link"));
|
||||
return onFailed(reply);
|
||||
}
|
||||
switch (d->type) {
|
||||
case GoogleMapsLink: failed(d); break;
|
||||
}
|
||||
|
||||
if (App::main()) App::main()->update();
|
||||
} else {
|
||||
i = imageLoadings.find(reply);
|
||||
if (i != imageLoadings.cend()) {
|
||||
d = i.value();
|
||||
imageLoadings.erase(i);
|
||||
|
||||
QPixmap thumb;
|
||||
QByteArray format;
|
||||
QByteArray data(reply->readAll());
|
||||
{
|
||||
QBuffer buffer(&data);
|
||||
QImageReader reader(&buffer);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0)
|
||||
reader.setAutoTransform(true);
|
||||
#endif
|
||||
thumb = QPixmap::fromImageReader(&reader, Qt::ColorOnly);
|
||||
format = reader.format();
|
||||
thumb.setDevicePixelRatio(cRetinaFactor());
|
||||
if (format.isEmpty()) format = QByteArray("JPG");
|
||||
}
|
||||
d->loading = false;
|
||||
d->thumb = thumb.isNull() ? (*black) : ImagePtr(thumb, format);
|
||||
serverRedirects.remove(d);
|
||||
if (App::main()) App::main()->update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ImageLinkManager::onFailed(QNetworkReply *reply) {
|
||||
if (!manager) return;
|
||||
|
||||
ImageLinkData *d = 0;
|
||||
QMap<QNetworkReply*, ImageLinkData*>::iterator i = dataLoadings.find(reply);
|
||||
if (i != dataLoadings.cend()) {
|
||||
d = i.value();
|
||||
dataLoadings.erase(i);
|
||||
} else {
|
||||
i = imageLoadings.find(reply);
|
||||
if (i != imageLoadings.cend()) {
|
||||
d = i.value();
|
||||
imageLoadings.erase(i);
|
||||
}
|
||||
}
|
||||
DEBUG_LOG(("Network Error: failed to get data for image link %1, error %2").arg(d ? d->id : 0).arg(reply->errorString()));
|
||||
if (d) {
|
||||
failed(d);
|
||||
}
|
||||
}
|
||||
|
||||
void ImageLinkManager::failed(ImageLinkData *data) {
|
||||
data->loading = false;
|
||||
data->thumb = *black;
|
||||
serverRedirects.remove(data);
|
||||
}
|
||||
|
||||
void ImageLinkData::load() {
|
||||
if (!thumb->isNull()) return thumb->load(false, false);
|
||||
if (loading) return;
|
||||
|
||||
loading = true;
|
||||
manager.getData(this);
|
||||
}
|
||||
|
||||
HistoryImageLink::HistoryImageLink(const QString &url, const QString &title, const QString &description) : HistoryMedia(),
|
||||
_title(st::msgMinWidth),
|
||||
_description(st::msgMinWidth) {
|
||||
|
Reference in New Issue
Block a user