BTFormat.cpp
资源名称:GGBT.rar [点击查看]
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:5k
源码类别:
P2P编程
开发平台:
Visual C++
- // BTFormat.cpp: implementation of the CBTFormat class.
- //
- //////////////////////////////////////////////////////////////////////
- #include "stdafx.h"
- #include "testBT.h"
- #include "BTFormat.h"
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- bool HasKey(VALMAP* pmap, string strKey)
- {
- VALMAP::iterator iter = pmap->find(strKey);
- return iter != pmap->end();
- }
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- CBTFormat::CBTFormat()
- {
- }
- CBTFormat::~CBTFormat()
- {
- }
- void CBTFormat::CheckMessage(CVal *pMsg)
- {
- if (pMsg->vt != VT_PMAP)
- throw string("message type error,should be VT_PMAP");
- /*
- VALMAP::iterator iter = (*pMsg->pmapVal).find("info1");
- if (iter == (*pMsg->pmapVal).end())
- {
- int i = 0;
- }
- else
- {
- int i = 0;
- }
- // CVal* pv = (*pMsg->pmapVal)["info1"];
- //*/
- CheckInfo((*pMsg->pmapVal)["info"]);
- }
- void CBTFormat::CheckInfo(CVal *pInfo)
- {
- if (!pInfo || pInfo->vt!=VT_PMAP)
- throw string("bad metainfo - not a dictionary");
- CVal* pPieces = (*pInfo->pmapVal)["pieces"];
- if (!pPieces || pPieces->vt != VT_PSTR || pPieces->lstrLen% 20 != 0)
- throw string("bad metainfo - bad pieces key");
- CVal* pPiecesLength = (*pInfo->pmapVal)["piece length"];
- if (!pPiecesLength || pPiecesLength->vt != VT_LONG || pPiecesLength->lVal <= 0)
- throw string("bad metainfo - illegal piece length");
- CVal* pName = (*pInfo->pmapVal)["name"];
- if (!pName || pName->vt != VT_PSTR || !pName->pstrVal)
- throw string("bad metainfo - bad name");
- if (HasKey(pInfo->pmapVal, "files") == HasKey(pInfo->pmapVal, "length"))
- throw string("bad metainfo - single/multiple file mix");
- if (HasKey(pInfo->pmapVal, "length"))
- {
- CVal* pLength = (*pInfo->pmapVal)["length"];
- if (!pLength || pLength->vt != VT_LONG || pLength->lVal<0)
- throw string("bad metainfo - bad length");
- }
- else
- {
- CVal* pFiles = (*pInfo->pmapVal)["files"];
- if (!pFiles || pFiles->vt != VT_PLIST)
- throw string("bad metainfo - bad file value");
- for (VALLIST::iterator iter=pFiles->plistVal->begin(); iter!= pFiles->plistVal->end(); iter++)
- {
- CVal* pf = *iter;
- if (!pf || pf->vt != VT_PMAP)
- throw string("bad metainfo - bad file value");
- CVal* pLength = (*pf->pmapVal)["length"];
- if (!pLength || pLength->vt != VT_LONG || pLength->lVal<0)
- throw string("bad metainfo - bad length");
- CVal* pPath = (*pf->pmapVal)["path"];
- if (!pPath || pPath ->vt != VT_PLIST)
- throw string("bad metainfo - bad path");
- for (VALLIST::iterator it=pPath->plistVal->begin(); it!= pPath->plistVal->end(); it++)
- {
- CVal* pP = *it;
- if (!pP || pP->vt != VT_PSTR)
- throw string("bad metainfo - bad path dir");
- char* temp = pP->pstrVal;
- }
- }
- }
- }
- void CBTFormat::check_peers(CVal *pInfo)
- {
- if (!pInfo || pInfo->vt != VT_PMAP)
- throw string("bad metainfo - not a dictionary");
- if (HasKey(pInfo->pmapVal, "failure reason"))
- {
- if ((*pInfo)["failure reason"]->vt != VT_PSTR)
- throw string("bad metainfo - failure reason not a string");
- return;
- }
- if (!HasKey(pInfo->pmapVal, "peers"))
- throw string("bad metainfo - have not peers");
- CVal* pPeers = (*pInfo)["peers"];
- if (pPeers->vt != VT_PLIST)
- throw string("bad metainfo - peers not a list");
- for (int i=0; i<pPeers->plistVal->size(); i++)
- {
- CVal* p = (*pPeers)[i];
- if (p->vt != VT_PMAP)
- throw string("bad metainfo - not a map");
- if (!HasKey(p->pmapVal, "ip"))
- throw string("bad metainfo - have no ip value");
- if ((*p)["ip"]->vt != VT_PSTR)
- throw string("bad metainfo - ip value not string");
- if (!HasKey(p->pmapVal, "port"))
- throw string("bad metainfo - have no port value");
- if ((*p)["port"]->vt != VT_LONG || (*p)["port"]->lVal < 0)
- throw string("bad metainfo - ip value not long");
- if (!HasKey(p->pmapVal, "peer id"))
- throw string("bad metainfo - have no peer id value");
- if ((*p)["peer id"]->vt != VT_PSTR || (*p)["peer id"]->lstrLen != 20)
- throw string("bad metainfo - peer id value not string");
- }
- if (HasKey(pInfo->pmapVal, "interval"))
- {
- if ((*pInfo)["interval"]->vt != VT_LONG || (*pInfo)["interval"]->lVal < 0)
- throw string("bad metainfo - interval value not long or < 0");
- }
- if (HasKey(pInfo->pmapVal, "min interval"))
- {
- if ((*pInfo)["min interval"]->vt != VT_LONG || (*pInfo)["min interval"]->lVal < 0)
- throw string("bad metainfo - min interval value not long or < 0");
- }
- if (HasKey(pInfo->pmapVal, "tracker id"))
- {
- if ((*pInfo)["tracker id"]->vt != VT_PSTR)
- throw string("bad metainfo - tracker id value not string");
- }
- if (HasKey(pInfo->pmapVal, "num peers"))
- {
- if ((*pInfo)["num peers"]->vt != VT_LONG || (*pInfo)["num peers"]->lVal < 0)
- throw string("bad metainfo - 'num peers value not long or < 0");
- }
- if (HasKey(pInfo->pmapVal, "done peers"))
- {
- if ((*pInfo)["done peers"]->vt != VT_LONG || (*pInfo)["done peers"]->lVal < 0)
- throw string("bad metainfo - done peers value not long or < 0");
- }
- if (HasKey(pInfo->pmapVal, "last"))
- {
- if ((*pInfo)["last"]->vt != VT_LONG || (*pInfo)["last"]->lVal < 0)
- throw string("bad metainfo - interval value not long or < 0");
- }
- }