BaseResource.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #pragma once
  20. namespace NPLayer1 {
  21. class Communicator;
  22. class BufferMgr;
  23. class BaseResource {
  24. public:
  25. BaseResource(Communicator*);
  26. virtual ~BaseResource(void);
  27. void DeleteResFile() {
  28. Uninit(false);
  29. };
  30. // 在虚拟缓冲区寻找空块或者可以替换的块,返回其在虚拟缓冲区的位置
  31. UINT GetReplacableBlock(const UINT newBlockID, UINT& replacedBlockID);
  32. // 针对某个NP的区间列表,获取可以下载的区间列表
  33. void GetDownloadableArray(const IntervalArray& anotherNP, IntervalArray& result);
  34. P2P_RETURN_TYPE GetBlock(UINT blockID, UINT& blockSize, LPVOID data);
  35. P2P_RETURN_TYPE PutBlock(UINT blockID, UINT blockSize, PBYTE data);
  36. void DelBlock(UINT blockID);
  37. bool FindBlock(UINT blockID) { return allIntervals.FindBlock(blockID);};
  38. UINT GetMinBlockID() { return allIntervals.GetMinBlockID();};
  39. UINT GetMaxBlockID() { return allIntervals.GetMaxBlockID();};
  40. // 复制全部区间列表
  41. void GetAllIntervals(BlockInterval* targetArray, UINT8& size) ;
  42. // 发送给TS/NP的区间列表
  43. void GetDiffIntervals(BlockInterval* targetArray, UINT8& size, bool forTS, bool getInc);
  44. // 清空发送给TS/NP的增量区间列表
  45. void ClearDiffIntervals(bool forTS);
  46. string GetHashCode() { return hashcode;}; // 取得资源的Hash Code
  47. string GetResName() { return resname;};
  48. UINT8 GetSPListSize() { return spIPListSize;};
  49. NormalAddress* GetSPList() { return spIPList;};
  50. virtual UINT GetPlayingBlock(bool max=true) = 0;
  51. virtual int GetBufferPercent() = 0;
  52. virtual bool EnlargeBuffer() = 0;
  53. virtual void PrintStatus() = 0;
  54. virtual BOOL SetPlayingBlock(UINT blockID) = 0;
  55. virtual void SetDefaultCP() = 0;
  56. protected:
  57. virtual void Uninit(bool force) = 0;
  58. void UninitEx();
  59. P2P_RETURN_TYPE ParseSPList(string strSPList);
  60. UINT FindBlockIndex(UINT blockID);
  61. protected:
  62. string resname; // 资源名
  63. string hashcode; // 请求资源的MD5码
  64. NormalAddress* spIPList; // SuperPeer列表的IP地址
  65. UINT8 spIPListSize; // SuperPeer列表的大小
  66. UINT* blockIDArray; // 虚拟缓冲区中对应的BlockID
  67. UINT* blockMapArray; // 虚拟缓冲区与真正缓冲区(BufferMgr)的对应表
  68. UINT blockMapSize; // 虚拟缓冲区中块的个数
  69. IntervalArray allIntervals; // 所有已下载块的区间列表
  70. IntervalArray csIncIntervals; // 发送给TS的增量区间列表(增加的)
  71. IntervalArray csDecIntervals; // 发送给TS的增量区间列表(减少的)
  72. IntervalArray p2pIncIntervals; // 发送给NP的增量区间列表(增加的)
  73. IntervalArray p2pDecIntervals; // 发送给NP的增量区间列表(减少的)
  74. UINT blocks4Play; // 有一定的块,开始或者继续播放
  75. BOOL bInited; // 是否已经初始化
  76. CriticalSection dataLocker; // 数据访问的互斥变量
  77. BufferMgr* bufferMgr;
  78. Communicator* comm;
  79. protected:
  80. enum {
  81. // 默认使用最大 DEFAULT_SPACE Bytes 的磁盘空间
  82. DEFAULT_SPACE = 1048576*20, 
  83. // 每次开始播放前,需要缓冲TIME_FOR_PLAY秒的数据
  84. TIME_FOR_PLAY = 45, 
  85. // 选择开始播放的位置,在SPUpdate.maxBlockID之前TIME_BEGIN_PLAY秒的块
  86. TIME_BEGIN_PLAY = 45,
  87. };
  88. };
  89. }