228 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
This file is part of Telegram Desktop,
 | 
						|
the official desktop application for the Telegram messaging service.
 | 
						|
 | 
						|
For license and copyright information please follow this link:
 | 
						|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
						|
*/
 | 
						|
#include "data/data_file_click_handler.h"
 | 
						|
 | 
						|
#include "core/click_handler_types.h"
 | 
						|
#include "core/file_utilities.h"
 | 
						|
#include "core/application.h"
 | 
						|
#include "data/data_document.h"
 | 
						|
#include "data/data_session.h"
 | 
						|
#include "data/data_download_manager.h"
 | 
						|
#include "data/data_photo.h"
 | 
						|
 | 
						|
FileClickHandler::FileClickHandler(FullMsgId context)
 | 
						|
: _context(context) {
 | 
						|
}
 | 
						|
 | 
						|
void FileClickHandler::setMessageId(FullMsgId context) {
 | 
						|
	_context = context;
 | 
						|
}
 | 
						|
 | 
						|
FullMsgId FileClickHandler::context() const {
 | 
						|
	return _context;
 | 
						|
}
 | 
						|
 | 
						|
not_null<DocumentData*> DocumentClickHandler::document() const {
 | 
						|
	return _document;
 | 
						|
}
 | 
						|
 | 
						|
DocumentWrappedClickHandler::DocumentWrappedClickHandler(
 | 
						|
	ClickHandlerPtr wrapped,
 | 
						|
	not_null<DocumentData*> document,
 | 
						|
	FullMsgId context)
 | 
						|
: DocumentClickHandler(document, context)
 | 
						|
, _wrapped(wrapped) {
 | 
						|
}
 | 
						|
 | 
						|
void DocumentWrappedClickHandler::onClickImpl() const {
 | 
						|
	_wrapped->onClick({ Qt::LeftButton });
 | 
						|
}
 | 
						|
 | 
						|
DocumentClickHandler::DocumentClickHandler(
 | 
						|
	not_null<DocumentData*> document,
 | 
						|
	FullMsgId context)
 | 
						|
: FileClickHandler(context)
 | 
						|
, _document(document) {
 | 
						|
	setProperty(
 | 
						|
		kDocumentLinkMediaProperty,
 | 
						|
		reinterpret_cast<qulonglong>(_document.get()));
 | 
						|
}
 | 
						|
 | 
						|
QString DocumentClickHandler::tooltip() const {
 | 
						|
	return property(kDocumentFilenameTooltipProperty).value<QString>();
 | 
						|
}
 | 
						|
 | 
						|
DocumentOpenClickHandler::DocumentOpenClickHandler(
 | 
						|
	not_null<DocumentData*> document,
 | 
						|
	Fn<void(FullMsgId)> &&callback,
 | 
						|
	FullMsgId context)
 | 
						|
: DocumentClickHandler(document, context)
 | 
						|
, _handler(std::move(callback)) {
 | 
						|
	Expects(_handler != nullptr);
 | 
						|
}
 | 
						|
 | 
						|
void DocumentOpenClickHandler::onClickImpl() const {
 | 
						|
	_handler(context());
 | 
						|
}
 | 
						|
 | 
						|
