CcosPacket.cpp 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022
  1. #include "CcosPacket.h"
  2. #include "Crc64.h"
  3. #include <cstring>
  4. #include <vector>
  5. #include <stdexcept>
  6. // 辅助函数:复制内存
  7. template<class Type> void CopyStream(Type* pTarget, const char* pStr, size_t Size) {
  8. char* pcTarget = (char*)pTarget;
  9. memcpy(pcTarget, pStr, Size);
  10. }
  11. // 获取键的灵活性和大小信息
  12. bool GetKeyFlexble(unsigned char* pBuff, bool& Flexible, size_t& LengthSize, size_t& ContextSize) {
  13. CCOSKEYST stKey;
  14. memcpy(&stKey, pBuff, sizeof(CCOSKEYST));
  15. if (stKey.Flexble) {
  16. Flexible = true;
  17. LengthSize = 1;
  18. for (unsigned char i = 0; i < stKey.ValSize; i++) {
  19. LengthSize <<= 1;
  20. }
  21. }
  22. else {
  23. Flexible = false;
  24. ContextSize = 1;
  25. for (unsigned char i = 0; i < stKey.ValSize; i++) {
  26. ContextSize <<= 1;
  27. }
  28. }
  29. return true;
  30. }
  31. // 设置键的灵活值
  32. bool SetKeyFlexbleValue(unsigned char* pBuff, size_t LengthSize, size_t ContextSize) {
  33. switch (LengthSize) {
  34. case 8:
  35. *reinterpret_cast<uint64_t*>(pBuff) = ContextSize;
  36. break;
  37. case 4:
  38. *reinterpret_cast<uint32_t*>(pBuff) = ContextSize;
  39. break;
  40. case 2:
  41. *reinterpret_cast<uint16_t*>(pBuff) = ContextSize;
  42. break;
  43. case 1:
  44. *pBuff = ContextSize;
  45. break;
  46. default:
  47. return false;
  48. }
  49. return true;
  50. }
  51. // 获取对象上下文
  52. bool GetObjectContext(char* pData, size_t Size, CCOSKEYTYPE& key, bool& Flexible, char*& pContext, size_t& ContextSize) {
  53. if (Size <= sizeof(CCOSKEYST) || pData == nullptr) {
  54. return false;
  55. }
  56. CCOSKEYST Key;
  57. memcpy(&Key, pData, sizeof(CCOSKEYST));
  58. key = *reinterpret_cast<CCOSKEYTYPE*>(pData);
  59. if (Key.Flexble) {
  60. // 灵活长度处理
  61. size_t ObjSize = 1 << Key.ValSize;
  62. if (sizeof(CCOSKEYST) + ObjSize > Size)
  63. {
  64. return false;
  65. }
  66. switch (ObjSize) {
  67. case 8:
  68. ContextSize = *reinterpret_cast<uint64_t*>(pData + sizeof(CCOSKEYST));
  69. break;
  70. case 4:
  71. ContextSize = *reinterpret_cast<uint32_t*>(pData + sizeof(CCOSKEYST));
  72. break;
  73. case 2:
  74. ContextSize = *reinterpret_cast<uint16_t*>(pData + sizeof(CCOSKEYST));
  75. break;
  76. case 1:
  77. ContextSize = *reinterpret_cast<uint8_t*>(pData + sizeof(CCOSKEYST));
  78. break;
  79. default:
  80. return false;
  81. }
  82. if (sizeof(CCOSKEYST) + ObjSize + ContextSize > Size) {
  83. return false;
  84. }
  85. pContext = pData + sizeof(CCOSKEYST) + ObjSize;
  86. Flexible = true;
  87. }
  88. else {
  89. // 固定长度处理
  90. ContextSize = 1 << Key.ValSize;
  91. if (sizeof(CCOSKEYTYPE) + ContextSize > Size) {
  92. return false;
  93. }
  94. pContext = pData + sizeof(CCOSKEYST);
  95. Flexible = false;
  96. }
  97. return true;
  98. }
  99. // 检查数据的第一层级结构
  100. bool CheckFirstLevelOfTheData(char* pData, size_t Size) {
  101. CCOSKEYTYPE ObjectKey;
  102. bool Flexible;
  103. char* pObject;
  104. size_t ObjectSize;
  105. while (Size > 0) {
  106. if (!GetObjectContext(pData, Size, ObjectKey, Flexible, pObject, ObjectSize)) {
  107. return false;
  108. }
  109. size_t jumpsize = (pObject - pData) + ObjectSize;
  110. if (Size < jumpsize) {
  111. return false;
  112. }
  113. pData += jumpsize;
  114. Size -= jumpsize;
  115. }
  116. return true;
  117. }
  118. // RawPacketObjectExption 实现
  119. RawPacketObjectExption::RawPacketObjectExption(const char* pExp) : std::runtime_error(pExp) {}
  120. RawPacketObjectExption::RawPacketObjectExption(const RawPacketObjectExption& tValue) : std::runtime_error(tValue) {}
  121. RawPacketObjectExption& RawPacketObjectExption::operator=(const RawPacketObjectExption& tValue) {
  122. if (this != &tValue) {
  123. std::runtime_error::operator=(tValue);
  124. }
  125. return *this;
  126. }
  127. // RawPacketObject 实现
  128. void RawPacketObject::AddPacketSize(size_t addsize) {
  129. m_PacketSize += addsize;
  130. if (m_pParent) {
  131. m_pParent->AddPacketSize(addsize);
  132. }
  133. }
  134. BOOL RawPacketObject::HasKey() { return m_HasKey; }
  135. size_t RawPacketObject::sizeOfRaw() { return m_PacketSize; }
  136. size_t RawPacketObject::sizeOfObject() { return m_vec ? m_vec->size() : 0; }
  137. size_t RawPacketObject::sizeOfBuff() { return m_BuffSize; }
  138. void RawPacketObject::Clear() {
  139. if (m_vec) {
  140. for (auto obj : *m_vec) {
  141. delete obj;
  142. }
  143. m_vec->clear();
  144. }
  145. m_pPacketBuff = nullptr;
  146. m_BuffSize = 0;
  147. m_PacketSize = 0;
  148. }
  149. void RawPacketObject::delet() {
  150. if (m_InternalMalloc && m_pInternalBuff) {
  151. delete m_pInternalBuff;
  152. m_pInternalBuff = nullptr;
  153. }
  154. Clear();
  155. if (m_vec) {
  156. delete m_vec;
  157. m_vec = nullptr;
  158. }
  159. }
  160. RawPacketObject::RawPacketObject(RawPacketObject* pParent) :
  161. m_HasKey(false), m_InternalMalloc(true), m_pParent(pParent),
  162. m_pValue(nullptr), m_pPacketBuff(nullptr), m_PacketSize(0), m_BuffSize(1024) {
  163. m_pInternalBuff = new std::vector<unsigned char>(m_BuffSize);
  164. m_pPacketBuff = m_pInternalBuff->data();
  165. m_vec = new std::vector<RawPacketObject*>();
  166. }
  167. RawPacketObject::RawPacketObject(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize) :
  168. m_HasKey(false), m_InternalMalloc(false), m_pParent(pParent),
  169. m_pInternalBuff(nullptr), m_pPacketBuff(p), m_PacketSize(packetsize), m_BuffSize(buffsize) {
  170. m_vec = new std::vector<RawPacketObject*>();
  171. ReloadObject();
  172. }
  173. RawPacketObject::~RawPacketObject() {
  174. delet();
  175. }
  176. bool RawPacketObject::ReloadObject() {
  177. if (!m_pPacketBuff || m_PacketSize == 0) {
  178. m_pValue = nullptr;
  179. m_HasKey = false;
  180. return false;
  181. }
  182. CCOSKEYTYPE key;
  183. bool Flexible;
  184. char* pObject;
  185. size_t ObjectSize;
  186. if (!GetObjectContext(reinterpret_cast<char*>(m_pPacketBuff), m_PacketSize, key, Flexible, pObject, ObjectSize)) {
  187. m_pValue = nullptr;
  188. m_HasKey = false;
  189. return false;
  190. }
  191. m_pValue = reinterpret_cast<unsigned char*>(pObject);
  192. m_HasKey = true;
  193. size_t jumpsize = (pObject - reinterpret_cast<char*>(m_pPacketBuff)) + ObjectSize;
  194. bool MultipleObjectExist = (m_PacketSize > jumpsize);
  195. if (MultipleObjectExist) {
  196. m_HasKey = false;
  197. unsigned char* pTemp = m_pPacketBuff;
  198. size_t tempSize = m_PacketSize;
  199. while (tempSize > 0) {
  200. GetObjectContext(reinterpret_cast<char*>(pTemp), tempSize, key, Flexible, pObject, ObjectSize);
  201. jumpsize = (reinterpret_cast<unsigned char*>(pObject) - pTemp) + ObjectSize;
  202. RawPacketObject* sub = new RawPacketObject(this, pTemp, jumpsize, jumpsize);
  203. m_vec->push_back(sub);
  204. pTemp += jumpsize;
  205. tempSize -= jumpsize;
  206. }
  207. }
  208. else {
  209. CCOSKEYST stKey;
  210. memcpy(&stKey, m_pPacketBuff, sizeof(CCOSKEYST));
  211. if (stKey.ObjFlag) {
  212. unsigned char* pTemp = reinterpret_cast<unsigned char*>(pObject);
  213. size_t tempSize = ObjectSize;
  214. while (tempSize > 0) {
  215. GetObjectContext(reinterpret_cast<char*>(pTemp), tempSize, key, Flexible, pObject, ObjectSize);
  216. jumpsize = (reinterpret_cast<unsigned char*>(pObject) - pTemp) + ObjectSize;
  217. RawPacketObject* sub = new RawPacketObject(this, pTemp, jumpsize, jumpsize);
  218. m_vec->push_back(sub);
  219. pTemp += jumpsize;
  220. tempSize -= jumpsize;
  221. }
  222. }
  223. }
  224. return true;
  225. }
  226. void RawPacketObject::Reload(RawPacketObject* pParent, unsigned char* p, size_t packetsize, size_t buffsize) {
  227. delet();
  228. m_pParent = pParent;
  229. m_pPacketBuff = p;
  230. m_PacketSize = packetsize;
  231. m_BuffSize = buffsize;
  232. ReloadObject();
  233. }
  234. void RawPacketObject::SetKey(CCOSKEYTYPE key) {
  235. if (m_PacketSize + sizeof(key) > m_BuffSize) {
  236. if (m_InternalMalloc) {
  237. ReloadInternalMalloc(sizeof(key));
  238. }
  239. else {
  240. throw RawPacketObjectExption("Key size overflow");
  241. }
  242. }
  243. memcpy(m_pPacketBuff, &key, sizeof(key));
  244. m_HasKey = true;
  245. bool Flexible;
  246. size_t LengthSize = 0, ContextSize = 0;
  247. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  248. size_t offset = sizeof(key);
  249. if (Flexible) {
  250. if (m_PacketSize + offset + LengthSize > m_BuffSize) {
  251. if (m_InternalMalloc) {
  252. ReloadInternalMalloc(LengthSize);
  253. }
  254. else {
  255. throw RawPacketObjectExption("Length size overflow");
  256. }
  257. }
  258. memset(m_pPacketBuff + offset, 0, LengthSize);
  259. m_pValue = m_pPacketBuff + offset + LengthSize;
  260. }
  261. else {
  262. if (m_PacketSize + offset + ContextSize > m_BuffSize) {
  263. if (m_InternalMalloc) {
  264. ReloadInternalMalloc(ContextSize);
  265. }
  266. else {
  267. throw RawPacketObjectExption("Value size overflow");
  268. }
  269. }
  270. memset(m_pPacketBuff + offset, 0, ContextSize);
  271. m_pValue = m_pPacketBuff + offset;
  272. }
  273. AddPacketSize(m_pValue - m_pPacketBuff);
  274. }
  275. bool RawPacketObject::add(CCOSKEYTYPE Key, bool tValue)
  276. {
  277. return add_Template(Key, tValue);
  278. }
  279. bool RawPacketObject::add(CCOSKEYTYPE Key, char tValue)
  280. {
  281. return add_Template(Key, tValue);
  282. }
  283. bool RawPacketObject::add(CCOSKEYTYPE Key, unsigned char tValue)
  284. {
  285. return add_Template(Key, tValue);
  286. }
  287. bool RawPacketObject::add(CCOSKEYTYPE Key, short tValue)
  288. {
  289. return add_Template(Key, tValue);
  290. }
  291. bool RawPacketObject::add(CCOSKEYTYPE Key, unsigned short tValue)
  292. {
  293. return add_Template(Key, tValue);
  294. }
  295. bool RawPacketObject::add(CCOSKEYTYPE Key, int tValue)
  296. {
  297. return add_Template(Key, tValue);
  298. }
  299. bool RawPacketObject::add(CCOSKEYTYPE Key, unsigned int tValue)
  300. {
  301. return add_Template(Key, tValue);
  302. }
  303. bool RawPacketObject::add(CCOSKEYTYPE Key, long tValue)
  304. {
  305. return add_Template(Key, tValue);
  306. }
  307. bool RawPacketObject::add(CCOSKEYTYPE Key, unsigned long tValue)
  308. {
  309. return add_Template(Key, tValue);
  310. }
  311. bool RawPacketObject::add(CCOSKEYTYPE Key, long long tValue)
  312. {
  313. return add_Template(Key, tValue);
  314. }
  315. bool RawPacketObject::add(CCOSKEYTYPE Key, unsigned long long tValue)
  316. {
  317. return add_Template(Key, tValue);
  318. }
  319. bool RawPacketObject::add(CCOSKEYTYPE Key, float tValue)
  320. {
  321. return add_Template(Key, tValue);
  322. }
  323. bool RawPacketObject::add(CCOSKEYTYPE Key, double tValue)
  324. {
  325. return add_Template(Key, tValue);
  326. }
  327. void RawPacketObject::ReloadInternalMalloc(size_t sizeofadd) {
  328. m_BuffSize += sizeofadd;
  329. if (m_pInternalBuff) {
  330. m_pInternalBuff->resize(m_BuffSize);
  331. m_pPacketBuff = m_pInternalBuff->data();
  332. }
  333. }
  334. template <class T>
  335. bool RawPacketObject::add_Template(CCOSKEYTYPE Key, T tValue) {
  336. unsigned char* pTempBuff;
  337. size_t addSize = 0;
  338. bool Flexible;
  339. size_t LengthSize = 0;
  340. size_t ContextSize = 0;
  341. if (m_PacketSize + sizeof(Key) + sizeof(tValue) > sizeOfBuff())
  342. {
  343. if (m_InternalMalloc)
  344. {
  345. ReloadInternalMalloc(sizeof(Key) + sizeof(tValue));
  346. }
  347. else
  348. {
  349. throw RawPacketObjectExption("add size overflow ");
  350. return false;
  351. }
  352. }
  353. if (m_HasKey)
  354. {
  355. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  356. if (!Flexible)
  357. {
  358. throw RawPacketObjectExption("fixed length can not use add function!");
  359. return false;
  360. }
  361. }
  362. pTempBuff = &(m_pPacketBuff[m_PacketSize]);
  363. memcpy(pTempBuff, &Key, sizeof(Key));
  364. GetKeyFlexble(pTempBuff, Flexible, LengthSize, ContextSize);
  365. if (Flexible)
  366. {
  367. throw RawPacketObjectExption("Wring key to satatic values ");
  368. return false;
  369. }
  370. else
  371. {
  372. addSize = sizeof(Key) + ContextSize;
  373. pTempBuff += sizeof(Key);
  374. memcpy(pTempBuff, &tValue, ContextSize);
  375. }
  376. if (!SetKeyLengthValue(addSize))
  377. {
  378. throw RawPacketObjectExption("update Length zore value error!");
  379. return false;
  380. }
  381. RawPacketObject* subRPO = new RawPacketObject(this, (unsigned char*)&(m_pPacketBuff[m_PacketSize]), addSize, addSize);
  382. (*m_vec).push_back(subRPO);
  383. AddPacketSize(addSize);
  384. return true;
  385. }
  386. template<class T1>
  387. bool RawPacketObject::SignedAssignmentProcess(T1 temp)
  388. {
  389. bool Flexible;
  390. size_t LengthSize = 0;
  391. size_t ContextSize = 0;
  392. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  393. if (Flexible)
  394. {
  395. throw RawPacketObjectExption("Flexible length can not use = function!");
  396. return false;
  397. }
  398. else
  399. {
  400. switch (ContextSize)
  401. {
  402. case 8:
  403. {
  404. //64bit
  405. long long Local = (long long)temp;
  406. unsigned long long LocalLen = (unsigned long long)Local;
  407. memcpy(m_pValue, &LocalLen, sizeof(unsigned long long));
  408. break;
  409. }
  410. case 4:
  411. {
  412. //32bit
  413. int Local = (int)temp;
  414. unsigned int LocalLen = (unsigned int)Local;
  415. memcpy(m_pValue, &LocalLen, sizeof(unsigned int));
  416. break;
  417. }
  418. case 2:
  419. {
  420. //16bit
  421. short Local = (short)temp;
  422. unsigned short LocalLen = (unsigned short)Local;
  423. memcpy(m_pValue, &LocalLen, sizeof(unsigned short));
  424. break;
  425. }
  426. case 1:
  427. {
  428. //8bit
  429. char Local = (char)temp;
  430. unsigned char LocalLen = (unsigned char)Local;
  431. memcpy(m_pValue, &LocalLen, sizeof(unsigned char));
  432. break;
  433. }
  434. default:
  435. throw RawPacketObjectExption("ContextSize error!");
  436. break;
  437. }
  438. AddPacketSize(ContextSize);
  439. }
  440. return true;
  441. }
  442. template<class T2>
  443. bool RawPacketObject::UnSignedAssignmentProcess(T2 temp)
  444. {
  445. bool Flexible;
  446. size_t LengthSize = 0;
  447. size_t ContextSize = 0;
  448. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  449. if (Flexible)
  450. {
  451. throw RawPacketObjectExption("Flexible length can not use = function!");
  452. return false;
  453. }
  454. else
  455. {
  456. switch (ContextSize)
  457. {
  458. case 8:
  459. {
  460. //64bit
  461. unsigned long long LocalLen = (unsigned long long)temp;
  462. memcpy(m_pValue, &LocalLen, sizeof(unsigned long long));
  463. break;
  464. }
  465. case 4:
  466. {
  467. //32bit
  468. unsigned int LocalLen = (unsigned int)temp;
  469. memcpy(m_pValue, &LocalLen, sizeof(unsigned int));
  470. break;
  471. }
  472. case 2:
  473. {
  474. //16bit
  475. unsigned short LocalLen = (unsigned short)temp;
  476. memcpy(m_pValue, &LocalLen, sizeof(unsigned short));
  477. break;
  478. }
  479. case 1:
  480. {
  481. //8bit
  482. unsigned char LocalLen = (unsigned char)temp;
  483. memcpy(m_pValue, &LocalLen, sizeof(unsigned char));
  484. break;
  485. }
  486. default:
  487. throw RawPacketObjectExption("ContextSize error!");
  488. break;
  489. }
  490. AddPacketSize(ContextSize);
  491. return true;
  492. }
  493. }
  494. template<class T3>
  495. bool RawPacketObject::ReadSignedValueByType(T3& value)
  496. {
  497. if (m_HasKey)
  498. {
  499. bool Flexible;
  500. size_t LengthSize = 0;
  501. size_t ContextSize = 0;
  502. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  503. if (Flexible)
  504. {
  505. throw RawPacketObjectExption("Flexible length can not use = function!");
  506. return false;
  507. }
  508. else
  509. {
  510. switch (ContextSize)
  511. {
  512. case 8:
  513. {
  514. //64bit
  515. unsigned long long LocalLen;
  516. memcpy(&LocalLen, m_pValue, sizeof(unsigned long long));
  517. long long Local = (long long)LocalLen;
  518. value = (T3)Local;
  519. break;
  520. }
  521. case 4:
  522. {
  523. //32bit
  524. unsigned int LocalLen;
  525. memcpy(&LocalLen, m_pValue, sizeof(unsigned int));
  526. int Local = (int)LocalLen;
  527. value = (T3)Local;
  528. break;
  529. }
  530. case 2:
  531. {
  532. //16bit
  533. unsigned short LocalLen;
  534. memcpy(&LocalLen, m_pValue, sizeof(unsigned short));
  535. short Local = (short)LocalLen;
  536. value = (T3)Local;
  537. break;
  538. }
  539. case 1:
  540. {
  541. //8bit
  542. unsigned char LocalLen;
  543. memcpy(&LocalLen, m_pValue, sizeof(unsigned char));
  544. char Local = (char)LocalLen;
  545. value = (T3)Local;
  546. break;
  547. }
  548. default:
  549. throw RawPacketObjectExption("ContextSize error!");
  550. break;
  551. }
  552. return true;
  553. }
  554. }
  555. else
  556. {
  557. throw RawPacketObjectExption("Do not have key, can not get value");
  558. return false;
  559. }
  560. }
  561. template<class T4>
  562. bool RawPacketObject::ReadUnSignedValueByType(T4& value)
  563. {
  564. if (m_HasKey)
  565. {
  566. bool Flexible;
  567. size_t LengthSize = 0;
  568. size_t ContextSize = 0;
  569. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  570. if (Flexible)
  571. {
  572. throw RawPacketObjectExption("Flexible length can not use = function!");
  573. return false;
  574. }
  575. else
  576. {
  577. switch (ContextSize)
  578. {
  579. case 8:
  580. {
  581. //64bit
  582. unsigned long long LocalLen;
  583. memcpy(&LocalLen, m_pValue, sizeof(unsigned long long));
  584. value = (T4)LocalLen;
  585. break;
  586. }
  587. case 4:
  588. {
  589. //32bit
  590. unsigned int LocalLen;
  591. memcpy(&LocalLen, m_pValue, sizeof(unsigned int));
  592. value = (T4)LocalLen;
  593. break;
  594. }
  595. case 2:
  596. {
  597. //16bit
  598. unsigned short LocalLen;
  599. memcpy(&LocalLen, m_pValue, sizeof(unsigned short));
  600. value = (T4)LocalLen;
  601. break;
  602. }
  603. case 1:
  604. {
  605. //8bit
  606. unsigned char LocalLen;
  607. memcpy(&LocalLen, m_pValue, sizeof(unsigned char));
  608. value = (T4)LocalLen;
  609. break;
  610. }
  611. default:
  612. throw RawPacketObjectExption("ContextSize error!");
  613. break;
  614. }
  615. return true;
  616. }
  617. }
  618. else
  619. {
  620. throw RawPacketObjectExption("Do not have key, can not get value");
  621. return false;
  622. }
  623. }
  624. bool RawPacketObject::update(const char* pValue, size_t size)
  625. {
  626. bool Flexible;
  627. size_t LengthSize = 0;
  628. size_t ContextSize = 0;
  629. if (m_HasKey)
  630. {
  631. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  632. if (Flexible)
  633. {
  634. if (sizeof(CCOSKEYTYPE) + LengthSize + size > sizeOfBuff())
  635. {
  636. throw RawPacketObjectExption("update size overflow ");
  637. return false;
  638. }
  639. memcpy(m_pValue, pValue, size);
  640. //set the length value
  641. SetKeyFlexbleValue(&(m_pPacketBuff[sizeof(CCOSKEYTYPE)]), LengthSize, size);
  642. m_PacketSize = sizeof(CCOSKEYTYPE) + LengthSize + size;
  643. }
  644. else
  645. {
  646. if (sizeof(CCOSKEYTYPE) + size > sizeOfBuff())
  647. {
  648. throw RawPacketObjectExption("update size overflow ");
  649. return false;
  650. }
  651. memcpy(m_pValue, pValue, ContextSize);
  652. m_PacketSize = sizeof(CCOSKEYTYPE) + size;
  653. }
  654. }
  655. else
  656. {
  657. throw RawPacketObjectExption("Do not have key, can not update value");
  658. return false;
  659. }
  660. return true;
  661. }
  662. // 为各种类型实例化模板函数
  663. template bool RawPacketObject::add_Template<bool>(CCOSKEYTYPE, bool);
  664. template bool RawPacketObject::add_Template<char>(CCOSKEYTYPE, char);
  665. template bool RawPacketObject::add_Template<unsigned char>(CCOSKEYTYPE, unsigned char);
  666. template bool RawPacketObject::add_Template<short>(CCOSKEYTYPE, short);
  667. template bool RawPacketObject::add_Template<unsigned short>(CCOSKEYTYPE, unsigned short);
  668. template bool RawPacketObject::add_Template<int>(CCOSKEYTYPE, int);
  669. template bool RawPacketObject::add_Template<unsigned int>(CCOSKEYTYPE, unsigned int);
  670. template bool RawPacketObject::add_Template<long>(CCOSKEYTYPE, long);
  671. template bool RawPacketObject::add_Template<unsigned long>(CCOSKEYTYPE, unsigned long);
  672. template bool RawPacketObject::add_Template<long long>(CCOSKEYTYPE, long long);
  673. template bool RawPacketObject::add_Template<unsigned long long>(CCOSKEYTYPE, unsigned long long);
  674. template bool RawPacketObject::add_Template<float>(CCOSKEYTYPE, float);
  675. template bool RawPacketObject::add_Template<double>(CCOSKEYTYPE, double);
  676. bool RawPacketObject::add(CCOSKEYTYPE Key, const char* pValue, size_t size) {
  677. unsigned char* pTempBuff;
  678. size_t addSize = 0;
  679. bool Flexible;
  680. size_t LengthSize = 0;
  681. size_t ContextSize = 0;
  682. if (m_PacketSize + sizeof(Key) + size > sizeOfBuff())
  683. {
  684. if (m_InternalMalloc)
  685. {
  686. ReloadInternalMalloc(sizeof(Key) + size);
  687. }
  688. else
  689. {
  690. throw RawPacketObjectExption("add size overflow ");
  691. return false;
  692. }
  693. }
  694. if (m_HasKey)
  695. {
  696. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  697. if (!Flexible)
  698. {
  699. throw RawPacketObjectExption("fixed length can not use add function!");
  700. return false;
  701. }
  702. }
  703. pTempBuff = &(m_pPacketBuff[m_PacketSize]);
  704. memcpy(pTempBuff, &Key, sizeof(Key));
  705. GetKeyFlexble(pTempBuff, Flexible, LengthSize, ContextSize);
  706. if (Flexible)
  707. {
  708. addSize = sizeof(Key) + LengthSize + size;
  709. if (m_PacketSize + addSize > sizeOfBuff())
  710. {
  711. if (m_InternalMalloc)
  712. {
  713. ReloadInternalMalloc(LengthSize);
  714. }
  715. else
  716. {
  717. throw RawPacketObjectExption("Length size overflow ");
  718. return false;
  719. }
  720. }
  721. pTempBuff += sizeof(Key);
  722. SetKeyFlexbleValue(pTempBuff, LengthSize, size);
  723. pTempBuff += LengthSize;
  724. memcpy(pTempBuff, pValue, size);
  725. }
  726. else
  727. {
  728. addSize = sizeof(Key) + ContextSize;
  729. pTempBuff += sizeof(Key);
  730. memcpy(pTempBuff, pValue, ContextSize);
  731. }
  732. if (!SetKeyLengthValue(addSize))
  733. {
  734. throw RawPacketObjectExption("update Length zore value error!");
  735. return false;
  736. }
  737. RawPacketObject* subRPO = new RawPacketObject(this, (unsigned char*)&(m_pPacketBuff[m_PacketSize]), addSize, addSize);
  738. (*m_vec).push_back(subRPO);
  739. AddPacketSize(addSize);
  740. return true;
  741. }
  742. bool RawPacketObject::add(RawPacketObject& dataobj) {
  743. if (&dataobj == this)
  744. {
  745. return false;
  746. }
  747. bool Flexible;
  748. size_t LengthSize = 0;
  749. size_t ContextSize = 0;
  750. if (m_HasKey)
  751. {
  752. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  753. if (!Flexible)
  754. {
  755. throw RawPacketObjectExption("fixed length can not use add function!");
  756. return false;
  757. }
  758. }
  759. if (m_PacketSize + dataobj.sizeOfRaw() > sizeOfBuff())
  760. {
  761. if (m_InternalMalloc)
  762. {
  763. ReloadInternalMalloc(dataobj.sizeOfRaw());
  764. }
  765. else
  766. {
  767. throw RawPacketObjectExption("add size overflow ");
  768. return false;
  769. }
  770. }
  771. if (m_HasKey)
  772. {
  773. if (!SetKeyLengthValue(dataobj.sizeOfRaw()))
  774. {
  775. throw RawPacketObjectExption("update Length zore value error!");
  776. return false;
  777. }
  778. }
  779. memcpy(&(m_pPacketBuff[m_PacketSize]), dataobj.m_pPacketBuff, dataobj.sizeOfRaw());
  780. unsigned char* p = &(m_pPacketBuff[m_PacketSize]);
  781. size_t packetsize = dataobj.sizeOfRaw();
  782. size_t buffsize = dataobj.sizeOfRaw();
  783. RawPacketObject* addobj = new RawPacketObject(this, p, packetsize, buffsize);
  784. (*m_vec).push_back(addobj);
  785. AddPacketSize(packetsize);
  786. return true;
  787. }
  788. bool RawPacketObject::SetKeyLengthValue(size_t addSize)
  789. {
  790. bool Flexible;
  791. size_t LengthSize = 0;
  792. size_t ContextSize = 0;
  793. unsigned char* pTempBuff;
  794. if (m_HasKey)//update Length zore value
  795. {
  796. GetKeyFlexble(m_pPacketBuff, Flexible, LengthSize, ContextSize);
  797. if (Flexible)
  798. {
  799. size_t LengthZoreValue = 0;
  800. pTempBuff = m_pPacketBuff + sizeof(CCOSKEYTYPE);
  801. memcpy(&LengthZoreValue, pTempBuff, LengthSize);
  802. size_t TempSize = addSize + LengthZoreValue;
  803. SetKeyFlexbleValue(pTempBuff, LengthSize, TempSize);
  804. }
  805. }
  806. return true;
  807. }
  808. // 赋值操作实现
  809. RawPacketObject& RawPacketObject::operator=(const RawPacketObject& tValue) {
  810. if (this == &tValue) return *this;
  811. size_t newSize = tValue.m_PacketSize;
  812. if (m_BuffSize < newSize) {
  813. if (m_InternalMalloc) {
  814. ReloadInternalMalloc(newSize - m_BuffSize);
  815. }
  816. else {
  817. throw RawPacketObjectExption("new obj's BuffSize too long");
  818. }
  819. }
  820. memcpy(m_pPacketBuff, tValue.m_pPacketBuff, newSize);
  821. Reload(tValue.m_pParent, m_pPacketBuff, newSize, newSize);
  822. return *this;
  823. }
  824. // 各种类型的赋值操作
  825. RawPacketObject& RawPacketObject::operator=(const bool tValue) {
  826. return *this = static_cast<char>(tValue);
  827. }
  828. // 读取操作实现
  829. RawPacketObject& RawPacketObject::operator[](size_t idx) {
  830. if (idx >= sizeOfObject()) {
  831. throw RawPacketObjectExption("overflow of Idx Of []");
  832. }
  833. return *(*m_vec)[idx];
  834. }
  835. RawPacketObject& RawPacketObject::operator[](int idx) {
  836. if (idx < 0) {
  837. throw RawPacketObjectExption("using minus idx to operate []");
  838. }
  839. return operator[](static_cast<size_t>(idx));
  840. }
  841. RawPacketObject& RawPacketObject::operator[](CCOSKEYTYPE Key) {
  842. for (auto obj : *m_vec) {
  843. CCOSKEYTYPE objKey;
  844. memcpy(&objKey, obj->m_pPacketBuff, sizeof(CCOSKEYTYPE));
  845. if (objKey == Key) {
  846. return *obj;
  847. }
  848. }
  849. throw RawPacketObjectExption("none matches the operator param");
  850. }
  851. // 类型转换操作
  852. RawPacketObject::operator bool() {
  853. if (IsObject()) throw RawPacketObjectExption("try to convert a object");
  854. return *reinterpret_cast<bool*>(m_pValue);
  855. }
  856. bool RawPacketObject::operator==(const RawPacketObject& ar) const {
  857. return m_PacketSize == ar.m_PacketSize &&
  858. memcmp(m_pPacketBuff, ar.m_pPacketBuff, m_PacketSize) == 0;
  859. }
  860. // CcosPacket 实现
  861. CcosPacket::CcosPacket() : SCFPacket(), m_pDataObj(nullptr), m_bReady(false),
  862. m_LenzoneSize(4), m_CrcEffective(false), m_Direction(0), m_FreezeLenzone(1) {
  863. }
  864. CcosPacket::CcosPacket(char* pData, size_t Length) : SCFPacket(pData, Length),
  865. m_pDataObj(nullptr) {
  866. UpdateLastEnv();
  867. }
  868. CcosPacket::~CcosPacket() {
  869. if (m_pDataObj) {
  870. delete m_pDataObj;
  871. }
  872. }
  873. bool CcosPacket::UpdateLastEnv() {
  874. bool res = true;
  875. unsigned int Lenzonesize = 0;
  876. if (GetLenZoneSize(Lenzonesize) == false)
  877. {
  878. res = false;
  879. }
  880. bool Effective = false;
  881. if (res == true && GetDataCrcEffectiveFlag(Effective) == false)
  882. {
  883. res = false;
  884. }
  885. unsigned int Direction = 0;
  886. if (res == true && GetTargetDirection(Direction) == false)
  887. {
  888. res = false;
  889. }
  890. unsigned int FreezeLenzone = 0;
  891. if (res == true && GetFreezeLenZoneFlag(FreezeLenzone) == false)
  892. {
  893. res = false;
  894. }
  895. if (res)
  896. {
  897. m_bReady = true;
  898. m_CrcEffective = Effective;
  899. m_Direction = Direction;
  900. m_LenzoneSize = Lenzonesize;
  901. m_FreezeLenzone = FreezeLenzone;
  902. }
  903. else
  904. {
  905. m_bReady = false;
  906. }
  907. return res;
  908. }
  909. // 各种访问方法实现
  910. bool CcosPacket::GetPhyDevIdx(PHYIDXTYPE& PhyDevIdx) {
  911. if (!m_bReady) return false;
  912. PhyDevIdx = m_PacketBuff[DP_PHYIDX_OFFSET];
  913. return true;
  914. }
  915. bool CcosPacket::SetPhyDevIdx(PHYIDXTYPE PhyDevIdx) {
  916. if (m_bReady) return false;
  917. m_PacketBuff[DP_PHYIDX_OFFSET] = PhyDevIdx;
  918. return true;
  919. }
  920. bool CcosPacket::GetLogicDevIdx(LOGICIDXTYPE& LogicDevIdx)
  921. {
  922. bool ret = false;
  923. //if (m_bReady)
  924. {
  925. LogicDevIdx = m_PacketBuff[DP_LOGICIDX_OFFSET];
  926. ret = true;
  927. }
  928. return ret;
  929. }
  930. bool CcosPacket::SetLogicDevIdx(LOGICIDXTYPE LogicDevIdx)
  931. {
  932. bool ret = false;
  933. if (m_bReady == false)
  934. {
  935. m_PacketBuff[DP_LOGICIDX_OFFSET] = LogicDevIdx;
  936. ret = true;
  937. }
  938. return ret;
  939. }
  940. bool CcosPacket::GetDataCrcEffectiveFlag(bool& Effective)
  941. {
  942. bool ret = false;
  943. //if (m_bReady)
  944. {
  945. CCOSPACKETFLAG Dst = { 0 };
  946. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  947. Effective = Dst.CrcEffective;
  948. ret = true;
  949. }
  950. return ret;
  951. }
  952. bool CcosPacket::SetDataCrcEffectiveFlag(bool Effective)
  953. {
  954. bool ret = false;
  955. if (m_bReady == false)
  956. {
  957. CCOSPACKETFLAG Dst = { 0 };
  958. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  959. Dst.CrcEffective = Effective;
  960. CopyStream(&m_PacketBuff[DP_FLAG_OFFSET], (const char*)&Dst, 1);
  961. ret = true;
  962. }
  963. return ret;
  964. }
  965. bool CcosPacket::GetTargetDirection(unsigned int& Direction)
  966. {
  967. bool ret = false;
  968. //if (m_bReady)
  969. {
  970. CCOSPACKETFLAG Dst = { 0 };
  971. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  972. Direction = Dst.PackDirection;
  973. ret = true;
  974. }
  975. return ret;
  976. }
  977. bool CcosPacket::SetTargetDirection(unsigned int Direction)
  978. {
  979. bool ret = false;
  980. if (Direction > 2)
  981. {
  982. return ret;
  983. }
  984. if (m_bReady == false)
  985. {
  986. CCOSPACKETFLAG Dst = { 0 };
  987. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  988. Dst.PackDirection = Direction;
  989. CopyStream(&m_PacketBuff[DP_FLAG_OFFSET], (const char*)&Dst, 1);
  990. ret = true;
  991. }
  992. return ret;
  993. }
  994. bool CcosPacket::GetFreezeLenZoneFlag(unsigned int& FreezeFlag)
  995. {
  996. bool ret = false;
  997. //if (m_bReady)
  998. {
  999. CCOSPACKETFLAG Dst = { 0 };
  1000. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  1001. FreezeFlag = Dst.FreezeOfLenZone;
  1002. ret = true;
  1003. }
  1004. return ret;
  1005. }
  1006. bool CcosPacket::SetFreezeLenZoneFlag(unsigned int FreezeFlag)
  1007. {
  1008. bool ret = false;
  1009. if (m_bReady == false)
  1010. {
  1011. CCOSPACKETFLAG Dst = { 0 };
  1012. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  1013. Dst.FreezeOfLenZone = FreezeFlag;
  1014. CopyStream(&m_PacketBuff[DP_FLAG_OFFSET], (const char*)&Dst, 1);
  1015. ret = true;
  1016. }
  1017. return ret;
  1018. }
  1019. bool CcosPacket::GetLenZoneSize(unsigned int& LenzoneSize)
  1020. {
  1021. bool ret = false;
  1022. //if (m_bReady)
  1023. {
  1024. CCOSPACKETFLAG Dst = { 0 };
  1025. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  1026. // 111b
  1027. if (Dst.SizeOfLenZon == 7)
  1028. {
  1029. LenzoneSize = 0;//no Lenzone
  1030. }
  1031. else
  1032. {
  1033. LenzoneSize = 1;
  1034. for (unsigned int i = 0; i < Dst.SizeOfLenZon; i++)
  1035. {
  1036. LenzoneSize = LenzoneSize << 1;
  1037. }
  1038. }
  1039. ret = true;
  1040. }
  1041. return ret;
  1042. }
  1043. bool CcosPacket::SetLenZoneSize(unsigned int LenzoneSize)
  1044. {
  1045. bool ret = false;
  1046. if (LenzoneSize > 64)
  1047. {
  1048. return ret;
  1049. }
  1050. if (m_bReady == false)
  1051. {
  1052. CCOSPACKETFLAG Dst = { 0 };
  1053. CopyStream(&Dst, &m_PacketBuff[DP_FLAG_OFFSET], 1);
  1054. switch (LenzoneSize)
  1055. {
  1056. case 0:
  1057. Dst.SizeOfLenZon = 7;
  1058. break;
  1059. case 1:
  1060. Dst.SizeOfLenZon = 0;
  1061. break;
  1062. case 2:
  1063. Dst.SizeOfLenZon = 1;
  1064. break;
  1065. case 4:
  1066. Dst.SizeOfLenZon = 2;
  1067. break;
  1068. case 8:
  1069. Dst.SizeOfLenZon = 3;
  1070. break;
  1071. //case 16:
  1072. // Dst.SizeOfLenZon = 4;
  1073. // break;
  1074. //case 32:
  1075. // Dst.SizeOfLenZon = 5;
  1076. // break;
  1077. //case 64:
  1078. // Dst.SizeOfLenZon = 6;
  1079. // break;
  1080. default:
  1081. return false;
  1082. break;
  1083. }
  1084. CopyStream(&m_PacketBuff[DP_FLAG_OFFSET], (const char*)&Dst, 1);
  1085. m_LenzoneSize = LenzoneSize;
  1086. ret = true;
  1087. }
  1088. return ret;
  1089. }
  1090. bool CcosPacket::GetCommand(CCOSCMDTYPE& Cmd)
  1091. {
  1092. bool ret = false;
  1093. //if (m_bReady)
  1094. {
  1095. Cmd = m_PacketBuff[DP_CMD_OFFSET];
  1096. ret = true;
  1097. }
  1098. return ret;
  1099. }
  1100. bool CcosPacket::SetCommand(CCOSCMDTYPE Cmd)
  1101. {
  1102. bool ret = false;
  1103. if (m_bReady == false)
  1104. {
  1105. m_PacketBuff[DP_CMD_OFFSET] = Cmd;
  1106. ret = true;
  1107. }
  1108. return ret;
  1109. }
  1110. bool CcosPacket::GetRetcode(char& Ret)
  1111. {
  1112. bool ret = false;
  1113. //if (m_bReady)
  1114. {
  1115. Ret = m_PacketBuff[DP_RET_OFFSET];
  1116. ret = true;
  1117. }
  1118. return ret;
  1119. }
  1120. bool CcosPacket::SetRetcode(char Ret)
  1121. {
  1122. bool ret = false;
  1123. if (m_bReady == false)
  1124. {
  1125. m_PacketBuff[DP_RET_OFFSET] = Ret;
  1126. ret = true;
  1127. }
  1128. return ret;
  1129. }
  1130. bool CcosPacket::GetDataLen(unsigned long long& Len)
  1131. {
  1132. bool ret = false;
  1133. //if (m_bReady)
  1134. {
  1135. unsigned int LenzoneSize = 0;
  1136. if (GetLenZoneSize(LenzoneSize))
  1137. {
  1138. switch (LenzoneSize)
  1139. {
  1140. case 8:
  1141. {
  1142. //64bit
  1143. CopyStream(&Len, &m_PacketBuff[DP_PARAMLEN_OFFSET], sizeof(Len));
  1144. ret = true;
  1145. }
  1146. break;
  1147. case 4:
  1148. {
  1149. //32bit
  1150. unsigned int LocalLen = 0;
  1151. CopyStream(&LocalLen, &m_PacketBuff[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1152. Len = LocalLen;
  1153. ret = true;
  1154. }
  1155. break;
  1156. case 2:
  1157. {
  1158. //16bit
  1159. unsigned short LocalLen = 0;
  1160. CopyStream(&LocalLen, &m_PacketBuff[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1161. Len = LocalLen;
  1162. ret = true;
  1163. }
  1164. break;
  1165. case 1:
  1166. {
  1167. //8bit
  1168. unsigned char LocalLen = 0;
  1169. CopyStream(&LocalLen, &m_PacketBuff[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1170. Len = LocalLen;
  1171. ret = true;
  1172. }
  1173. break;
  1174. default:
  1175. //零和大于8字节的一律无视
  1176. break;
  1177. }
  1178. }
  1179. }
  1180. return ret;
  1181. }
  1182. bool CcosPacket::SetDataLen(unsigned long long Len)
  1183. {
  1184. bool ret = false;
  1185. if (m_bReady == false)
  1186. {
  1187. unsigned int LenzoneSize = 0;
  1188. if (GetLenZoneSize(LenzoneSize))
  1189. {
  1190. switch (LenzoneSize)
  1191. {
  1192. case 8:
  1193. {
  1194. //64bit
  1195. CopyStream(&m_PacketBuff[DP_PARAMLEN_OFFSET], (const char*)&Len, sizeof(Len));
  1196. ret = true;
  1197. }
  1198. break;
  1199. case 4:
  1200. {
  1201. //32bit
  1202. unsigned int LocalLen = (unsigned int)Len;
  1203. CopyStream(&m_PacketBuff[DP_PARAMLEN_OFFSET], (const char*)&LocalLen, sizeof(LocalLen));
  1204. ret = true;
  1205. }
  1206. break;
  1207. case 2:
  1208. {
  1209. //16bit
  1210. unsigned short LocalLen = (unsigned short)Len;
  1211. CopyStream(&m_PacketBuff[DP_PARAMLEN_OFFSET], (const char*)&LocalLen, sizeof(LocalLen));
  1212. ret = true;
  1213. }
  1214. break;
  1215. case 1:
  1216. {
  1217. //8bit
  1218. unsigned char LocalLen = (unsigned char)Len;
  1219. CopyStream(&m_PacketBuff[DP_PARAMLEN_OFFSET], (const char*)&LocalLen, sizeof(LocalLen));
  1220. ret = true;
  1221. }
  1222. break;
  1223. default:
  1224. //零和大于8字节的一律无视
  1225. break;
  1226. }
  1227. }
  1228. }
  1229. return ret;
  1230. }
  1231. bool CcosPacket::GetHeadsCrc(unsigned short& headCrc16)
  1232. {
  1233. bool ret = false;
  1234. //if (m_bReady)
  1235. {
  1236. unsigned int LenzoneSize = 0;
  1237. if (GetLenZoneSize(LenzoneSize))
  1238. {
  1239. CopyStream(&headCrc16, &m_PacketBuff[DP_PARAMLEN_OFFSET + LenzoneSize], sizeof(headCrc16));
  1240. ret = true;
  1241. }
  1242. }
  1243. return ret;
  1244. }
  1245. bool CcosPacket::SetHeadsCrc(unsigned short headCrc16)
  1246. {
  1247. bool ret = false;
  1248. if (m_bReady == false)
  1249. {
  1250. unsigned int LenzoneSize = 0;
  1251. if (GetLenZoneSize(LenzoneSize))
  1252. {
  1253. CopyStream(&m_PacketBuff[DP_PARAMLEN_OFFSET + LenzoneSize], (const char*)&headCrc16, sizeof(headCrc16));
  1254. ret = true;
  1255. }
  1256. }
  1257. return ret;
  1258. }
  1259. char* CcosPacket::GetData() {
  1260. size_t headSize = GetHeadSize();
  1261. return headSize > 0 ? m_PacketBuff + headSize : nullptr;
  1262. }
  1263. size_t CcosPacket::GetHeadSize() {
  1264. return DP_PARAMLEN_OFFSET + m_LenzoneSize + DP_CRC16_SIZE;
  1265. }
  1266. unsigned long long CcosPacket::GetCcosPacketSize()
  1267. {
  1268. unsigned long long TotalPacketSize = 0;
  1269. size_t HeadSize = GetHeadSize();
  1270. if (HeadSize > 0)
  1271. {
  1272. unsigned int LenzoneSize = 0;
  1273. GetLenZoneSize(LenzoneSize);
  1274. if (LenzoneSize == 0)
  1275. {
  1276. return HeadSize;
  1277. }
  1278. unsigned long long DataLen = 0;
  1279. if (GetDataLen(DataLen) == false)
  1280. {
  1281. return 0;
  1282. }
  1283. unsigned long long TotalPacketSize = HeadSize + DataLen;
  1284. if (DataLen > 0)
  1285. {
  1286. TotalPacketSize += DP_CRC16_SIZE;
  1287. }
  1288. if (HeadSize == 0 || TotalPacketSize > GetBuffLen())
  1289. {
  1290. return 0;
  1291. }
  1292. return TotalPacketSize;
  1293. }
  1294. return 0;
  1295. }
  1296. bool CcosPacket::GetParam(DWORD Idx, char*& pAddress, size_t& ParamSize)
  1297. {
  1298. CCOSKEYTYPE ObjectKey;
  1299. bool Flexible;
  1300. char* pObject = NULL;
  1301. size_t ObjectSize;
  1302. unsigned long long DataLen = 0;
  1303. size_t HeadSize = GetHeadSize();
  1304. if (GetDataLen(DataLen) == false || DataLen == 0)
  1305. {
  1306. return false;
  1307. }
  1308. size_t Size = DataLen;
  1309. char* pData = &m_PacketBuff[HeadSize];
  1310. for (DWORD i = 0; i <= Idx; i++)
  1311. {
  1312. if (GetObjectContext(pData, Size, ObjectKey, Flexible, pObject, ObjectSize))
  1313. {
  1314. //calculate jump size
  1315. size_t jumpsize = (pObject - pData) + ObjectSize;
  1316. if (Size > jumpsize)
  1317. {
  1318. pData += jumpsize;
  1319. Size -= jumpsize;
  1320. continue;
  1321. }
  1322. else if (Size == jumpsize)
  1323. {
  1324. //must be Size == jumpsize!!!!
  1325. //return true;
  1326. continue;
  1327. }
  1328. return false;
  1329. }
  1330. else
  1331. {
  1332. return false;;
  1333. }
  1334. }
  1335. pAddress = pObject;
  1336. ParamSize = ObjectSize;
  1337. return true;
  1338. }
  1339. RawPacketObject* CcosPacket::GetDataObject() {
  1340. if (!m_pDataObj) {
  1341. unsigned long long dataLen = 0;
  1342. GetDataLen(dataLen);
  1343. size_t headSize = GetHeadSize();
  1344. size_t buffSize = GetBuffLen() - headSize;
  1345. m_pDataObj = new RawPacketObject(nullptr,
  1346. reinterpret_cast<unsigned char*>(GetData()), dataLen, buffSize);
  1347. }
  1348. return m_pDataObj;
  1349. }
  1350. bool CcosPacket::SetData(const char* pData, size_t dataLen)
  1351. {
  1352. size_t HeadSize = GetHeadSize();
  1353. if (HeadSize > 0)
  1354. {
  1355. unsigned long long PacketSize = (HeadSize + dataLen + DP_CRC16_SIZE);
  1356. //check the packet buffer
  1357. if (GetBuffLen() < PacketSize)
  1358. {
  1359. //bufflen not enough
  1360. if (SetBuffLen(PacketSize) == false)
  1361. {
  1362. //mem allocation failed
  1363. return false;
  1364. }
  1365. }
  1366. //copy data
  1367. memcpy(&m_PacketBuff[HeadSize], pData, dataLen);
  1368. //update lenzone
  1369. PacketSize = (unsigned long long)dataLen;
  1370. return SetDataLen(PacketSize);
  1371. }
  1372. return false;
  1373. }
  1374. bool CcosPacket::AddData(const char* pData, size_t dataLen)
  1375. {
  1376. size_t HeadSize = GetHeadSize();
  1377. if (HeadSize > 0)
  1378. {
  1379. //exist lenzone
  1380. unsigned long long DataSize = 0;
  1381. if (GetDataLen(DataSize))
  1382. {
  1383. //
  1384. unsigned long long PacketSize = (HeadSize + DataSize + dataLen + DP_CRC16_SIZE);
  1385. //check the packet buffer
  1386. if (GetBuffLen() < PacketSize)
  1387. {
  1388. //bufflen not enough
  1389. if (SetBuffLen(PacketSize) == false)
  1390. {
  1391. //mem allocation failed
  1392. return false;
  1393. }
  1394. }
  1395. //copy data
  1396. unsigned long long CopyPosition = HeadSize + DataSize;
  1397. memcpy(&m_PacketBuff[CopyPosition], pData, dataLen);
  1398. DataSize += dataLen;
  1399. //update lenzone
  1400. return SetDataLen(DataSize);
  1401. }
  1402. }
  1403. return false;
  1404. }
  1405. bool CcosPacket::GetDataCrc(unsigned short& dataCrc16)
  1406. {
  1407. bool ret = false;
  1408. size_t HeadSize = GetHeadSize();
  1409. if (HeadSize > 0)
  1410. {
  1411. unsigned long long DataSize = 0;
  1412. if (GetDataLen(DataSize))
  1413. {
  1414. unsigned long long CrcPosition = HeadSize + DataSize;
  1415. CopyStream((const char*)&dataCrc16, &m_PacketBuff[CrcPosition], sizeof(dataCrc16));
  1416. ret = true;
  1417. }
  1418. }
  1419. return ret;
  1420. }
  1421. bool CcosPacket::SetDataCrc(unsigned short dataCrc16)
  1422. {
  1423. bool ret = false;
  1424. size_t HeadSize = GetHeadSize();
  1425. if (HeadSize > 0)
  1426. {
  1427. unsigned long long DataSize = 0;
  1428. if (GetDataLen(DataSize))
  1429. {
  1430. unsigned long long CrcPosition = HeadSize + DataSize;
  1431. CopyStream(&m_PacketBuff[CrcPosition], (const char*)&dataCrc16, sizeof(dataCrc16));
  1432. ret = true;
  1433. }
  1434. }
  1435. return ret;
  1436. }
  1437. // 初始化包
  1438. bool CcosPacket::InitPacket() {
  1439. m_PacketBuff[DP_HEAD_OFFSET] = DP_HEAD;
  1440. m_PacketBuff[DP_VER_OFFSET] = 0x01;
  1441. SetPhyDevIdx(0);
  1442. SetLogicDevIdx(0);
  1443. SetDataCrcEffectiveFlag(m_CrcEffective);
  1444. SetTargetDirection(m_Direction);
  1445. SetFreezeLenZoneFlag(m_FreezeLenzone);
  1446. SetLenZoneSize(m_LenzoneSize);
  1447. SetRetcode(0);
  1448. SetDataLen(0);
  1449. return true;
  1450. }
  1451. // 准备包
  1452. bool CcosPacket::ReadyPacket() {
  1453. //simple check
  1454. //head
  1455. if (m_PacketBuff[DP_HEAD_OFFSET] != (char)DP_HEAD)
  1456. {
  1457. return false;
  1458. }
  1459. //direction
  1460. unsigned int Direction = 3;
  1461. if (GetTargetDirection(Direction) == false || Direction > 2)
  1462. {
  1463. return false;
  1464. }
  1465. unsigned int LenzonSize = 0;
  1466. if (GetLenZoneSize(LenzonSize) == false || LenzonSize > 8)
  1467. {
  1468. return false;
  1469. }
  1470. unsigned long long DataLen = 0;
  1471. if (GetDataLen(DataLen) == false)
  1472. {
  1473. return false;
  1474. }
  1475. //check bufflen & packetlen
  1476. size_t HeadSize = GetHeadSize();
  1477. size_t TotalPacketSize = GetCcosPacketSize();
  1478. if (HeadSize == 0 || TotalPacketSize == 0)
  1479. {
  1480. return false;
  1481. }
  1482. //make head's crc
  1483. unsigned short crc16 = CRC16((unsigned char*)&m_PacketBuff[DP_HEAD_OFFSET], HeadSize - DP_CRC16_SIZE);
  1484. if (SetHeadsCrc(crc16) == false)
  1485. {
  1486. return false;
  1487. }
  1488. //check first level of data
  1489. if (DataLen > 0)
  1490. {
  1491. if (CheckFirstLevelOfTheData(&m_PacketBuff[HeadSize], DataLen) == false)
  1492. {
  1493. return false;
  1494. }
  1495. }
  1496. //make data's crc
  1497. if (DataLen > 0)
  1498. {
  1499. crc16 = CRC16((unsigned char*)&m_PacketBuff[HeadSize], DataLen);
  1500. if (SetDataCrc(crc16) == false)
  1501. {
  1502. return false;
  1503. }
  1504. }
  1505. if (UpdateLastEnv() == false)
  1506. {
  1507. return false;
  1508. }
  1509. SetPacketLen(TotalPacketSize);
  1510. return true;
  1511. }
  1512. // C接口函数实现
  1513. extern "C" PVOID MallocCcosPacket() {
  1514. return new CcosPacket();
  1515. }
  1516. extern "C" void ReleaseCcosPacket(PVOID pObj) {
  1517. delete static_cast<CcosPacket*>(pObj);
  1518. }
  1519. extern "C" PACKET_RET CcosPacketParser(const char* pRecData, DWORD nLength, DWORD& PacketLength) {
  1520. //head
  1521. DWORD i = 0;
  1522. for (; i < nLength; i++)
  1523. {
  1524. if (pRecData[i] != (char)DP_HEAD)
  1525. {
  1526. continue;
  1527. }
  1528. else
  1529. {
  1530. break;
  1531. }
  1532. }
  1533. if (i > 0)
  1534. {
  1535. PacketLength = i;
  1536. return PACKET_USELESS;
  1537. }
  1538. //ver
  1539. if (nLength < 2)
  1540. {
  1541. return PACKET_NOPACKET;
  1542. }
  1543. if (pRecData[DP_VER_OFFSET] != (char)0x01)
  1544. {
  1545. PacketLength = DP_VER_OFFSET + 1;
  1546. return PACKET_USELESS;
  1547. }
  1548. //read packet to cmd part
  1549. if (nLength < DP_CMD_OFFSET + 1)
  1550. {
  1551. return PACKET_NOPACKET;
  1552. }
  1553. //get flag-----------------------------
  1554. CCOSPACKETFLAG df;
  1555. CopyStream((const char*)&df, &pRecData[DP_FLAG_OFFSET], sizeof(CCOSPACKETFLAG));
  1556. //check direction
  1557. if (df.PackDirection > 2)
  1558. {
  1559. PacketLength = DP_FLAG_OFFSET + 1;
  1560. return PACKET_USELESS;
  1561. }
  1562. //get len zonesize
  1563. unsigned int LenzoneSize;
  1564. if (df.SizeOfLenZon == 7)
  1565. {
  1566. LenzoneSize = 0;//no Lenzone
  1567. }
  1568. else
  1569. {
  1570. LenzoneSize = 1;
  1571. for (unsigned int i = 0; i < df.SizeOfLenZon; i++)
  1572. {
  1573. LenzoneSize = LenzoneSize << 1;
  1574. }
  1575. }
  1576. //crc effective
  1577. bool CrcEffective = df.CrcEffective;
  1578. //freeze lenzone
  1579. unsigned int FreezeLenzone = df.FreezeOfLenZone;
  1580. //cmd--------------------------
  1581. unsigned int Cmd = pRecData[DP_CMD_OFFSET];
  1582. //get DataLen------------------
  1583. //check
  1584. if (nLength < DP_PARAMLEN_OFFSET + LenzoneSize)
  1585. {
  1586. return PACKET_NOPACKET;
  1587. }
  1588. unsigned long long DataLen = 0;
  1589. if (LenzoneSize > 0)
  1590. {
  1591. switch (LenzoneSize)
  1592. {
  1593. case 8:
  1594. {
  1595. //64bit
  1596. CopyStream(&DataLen, &pRecData[DP_PARAMLEN_OFFSET], sizeof(DataLen));
  1597. }
  1598. break;
  1599. case 4:
  1600. {
  1601. //32bit
  1602. unsigned int LocalLen = 0;
  1603. CopyStream(&LocalLen, &pRecData[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1604. DataLen = LocalLen;
  1605. }
  1606. break;
  1607. case 2:
  1608. {
  1609. //16bit
  1610. unsigned short LocalLen = 0;
  1611. CopyStream(&LocalLen, &pRecData[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1612. DataLen = LocalLen;
  1613. }
  1614. break;
  1615. case 1:
  1616. {
  1617. //8bit
  1618. unsigned char LocalLen = 0;
  1619. CopyStream(&LocalLen, &pRecData[DP_PARAMLEN_OFFSET], sizeof(LocalLen));
  1620. DataLen = LocalLen;
  1621. }
  1622. default:
  1623. {
  1624. //其他都是浮云
  1625. PacketLength = (DP_PARAMLEN_OFFSET + LenzoneSize);
  1626. return PACKET_USELESS;
  1627. }
  1628. break;
  1629. }
  1630. }
  1631. //get Crc & check
  1632. if (nLength < DP_PARAMLEN_OFFSET + LenzoneSize + DP_CRC16_SIZE)
  1633. {
  1634. return PACKET_NOPACKET;
  1635. }
  1636. //check the Head crc
  1637. unsigned short HeadCalcCrc = CRC16((unsigned char*)&pRecData[DP_HEAD_OFFSET], DP_PARAMLEN_OFFSET + LenzoneSize);
  1638. unsigned short HeadPacketCrc = 0;
  1639. CopyStream(&HeadPacketCrc, &pRecData[DP_PARAMLEN_OFFSET + LenzoneSize], DP_CRC16_SIZE);
  1640. unsigned long long dataOffset = DP_PARAMLEN_OFFSET + LenzoneSize + DP_CRC16_SIZE;
  1641. if (HeadCalcCrc != HeadPacketCrc)
  1642. {
  1643. PacketLength = dataOffset;
  1644. return PACKET_USELESS;
  1645. }
  1646. //head's crc check is done
  1647. if (LenzoneSize == 0 || DataLen == 0)
  1648. {
  1649. //done here
  1650. PacketLength = dataOffset;
  1651. //for test
  1652. #ifdef _DEBUG
  1653. //printf("\n\nGot Ccos Packet---------------------Dir:%d\n\n", df.PackDirection);
  1654. #endif
  1655. return PACKET_ISPACKET;
  1656. }
  1657. //get data & check
  1658. if (nLength < dataOffset + DataLen)
  1659. {
  1660. return PACKET_NOPACKET;
  1661. }
  1662. if (CheckFirstLevelOfTheData((char*)&pRecData[dataOffset], DataLen) == false)
  1663. {
  1664. PacketLength = dataOffset + DataLen;
  1665. return PACKET_USELESS;
  1666. }
  1667. //get crc
  1668. if (nLength < dataOffset + DataLen + DP_CRC16_SIZE)
  1669. {
  1670. return PACKET_NOPACKET;
  1671. }
  1672. if (CrcEffective)
  1673. {
  1674. unsigned short DataCalcCrc = CRC16((unsigned char*)&pRecData[dataOffset], DataLen);
  1675. unsigned short DataPacketCrc;
  1676. CopyStream(&DataPacketCrc, &pRecData[dataOffset + DataLen], DP_CRC16_SIZE);
  1677. if (DataCalcCrc != DataPacketCrc)
  1678. {
  1679. PacketLength = dataOffset + DataLen + DP_CRC16_SIZE;
  1680. return PACKET_USELESS;
  1681. }
  1682. }
  1683. PacketLength = dataOffset + DataLen + DP_CRC16_SIZE;
  1684. //for test
  1685. #ifdef _DEBUG
  1686. //printf("\n\nGot Ccos Packet---------------------Dir:%d.packet Len:%d\n\n", df.PackDirection, PacketLength);
  1687. #endif
  1688. return PACKET_ISPACKET;
  1689. }