ThermalPrintFSM.cpp 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112
  1. #include "stdafx.h"
  2. #include "SpHelper.h"
  3. #include "ThermalPrintFSM.h"
  4. #include "mod_ThermalPrint.h"
  5. #include "base64.h"
  6. #include "GetDevInfoHelper.h"
  7. #include "SpUtility.h"
  8. ErrorCodeEnum CThermalPrintFSM::OnInit()
  9. {
  10. LOG_FUNCTION();
  11. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  12. ErrorCodeEnum eErrDev = Error_Succeed;
  13. CSimpleStringA csDllName(true);
  14. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  15. eErrDev = pEntity->ExtractVendorLibFullPath(csDllName);
  16. //root.ini文件未配置则置热敏打印机不可用,但是实体依然启动
  17. if(eErrDev== Error_NotConfig) {
  18. m_bSupportPrint=false;//表示不支持打印
  19. m_bDevOpen=false;//表示dev打开失败
  20. m_pCommandList=NULL;
  21. Dbg("Open device failed , thermalPrint is not support print: root.ini param is null");
  22. return Error_Succeed;
  23. }
  24. if(eErrDev!=Error_Succeed){
  25. Dbg("Fetch Vendor dllName failed %s.", (LPCTSTR)csDllName);
  26. return eErrDev;
  27. }
  28. Dbg("VendorDllName: %s.", (LPCTSTR)csDllName);
  29. eErrDev = m_hDevHelper.LoadUp(csDllName);
  30. if(eErrDev!=Error_Succeed)
  31. {
  32. Dbg("LoadUp failed %s.", (LPCTSTR)csDllName);
  33. return eErrDev;
  34. }
  35. Dbg("Get functions' addresses succed.");
  36. //获取端口和波特率
  37. eErrDev = FetchOtherParam();
  38. if(eErrDev!=Error_Succeed)
  39. {
  40. Dbg("FetchOtherParam failed.");
  41. m_hDevHelper.TearDown();
  42. return eErrDev;
  43. }
  44. Dbg("m_port is %d,m_baudrate is %d",m_port,m_baudrate);
  45. bool bOpenFlag = false;
  46. bool bCreateDevCom = false;
  47. int initCount=0, initCountMax = 3;
  48. int MilliSleepSec = 1000;
  49. do
  50. {
  51. eErrDev = m_hDevHelper->DevOpen(m_port,m_baudrate);
  52. if(eErrDev!=Error_Succeed)
  53. {
  54. LOG_THERMALPRINT_ERROR_MSG_MACRO(eErrDev, DevOpen);
  55. m_hDevHelper.TearDown();
  56. return Error_DevConnFailed;
  57. }else{
  58. m_bSupportPrint=true;//表示支持打印
  59. m_bDevOpen=true;//表示dev打开成功
  60. m_pCommandList = new list<PrintCommand*>(); //初始化指令集合
  61. Dbg("Open device succeeded.");
  62. eErrDev = Error_Succeed;
  63. }
  64. } while (0);
  65. return eErrDev;
  66. }
  67. ErrorCodeEnum CThermalPrintFSM::FetchOtherParam()
  68. {
  69. ErrorCodeEnum erroCode = Error_Unexpect;
  70. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  71. CSmartPointer<IConfigInfo> spRootConfig;
  72. erroCode = spEntityFunction->OpenConfig(Config_Root, spRootConfig);
  73. if(erroCode==Error_Succeed)
  74. {
  75. CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityBase()->GetEntityName();
  76. CSimpleStringA str;
  77. spRootConfig->ReadConfigValue(strSection, "Port", str);
  78. if(!str.IsNullOrEmpty()){
  79. spRootConfig->ReadConfigValueInt(strSection, "Port", m_port);
  80. }
  81. str.Clear();
  82. spRootConfig->ReadConfigValue(strSection, "Baudrate", str);
  83. if(!str.IsNullOrEmpty()){
  84. spRootConfig->ReadConfigValueInt(strSection, "Baudrate", m_baudrate);
  85. }
  86. }
  87. return erroCode;
  88. }
  89. ErrorCodeEnum CThermalPrintFSM::OnExit()
  90. {
  91. m_hDevHelper.TearDown();
  92. //清理打印指令
  93. if(m_pCommandList){
  94. ClearPrintCMD();
  95. delete m_pCommandList;
  96. }
  97. return Error_Succeed;
  98. }
  99. ErrorCodeEnum CThermalPrintFSM::GetPrintState(int& state , CSimpleStringA& err_msg)
  100. {
  101. if(m_bDevOpen){
  102. ThermalState thState;
  103. if(m_hDevHelper->GetDevState(thState)==Error_Succeed){
  104. Dbg("热敏检查:纸状态 %d , 硬件状态 %d",(int)thState.paperState,(int)thState.hardwareState);
  105. if(thState.hardwareState==STATE_OK){
  106. if(thState.paperState==PAPER_FULL){
  107. state=0;
  108. }else if(thState.paperState==PAPER_LOW){
  109. state=1;
  110. }else if(thState.paperState==PAPER_EMPTY){
  111. state=2;
  112. }else if(thState.paperState==PAPER_JAMMED){
  113. state=3;
  114. }else{
  115. state=4;
  116. err_msg="未知的硬件故障状态";
  117. }
  118. }else if(thState.hardwareState==STATE_OTHER_ERROR){
  119. state=4;
  120. DevErrorInfo devOpenErrInfo = {0};
  121. ThermalState thermalState;
  122. if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
  123. {
  124. err_msg = devOpenErrInfo.szErrMsg;
  125. }
  126. else
  127. {
  128. Dbg("device GetDevState failed : GetLastErrState failed.");
  129. }
  130. }else{
  131. state=4;
  132. err_msg="未知的硬件故障状态";
  133. }
  134. return Error_Succeed;
  135. }else{
  136. DevErrorInfo devOpenErrInfo = {0};
  137. if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
  138. {
  139. Dbg("device GetDevState failed : %s.", devOpenErrInfo.szErrMsg);
  140. }
  141. else
  142. {
  143. Dbg("device GetDevState failed : GetLastErr failed.");
  144. }
  145. return Error_Hardware;
  146. }
  147. }else{
  148. return Error_DevNotAvailable;
  149. }
  150. }
  151. //解析每条命令
  152. PrintCommand* CThermalPrintFSM::ParseCommand( scew_element *elem )
  153. {
  154. PrintCommand* pcd = new PrintCommand();
  155. const char *name = scew_element_name(elem);
  156. Dbg("元素名称=%s",name);
  157. if(stricmp(name,"common")==0){
  158. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "name");
  159. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  160. if(attr1&&attr2){
  161. const char *str1 = scew_attribute_value(attr1);
  162. const char *str2 = scew_attribute_value(attr2);
  163. if(stricmp(str1,"CMD_COMMON_ROW_SPACE")==0){
  164. pcd->eCommandType=CMD_COMMON_ROW_SPACE;
  165. pcd->strCommandType="行距";
  166. pcd->strCommand=str2;
  167. }else if(stricmp(str1,"CMD_COMMON_ALIGN")==0){
  168. pcd->eCommandType=CMD_COMMON_ALIGN;
  169. pcd->strCommandType="字符对齐";
  170. pcd->strCommand=str2;
  171. }else if(stricmp(str1,"CMD_COMMON_REVERSE")==0){
  172. pcd->eCommandType=CMD_COMMON_REVERSE;
  173. pcd->strCommandType="颠倒打印";
  174. pcd->strCommand=str2;
  175. }else if(stricmp(str1,"CMD_COMMON_LEFT_MARGIN")==0){
  176. pcd->eCommandType=CMD_COMMON_LEFT_MARGIN;
  177. pcd->strCommandType="左边距";
  178. pcd->strCommand=str2;
  179. }else if(stricmp(str1,"CMD_COMMON_PRINTABLE_AREA")==0){
  180. pcd->eCommandType=CMD_COMMON_PRINTABLE_AREA;
  181. pcd->strCommandType="可打印区域";
  182. pcd->strCommand=str2;
  183. }else{
  184. Dbg("common节点name属性值不支持");
  185. goto on_error;
  186. }
  187. }else{
  188. Dbg("common节点无name或value属性");
  189. goto on_error;
  190. }
  191. }else if(stricmp(name,"font")==0){
  192. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "name");
  193. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  194. if(attr1&&attr2){
  195. const char *str1 = scew_attribute_value(attr1);
  196. const char *str2 = scew_attribute_value(attr2);
  197. if(stricmp(str1,"CMD_FONT_UNDERLINE")==0){
  198. pcd->eCommandType=CMD_FONT_UNDERLINE;
  199. pcd->strCommandType="字体下划线";
  200. pcd->strCommand=str2;
  201. }else if(stricmp(str1,"CMD_FONT_BOLD")==0){
  202. pcd->eCommandType=CMD_FONT_BOLD;
  203. pcd->strCommandType="字体加粗";
  204. pcd->strCommand=str2;
  205. }else if(stricmp(str1,"CMD_FONT_INVERSE")==0){
  206. pcd->eCommandType=CMD_FONT_INVERSE;
  207. pcd->strCommandType="字体反白";
  208. pcd->strCommand=str2;
  209. }else if(stricmp(str1,"CMD_FONT_DOUBLEHEIGHT")==0){
  210. pcd->eCommandType=CMD_FONT_DOUBLEHEIGHT;
  211. pcd->strCommandType="字体倍高";
  212. pcd->strCommand=str2;
  213. }else if(stricmp(str1,"CMD_FONT_DOUBLEWIDE")==0){
  214. pcd->eCommandType=CMD_FONT_DOUBLEWIDE;
  215. pcd->strCommandType="字体倍宽";
  216. pcd->strCommand=str2;
  217. }else if(stricmp(str1,"CMD_FONT_CUSTOM_SIZE")==0){
  218. pcd->eCommandType=CMD_FONT_CUSTOM_SIZE;
  219. pcd->strCommandType="字体宽高自定义";
  220. pcd->strCommand=str2;
  221. }else if(stricmp(str1,"CMD_FONT_ROTATE")==0){
  222. pcd->eCommandType=CMD_FONT_ROTATE;
  223. pcd->strCommandType="字体旋转";
  224. pcd->strCommand=str2;
  225. }else if(stricmp(str1,"CMD_FONT_LEFT_RIGHT_SPACE")==0){
  226. pcd->eCommandType=CMD_FONT_LEFT_RIGHT_SPACE;
  227. pcd->strCommandType="字体间隔距离";
  228. pcd->strCommand=str2;
  229. }else{
  230. Dbg("font节点name属性值不支持");
  231. goto on_error;
  232. }
  233. }else{
  234. Dbg("font节点无name或value属性");
  235. goto on_error;
  236. }
  237. }else if(stricmp(name,"action")==0){
  238. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "name");
  239. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  240. if(attr1&&attr2){
  241. const char *str1 = scew_attribute_value(attr1);
  242. const char *str2 = scew_attribute_value(attr2);
  243. if(stricmp(str1,"CMD_ACTION_PRINT_ONE_LINE")==0){
  244. pcd->eCommandType=CMD_ACTION_PRINT_ONE_LINE;
  245. pcd->strCommandType="打印走纸一行";
  246. pcd->strCommand=str2;
  247. }else if(stricmp(str1,"CMD_ACTION_PRINT_MOVEFORWRAD_LINES")==0){
  248. pcd->eCommandType=CMD_ACTION_PRINT_MOVEFORWRAD_LINES;
  249. pcd->strCommandType="打印走纸N行";
  250. pcd->strCommand=str2;
  251. }else if(stricmp(str1,"CMD_ACTION_PRINT_MOVEBACKWRAD_LINES")==0){
  252. pcd->eCommandType=CMD_ACTION_PRINT_MOVEBACKWRAD_LINES;
  253. pcd->strCommandType="打印回纸N行";
  254. pcd->strCommand=str2;
  255. }else if(stricmp(str1,"CMD_ACTION_CUT_ALL")==0){
  256. pcd->eCommandType=CMD_ACTION_CUT_ALL;
  257. pcd->strCommandType="全切纸";
  258. pcd->strCommand=str2;
  259. }else if(stricmp(str1,"CMD_ACTION_CUT_HALF")==0){
  260. pcd->eCommandType=CMD_ACTION_CUT_HALF;
  261. pcd->strCommandType="半切纸";
  262. pcd->strCommand=str2;
  263. }else if(stricmp(str1,"CMD_ACTION_MOVE_TO_POSITION_RELATIVE")==0){
  264. pcd->eCommandType=CMD_ACTION_MOVE_TO_POSITION_RELATIVE;
  265. pcd->strCommandType="横向移动";
  266. pcd->strCommand=str2;
  267. }else if(stricmp(str1,"CMD_ACTION_MOVE_TO_FORWRAD_LENGTH")==0){
  268. pcd->eCommandType=CMD_ACTION_MOVE_TO_FORWRAD_LENGTH;
  269. pcd->strCommandType="纵向移动";
  270. pcd->strCommand=str2;
  271. }else if(stricmp(str1,"CMD_ACTION_MOVE_TO_BLACKMARK")==0){
  272. pcd->eCommandType=CMD_ACTION_MOVE_TO_BLACKMARK;
  273. pcd->strCommandType="移动到黑标位置";
  274. pcd->strCommand=str2;
  275. }else if(stricmp(str1,"CMD_ACTION_PRINT_MOVEBACK_TO_LINE")==0){
  276. pcd->eCommandType=CMD_ACTION_PRINT_MOVEBACK_TO_LINE;
  277. pcd->strCommandType="移动到行首";
  278. pcd->strCommand=str2;
  279. }else{
  280. Dbg("action节点name属性值不支持");
  281. goto on_error;
  282. }
  283. }else{
  284. Dbg("action节点无name或value属性");
  285. goto on_error;
  286. }
  287. }else if(stricmp(name,"text")==0){
  288. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "base64");
  289. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  290. if(attr1&&attr2){
  291. const char *str1 = scew_attribute_value(attr1);
  292. const char *str2 = scew_attribute_value(attr2);
  293. if(stricmp(str1,"0")==0 && strlen(str2)>0){
  294. Dbg("解析出来的内容:%s",str2);
  295. pcd->eCommandType=CMD_PRINT_TEXT;
  296. pcd->strCommandType="文本内容";
  297. //utf8转码,为测试使用,不测试时不需要转码
  298. char* gbkstr = ConvertUtf8ToGBK((char*)str2);
  299. Dbg("解析出来的文本:%s",gbkstr);
  300. //转义字符
  301. pcd->strCommand=decodeXmlContent((const char*)gbkstr);
  302. delete[] gbkstr;
  303. Dbg("转义出来的内容:%s",pcd->strCommand.GetData());
  304. }else if(stricmp(str1,"1")==0 && strlen(str2)>0){
  305. pcd->eCommandType=CMD_PRINT_TEXT;
  306. pcd->strCommandType="文本内容";
  307. //base64特殊处理:注意业务传送过来的是utf8格式编码的base64,
  308. CSimpleStringA decodeStr=decodeBase64Content(str2);
  309. if(decodeStr.GetLength()==0){
  310. Dbg("text节点value属性解码失败");
  311. goto on_error;
  312. }else{
  313. //Dbg("base64解码出来的内容:%s",decodeStr.GetData());
  314. char* gbkstr = ConvertUtf8ToGBK((char*)decodeStr.GetData());
  315. //Dbg("base64解码出来的内容:%s",gbkstr);
  316. pcd->strCommand=gbkstr;
  317. }
  318. }else{
  319. Dbg("text节点base64属性值不支持或者value属性值为空");
  320. goto on_error;
  321. }
  322. }else{
  323. Dbg("text节点无base64或value属性");
  324. goto on_error;
  325. }
  326. }else if(stricmp(name,"image")==0){
  327. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  328. if(attr2){
  329. const char *str2 = scew_attribute_value(attr2);
  330. if(strlen(str2)>0){
  331. pcd->eCommandType=CMD_PRINT_IMAGE;
  332. pcd->strCommandType="图片内容";
  333. pcd->strCommand=str2;
  334. }else{
  335. Dbg("image节点value属性值为空");
  336. goto on_error;
  337. }
  338. }else{
  339. Dbg("image节点无value属性");
  340. goto on_error;
  341. }
  342. }else if(stricmp(name,"barcode")==0){
  343. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "type");
  344. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  345. scew_attribute *attr3 = scew_element_attribute_by_name(elem, "param");
  346. if(attr1&&attr2&&attr3){
  347. const char *str1 = scew_attribute_value(attr1);
  348. const char *str2 = scew_attribute_value(attr2);
  349. const char *str3 = scew_attribute_value(attr3);
  350. if(strlen(str1)>0&& strlen(str2)>0&&strlen(str3)>0){
  351. pcd->eCommandType=CMD_PRINT_BARCODE;
  352. pcd->strCommandType="条形码";
  353. pcd->eBarcodeType=(BarCodeType)atoi(str1);
  354. pcd->strCommand=str2;
  355. pcd->strParam=str3;
  356. }else{
  357. Dbg("barcode节点param或value或type属性值为空");
  358. goto on_error;
  359. }
  360. }else{
  361. Dbg("barcode节点无param或value或type属性");
  362. goto on_error;
  363. }
  364. }else if(stricmp(name,"QRcode")==0){
  365. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "type");
  366. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  367. scew_attribute *attr3 = scew_element_attribute_by_name(elem, "param");
  368. if(attr1&&attr2&&attr3){
  369. const char *str1 = scew_attribute_value(attr1);
  370. const char *str2 = scew_attribute_value(attr2);
  371. const char *str3 = scew_attribute_value(attr3);
  372. if(strlen(str1)>0&& strlen(str2)>0&&strlen(str3)>0){
  373. pcd->eCommandType=CMD_PRINT_QR;
  374. pcd->strCommandType="二维码";
  375. pcd->eQRcodeType=(QRCodeType)atoi(str1);
  376. //base64特殊处理
  377. CSimpleStringA decodeStr=decodeBase64Content(str2);
  378. if(decodeStr.GetLength()==0){
  379. Dbg("QRcode节点value属性解码失败");
  380. goto on_error;
  381. }else{
  382. pcd->strCommand=decodeStr;
  383. }
  384. pcd->strParam=str3;
  385. }else{
  386. Dbg("QRcode节点param或value或type属性值为空");
  387. goto on_error;
  388. }
  389. }else{
  390. Dbg("QRcode节点无param或value或type属性");
  391. goto on_error;
  392. }
  393. }else{
  394. Dbg("%s节点不支持",name);
  395. goto on_error;
  396. }
  397. return pcd;
  398. on_error:
  399. if (pcd) {
  400. free(pcd);
  401. }
  402. return NULL;
  403. }
  404. CSimpleStringA CThermalPrintFSM::decodeBase64Content( const char* str )
  405. {
  406. CSimpleStringA decodeStr="";
  407. int decodeLen = base64_decode_len(str);
  408. char* decodeByte = new char[decodeLen];
  409. memset(decodeByte,0,decodeLen);
  410. if( base64_decode(decodeByte,str)){
  411. decodeStr = decodeByte;
  412. }
  413. delete decodeByte;
  414. return decodeStr;
  415. }
  416. CSimpleStringA CThermalPrintFSM::decodeXmlContent(const char* str)
  417. {
  418. CSimpleStringA decodeStr=str;
  419. decodeStr = replaceXmlContent(decodeStr, "&lt;", "<");
  420. decodeStr = replaceXmlContent(decodeStr, "&gt;", ">");
  421. decodeStr = replaceXmlContent(decodeStr, "&apos;", "\'");
  422. decodeStr = replaceXmlContent(decodeStr, "&quot;", "\"");
  423. decodeStr = replaceXmlContent(decodeStr, "&amp;", "&");
  424. return decodeStr;
  425. }
  426. CSimpleStringA CThermalPrintFSM::replaceXmlContent(CSimpleStringA& str,const char* regex,const char* replacement)
  427. {
  428. if(str.IsNullOrEmpty()){
  429. return str;
  430. }
  431. int index;
  432. index = str.IndexOf(regex);
  433. CSimpleStringA strNew="";
  434. if (index >= 0)
  435. {
  436. while (index >= 0)
  437. {
  438. strNew += str.SubString(0,index)+replacement;
  439. str = str.SubString(index + strlen(regex));
  440. index = str.IndexOf(regex);
  441. }
  442. strNew += str;
  443. return strNew;
  444. }
  445. return str;
  446. }
  447. ErrorCodeEnum CThermalPrintFSM::ParsePrintXml( CSimpleStringA xml )
  448. {
  449. ErrorCodeEnum ret = Error_Succeed;
  450. scew_reader *reader = NULL;
  451. scew_parser *parser = NULL;
  452. scew_tree *tree = NULL;
  453. scew_element *root = NULL; //????这个如何delete
  454. scew_list* lst = NULL;
  455. int count = 0;
  456. reader = scew_reader_buffer_create(xml.GetData(),xml.GetLength());
  457. if (!reader) {
  458. Dbg("create scew buffer reader!");
  459. ret = Error_Exception;
  460. goto on_error;
  461. }
  462. parser = scew_parser_create();
  463. tree = scew_parser_load(parser, reader);
  464. if (!tree) {
  465. scew_error code = scew_error_code();
  466. if (code == scew_error_expat) {
  467. enum XML_Error expat_code = scew_error_expat_code(parser);
  468. Dbg("scew parse error:%d, line:%d column:%d %s", expat_code, scew_error_expat_line(parser),
  469. scew_error_expat_column(parser), scew_error_expat_string(expat_code));
  470. }
  471. Dbg("parser xml failed! xml=[%s]", xml.GetData());
  472. ret = Error_Exception;
  473. goto on_error;
  474. }
  475. root = scew_tree_root(tree);
  476. if (!root) {
  477. Dbg("does not have root element!xml=[%s]", xml.GetData());
  478. ret = Error_Exception;
  479. goto on_error;
  480. }
  481. lst = scew_element_children(root);
  482. count =scew_list_size(lst);
  483. Dbg("共有%d行命令",count);
  484. if (lst) {
  485. for (scew_list *it = scew_list_first(lst); it; it = scew_list_next(it)) {
  486. scew_element* elem = (scew_element*)scew_list_data(it);
  487. PrintCommand* command = ParseCommand(elem);
  488. if (command) {
  489. m_pCommandList->push_back(command);
  490. } else {
  491. ret = Error_Exception;
  492. Dbg("parse xml object failed!");
  493. break;
  494. }
  495. }
  496. }
  497. on_error:
  498. if (tree) {
  499. scew_tree_free(tree);
  500. }
  501. if (parser) {
  502. scew_parser_free(parser);
  503. }
  504. if (reader) {
  505. scew_reader_close(reader);
  506. }
  507. return ret;
  508. }
  509. void CThermalPrintFSM::OnStateTrans( int iSrcState, int iDstState )
  510. {
  511. Dbg("[ThermalPrintFSM] State trans from %d to %d!", iSrcState, iDstState);
  512. }
  513. void CThermalPrintFSM::s0_on_entry()
  514. {
  515. LOG_FUNCTION();
  516. ScheduleTimer(1, 5000);
  517. //清理s1,s2遗留下来的打印指令
  518. ClearPrintCMD();
  519. }
  520. void CThermalPrintFSM::s0_on_exit()
  521. {
  522. LOG_FUNCTION();
  523. CancelTimer(1);
  524. }
  525. unsigned int CThermalPrintFSM::s0_on_event( FSMEvent* e )
  526. {
  527. //LOG_FUNCTION();
  528. switch(e->iEvt) {
  529. case EVT_TIMER:
  530. ScheduleTimer(1, 5000);
  531. e->SetHandled();
  532. break;
  533. case USER_EVT_PRINT:
  534. //打开闪灯
  535. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_ON, "ThermalPrint light is on.");
  536. m_bHasPrintTask = true;
  537. e->SetHandled();
  538. break;
  539. case USER_EVT_QUIT:
  540. e->SetHandled();
  541. LOG_TRACE("s0 on event quit");
  542. break;
  543. default:
  544. break;
  545. }
  546. return 0;
  547. }
  548. void CThermalPrintFSM::s1_on_entry()
  549. {
  550. LOG_FUNCTION();
  551. //检查打印机状态
  552. PreCheckPrinterTask* task = new PreCheckPrinterTask(this);
  553. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  554. }
  555. void CThermalPrintFSM::s1_on_exit()
  556. {
  557. LOG_FUNCTION();
  558. }
  559. unsigned int CThermalPrintFSM::s1_on_event( FSMEvent* e )
  560. {
  561. int ret = 0;
  562. switch(e->iEvt)
  563. {
  564. case USER_EVT_PRECHECK_FINISHED:
  565. e->SetHandled();
  566. ret = e->param1;
  567. Dbg("ret = %d",e->param1);
  568. if(ret!=0){
  569. //预检查失败
  570. //关闭闪灯,等待一段时间
  571. Sleep(3000);
  572. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_OFF, "ThermalPrint light is off.");
  573. Dbg("PreCheckPrinter is fail : errorcode [%s] , errormsg [%s]", m_errCode.GetData() ,m_errMsg.GetData());
  574. Dbg("print is fail.************************************************************");
  575. OnPreCheckFailed();
  576. m_bHasPrintTask=false;
  577. }
  578. break;
  579. default:
  580. break;
  581. }
  582. return ret;
  583. }
  584. void CThermalPrintFSM::s2_on_entry()
  585. {
  586. LOG_FUNCTION();
  587. PrintTask* task = new PrintTask(this);
  588. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  589. }
  590. void CThermalPrintFSM::s2_on_exit()
  591. {
  592. LOG_FUNCTION();
  593. }
  594. unsigned int CThermalPrintFSM::s2_on_event( FSMEvent* e )
  595. {
  596. int ret = 0;
  597. switch(e->iEvt) {
  598. case USER_EVT_PRINT_FINISHED:
  599. e->SetHandled();
  600. ret = e->param1;
  601. //关闭闪灯,等待一段时间
  602. Sleep(3000);
  603. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_OFF, "ThermalPrint light is off.");
  604. if(ret==1){
  605. //打印失败
  606. OnPrintFailed();
  607. Dbg("Print is fail.************************************************************");
  608. //打印具体错误
  609. DevErrorInfo devOpenErrInfo = {0};
  610. ThermalState thermalState;
  611. CSimpleStringA err_msg="";
  612. if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
  613. {
  614. err_msg = devOpenErrInfo.szErrMsg;
  615. Dbg("Print is fail :[%s],ThermalPaperState is %d ,ThermalHardwareState is %d ",err_msg.GetData(),thermalState.paperState,thermalState.hardwareState);
  616. }
  617. else
  618. {
  619. Dbg("Print failed : GetLastErrState failed.");
  620. }
  621. //需要reset一次
  622. if(m_hDevHelper->Reset()!=Error_Succeed){
  623. DevErrorInfo devOpenErrInfo = {0};
  624. if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
  625. {
  626. Dbg("Reset failed : [%s]", devOpenErrInfo.szErrMsg);
  627. }
  628. else
  629. {
  630. Dbg("Reset failed : GetLastErr failed.");
  631. }
  632. }else{
  633. Dbg("reset success!");
  634. }
  635. }else{
  636. //打印成功
  637. OnPrintSucc();
  638. Dbg("Print is OK.************************************************************");
  639. }
  640. m_bHasPrintTask=false;
  641. break;
  642. default:
  643. break;
  644. }
  645. return ret;
  646. }
  647. void CThermalPrintFSM::OnPreCheckFailed()
  648. {
  649. // 广播给业务,发送任务失败
  650. PrintResult evt;
  651. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  652. evt.print_Result=1;
  653. evt.error_code = CSimpleStringA2W(m_errCode);
  654. evt.error_msg = CSimpleStringA2W(m_errMsg);
  655. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  656. }
  657. void CThermalPrintFSM::OnPrintFailed()
  658. {
  659. // 广播给业务,发送任务失败
  660. PrintResult evt;
  661. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  662. evt.print_Result=1;
  663. evt.error_code = CSimpleStringA2W(m_errCode);
  664. evt.error_msg = CSimpleStringA2W(m_errMsg);
  665. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  666. }
  667. void CThermalPrintFSM::OnPrintSucc()
  668. {
  669. // 广播给业务,发送任务失败
  670. PrintResult evt;
  671. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  672. evt.print_Result=0;
  673. evt.error_code = L"";
  674. evt.error_msg = L"";
  675. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  676. }
  677. //预检查实现
  678. int CThermalPrintFSM::PreCheckPrinter()
  679. {
  680. if(m_bDevOpen){
  681. ThermalState thState;
  682. if(m_hDevHelper->GetDevState(thState)==Error_Succeed){
  683. Dbg("打印预检查:纸状态 %d , 硬件状态 %d",(int)thState.paperState,(int)thState.hardwareState);
  684. if(thState.hardwareState==STATE_OK){
  685. if(thState.paperState==PAPER_FULL){
  686. return 0;
  687. }else if(thState.paperState==PAPER_LOW){
  688. m_errCode=Error_Paper_low;
  689. m_errMsg="凭条打印机少纸";
  690. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_LOW,"thermal print paper low.");
  691. return 0;
  692. }else if(thState.paperState==PAPER_EMPTY){
  693. m_errCode=Error_Paper_empty;
  694. m_errMsg="凭条打印机缺纸";
  695. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_EMPTY,"thermal print paper empty.");
  696. return 1;
  697. }else if(thState.paperState==PAPER_JAMMED){
  698. m_errCode=Error_Paper_jammed;
  699. m_errMsg="凭条打印机卡纸";
  700. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_JAMMED,"thermal print paper jammed.");
  701. return 1;
  702. }else{
  703. m_errCode=Error_PreCheckPrint;
  704. m_errMsg="凭条打印机硬件故障:故障码未知";
  705. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault undefined.");
  706. return 1;
  707. }
  708. }else if(thState.hardwareState==STATE_OTHER_ERROR){
  709. DevErrorInfo devOpenErrInfo = {0};
  710. ThermalState thermalState;
  711. CSimpleStringA err_msg="";
  712. if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
  713. {
  714. err_msg = devOpenErrInfo.szErrMsg;
  715. }
  716. else
  717. {
  718. Dbg("device GetDevState failed : GetLastErrState failed.");
  719. }
  720. m_errCode=Error_OtherDevFault;
  721. m_errMsg="凭条打印机硬件故障:";
  722. m_errMsg.Append(err_msg);
  723. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault.");
  724. return 1;
  725. }else{
  726. m_errCode=Error_PreCheckPrint;
  727. m_errMsg="凭条打印机硬件故障:故障码未知";
  728. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault undefined.");
  729. return 1;
  730. }
  731. }else{
  732. DevErrorInfo devOpenErrInfo = {0};
  733. if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
  734. {
  735. Dbg("device GetDevState failed : %s.", devOpenErrInfo.szErrMsg);
  736. }
  737. else
  738. {
  739. Dbg("device GetDevState failed : GetLastErr failed.");
  740. }
  741. m_errCode=Error_PreCheckPrint;
  742. m_errMsg="调用热敏适配器GetDevState方法失败";
  743. return 1;
  744. }
  745. }else{
  746. m_errCode=Error_DevNotOpen;
  747. m_errMsg="厂商设备还未打开";
  748. return 1;
  749. }
  750. }
  751. //打印实现
  752. int CThermalPrintFSM::Print()
  753. {
  754. if(m_bDevOpen){
  755. //开始调用beginPrint
  756. if(m_hDevHelper->BeginPrint(m_paperType,m_paperWidth)!=Error_Succeed){
  757. //失败
  758. m_errCode=Error_Print;
  759. m_errMsg="调用热敏适配器BeginPrint方法失败";
  760. return 1;
  761. }
  762. //循环调用打印命令
  763. bool isOK =true;
  764. CSimpleStringA strCMD;
  765. list<PrintCommand*>::iterator iter;
  766. for(iter=m_pCommandList->begin();iter!=m_pCommandList->end();++iter){
  767. PrintCommand* cmd= *iter;
  768. if(cmd){
  769. strCMD = cmd->strCommandType;
  770. //执行单个命令
  771. if(ExecutePrintCMD(cmd)!=Error_Succeed){
  772. Dbg("执行%s命令失败",strCMD.GetData());
  773. //尝试把可能执行了一半的错误纸张吐出来,以免影响后面的任务
  774. m_hDevHelper->ControlAction(ACTION_CUT_ALL,1);
  775. isOK=false;
  776. break;
  777. }
  778. }else{
  779. strCMD="null";
  780. isOK=false;
  781. break;
  782. }
  783. }
  784. if(isOK){
  785. return 0;
  786. }else{
  787. m_errCode=Error_Print;
  788. m_errMsg="凭条打印机打印失败";
  789. return 1;
  790. }
  791. }else{
  792. m_errCode=Error_DevNotOpen;
  793. m_errMsg="厂商设备还未打开";
  794. return 1;
  795. }
  796. }
  797. int CThermalPrintFSM::ExecutePrintCMD(PrintCommand* cmd)
  798. {
  799. //针对不同的指令调不同的打印命令
  800. if(cmd->eCommandType<10){
  801. //CommandType
  802. return ExecuteParamCMD(cmd);
  803. }else if(cmd->eCommandType>=10&&cmd->eCommandType<100){
  804. //FontStyle
  805. return ExecuteFontCMD(cmd);
  806. }else if(cmd->eCommandType>=100&&cmd->eCommandType<200){
  807. //PrintAction
  808. return ExecuteActionCMD(cmd);
  809. }else if(cmd->eCommandType>=200){
  810. //printImage or QR
  811. return ExecuteImageCMD(cmd);
  812. }
  813. }
  814. int CThermalPrintFSM::ExecuteParamCMD(PrintCommand* cmd){
  815. DWORD value1=0;
  816. DWORD value2=0;
  817. if(cmd->eCommandType==CMD_COMMON_ROW_SPACE){
  818. value1=(DWORD)atoi(cmd->strCommand);
  819. return m_hDevHelper->SetParam(COMMON_ROW_SPACE,value1);
  820. }else if(cmd->eCommandType==CMD_COMMON_ALIGN){
  821. value1=(DWORD)atoi(cmd->strCommand);
  822. return m_hDevHelper->SetParam(COMMON_ALIGN,value1);
  823. }else if(cmd->eCommandType==CMD_COMMON_REVERSE){
  824. value1=(DWORD)atoi(cmd->strCommand);
  825. return m_hDevHelper->SetParam(COMMON_REVERSE,value1);
  826. }else if(cmd->eCommandType==CMD_COMMON_LEFT_MARGIN){
  827. value1=(DWORD)atoi(cmd->strCommand);
  828. return m_hDevHelper->SetParam(COMMON_LEFT_MARGIN,value1);
  829. }else if(cmd->eCommandType==CMD_COMMON_PRINTABLE_AREA){
  830. value1=(DWORD)atoi(cmd->strCommand);
  831. return m_hDevHelper->SetParam(COMMON_PRINTABLE_AREA,value1);
  832. }else {
  833. Dbg("打印命令不存在");
  834. return Error_Exception;
  835. }
  836. }
  837. int CThermalPrintFSM::ExecuteFontCMD(PrintCommand* cmd){
  838. DWORD value1=0;
  839. DWORD value2=0;
  840. if(cmd->eCommandType==CMD_FONT_UNDERLINE){
  841. value1=(DWORD)atoi(cmd->strCommand);
  842. return m_hDevHelper->SetFont(FONT_UNDERLINE,value1);
  843. }else if(cmd->eCommandType==CMD_FONT_BOLD){
  844. value1=(DWORD)atoi(cmd->strCommand);
  845. return m_hDevHelper->SetFont(FONT_BOLD,value1);
  846. }else if(cmd->eCommandType==CMD_FONT_INVERSE){
  847. value1=(DWORD)atoi(cmd->strCommand);
  848. return m_hDevHelper->SetFont(FONT_INVERSE,value1);
  849. }else if(cmd->eCommandType==CMD_FONT_DOUBLEHEIGHT){
  850. value1=(DWORD)atoi(cmd->strCommand);
  851. return m_hDevHelper->SetFont(FONT_DOUBLEHEIGHT,value1);
  852. }else if(cmd->eCommandType==CMD_FONT_DOUBLEWIDE){
  853. value1=(DWORD)atoi(cmd->strCommand);
  854. return m_hDevHelper->SetFont(FONT_DOUBLEWIDE,value1);
  855. }else if(cmd->eCommandType==CMD_FONT_CUSTOM_SIZE){
  856. //2个参数
  857. CAutoArray<CSimpleStringA> valueArray =cmd->strCommand.Split('|');
  858. if (valueArray.GetCount() != 2)
  859. {
  860. Dbg("CMD_FONT_CUSTOM_SIZE 参数错误:%s",cmd->strCommand.GetData());
  861. return Error_Exception;
  862. }
  863. value1 = (DWORD)atoi((LPCTSTR)valueArray[0]);
  864. value2 = (DWORD)atoi((LPCTSTR)valueArray[1]);
  865. return m_hDevHelper->SetFont(FONT_CUSTOM_SIZE,value1,value2);
  866. }else if(cmd->eCommandType==CMD_FONT_ROTATE){
  867. value1=(DWORD)atoi(cmd->strCommand);
  868. return m_hDevHelper->SetFont(FONT_ROTATE,value1);
  869. }else if(cmd->eCommandType==CMD_FONT_LEFT_RIGHT_SPACE){
  870. //暂时只支持一个参数,参数只有右边距
  871. value2=(DWORD)atoi(cmd->strCommand);
  872. return m_hDevHelper->SetFont(FONT_LEFT_RIGHT_SPACE,0,value2);
  873. }else {
  874. Dbg("打印命令不存在");
  875. return Error_Exception;
  876. }
  877. }
  878. int CThermalPrintFSM::ExecuteActionCMD(PrintCommand* cmd){
  879. DWORD value1=0;
  880. DWORD value2=0;
  881. if(cmd->eCommandType==CMD_ACTION_PRINT_ONE_LINE){
  882. value1=(DWORD)atoi(cmd->strCommand);
  883. return m_hDevHelper->ControlAction(ACTION_PRINT_ONE_LINE,value1);
  884. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEFORWRAD_LINES){
  885. value1=(DWORD)atoi(cmd->strCommand);
  886. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEFORWRAD_LINES,value1);
  887. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACKWRAD_LINES){
  888. value1=(DWORD)atoi(cmd->strCommand);
  889. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACKWRAD_LINES,value1);
  890. }else if(cmd->eCommandType==CMD_ACTION_CUT_ALL){
  891. value1=(DWORD)atoi(cmd->strCommand);
  892. return m_hDevHelper->ControlAction(ACTION_CUT_ALL,value1);
  893. }else if(cmd->eCommandType==CMD_ACTION_CUT_HALF){
  894. value1=(DWORD)atoi(cmd->strCommand);
  895. return m_hDevHelper->ControlAction(ACTION_CUT_HALF,value1);
  896. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_POSITION_RELATIVE){
  897. value1=(DWORD)atoi(cmd->strCommand);
  898. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_POSITION_RELATIVE,value1);
  899. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_FORWRAD_LENGTH){
  900. value1=(DWORD)atoi(cmd->strCommand);
  901. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_FORWRAD_LENGTH,value1);
  902. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_BLACKMARK){
  903. value1=(DWORD)atoi(cmd->strCommand);
  904. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_BLACKMARK,value1);
  905. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACK_TO_LINE){
  906. value1=(DWORD)atoi(cmd->strCommand);
  907. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACK_TO_LINE,value1);
  908. }else {
  909. Dbg("打印命令不存在");
  910. return Error_Exception;
  911. }
  912. }
  913. int CThermalPrintFSM::ExecuteImageCMD(PrintCommand* cmd){
  914. if(cmd->eCommandType==CMD_PRINT_IMAGE){
  915. Dbg("要打印的图片长度:%d",cmd->strCommand.GetLength());
  916. //int ilen = cmd->strCommand.GetLength();
  917. //int begin=0;
  918. //while(begin<ilen){
  919. // CSimpleStringA str1;
  920. // if(begin+1000<ilen){
  921. // str1 = cmd->strCommand.SubString(begin,1000);
  922. // }else{
  923. // str1 = cmd->strCommand.SubString(begin,ilen);
  924. // }
  925. // Dbg("要打印的图片内容:%s",str1.GetData());//内容超长分批打印
  926. // begin=begin+1000;
  927. //}
  928. BYTE* data = (BYTE*)cmd->strCommand.GetData();
  929. DWORD len = (DWORD)cmd->strCommand.GetLength();
  930. return m_hDevHelper->PrintImage(data,len);
  931. }else if(cmd->eCommandType==CMD_PRINT_TEXT){
  932. //Dbg("要打印的文本长度:%d",cmd->strCommand.GetLength());
  933. //Dbg("要打印的文本内容:%s",cmd->strCommand.GetData());
  934. BYTE* data = (BYTE*)cmd->strCommand.GetData();
  935. DWORD len = (DWORD)cmd->strCommand.GetLength();
  936. return m_hDevHelper->PrintText(data,len);
  937. }else if(cmd->eCommandType==CMD_PRINT_BARCODE){
  938. //3个参数
  939. //CAutoArray<CSimpleStringA> valueArray =cmd->strParam.Split('|');
  940. //if (valueArray.GetCount() != 3)
  941. //{
  942. // Dbg("CMD_PRINT_BARCODE 参数错误:%s",cmd->strParam.GetData());
  943. // return Error_Exception;
  944. //}
  945. //BarCodeType eType = cmd->eBarcodeType;
  946. //BYTE* data = (BYTE*)cmd->strCommand.GetData();
  947. //DWORD len = (DWORD)cmd->strCommand.GetLength();
  948. //DWORD unitWidth = (DWORD)atoi((LPCTSTR)valueArray[0]);
  949. //DWORD height =(DWORD)atoi((LPCTSTR)valueArray[1]);
  950. //HriPosition position =(HriPosition)atoi((LPCTSTR)valueArray[2]);
  951. //return m_hDevHelper->PrintBarCode(eType,data,len,unitWidth,height,position);
  952. Dbg("CMD_PRINT_BARCODE 打印命令暂不支持");
  953. return Error_Exception;
  954. }else if(cmd->eCommandType==CMD_PRINT_QR){
  955. Dbg("CMD_PRINT_QR 打印命令暂不支持");
  956. return Error_Exception;
  957. }else {
  958. Dbg("打印命令不存在");
  959. return Error_Exception;
  960. }
  961. }
  962. void CThermalPrintFSM::ClearPrintCMD()
  963. {
  964. if(m_pCommandList){
  965. //循环删除里面的对象
  966. list<PrintCommand*>::iterator iter;
  967. for(iter=m_pCommandList->begin();iter!=m_pCommandList->end();++iter){
  968. PrintCommand* cmd= *iter;
  969. delete cmd;
  970. }
  971. //清空集合
  972. m_pCommandList->clear();
  973. }
  974. }
  975. char* CThermalPrintFSM::ConvertUtf8ToGBK(char* strUtf8)
  976. {
  977. #if defined(RVC_OS_WIN)
  978. int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
  979. WCHAR* wszGBK = new WCHAR[len + 1];
  980. memset(wszGBK, 0, len * 2 + 2);
  981. MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
  982. len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  983. char* szGBK = new char[len + 1];
  984. memset(szGBK, 0, len + 1);
  985. WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
  986. delete[] wszGBK;
  987. return szGBK;
  988. #else
  989. std::string str(strUtf8);
  990. std::string result = SP::Utility::UTF8ToGBK(str);
  991. const int len = result.length();
  992. char* szGBK = new char[len + 1];
  993. memset(szGBK, 0, len + 1);
  994. strcpy(szGBK, result.c_str());
  995. return szGBK;
  996. #endif //RVC_OS_WIN
  997. }