Add td_api::remoteFile.unique_id.

GitOrigin-RevId: b6355e905d7268aefbb4dd2e951b15e12504ee54
This commit is contained in:
levlam 2019-10-25 17:04:01 +03:00
parent d5ba35e2f0
commit edd3bb94a4
7 changed files with 46 additions and 6 deletions

View File

@ -138,12 +138,14 @@ temporaryPasswordState has_password:Bool valid_for:int32 = TemporaryPasswordStat
localFile path:string can_be_downloaded:Bool can_be_deleted:Bool is_downloading_active:Bool is_downloading_completed:Bool download_offset:int32 downloaded_prefix_size:int32 downloaded_size:int32 = LocalFile;
//@description Represents a remote file
//@id Remote file identifier; may be empty. Can be used across application restarts or even from other devices for the current user. If the ID starts with "http://" or "https://", it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known.
//@id Remote file identifier; may be empty. Can be used across application restarts or even from other devices for the current user. Uniquely identifies a file, but a file can have a lot of different valid identifiers.
//-If the ID starts with "http://" or "https://", it represents the HTTP URL of the file. TDLib is currently unable to download files if only their URL is known.
//-If downloadFile is called on such a file or if it is sent to a secret chat, TDLib starts a file generation process by sending updateFileGenerationStart to the client with the HTTP URL in the original_path and "#url#" as the conversion string. Clients should generate the file by downloading it to the specified location
//@unique_id Unique file identifier; may be empty if unknown. The unique file identifier which is the same for the same file even for different users and is persistent over time
//@is_uploading_active True, if the file is currently being uploaded (or a remote copy is being generated by some other means)
//@is_uploading_completed True, if a remote copy is fully available
//@uploaded_size Size of the remote available part of the file; 0 if unknown
remoteFile id:string is_uploading_active:Bool is_uploading_completed:Bool uploaded_size:int32 = RemoteFile;
remoteFile id:string unique_id:string is_uploading_active:Bool is_uploading_completed:Bool uploaded_size:int32 = RemoteFile;
//@description Represents a file
//@id Unique file identifier

Binary file not shown.

View File

@ -837,8 +837,8 @@ td_api::object_ptr<td_api::localFile> copy(const td_api::localFile &obj) {
}
template <>
td_api::object_ptr<td_api::remoteFile> copy(const td_api::remoteFile &obj) {
return td_api::make_object<td_api::remoteFile>(obj.id_, obj.is_uploading_active_, obj.is_uploading_completed_,
obj.uploaded_size_);
return td_api::make_object<td_api::remoteFile>(obj.id_, obj.unique_id_, obj.is_uploading_active_,
obj.is_uploading_completed_, obj.uploaded_size_);
}
template <>

View File

@ -284,6 +284,16 @@ class FullRemoteFileLocation {
return AsKey{*this};
}
struct AsUnique {
const FullRemoteFileLocation &key;
template <class StorerT>
void store(StorerT &storer) const;
};
AsUnique as_unique() const {
return AsUnique{*this};
}
DcId get_dc_id() const {
CHECK(!is_web());
return dc_id_;

View File

@ -202,6 +202,17 @@ void FullRemoteFileLocation::AsKey::store(StorerT &storer) const {
});
}
template <class StorerT>
void FullRemoteFileLocation::AsUnique::store(StorerT &storer) const {
using td::store;
store(key.location_type(), storer);
key.variant_.visit([&](auto &&value) {
using td::store;
store(value.as_key(), storer);
});
}
template <class StorerT>
void RemoteFileLocation::store(StorerT &storer) const {
td::store(variant_, storer);

View File

@ -2665,6 +2665,14 @@ static bool is_background_type(FileType type) {
return type == FileType::Wallpaper || type == FileType::Background;
}
string FileManager::get_unique_id(const FullGenerateFileLocation &location) {
return base64url_encode(zero_encode('\xff' + serialize(location)));
}
string FileManager::get_unique_id(const FullRemoteFileLocation &location) {
return base64url_encode(zero_encode(serialize(location.as_unique())));
}
string FileManager::get_persistent_id(const FullGenerateFileLocation &location) {
auto binary = serialize(location);
@ -2672,6 +2680,7 @@ string FileManager::get_persistent_id(const FullGenerateFileLocation &location)
binary.push_back(PERSISTENT_ID_VERSION_MAP);
return base64url_encode(binary);
}
string FileManager::get_persistent_id(const FullRemoteFileLocation &location) {
auto location_copy = location;
location_copy.clear_file_reference();
@ -2805,12 +2814,17 @@ td_api::object_ptr<td_api::file> FileManager::get_file_object(FileId file_id, bo
}
string persistent_file_id;
string unique_file_id;
if (file_view.has_alive_remote_location()) {
persistent_file_id = get_persistent_id(file_view.remote_location());
if (!file_view.remote_location().is_web()) {
unique_file_id = get_unique_id(file_view.remote_location());
}
} else if (file_view.has_url()) {
persistent_file_id = file_view.url();
} else if (file_view.has_generate_location() && begins_with(file_view.generate_location().conversion_, "#map#")) {
persistent_file_id = get_persistent_id(file_view.generate_location());
unique_file_id = get_unique_id(file_view.generate_location());
}
bool is_uploading_completed = !persistent_file_id.empty();
@ -2841,8 +2855,8 @@ td_api::object_ptr<td_api::file> FileManager::get_file_object(FileId file_id, bo
td_api::make_object<td_api::localFile>(std::move(path), can_be_downloaded, can_be_deleted,
file_view.is_downloading(), file_view.has_local_location(),
download_offset, local_prefix_size, local_total_size),
td_api::make_object<td_api::remoteFile>(std::move(persistent_file_id), file_view.is_uploading(),
is_uploading_completed, remote_size));
td_api::make_object<td_api::remoteFile>(std::move(persistent_file_id), std::move(unique_file_id),
file_view.is_uploading(), is_uploading_completed, remote_size));
}
vector<int32> FileManager::get_file_ids_object(const vector<FileId> &file_ids, bool with_main_file_id) {

View File

@ -579,6 +579,9 @@ class FileManager : public FileLoadManager::Callback {
void flush_to_pmc(FileNodePtr node, bool new_remote, bool new_local, bool new_generate, const char *source);
void load_from_pmc(FileNodePtr node, bool new_remote, bool new_local, bool new_generate);
string get_unique_id(const FullGenerateFileLocation &location);
string get_unique_id(const FullRemoteFileLocation &location);
string get_persistent_id(const FullGenerateFileLocation &location);
string get_persistent_id(const FullRemoteFileLocation &location);