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

📄 btrequest.cpp

📁 linux下最常用的bt下载软件的最新源代码
💻 CPP
字号:
#include <sys/types.h>#include <stdlib.h>#include "btrequest.h"#include "btcontent.h"#include "btconfig.h"static void _empty_slice_list(PSLICE *ps_head){  PSLICE p;  for(; *ps_head;){    p = (*ps_head)->next;    delete (*ps_head);    *ps_head = p;  }}RequestQueue::~RequestQueue(){  if( rq_head ) _empty_slice_list(&rq_head);}RequestQueue::RequestQueue(){  rq_head = (PSLICE) 0;}void RequestQueue::Empty(){  if(rq_head) _empty_slice_list(&rq_head);}void RequestQueue::SetHead(PSLICE ps){  if( rq_head ) _empty_slice_list(&rq_head);  rq_head = ps;}void RequestQueue::operator=(RequestQueue &rq){  if( rq_head ) _empty_slice_list(&rq_head);  rq_head = rq.rq_head;  rq.rq_head = (PSLICE) 0;}int RequestQueue::Add(size_t idx,size_t off,size_t len){  size_t cnt = 0;  PSLICE n = rq_head;  PSLICE u = (PSLICE) 0;  for( ; n ; u = n,n = u->next) cnt++; // move to end  if( cnt >= cfg_req_queue_length ) return -1;	// already full  n = new SLICE;#ifndef WINDOWS  if( !n ) return -1;#endif  n->next = (PSLICE) 0;  n->index = idx;  n->offset = off;  n->length = len;  if( u ) u->next = n; else rq_head = n;  return 0;}int RequestQueue::Remove(size_t idx,size_t off,size_t len){  PSLICE n = rq_head;  PSLICE u = (PSLICE) 0;  for( ; n ; u = n, n = u->next){    if(n->index == idx && n->offset == off && n->length == len ) break;  }  if( !n ) return -1;	/* not found */  if( u ) u->next = n->next; else rq_head = n->next;  delete n;  return 0;}int RequestQueue::Pop(size_t *pidx,size_t *poff,size_t *plen){  PSLICE n;  if( !rq_head ) return -1;  n = rq_head->next;  if(pidx) *pidx = rq_head->index;  if(poff) *poff = rq_head->offset;  if(plen) *plen = rq_head->length;  delete rq_head;  rq_head = n;  return 0;}int RequestQueue::Peek(size_t *pidx,size_t *poff,size_t *plen) const{  if( !rq_head ) return -1;  if(pidx) *pidx = rq_head->index;  if(poff) *poff = rq_head->offset;  if(plen) *plen = rq_head->length;  return 0;}int RequestQueue::CreateWithIdx(size_t idx){  size_t i,off,len,ns;    if( rq_head ) _empty_slice_list(&rq_head);  ns = NSlices(idx);  for( i = off = 0; i < ns; i++){    len = Slice_Length(idx,i);    if( Add(idx,off,len) < 0) return -1;    off += len;  }  return 0;}size_t RequestQueue::Slice_Length(size_t idx,size_t sidx) const{  size_t plen = BTCONTENT.GetPieceLength(idx);  return (sidx == ( plen / cfg_req_slice_size)) ?    (plen % cfg_req_slice_size) :     cfg_req_slice_size;}size_t RequestQueue::NSlices(size_t idx) const{  size_t r,n;  r = BTCONTENT.GetPieceLength(idx);  n = r / cfg_req_slice_size;  return ( r % cfg_req_slice_size ) ? n + 1 : n;}int RequestQueue::IsValidRequest(size_t idx,size_t off,size_t len){  return ( idx < BTCONTENT.GetNPieces() &&	   len &&	   (off + len) <= BTCONTENT.GetPieceLength(idx) &&	   len <= cfg_max_slice_size) ?    1 : 0;}// ****************************** PendingQueue ******************************PendingQueue PENDINGQUEUE;PendingQueue::PendingQueue(){  int i = 0;  for(; i < PENDING_QUEUE_SIZE; i++) pending_array[i] = (PSLICE) 0;  pq_count = 0;}PendingQueue::~PendingQueue(){  if(pq_count) Empty();}void PendingQueue::Empty(){  int i = 0;  for ( ; i < PENDING_QUEUE_SIZE && pq_count; i++)    if( pending_array[i] != (PSLICE) 0 ){       _empty_slice_list(&(pending_array[i]));       pq_count--;     }}int PendingQueue::Exist(size_t idx){   int i = 0;  for ( ; i < PENDING_QUEUE_SIZE && pq_count; i++)    if( (PSLICE) 0 != pending_array[i] && idx == pending_array[i]->index) return 1;  return 0;}int PendingQueue::Pending(RequestQueue *prq){   int i = 0;  if( pq_count >= PENDING_QUEUE_SIZE ){    prq->Empty();    return -1;  }  for( ; i < PENDING_QUEUE_SIZE; i++)    if(pending_array[i] == (PSLICE) 0){      pending_array[i] = prq->GetHead();      prq->Release();      pq_count++;      break;    }  return 0;}int PendingQueue::ReAssign(RequestQueue *prq, BitField &bf){   int i = 0;  size_t sc = pq_count;  for( ; i < PENDING_QUEUE_SIZE && sc; i++){    if( pending_array[i] != (PSLICE) 0){      sc--;      if( bf.IsSet(pending_array[i]->index) ){	prq->SetHead(pending_array[i]);	pending_array[i] = (PSLICE) 0;	pq_count--;	break;      }    }  }  return 0;}

⌨️ 快捷键说明

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