This repository has been archived on 2020-05-25. You can view files and clone it, but cannot push or open issues or pull requests.
tdlib-fork/td/telegram/files/PartsManager.h
levlam ac3fa705a2 File streaming fixes.
GitOrigin-RevId: 86c6d1394a31d6bb108a12e14f4d981133ece235
2018-12-26 19:11:15 +03:00

96 lines
2.7 KiB
C++

//
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
//
// 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/files/FileBitmask.h"
#include "td/utils/common.h"
#include "td/utils/Status.h"
namespace td {
/*** PartsManager***/
struct Part {
int id;
int64 offset;
size_t size;
};
class PartsManager {
public:
Status init(int64 size, int64 expected_size, bool is_size_final, size_t part_size,
const std::vector<int> &ready_parts, bool use_part_count_limit) TD_WARN_UNUSED_RESULT;
bool ready();
bool unchecked_ready();
Status finish() TD_WARN_UNUSED_RESULT;
// returns empty part if nothing to return
Result<Part> start_part() TD_WARN_UNUSED_RESULT;
Status on_part_ok(int32 id, size_t part_size, size_t actual_size) TD_WARN_UNUSED_RESULT;
void on_part_failed(int32 id);
Status set_known_prefix(size_t size, bool is_ready);
void set_need_check();
void set_checked_prefix_size(int64 size);
void set_streaming_offset(int64 offset);
int64 get_checked_prefix_size() const;
int64 get_unchecked_ready_prefix_size();
int64 get_size() const;
int64 get_size_or_zero() const;
int64 get_expected_size() const;
int64 get_ready_size() const;
size_t get_part_size() const;
int32 get_part_count() const;
int32 get_unchecked_ready_prefix_count();
int32 get_ready_prefix_count();
string get_bitmask() const;
private:
static constexpr int MAX_PART_COUNT = 3000;
static constexpr int MAX_PART_SIZE = 512 * (1 << 10);
static constexpr int64 MAX_FILE_SIZE = MAX_PART_SIZE * MAX_PART_COUNT;
enum class PartStatus : int32 { Empty, Pending, Ready };
bool need_check_{false};
int64 checked_prefix_size_{0};
bool known_prefix_flag_{false};
int64 known_prefix_size_;
int64 size_;
int64 expected_size_;
int64 min_size_;
int64 max_size_;
bool unknown_size_flag_;
int64 ready_size_;
size_t part_size_;
int part_count_;
int pending_count_;
int first_empty_part_;
int first_not_ready_part_;
int64 streaming_offset_{0};
int first_streaming_empty_part_;
vector<PartStatus> part_status_;
Bitmask bitmask_;
bool use_part_count_limit_;
void init_common(const vector<int> &ready_parts);
Status init_known_prefix(int64 known_prefix, size_t part_size,
const std::vector<int> &ready_parts) TD_WARN_UNUSED_RESULT;
Status init_no_size(size_t part_size, const std::vector<int> &ready_parts) TD_WARN_UNUSED_RESULT;
Part get_part(int id);
Part get_empty_part();
void on_part_start(int32 id);
void update_first_empty_part();
void update_first_not_ready_part();
};
} // namespace td