BTFormat.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:5k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // BTFormat.cpp: implementation of the CBTFormat class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testBT.h"
  6. #include "BTFormat.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. bool HasKey(VALMAP* pmap, string strKey)
  13. {
  14. VALMAP::iterator iter = pmap->find(strKey);
  15. return iter != pmap->end();
  16. }
  17. //////////////////////////////////////////////////////////////////////
  18. // Construction/Destruction
  19. //////////////////////////////////////////////////////////////////////
  20. CBTFormat::CBTFormat()
  21. {
  22. }
  23. CBTFormat::~CBTFormat()
  24. {
  25. }
  26. void CBTFormat::CheckMessage(CVal *pMsg)
  27. {
  28. if (pMsg->vt != VT_PMAP)
  29. throw string("message type error,should be VT_PMAP");
  30. /*
  31. VALMAP::iterator iter = (*pMsg->pmapVal).find("info1");
  32. if (iter == (*pMsg->pmapVal).end())
  33. {
  34. int i = 0;
  35. }
  36. else
  37. {
  38. int i = 0;
  39. }
  40. // CVal* pv = (*pMsg->pmapVal)["info1"];
  41. //*/
  42. CheckInfo((*pMsg->pmapVal)["info"]);
  43. }
  44. void CBTFormat::CheckInfo(CVal *pInfo)
  45. {
  46. if (!pInfo || pInfo->vt!=VT_PMAP)
  47. throw string("bad metainfo - not a dictionary");
  48. CVal* pPieces = (*pInfo->pmapVal)["pieces"];
  49. if (!pPieces || pPieces->vt != VT_PSTR || pPieces->lstrLen% 20 != 0)
  50. throw string("bad metainfo - bad pieces key");
  51. CVal* pPiecesLength = (*pInfo->pmapVal)["piece length"];
  52. if (!pPiecesLength || pPiecesLength->vt != VT_LONG || pPiecesLength->lVal <= 0)
  53. throw string("bad metainfo - illegal piece length");
  54. CVal* pName = (*pInfo->pmapVal)["name"];
  55. if (!pName || pName->vt != VT_PSTR || !pName->pstrVal)
  56. throw string("bad metainfo - bad name");
  57. if (HasKey(pInfo->pmapVal, "files") == HasKey(pInfo->pmapVal, "length"))
  58. throw string("bad metainfo - single/multiple file mix");
  59. if (HasKey(pInfo->pmapVal, "length"))
  60. {
  61. CVal* pLength = (*pInfo->pmapVal)["length"];
  62. if (!pLength || pLength->vt != VT_LONG || pLength->lVal<0)
  63. throw string("bad metainfo - bad length");
  64. }
  65. else
  66. {
  67. CVal* pFiles = (*pInfo->pmapVal)["files"];
  68. if (!pFiles || pFiles->vt != VT_PLIST)
  69. throw string("bad metainfo - bad file value");
  70. for (VALLIST::iterator iter=pFiles->plistVal->begin(); iter!= pFiles->plistVal->end(); iter++)
  71. {
  72. CVal* pf = *iter;
  73. if (!pf || pf->vt != VT_PMAP)
  74. throw string("bad metainfo - bad file value");
  75. CVal* pLength = (*pf->pmapVal)["length"];
  76. if (!pLength || pLength->vt != VT_LONG || pLength->lVal<0)
  77. throw string("bad metainfo - bad length");
  78. CVal* pPath = (*pf->pmapVal)["path"];
  79. if (!pPath || pPath ->vt != VT_PLIST)
  80. throw string("bad metainfo - bad path");
  81. for (VALLIST::iterator it=pPath->plistVal->begin(); it!= pPath->plistVal->end(); it++)
  82. {
  83. CVal* pP = *it;
  84. if (!pP || pP->vt != VT_PSTR)
  85. throw string("bad metainfo - bad path dir");
  86. char* temp = pP->pstrVal;
  87. }
  88. }
  89. }
  90. }
  91. void CBTFormat::check_peers(CVal *pInfo)
  92. {
  93. if (!pInfo || pInfo->vt != VT_PMAP)
  94. throw string("bad metainfo - not a dictionary");
  95. if (HasKey(pInfo->pmapVal, "failure reason"))
  96. {
  97. if ((*pInfo)["failure reason"]->vt != VT_PSTR)
  98. throw string("bad metainfo - failure reason not a string");
  99. return;
  100. }
  101. if (!HasKey(pInfo->pmapVal, "peers"))
  102. throw string("bad metainfo - have not peers");
  103. CVal* pPeers = (*pInfo)["peers"];
  104. if (pPeers->vt != VT_PLIST)
  105. throw string("bad metainfo - peers not a list");
  106. for (int i=0; i<pPeers->plistVal->size(); i++)
  107. {
  108. CVal* p = (*pPeers)[i];
  109. if (p->vt != VT_PMAP)
  110. throw string("bad metainfo - not a map");
  111. if (!HasKey(p->pmapVal, "ip"))
  112. throw string("bad metainfo - have no ip value");
  113. if ((*p)["ip"]->vt != VT_PSTR)
  114. throw string("bad metainfo - ip value not string");
  115. if (!HasKey(p->pmapVal, "port"))
  116. throw string("bad metainfo - have no port value");
  117. if ((*p)["port"]->vt != VT_LONG || (*p)["port"]->lVal < 0)
  118. throw string("bad metainfo - ip value not long");
  119. if (!HasKey(p->pmapVal, "peer id"))
  120. throw string("bad metainfo - have no peer id value");
  121. if ((*p)["peer id"]->vt != VT_PSTR || (*p)["peer id"]->lstrLen != 20)
  122. throw string("bad metainfo - peer id value not string");
  123. }
  124. if (HasKey(pInfo->pmapVal, "interval"))
  125. {
  126. if ((*pInfo)["interval"]->vt != VT_LONG || (*pInfo)["interval"]->lVal < 0)
  127. throw string("bad metainfo - interval value not long or < 0");
  128. }
  129. if (HasKey(pInfo->pmapVal, "min interval"))
  130. {
  131. if ((*pInfo)["min interval"]->vt != VT_LONG || (*pInfo)["min interval"]->lVal < 0)
  132. throw string("bad metainfo - min interval value not long or < 0");
  133. }
  134. if (HasKey(pInfo->pmapVal, "tracker id"))
  135. {
  136. if ((*pInfo)["tracker id"]->vt != VT_PSTR)
  137. throw string("bad metainfo - tracker id value not string");
  138. }
  139. if (HasKey(pInfo->pmapVal, "num peers"))
  140. {
  141. if ((*pInfo)["num peers"]->vt != VT_LONG || (*pInfo)["num peers"]->lVal < 0)
  142. throw string("bad metainfo - 'num peers value not long or < 0");
  143. }
  144. if (HasKey(pInfo->pmapVal, "done peers"))
  145. {
  146. if ((*pInfo)["done peers"]->vt != VT_LONG || (*pInfo)["done peers"]->lVal < 0)
  147. throw string("bad metainfo - done peers value not long or < 0");
  148. }
  149. if (HasKey(pInfo->pmapVal, "last"))
  150. {
  151. if ((*pInfo)["last"]->vt != VT_LONG || (*pInfo)["last"]->lVal < 0)
  152. throw string("bad metainfo - interval value not long or < 0");
  153. }
  154. }