void DocumentSaveClickHandler::Save(
 | 
						|
		Data::FileOrigin origin,
 | 
						|
		not_null<DocumentData*> data,
 | 
						|
		Mode mode) {
 | 
						|
	if (data->isNull()) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	auto savename = QString();
 | 
						|
	if (mode != Mode::ToCacheOrFile || !data->saveToCache()) {
 | 
						|
		if (mode != Mode::ToNewFile && data->saveFromData()) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
		const auto filepath = data->filepath(true);
 | 
						|
		const auto fileinfo = QFileInfo(
 | 
						|
			);
 | 
						|
		const auto filedir = filepath.isEmpty()
 | 
						|
			? QDir()
 | 
						|
			: fileinfo.dir();
 | 
						|
		const auto filename = filepath.isEmpty()
 | 
						|
			? QString()
 | 
						|
			: fileinfo.fileName();
 | 
						|
		savename = DocumentFileNameForSave(
 | 
						|
			data,
 | 
						|
			(mode == Mode::ToNewFile),
 | 
						|
			filename,
 | 
						|
			filedir);
 | 
						|
		if (savename.isEmpty()) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	data->save(origin, savename);
 | 
						|
}
 | 
						|
 | 
						|
void DocumentSaveClickHandler::SaveAndTrack(
 | 
						|
		FullMsgId itemId,
 | 
						|
		not_null<DocumentData*> document,
 | 
						|
		Mode mode) {
 | 
						|
	Save(itemId ? itemId : Data::FileOrigin(), document, mode);
 | 
						|
	if (document->loading() && !document->loadingFilePath().isEmpty()) {
 | 
						|
		if (const auto item = document->owner().message(itemId)) {
 | 
						|
			Core::App().downloadManager().addLoading({
 | 
						|
				.item = item,
 | 
						|
				.document = document,
 | 
						|
			});
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void DocumentSaveClickHandler::onClickImpl() const {
 | 
						|
	SaveAndTrack(context(), document());
 | 
						|
}
 | 
						|
 | 
						|
DocumentCancelClickHandler::DocumentCancelClickHandler(
 | 
						|
	not_null<DocumentData*> document,
 | 
						|
	Fn<void(FullMsgId)> &&callback,
 | 
						|
	FullMsgId context)
 | 
						|
: DocumentClickHandler(document, context)
 | 
						|
, _handler(std::move(callback)) {
 | 
						|
}
 | 
						|
 | 
						|
void DocumentCancelClickHandler::onClickImpl() const {
 | 
						|
	const auto data = document();
 | 
						|
	if (data->isNull()) {
 | 
						|
		return;
 | 
						|
	} else if (data->uploading() && _handler) {
 | 
						|
		_handler(context());
 | 
						|
	} else {
 | 
						|
		data->cancel();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void DocumentOpenWithClickHandler::Open(
 | 
						|
		Data::FileOrigin origin,
 | 
						|
		not_null<DocumentData*> data) {
 | 
						|
	if (data->isNull()) {
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	data->saveFromDataSilent();
 | 
						|
	const auto path = data->filepath(true);
 | 
						|
	if (!path.isEmpty()) {
 | 
						|
		File::OpenWith(path);
 | 
						|
	} else {
 | 
						|
		DocumentSaveClickHandler::Save(
 | 
						|
			origin,
 | 
						|
			data,
 | 
						|
			DocumentSaveClickHandler::Mode::ToFile);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void DocumentOpenWithClickHandler::onClickImpl() const {
 | 
						|
	Open(context(), document());
 | 
						|
}
 | 
						|
 | 
						|
PhotoClickHandler::PhotoClickHandler(
 | 
						|
	not_null<PhotoData*> photo,
 | 
						|
	FullMsgId context,
 | 
						|
	PeerData *peer)
 | 
						|
: FileClickHandler(context)
 | 
						|
, _photo(photo)
 | 
						|
, _peer(peer) {
 | 
						|
	setProperty(
 | 
						|
		kPhotoLinkMediaProperty,
 | 
						|
		reinterpret_cast<qulonglong>(_photo.get()));
 | 
						|
}
 | 
						|
 | 
						|
not_null<PhotoData*> PhotoClickHandler::photo() const {
 | 
						|
	return _photo;
 | 
						|
}
 | 
						|
 | 
						|
PeerData *PhotoClickHandler::peer() const {
 | 
						|
	return _peer;
 | 
						|
}
 | 
						|
 | 
						|
PhotoOpenClickHandler::PhotoOpenClickHandler(
 | 
						|
	not_null<PhotoData*> photo,
 | 
						|
	Fn<void(FullMsgId)> &&callback,
 | 
						|
	FullMsgId context)
 | 
						|
: PhotoClickHandler(photo, context)
 | 
						|
, _handler(std::move(callback)) {
 | 
						|
	Expects(_handler != nullptr);
 | 
						|
}
 | 
						|
 | 
						|
void PhotoOpenClickHandler::onClickImpl() const {
 | 
						|
	_handler(context());
 | 
						|
}
 | 
						|
 | 
						|
void PhotoSaveClickHandler::onClickImpl() const {
 | 
						|
	const auto data = photo();
 | 
						|
	if (data->isNull()) {
 | 
						|
		return;
 | 
						|
	} else {
 | 
						|
		data->clearFailed(Data::PhotoSize::Large);
 | 
						|
		data->load(context());
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
PhotoCancelClickHandler::PhotoCancelClickHandler(
 | 
						|
	not_null<PhotoData*> photo,
 | 
						|
	Fn<void(FullMsgId)> &&callback,
 | 
						|
	FullMsgId context)
 | 
						|
: PhotoClickHandler(photo, context)
 | 
						|
, _handler(std::move(callback)) {
 | 
						|
}
 | 
						|
 | 
						|
void PhotoCancelClickHandler::onClickImpl() const {
 | 
						|
	const auto data = photo();
 | 
						|
	if (data->isNull()) {
 | 
						|
		return;
 | 
						|
	} else if (data->uploading() && _handler) {
 | 
						|
		_handler(context());
 | 
						|
	} else {
 | 
						|
		data->cancel();
 | 
						|
	}
 | 
						|
}
 |