⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btfiles.h

📁 ctorrent源码
💻 H
字号:
#ifndef BTFILES_H
#define BTFILES_H

#include "./def.h"
#include <sys/types.h>
#include <stdio.h>

#include "bitfield.h"

typedef struct _btfile          //结构BTFILE存储文件的路径,长度,分块等信息。如果要下载的是多个文件,
{                               //那么BTFILE便是一个文件链表,此时包含多个文件的整个链表便被当成一个大的文件看待。
  char *bf_filename;	// full path of file.文件的绝对路径
  u_int64_t bf_length;       //文件长度。单位:B
  FILE *bf_fp;                   //文件的FILE指针

  time_t bf_last_timestamp;	// last io timestamp.最后一次进行io操作的时间戳

  u_int64_t bf_completed;		// already downloaded length,已经下载的数据长度。单位:B

  size_t bf_npieces;  //number of pieces,文件的piece数目

  unsigned char bf_flag_opened:1;     //文件打开标志位。若此文件已被_btf_open()打开,则置为1
  unsigned char bf_flag_need:1;       //程序中只给出了定义,没有使用
  unsigned char bf_reserved:6;        //保留项,没有使用

  struct _btfile *bf_next;        //链表中下一个文件的指针。单文件情况下为空
}BTFILE;


class btFiles           //类btFiles包含了需要下载的数据文件的信息。这些文件可能是一个,也可能是多个。
{
 private:
  
  BTFILE *m_btfhead;
  char *m_directory;            //在多文件情形下,制作种子文件时,为包含要制作种子的文件的目录;
                                //下载数据文件时,为种子文件中包含所有文件的那个目录。若只有一个文件,则为空。
  u_int64_t m_total_files_length;      //所有文件长度。单位:B
  size_t m_total_opened;	           // already opened,已打开的所有文件数目

  u_int8_t m_flag_automanage:1;    //m_flag_automanage是自动管理文件打开数目的标志。虽然初始值为1,但在构造函数中又将此项赋为0。
  u_int8_t m_flag_reserved:7;	 // current version not implement,保留项,程序中没有使用

  BTFILE* _new_bfnode();
  int _btf_open(BTFILE *sbf_p);
  int _btf_ftruncate(int fd,int64_t length);
  int _btf_creat_by_path(const char *pathname, int64_t file_length);
  int _btf_destroy();
  int _btf_recurses_directory(const char *cur_path, BTFILE *lastnode);

 public:
  int CreateFiles();

  btFiles();
  ~btFiles();
  
  int BuildFromFS(const char *pathname);
  int BuildFromMI(const char *metabuf, const size_t metabuf_len, const char *saveas);

  u_int64_t GetTotalLength() const { return m_total_files_length; }
  ssize_t IO(char *buf, u_int64_t off, size_t len, const int iotype);
  size_t FillMetaInfo(FILE* fp);

  void SetFilter(int nfile, BitField *pFilter,size_t pieceLength);
  size_t getFilePieces(size_t nfile);

#ifndef WINDOWS
  void PrintOut();
#endif
  BTFILE *GetNextFile(BTFILE *file);
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -