SpHelper.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. #include "stdafx.h"
  2. #include "precompile.h"
  3. #include "SpHelper.h"
  4. #include "SimpleString.h"
  5. #include "iobuffer.h"
  6. #include "memutil.h"
  7. #include <winpr/wlog.h>
  8. #define TAG SPBASE_TAG("SpHelper")
  9. //
  10. // SpBuffer
  11. //
  12. template<class T>
  13. static inline void WriteT(iobuffer_t *iobuf, T &t)
  14. {
  15. iobuffer_write(iobuf, IOBUF_T_BUF, &t, sizeof(t));
  16. }
  17. template<class T>
  18. static inline void WriteT(iobuffer_t *iobuf, const T &t)
  19. {
  20. iobuffer_write(iobuf, IOBUF_T_BUF, &t, sizeof(t));
  21. }
  22. template<class T>
  23. static inline void WriteArrayT(iobuffer_t *iobuf, CAutoArray<T> &t)
  24. {
  25. int nArrayNum = t.GetCount();
  26. iobuffer_write(iobuf, IOBUF_T_I4, &nArrayNum, 0);
  27. for(int i=0; i<nArrayNum; i++)
  28. {
  29. WriteT(iobuf, t[i]);
  30. }
  31. }
  32. template<class T>
  33. static inline void WriteArrayT(iobuffer_t *iobuf, const CAutoArray<T> &t)
  34. {
  35. int nArrayNum = t.GetCount();
  36. iobuffer_write(iobuf, IOBUF_T_I4, &nArrayNum, 0);
  37. for(int i=0; i<nArrayNum; i++)
  38. {
  39. WriteT(iobuf, t[i]);
  40. }
  41. }
  42. template<>
  43. #ifdef _WIN32
  44. static
  45. #endif //_WIN32
  46. inline void WriteT(iobuffer_t* iobuf, CSimpleStringA& t)
  47. {
  48. CSimpleStringW wt = CSimpleStringA2W(t); // string is unicode so we can compatible with silverlight
  49. iobuffer_write(iobuf, IOBUF_T_WTSTR, wt.GetData(), -1);
  50. }
  51. template<>
  52. #ifdef _WIN32
  53. static
  54. #endif //_WIN32
  55. inline void WriteT(iobuffer_t* iobuf, const CSimpleStringA& t)
  56. {
  57. CSimpleStringW wt = CSimpleStringA2W(t); // string is unicode so we can compatible with silverlight
  58. iobuffer_write(iobuf, IOBUF_T_WTSTR, wt.GetData(), -1);
  59. }
  60. template<>
  61. #ifdef _WIN32
  62. static
  63. #endif //_WIN32
  64. inline void WriteT(iobuffer_t *iobuf, CSimpleStringW &t)
  65. {
  66. iobuffer_write(iobuf, IOBUF_T_WTSTR, t.GetData(), -1);
  67. }
  68. #ifndef _WIN32
  69. template<>
  70. inline void WriteT(iobuffer_t* iobuf, CSimpleString16Bit& t)
  71. {
  72. iobuffer_write(iobuf, IOBUF_T_WSTR, t.GetData(), -1);
  73. }
  74. #endif //NOT _WIN32
  75. template<>
  76. #ifdef _WIN32
  77. static
  78. #endif //_WIN32
  79. inline void WriteT(iobuffer_t *iobuf, const CSimpleStringW &t)
  80. {
  81. iobuffer_write(iobuf, IOBUF_T_WTSTR, t.GetData(), -1);
  82. }
  83. #ifndef _WIN32
  84. template<>
  85. inline void WriteT(iobuffer_t* iobuf, const CSimpleString16Bit& t)
  86. {
  87. iobuffer_write(iobuf, IOBUF_T_WSTR, t.GetData(), -1);
  88. }
  89. #endif //NOT _WIN32
  90. template<>
  91. #ifdef _WIN32
  92. static
  93. #endif //_WIN32
  94. inline void WriteT(iobuffer_t *iobuf, CBlob &t)
  95. {
  96. iobuffer_write(iobuf, IOBUF_T_I4, &t.m_iLength, 0);
  97. iobuffer_write(iobuf, IOBUF_T_BUF, t.m_pData, t.m_iLength);
  98. }
  99. template<>
  100. #ifdef _WIN32
  101. static
  102. #endif //_WIN32
  103. inline void WriteT(iobuffer_t *iobuf, const CBlob &t)
  104. {
  105. iobuffer_write(iobuf, IOBUF_T_I4, &t.m_iLength, 0);
  106. iobuffer_write(iobuf, IOBUF_T_BUF, t.m_pData, t.m_iLength);
  107. }
  108. template<class T>
  109. static inline void ReadT(iobuffer_t *iobuf, T &t)
  110. {
  111. int size = sizeof(t);
  112. iobuffer_read(iobuf, IOBUF_T_BUF, &t, &size);
  113. }
  114. template<class T>
  115. static inline void ReadArrayT(iobuffer_t *iobuf, CAutoArray<T> &t)
  116. {
  117. int nArrayNum(0);
  118. iobuffer_read(iobuf, IOBUF_T_I4, &nArrayNum, NULL);
  119. if (nArrayNum >0)
  120. {
  121. t.Init(nArrayNum);
  122. for(int i=0; i<nArrayNum; i++)
  123. {
  124. ReadT(iobuf, t[i]);
  125. }
  126. }
  127. }
  128. template<>
  129. #ifdef _WIN32
  130. static
  131. #endif //_WIN32
  132. inline void ReadT(iobuffer_t* iobuf, CSimpleStringA& t)
  133. {
  134. SPCHAR* wt = NULL;
  135. iobuffer_format_read(iobuf, IOBUF_WSTR_FLAG, &wt);
  136. CSimpleStringW wStr = wt;
  137. FREE(wt);
  138. t = CSimpleStringW2A(wStr);
  139. }
  140. template<>
  141. #ifdef _WIN32
  142. static
  143. #endif //_WIN32
  144. inline void ReadT(iobuffer_t * iobuf, CSimpleStringW& t)
  145. {
  146. SPCHAR* wt = NULL;
  147. iobuffer_format_read(iobuf, IOBUF_WSTR_FLAG, &wt);
  148. t = wt;
  149. FREE(wt);
  150. }
  151. #ifndef _WIN32
  152. template<>
  153. inline void ReadT(iobuffer_t* iobuf, CSimpleString16Bit& t)
  154. {
  155. WCHAR* wt = NULL;
  156. iobuffer_format_read(iobuf, "w", &wt);
  157. t = wt;
  158. FREE(wt);
  159. }
  160. #endif //NOT _WIN32
  161. template<>
  162. #ifdef _WIN32
  163. static
  164. #endif //_WIN32
  165. inline void ReadT(iobuffer_t *iobuf, CBlob &t)
  166. {
  167. t.Clear();
  168. iobuffer_read(iobuf, IOBUF_T_I4, &t.m_iLength, NULL);
  169. if (t.m_iLength) {
  170. void *p = new char[t.m_iLength];
  171. iobuffer_read(iobuf, IOBUF_T_BUF, p, &t.m_iLength);
  172. t.m_pData = (char*)p;
  173. t.m_bManaged = true;
  174. }
  175. }
  176. template<class T>
  177. static inline void DoT(iobuffer_t *iobuf, int mode, T &t)
  178. {
  179. if (mode == SpBuffer::OP_READ) {
  180. ReadT(iobuf, t);
  181. } else {
  182. WriteT(iobuf, t);
  183. }
  184. }
  185. template<class T>
  186. static inline void DoArrayT(iobuffer_t *iobuf, int mode, T &t)
  187. {
  188. if (mode == SpBuffer::OP_READ) {
  189. ReadArrayT(iobuf, t);
  190. } else {
  191. WriteArrayT(iobuf, t);
  192. }
  193. }
  194. SpBuffer::SpBuffer() : m_pInternalBuf(NULL)
  195. {
  196. }
  197. SpBuffer::~SpBuffer()
  198. {
  199. Close();
  200. }
  201. bool SpBuffer::OpenRead(const char *buf, int size)
  202. {
  203. _ASSERT(!m_pInternalBuf);
  204. m_pInternalBuf = iobuffer_create(0, size);
  205. memcpy(iobuffer_data(m_pInternalBuf, 0), buf, size);
  206. iobuffer_push_count(m_pInternalBuf, size);
  207. m_iMode = OP_READ;
  208. return true;
  209. }
  210. bool SpBuffer::OpenRead(iobuffer_t **iobuf)
  211. {
  212. _ASSERT(!m_pInternalBuf);
  213. _ASSERT(iobuf && *iobuf);
  214. m_pInternalBuf = *iobuf;
  215. *iobuf = NULL;
  216. m_iMode = OP_READ;
  217. return true;
  218. }
  219. bool SpBuffer::OpenWrite(int cap)
  220. {
  221. _ASSERT(!m_pInternalBuf);
  222. m_pInternalBuf = iobuffer_create(0, cap);
  223. m_iMode = OP_WRITE;
  224. return true;
  225. }
  226. void SpBuffer::Close()
  227. {
  228. if (m_pInternalBuf) {
  229. iobuffer_destroy(m_pInternalBuf);
  230. m_pInternalBuf = NULL;
  231. }
  232. }
  233. void SpBuffer::SetCapacity(int cap)
  234. {
  235. iobuffer_set_capacity(m_pInternalBuf, cap);
  236. }
  237. void SpBuffer::SetLength(int len)
  238. {
  239. iobuffer_set_length(m_pInternalBuf, len);
  240. }
  241. int SpBuffer::GetCapacity()
  242. {
  243. return iobuffer_get_capacity(m_pInternalBuf);
  244. }
  245. int SpBuffer::GetLength()
  246. {
  247. return iobuffer_get_length(m_pInternalBuf);
  248. }
  249. SpBuffer & SpBuffer::operator &(bool& v)
  250. {
  251. DoT(m_pInternalBuf, m_iMode, v);
  252. return *this;
  253. }
  254. SpBuffer & SpBuffer::operator &(ULONGLONG &v)
  255. {
  256. DoT(m_pInternalBuf, m_iMode, v);
  257. return *this;
  258. }
  259. SpBuffer & SpBuffer::operator &(LONGLONG &v)
  260. {
  261. DoT(m_pInternalBuf, m_iMode, v);
  262. return *this;
  263. }
  264. SpBuffer & SpBuffer::operator &(INT &v)
  265. {
  266. DoT(m_pInternalBuf, m_iMode, v);
  267. return *this;
  268. }
  269. SpBuffer & SpBuffer::operator &(SHORT &v)
  270. {
  271. DoT(m_pInternalBuf, m_iMode, v);
  272. return *this;
  273. }
  274. SpBuffer & SpBuffer::operator &(CHAR &v)
  275. {
  276. DoT(m_pInternalBuf, m_iMode, v);
  277. return *this;
  278. }
  279. SpBuffer & SpBuffer::operator &(DWORD &v)
  280. {
  281. DoT(m_pInternalBuf, m_iMode, v);
  282. return *this;
  283. }
  284. SpBuffer & SpBuffer::operator &(WORD &v)
  285. {
  286. DoT(m_pInternalBuf, m_iMode, v);
  287. return *this;
  288. }
  289. SpBuffer & SpBuffer::operator &(BYTE &v)
  290. {
  291. DoT(m_pInternalBuf, m_iMode, v);
  292. return *this;
  293. }
  294. SpBuffer & SpBuffer::operator &(FLOAT &v)
  295. {
  296. DoT(m_pInternalBuf, m_iMode, v);
  297. return *this;
  298. }
  299. SpBuffer & SpBuffer::operator &(DOUBLE &v)
  300. {
  301. DoT(m_pInternalBuf, m_iMode, v);
  302. return *this;
  303. }
  304. SpBuffer & SpBuffer::operator &(CBlob& v)
  305. {
  306. DoT(m_pInternalBuf, m_iMode, v);
  307. return *this;
  308. }
  309. // compatible with Silverlight, because silverlight only support UNICODE string and
  310. // does not support GB2312 encoding
  311. SpBuffer & SpBuffer::operator &(CSimpleStringA &v)
  312. {
  313. DoT(m_pInternalBuf, m_iMode, v);
  314. return *this;
  315. }
  316. SpBuffer & SpBuffer::operator &(CSimpleStringW &v)
  317. {
  318. DoT(m_pInternalBuf, m_iMode, v);
  319. return *this;
  320. }
  321. SpBuffer & SpBuffer::operator &(CAutoArray<bool> &v)
  322. {
  323. DoArrayT(m_pInternalBuf, m_iMode, v);
  324. return *this;
  325. }
  326. SpBuffer & SpBuffer::operator &(CAutoArray<ULONGLONG> &v)
  327. {
  328. DoArrayT(m_pInternalBuf, m_iMode, v);
  329. return *this;
  330. }
  331. SpBuffer & SpBuffer::operator &(CAutoArray<LONGLONG> &v)
  332. {
  333. DoArrayT(m_pInternalBuf, m_iMode, v);
  334. return *this;
  335. }
  336. SpBuffer & SpBuffer::operator &(CAutoArray<INT> &v)
  337. {
  338. DoArrayT(m_pInternalBuf, m_iMode, v);
  339. return *this;
  340. }
  341. SpBuffer & SpBuffer::operator &(CAutoArray<SHORT> &v)
  342. {
  343. DoArrayT(m_pInternalBuf, m_iMode, v);
  344. return *this;
  345. }
  346. SpBuffer & SpBuffer::operator &(CAutoArray<CHAR> &v)
  347. {
  348. DoArrayT(m_pInternalBuf, m_iMode, v);
  349. return *this;
  350. }
  351. SpBuffer & SpBuffer::operator &(CAutoArray<DWORD> &v)
  352. {
  353. DoArrayT(m_pInternalBuf, m_iMode, v);
  354. return *this;
  355. }
  356. SpBuffer & SpBuffer::operator &(CAutoArray<WORD> &v)
  357. {
  358. DoArrayT(m_pInternalBuf, m_iMode, v);
  359. return *this;
  360. }
  361. SpBuffer & SpBuffer::operator &(CAutoArray<BYTE> &v)
  362. {
  363. DoArrayT(m_pInternalBuf, m_iMode, v);
  364. return *this;
  365. }
  366. SpBuffer & SpBuffer::operator &(CAutoArray<FLOAT> &v)
  367. {
  368. DoArrayT(m_pInternalBuf, m_iMode, v);
  369. return *this;
  370. }
  371. SpBuffer & SpBuffer::operator &(CAutoArray<DOUBLE> &v)
  372. {
  373. DoArrayT(m_pInternalBuf, m_iMode, v);
  374. return *this;
  375. }
  376. SpBuffer & SpBuffer::operator &(CAutoArray<CSimpleStringA> &v)
  377. {
  378. DoArrayT(m_pInternalBuf, m_iMode, v);
  379. return *this;
  380. }
  381. SpBuffer & SpBuffer::operator &(CAutoArray<CSimpleStringW> &v)
  382. {
  383. DoArrayT(m_pInternalBuf, m_iMode, v);
  384. return *this;
  385. }
  386. SpBuffer & SpBuffer::operator &(CAutoArray<CBlob> &v)
  387. {
  388. DoArrayT(m_pInternalBuf, m_iMode, v);
  389. return *this;
  390. }
  391. SpBuffer & SpBuffer::operator &(const bool&v)
  392. {
  393. WriteT(m_pInternalBuf, v);
  394. return *this;
  395. }
  396. SpBuffer & SpBuffer::operator &(const ULONGLONG&v)
  397. {
  398. WriteT(m_pInternalBuf, v);
  399. return *this;
  400. }
  401. SpBuffer & SpBuffer::operator &(const LONGLONG&v)
  402. {
  403. WriteT(m_pInternalBuf, v);
  404. return *this;
  405. }
  406. SpBuffer & SpBuffer::operator &(const INT&v)
  407. {
  408. WriteT(m_pInternalBuf, v);
  409. return *this;
  410. }
  411. SpBuffer & SpBuffer::operator &(const SHORT&v)
  412. {
  413. WriteT(m_pInternalBuf, v);
  414. return *this;
  415. }
  416. SpBuffer & SpBuffer::operator &(const CHAR&v)
  417. {
  418. WriteT(m_pInternalBuf, v);
  419. return *this;
  420. }
  421. SpBuffer & SpBuffer::operator &(const DWORD&v)
  422. {
  423. WriteT(m_pInternalBuf, v);
  424. return *this;
  425. }
  426. SpBuffer & SpBuffer::operator &(const WORD&v)
  427. {
  428. WriteT(m_pInternalBuf, v);
  429. return *this;
  430. }
  431. SpBuffer & SpBuffer::operator &(const BYTE&v)
  432. {
  433. WriteT(m_pInternalBuf, v);
  434. return *this;
  435. }
  436. SpBuffer & SpBuffer::operator &(const FLOAT&v)
  437. {
  438. WriteT(m_pInternalBuf, v);
  439. return *this;
  440. }
  441. SpBuffer & SpBuffer::operator &(const DOUBLE&v)
  442. {
  443. WriteT(m_pInternalBuf, v);
  444. return *this;
  445. }
  446. SpBuffer & SpBuffer::operator &(const CSimpleStringA &v)
  447. {
  448. WriteT(m_pInternalBuf, v);
  449. return *this;
  450. }
  451. SpBuffer & SpBuffer::operator &(const CSimpleStringW &v)
  452. {
  453. WriteT(m_pInternalBuf, v);
  454. return *this;
  455. }
  456. SpBuffer & SpBuffer::operator &(const CBlob&v)
  457. {
  458. WriteT(m_pInternalBuf, v);
  459. return *this;
  460. }
  461. SpBuffer & SpBuffer::operator &(const CAutoArray<bool> &v)
  462. {
  463. WriteArrayT(m_pInternalBuf, v);
  464. return *this;
  465. }
  466. SpBuffer & SpBuffer::operator &(const CAutoArray<ULONGLONG> &v)
  467. {
  468. WriteArrayT(m_pInternalBuf, v);
  469. return *this;
  470. }
  471. SpBuffer & SpBuffer::operator &(const CAutoArray<LONGLONG> &v)
  472. {
  473. WriteArrayT(m_pInternalBuf, v);
  474. return *this;
  475. }
  476. SpBuffer & SpBuffer::operator &(const CAutoArray<INT> &v)
  477. {
  478. WriteArrayT(m_pInternalBuf, v);
  479. return *this;
  480. }
  481. SpBuffer & SpBuffer::operator &(const CAutoArray<SHORT> &v)
  482. {
  483. WriteArrayT(m_pInternalBuf, v);
  484. return *this;
  485. }
  486. SpBuffer & SpBuffer::operator &(const CAutoArray<CHAR> &v)
  487. {
  488. WriteArrayT(m_pInternalBuf, v);
  489. return *this;
  490. }
  491. SpBuffer & SpBuffer::operator &(const CAutoArray<DWORD> &v)
  492. {
  493. WriteArrayT(m_pInternalBuf, v);
  494. return *this;
  495. }
  496. SpBuffer & SpBuffer::operator &(const CAutoArray<WORD> &v)
  497. {
  498. WriteArrayT(m_pInternalBuf, v);
  499. return *this;
  500. }
  501. SpBuffer & SpBuffer::operator &(const CAutoArray<BYTE> &v)
  502. {
  503. WriteArrayT(m_pInternalBuf, v);
  504. return *this;
  505. }
  506. SpBuffer & SpBuffer::operator &(const CAutoArray<FLOAT> &v)
  507. {
  508. WriteArrayT(m_pInternalBuf, v);
  509. return *this;
  510. }
  511. SpBuffer & SpBuffer::operator &(const CAutoArray<DOUBLE> &v)
  512. {
  513. WriteArrayT(m_pInternalBuf, v);
  514. return *this;
  515. }
  516. SpBuffer & SpBuffer::operator &(const CAutoArray<CSimpleStringA> &v)
  517. {
  518. WriteArrayT(m_pInternalBuf, v);
  519. return *this;
  520. }
  521. SpBuffer & SpBuffer::operator &(const CAutoArray<CSimpleStringW> &v)
  522. {
  523. WriteArrayT(m_pInternalBuf, v);
  524. return *this;
  525. }
  526. SpBuffer & SpBuffer::operator &(const CAutoArray<CBlob> &v)
  527. {
  528. WriteArrayT(m_pInternalBuf, v);
  529. return *this;
  530. }
  531. #ifdef _WIN32
  532. SpBuffer& SpBuffer::operator &(UINT& v)
  533. {
  534. DoT(m_pInternalBuf, m_iMode, v);
  535. return *this;
  536. }
  537. SpBuffer& SpBuffer::operator &(const UINT& v)
  538. {
  539. WriteT(m_pInternalBuf, v);
  540. return *this;
  541. }
  542. SpBuffer& SpBuffer::operator &(CAutoArray<UINT>& v)
  543. {
  544. DoArrayT(m_pInternalBuf, m_iMode, v);
  545. return *this;
  546. }
  547. SpBuffer& SpBuffer::operator &(const CAutoArray<UINT>& v)
  548. {
  549. WriteArrayT(m_pInternalBuf, v);
  550. return *this;
  551. }
  552. SpBuffer& SpBuffer::operator &(LONG& v)
  553. {
  554. DoT(m_pInternalBuf, m_iMode, v);
  555. return *this;
  556. }
  557. SpBuffer& SpBuffer::operator &(CAutoArray<LONG>& v)
  558. {
  559. DoArrayT(m_pInternalBuf, m_iMode, v);
  560. return *this;
  561. }
  562. SpBuffer& SpBuffer::operator &(const LONG& v)
  563. {
  564. WriteT(m_pInternalBuf, v);
  565. return *this;
  566. }
  567. SpBuffer& SpBuffer::operator &(const CAutoArray<LONG>& v)
  568. {
  569. WriteArrayT(m_pInternalBuf, v);
  570. return *this;
  571. }
  572. //SpBuffer& SpBuffer::operator &(ULONG& v)
  573. //{
  574. // DoT(m_pInternalBuf, m_iMode, v);
  575. // return *this;
  576. //}
  577. //SpBuffer& SpBuffer::operator &(CAutoArray<ULONG>& v)
  578. //{
  579. // DoArrayT(m_pInternalBuf, m_iMode, v);
  580. // return *this;
  581. //}
  582. //SpBuffer& SpBuffer::operator &(const ULONG& v)
  583. //{
  584. // WriteT(m_pInternalBuf, v);
  585. // return *this;
  586. //}
  587. //SpBuffer& SpBuffer::operator &(const CAutoArray<ULONG>& v)
  588. //{
  589. // WriteArrayT(m_pInternalBuf, v);
  590. // return *this;
  591. //}
  592. #else
  593. SpBuffer& SpBuffer::operator &(CSimpleString16Bit& v)
  594. {
  595. DoT(m_pInternalBuf, m_iMode, v);
  596. return *this;
  597. }
  598. SpBuffer& SpBuffer::operator &(CAutoArray<CSimpleString16Bit>& v)
  599. {
  600. DoArrayT(m_pInternalBuf, m_iMode, v);
  601. return *this;
  602. }
  603. SpBuffer& SpBuffer::operator &(const CSimpleString16Bit& v)
  604. {
  605. WriteT(m_pInternalBuf, v);
  606. return *this;
  607. }
  608. SpBuffer& SpBuffer::operator &(const CAutoArray<CSimpleString16Bit>& v)
  609. {
  610. WriteArrayT(m_pInternalBuf, v);
  611. return *this;
  612. }
  613. #endif //_WIN32
  614. CAutoBuffer SpBuffer::ToBuffer()
  615. {
  616. CAutoBuffer Buf;
  617. int size = iobuffer_get_length(m_pInternalBuf);
  618. Buf.Init(size);
  619. if (size) {
  620. memcpy(&Buf[0], iobuffer_data(m_pInternalBuf, 0), size);
  621. }
  622. return Buf;
  623. }
  624. CBlob SpBuffer::ToBlob()
  625. {
  626. CBlob blob;
  627. int size = iobuffer_get_length(m_pInternalBuf);
  628. blob.m_bManaged = true;
  629. blob.m_iLength = size;
  630. if (size) {
  631. blob.m_pData = new char[size];
  632. memcpy(blob.m_pData, iobuffer_data(m_pInternalBuf, 0), size);
  633. }
  634. return blob;
  635. }
  636. SPBASE_API ErrorCodeEnum SpExtractClassFunctionName(const char *pszParam, CSimpleStringA &strClassName, CSimpleStringA &strFunctionName)
  637. {
  638. if (!pszParam)
  639. return Error_Null;
  640. const char *p = strstr(pszParam, "::");
  641. if (p) {
  642. if (p == pszParam) {
  643. // "::func"
  644. strClassName = "";
  645. } else {
  646. // "class::func"
  647. strClassName = CSimpleStringA(pszParam, p - pszParam);
  648. }
  649. p += 2;
  650. if (*p == '\0') {
  651. // "class::"
  652. strFunctionName = "";
  653. } else {
  654. // "class::func"
  655. strFunctionName = p;
  656. }
  657. } else {
  658. // "class"
  659. strClassName = pszParam;
  660. strFunctionName = pszParam;
  661. }
  662. return Error_Succeed;
  663. }
  664. #define ENT_ENUM_MAP(name) case EntityState_##name: return "[" #name "]"; break;
  665. SPBASE_API LPCTSTR SpStrEntityState(const EntityStateEnum state)
  666. {
  667. switch (state) {
  668. ENT_ENUM_MAP(NoStart)
  669. ENT_ENUM_MAP(Starting)
  670. ENT_ENUM_MAP(Idle)
  671. ENT_ENUM_MAP(Busy)
  672. ENT_ENUM_MAP(Pause)
  673. ENT_ENUM_MAP(UnLoading)
  674. ENT_ENUM_MAP(Lost)
  675. ENT_ENUM_MAP(Close)
  676. ENT_ENUM_MAP(Killed)
  677. ENT_ENUM_MAP(Passed)
  678. ENT_ENUM_MAP(Failed)
  679. default:
  680. break;
  681. }
  682. return "Unknown";
  683. }
  684. #undef ENT_ENUM_MAP
  685. #define ENT_ENUM_MAP(name) case CloseCause_##name: return #name; break;
  686. SPBASE_API LPCTSTR SpStrCloseCause(const EntityCloseCauseEnum cause)
  687. {
  688. switch (cause) {
  689. ENT_ENUM_MAP(Self)
  690. ENT_ENUM_MAP(Other)
  691. ENT_ENUM_MAP(Lost)
  692. ENT_ENUM_MAP(Dragged)
  693. ENT_ENUM_MAP(ShellQuit)
  694. ENT_ENUM_MAP(Crash)
  695. default:
  696. break;
  697. }
  698. return "Unknown";
  699. }
  700. #undef ENT_ENUM_MAP
  701. #define ENT_ENUM_MAP(name) case RebootTrigger_##name: return #name; break;
  702. SPBASE_API LPCTSTR SpStrRebootTrigger(const RebootTriggerEnum trigger)
  703. {
  704. switch (trigger) {
  705. ENT_ENUM_MAP(Unknown)
  706. ENT_ENUM_MAP(Period)
  707. ENT_ENUM_MAP(FrameUpgrade)
  708. ENT_ENUM_MAP(OSUpgrade)
  709. ENT_ENUM_MAP(RollBack)
  710. ENT_ENUM_MAP(FailLoad)
  711. ENT_ENUM_MAP(Resource)
  712. ENT_ENUM_MAP(RunExcepition)
  713. ENT_ENUM_MAP(RunDead)
  714. ENT_ENUM_MAP(Attacked)
  715. ENT_ENUM_MAP(Powerdown)
  716. ENT_ENUM_MAP(Repaired)
  717. ENT_ENUM_MAP(ManualLocal)
  718. ENT_ENUM_MAP(ManualRemove)
  719. ENT_ENUM_MAP(Unsubscribe)
  720. ENT_ENUM_MAP(DeadForever)
  721. default:
  722. break;
  723. }
  724. return "UnRecorded";
  725. }
  726. #undef ENT_ENUM_MAP
  727. #define ENT_ENUM_MAP(name) case RebootWay_##name: return #name; break;
  728. SPBASE_API LPCTSTR SpStrRebootWay(const RebootWayEnum way)
  729. {
  730. switch (way) {
  731. ENT_ENUM_MAP(Unknown)
  732. ENT_ENUM_MAP(Framework)
  733. ENT_ENUM_MAP(OS)
  734. ENT_ENUM_MAP(Power)
  735. default:
  736. break;
  737. }
  738. return "UnRecorded";
  739. }
  740. #undef ENT_ENUM_MAP
  741. #define ENT_ENUM_MAP(name) case AppBootState_##name: return #name; break;
  742. SPBASE_API LPCTSTR SpStrAppBootState(const AppBootStateEnum state)
  743. {
  744. static char content[128];
  745. switch (state) {
  746. ENT_ENUM_MAP(Init)
  747. ENT_ENUM_MAP(StartEntity)
  748. ENT_ENUM_MAP(CallAccessAuth)
  749. ENT_ENUM_MAP(FirstEnterMainPage)
  750. default:
  751. sprintf(content, "UnRecorded(%d)", (int)state);
  752. break;
  753. }
  754. return content;
  755. }
  756. SPBASE_API MachineTypeEnum SpStr2MachineType(const CSimpleStringA& strMachineType)
  757. {
  758. MachineTypeEnum machineType(RVC_Unknown);
  759. if (!strMachineType.IsNullOrEmpty()) {
  760. if (_stricmp(strMachineType, "RVC.Stand2S") == 0) {
  761. machineType = RVC_Stand2S;
  762. }
  763. else if (_stricmp(strMachineType, "RVC.Stand1SPlus") == 0) {
  764. machineType = RVC_Stand1SPlus;
  765. }
  766. else if (_stricmp(strMachineType, "RVC.CardStore") == 0) {
  767. machineType = RVC_CardStore;
  768. }
  769. else if (_stricmp(strMachineType, "RVC.CardPrinter") == 0) {
  770. machineType = RVC_CardPrinter;
  771. }
  772. }
  773. return machineType;
  774. }
  775. #undef ENT_ENUM_MAP