45e855f89d
I can't maintain anymore this amount of features while keeping the library constantly updated and without bugs. Every merge was taking me multiple hours of revisioning the code. I give up. From this commit onwards TDLight will only have small useful customizations that are easy to maintain. Now the people relying on the OptimizeMemory method can restart the session every N hours to free up the memory. The real way to keep a low memory usage must involve a huge refactoring to allow the unloading of the caches into the sqlite database, similar to what's already happening with messages data. Only Levlam has the ability to implement this without needing to merge the upstream everytime.
135 lines
4.6 KiB
C++
135 lines
4.6 KiB
C++
//
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
#pragma once
|
|
|
|
#include "td/telegram/secret_api.h"
|
|
#include "td/telegram/td_api.h"
|
|
#include "td/telegram/telegram_api.h"
|
|
|
|
#include "td/telegram/DialogId.h"
|
|
#include "td/telegram/Document.h"
|
|
#include "td/telegram/EncryptedFile.h"
|
|
#include "td/telegram/files/FileId.h"
|
|
#include "td/telegram/Photo.h"
|
|
#include "td/telegram/SecretInputMedia.h"
|
|
|
|
#include "td/utils/buffer.h"
|
|
#include "td/utils/common.h"
|
|
|
|
#include <unordered_map>
|
|
#include <utility>
|
|
|
|
namespace td {
|
|
|
|
class MultiPromiseActor;
|
|
class Td;
|
|
|
|
class DocumentsManager {
|
|
public:
|
|
explicit DocumentsManager(Td *td);
|
|
|
|
class RemoteDocument {
|
|
public:
|
|
tl_object_ptr<telegram_api::document> document;
|
|
// or
|
|
unique_ptr<EncryptedFile> secret_file;
|
|
tl_object_ptr<secret_api::decryptedMessageMediaDocument> secret_document;
|
|
// or
|
|
tl_object_ptr<telegram_api::WebDocument> web_document;
|
|
PhotoSize thumbnail;
|
|
|
|
vector<tl_object_ptr<telegram_api::DocumentAttribute>> attributes;
|
|
|
|
RemoteDocument(tl_object_ptr<telegram_api::document> &&server_document)
|
|
: document(std::move(server_document))
|
|
, secret_file(nullptr)
|
|
, secret_document(nullptr)
|
|
, web_document(nullptr)
|
|
, thumbnail()
|
|
, attributes(std::move(document->attributes_)) {
|
|
}
|
|
|
|
RemoteDocument(tl_object_ptr<telegram_api::WebDocument> &&web_document, PhotoSize thumbnail,
|
|
vector<tl_object_ptr<telegram_api::DocumentAttribute>> &&attributes)
|
|
: document(nullptr)
|
|
, secret_file(nullptr)
|
|
, secret_document(nullptr)
|
|
, web_document(std::move(web_document))
|
|
, thumbnail(std::move(thumbnail))
|
|
, attributes(std::move(attributes)) {
|
|
}
|
|
|
|
RemoteDocument(unique_ptr<EncryptedFile> &&secret_file,
|
|
tl_object_ptr<secret_api::decryptedMessageMediaDocument> &&secret_document,
|
|
vector<tl_object_ptr<telegram_api::DocumentAttribute>> &&attributes)
|
|
: document(nullptr)
|
|
, secret_file(std::move(secret_file))
|
|
, secret_document(std::move(secret_document))
|
|
, web_document(nullptr)
|
|
, thumbnail()
|
|
, attributes(std::move(attributes)) {
|
|
}
|
|
};
|
|
|
|
tl_object_ptr<td_api::document> get_document_object(FileId file_id, PhotoFormat thumbnail_format) const;
|
|
|
|
void memory_stats(vector<string> &output);
|
|
|
|
Document on_get_document(RemoteDocument remote_document, DialogId owner_dialog_id,
|
|
MultiPromiseActor *load_data_multipromise_ptr = nullptr,
|
|
Document::Type default_document_type = Document::Type::General, bool is_background = false,
|
|
bool is_pattern = false);
|
|
|
|
void create_document(FileId file_id, string minithumbnail, PhotoSize thumbnail, string file_name, string mime_type,
|
|
bool replace);
|
|
|
|
bool has_input_media(FileId file_id, FileId thumbnail_file_id, bool is_secret) const;
|
|
|
|
SecretInputMedia get_secret_input_media(FileId document_file_id,
|
|
tl_object_ptr<telegram_api::InputEncryptedFile> input_file,
|
|
const string &caption, BufferSlice thumbnail) const;
|
|
|
|
tl_object_ptr<telegram_api::InputMedia> get_input_media(FileId file_id,
|
|
tl_object_ptr<telegram_api::InputFile> input_file,
|
|
tl_object_ptr<telegram_api::InputFile> input_thumbnail) const;
|
|
|
|
FileId get_document_thumbnail_file_id(FileId file_id) const;
|
|
|
|
void delete_document_thumbnail(FileId file_id);
|
|
|
|
FileId dup_document(FileId new_id, FileId old_id);
|
|
|
|
void merge_documents(FileId new_id, FileId old_id, bool can_delete_old);
|
|
|
|
template <class StorerT>
|
|
void store_document(FileId file_id, StorerT &storer) const;
|
|
|
|
template <class ParserT>
|
|
FileId parse_document(ParserT &parser);
|
|
|
|
string get_document_search_text(FileId file_id) const;
|
|
|
|
private:
|
|
class GeneralDocument {
|
|
public:
|
|
string file_name;
|
|
string mime_type;
|
|
string minithumbnail;
|
|
PhotoSize thumbnail;
|
|
FileId file_id;
|
|
};
|
|
|
|
const GeneralDocument *get_document(FileId file_id) const;
|
|
|
|
FileId on_get_document(unique_ptr<GeneralDocument> new_document, bool replace);
|
|
|
|
Td *td_;
|
|
std::unordered_map<FileId, unique_ptr<GeneralDocument>, FileIdHash> documents_; // file_id -> GeneralDocument
|
|
};
|
|
|
|
} // namespace td
|