ThermalPrintFSM.cpp 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123
  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. #ifdef RVC_OS_WIN
  299. char* gbkstr = ConvertUtf8ToGBK((char*)str2);
  300. Dbg("解析出来的文本:%s",gbkstr);
  301. //转义字符
  302. pcd->strCommand = decodeXmlContent((const char*)gbkstr);
  303. delete[] gbkstr;
  304. Dbg("转义出来的内容:%s",pcd->strCommand.GetData());
  305. #else
  306. Dbg("解析出来的文本:%s", str2);
  307. //转义字符
  308. pcd->strCommand = decodeXmlContent(str2);
  309. Dbg("转义出来的内容:%s", pcd->strCommand.GetData());
  310. #endif // RVC_OS_WIN
  311. }else if(stricmp(str1,"1")==0 && strlen(str2)>0){
  312. pcd->eCommandType=CMD_PRINT_TEXT;
  313. pcd->strCommandType="文本内容";
  314. //base64特殊处理:注意业务传送过来的是utf8格式编码的base64,
  315. CSimpleStringA decodeStr=decodeBase64Content(str2);
  316. if(decodeStr.GetLength()==0){
  317. Dbg("text节点value属性解码失败");
  318. goto on_error;
  319. }else{
  320. //Dbg("base64解码出来的内容:%s",decodeStr.GetData());
  321. #ifdef RVC_OS_WIN
  322. char* gbkstr = ConvertUtf8ToGBK((char*)decodeStr.GetData());//windows机用GBK编码
  323. //Dbg("base64解码出来的内容:%s",gbkstr);
  324. pcd->strCommand = gbkstr;
  325. delete[] gbkstr;
  326. #else
  327. pcd->strCommand = decodeStr;
  328. #endif // RVC_OS_WIN
  329. }
  330. }else{
  331. Dbg("text节点base64属性值不支持或者value属性值为空");
  332. goto on_error;
  333. }
  334. }else{
  335. Dbg("text节点无base64或value属性");
  336. goto on_error;
  337. }
  338. }else if(stricmp(name,"image")==0){
  339. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  340. if(attr2){
  341. const char *str2 = scew_attribute_value(attr2);
  342. if(strlen(str2)>0){
  343. pcd->eCommandType=CMD_PRINT_IMAGE;
  344. pcd->strCommandType="图片内容";
  345. pcd->strCommand=str2;
  346. }else{
  347. Dbg("image节点value属性值为空");
  348. goto on_error;
  349. }
  350. }else{
  351. Dbg("image节点无value属性");
  352. goto on_error;
  353. }
  354. }else if(stricmp(name,"barcode")==0){
  355. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "type");
  356. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  357. scew_attribute *attr3 = scew_element_attribute_by_name(elem, "param");
  358. if(attr1&&attr2&&attr3){
  359. const char *str1 = scew_attribute_value(attr1);
  360. const char *str2 = scew_attribute_value(attr2);
  361. const char *str3 = scew_attribute_value(attr3);
  362. if(strlen(str1)>0&& strlen(str2)>0&&strlen(str3)>0){
  363. pcd->eCommandType=CMD_PRINT_BARCODE;
  364. pcd->strCommandType="条形码";
  365. pcd->eBarcodeType=(BarCodeType)atoi(str1);
  366. pcd->strCommand=str2;
  367. pcd->strParam=str3;
  368. }else{
  369. Dbg("barcode节点param或value或type属性值为空");
  370. goto on_error;
  371. }
  372. }else{
  373. Dbg("barcode节点无param或value或type属性");
  374. goto on_error;
  375. }
  376. }else if(stricmp(name,"QRcode")==0){
  377. scew_attribute *attr1 = scew_element_attribute_by_name(elem, "type");
  378. scew_attribute *attr2 = scew_element_attribute_by_name(elem, "value");
  379. scew_attribute *attr3 = scew_element_attribute_by_name(elem, "param");
  380. if(attr1&&attr2&&attr3){
  381. const char *str1 = scew_attribute_value(attr1);
  382. const char *str2 = scew_attribute_value(attr2);
  383. const char *str3 = scew_attribute_value(attr3);
  384. if(strlen(str1)>0&& strlen(str2)>0&&strlen(str3)>0){
  385. pcd->eCommandType=CMD_PRINT_QR;
  386. pcd->strCommandType="二维码";
  387. pcd->eQRcodeType=(QRCodeType)atoi(str1);
  388. //base64特殊处理
  389. CSimpleStringA decodeStr=decodeBase64Content(str2);
  390. if(decodeStr.GetLength()==0){
  391. Dbg("QRcode节点value属性解码失败");
  392. goto on_error;
  393. }else{
  394. pcd->strCommand=decodeStr;
  395. }
  396. pcd->strParam=str3;
  397. }else{
  398. Dbg("QRcode节点param或value或type属性值为空");
  399. goto on_error;
  400. }
  401. }else{
  402. Dbg("QRcode节点无param或value或type属性");
  403. goto on_error;
  404. }
  405. }else{
  406. Dbg("%s节点不支持",name);
  407. goto on_error;
  408. }
  409. return pcd;
  410. on_error:
  411. if (pcd) {
  412. free(pcd);
  413. }
  414. return NULL;
  415. }
  416. CSimpleStringA CThermalPrintFSM::decodeBase64Content( const char* str )
  417. {
  418. CSimpleStringA decodeStr="";
  419. int decodeLen = base64_decode_len(str);
  420. char* decodeByte = new char[decodeLen];
  421. memset(decodeByte,0,decodeLen);
  422. if( base64_decode(decodeByte,str)){
  423. decodeStr = decodeByte;
  424. }
  425. delete decodeByte;
  426. return decodeStr;
  427. }
  428. CSimpleStringA CThermalPrintFSM::decodeXmlContent(const char* str)
  429. {
  430. CSimpleStringA decodeStr=str;
  431. decodeStr = replaceXmlContent(decodeStr, "&lt;", "<");
  432. decodeStr = replaceXmlContent(decodeStr, "&gt;", ">");
  433. decodeStr = replaceXmlContent(decodeStr, "&apos;", "\'");
  434. decodeStr = replaceXmlContent(decodeStr, "&quot;", "\"");
  435. decodeStr = replaceXmlContent(decodeStr, "&amp;", "&");
  436. return decodeStr;
  437. }
  438. CSimpleStringA CThermalPrintFSM::replaceXmlContent(CSimpleStringA& str,const char* regex,const char* replacement)
  439. {
  440. if(str.IsNullOrEmpty()){
  441. return str;
  442. }
  443. int index;
  444. index = str.IndexOf(regex);
  445. CSimpleStringA strNew="";
  446. if (index >= 0)
  447. {
  448. while (index >= 0)
  449. {
  450. strNew += str.SubString(0,index)+replacement;
  451. str = str.SubString(index + strlen(regex));
  452. index = str.IndexOf(regex);
  453. }
  454. strNew += str;
  455. return strNew;
  456. }
  457. return str;
  458. }
  459. ErrorCodeEnum CThermalPrintFSM::ParsePrintXml( CSimpleStringA xml )
  460. {
  461. ErrorCodeEnum ret = Error_Succeed;
  462. scew_reader *reader = NULL;
  463. scew_parser *parser = NULL;
  464. scew_tree *tree = NULL;
  465. scew_element *root = NULL; //????这个如何delete
  466. scew_list* lst = NULL;
  467. int count = 0;
  468. reader = scew_reader_buffer_create(xml.GetData(),xml.GetLength());
  469. if (!reader) {
  470. Dbg("create scew buffer reader!");
  471. ret = Error_Exception;
  472. goto on_error;
  473. }
  474. parser = scew_parser_create();
  475. tree = scew_parser_load(parser, reader);
  476. if (!tree) {
  477. scew_error code = scew_error_code();
  478. if (code == scew_error_expat) {
  479. enum XML_Error expat_code = scew_error_expat_code(parser);
  480. Dbg("scew parse error:%d, line:%d column:%d %s", expat_code, scew_error_expat_line(parser),
  481. scew_error_expat_column(parser), scew_error_expat_string(expat_code));
  482. }
  483. Dbg("parser xml failed! xml=[%s]", xml.GetData());
  484. ret = Error_Exception;
  485. goto on_error;
  486. }
  487. root = scew_tree_root(tree);
  488. if (!root) {
  489. Dbg("does not have root element!xml=[%s]", xml.GetData());
  490. ret = Error_Exception;
  491. goto on_error;
  492. }
  493. lst = scew_element_children(root);
  494. count =scew_list_size(lst);
  495. Dbg("共有%d行命令",count);
  496. if (lst) {
  497. for (scew_list *it = scew_list_first(lst); it; it = scew_list_next(it)) {
  498. scew_element* elem = (scew_element*)scew_list_data(it);
  499. PrintCommand* command = ParseCommand(elem);
  500. if (command) {
  501. m_pCommandList->push_back(command);
  502. } else {
  503. ret = Error_Exception;
  504. Dbg("parse xml object failed!");
  505. break;
  506. }
  507. }
  508. }
  509. on_error:
  510. if (tree) {
  511. scew_tree_free(tree);
  512. }
  513. if (parser) {
  514. scew_parser_free(parser);
  515. }
  516. if (reader) {
  517. scew_reader_close(reader);
  518. }
  519. return ret;
  520. }
  521. void CThermalPrintFSM::OnStateTrans( int iSrcState, int iDstState )
  522. {
  523. Dbg("[ThermalPrintFSM] State trans from %d to %d!", iSrcState, iDstState);
  524. }
  525. void CThermalPrintFSM::s0_on_entry()
  526. {
  527. LOG_FUNCTION();
  528. ScheduleTimer(1, 5000);
  529. //清理s1,s2遗留下来的打印指令
  530. ClearPrintCMD();
  531. }
  532. void CThermalPrintFSM::s0_on_exit()
  533. {
  534. LOG_FUNCTION();
  535. CancelTimer(1);
  536. }
  537. unsigned int CThermalPrintFSM::s0_on_event( FSMEvent* e )
  538. {
  539. //LOG_FUNCTION();
  540. switch(e->iEvt) {
  541. case EVT_TIMER:
  542. ScheduleTimer(1, 5000);
  543. e->SetHandled();
  544. break;
  545. case USER_EVT_PRINT:
  546. //打开闪灯
  547. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_ON, "ThermalPrint light is on.");
  548. m_bHasPrintTask = true;
  549. e->SetHandled();
  550. break;
  551. case USER_EVT_QUIT:
  552. e->SetHandled();
  553. LOG_TRACE("s0 on event quit");
  554. break;
  555. default:
  556. break;
  557. }
  558. return 0;
  559. }
  560. void CThermalPrintFSM::s1_on_entry()
  561. {
  562. LOG_FUNCTION();
  563. //检查打印机状态
  564. PreCheckPrinterTask* task = new PreCheckPrinterTask(this);
  565. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  566. }
  567. void CThermalPrintFSM::s1_on_exit()
  568. {
  569. LOG_FUNCTION();
  570. }
  571. unsigned int CThermalPrintFSM::s1_on_event( FSMEvent* e )
  572. {
  573. int ret = 0;
  574. switch(e->iEvt)
  575. {
  576. case USER_EVT_PRECHECK_FINISHED:
  577. e->SetHandled();
  578. ret = e->param1;
  579. Dbg("ret = %d",e->param1);
  580. if(ret!=0){
  581. //预检查失败
  582. //关闭闪灯,等待一段时间
  583. Sleep(3000);
  584. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_OFF, "ThermalPrint light is off.");
  585. Dbg("PreCheckPrinter is fail : errorcode [%s] , errormsg [%s]", m_errCode.GetData() ,m_errMsg.GetData());
  586. Dbg("print is fail.************************************************************");
  587. OnPreCheckFailed();
  588. m_bHasPrintTask=false;
  589. }
  590. break;
  591. default:
  592. break;
  593. }
  594. return ret;
  595. }
  596. void CThermalPrintFSM::s2_on_entry()
  597. {
  598. LOG_FUNCTION();
  599. PrintTask* task = new PrintTask(this);
  600. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  601. }
  602. void CThermalPrintFSM::s2_on_exit()
  603. {
  604. LOG_FUNCTION();
  605. }
  606. unsigned int CThermalPrintFSM::s2_on_event( FSMEvent* e )
  607. {
  608. int ret = 0;
  609. switch(e->iEvt) {
  610. case USER_EVT_PRINT_FINISHED:
  611. e->SetHandled();
  612. ret = e->param1;
  613. //关闭闪灯,等待一段时间
  614. Sleep(3000);
  615. LogEvent(Severity_Middle, LOG_EVT_THERMAL_PRINTER_GREEN_OFF, "ThermalPrint light is off.");
  616. if(ret==1){
  617. //打印失败
  618. OnPrintFailed();
  619. Dbg("Print is fail.************************************************************");
  620. //打印具体错误
  621. DevErrorInfo devOpenErrInfo = {0};
  622. ThermalState thermalState;
  623. CSimpleStringA err_msg="";
  624. if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
  625. {
  626. err_msg = devOpenErrInfo.szErrMsg;
  627. Dbg("Print is fail :[%s],ThermalPaperState is %d ,ThermalHardwareState is %d ",err_msg.GetData(),thermalState.paperState,thermalState.hardwareState);
  628. }
  629. else
  630. {
  631. Dbg("Print failed : GetLastErrState failed.");
  632. }
  633. //需要reset一次
  634. if(m_hDevHelper->Reset()!=Error_Succeed){
  635. DevErrorInfo devOpenErrInfo = {0};
  636. if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
  637. {
  638. Dbg("Reset failed : [%s]", devOpenErrInfo.szErrMsg);
  639. }
  640. else
  641. {
  642. Dbg("Reset failed : GetLastErr failed.");
  643. }
  644. }else{
  645. Dbg("reset success!");
  646. }
  647. }else{
  648. //打印成功
  649. OnPrintSucc();
  650. Dbg("Print is OK.************************************************************");
  651. }
  652. m_bHasPrintTask=false;
  653. break;
  654. default:
  655. break;
  656. }
  657. return ret;
  658. }
  659. void CThermalPrintFSM::OnPreCheckFailed()
  660. {
  661. // 广播给业务,发送任务失败
  662. PrintResult evt;
  663. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  664. evt.print_Result=1;
  665. evt.error_code = CSimpleStringA2W(m_errCode);
  666. evt.error_msg = CSimpleStringA2W(m_errMsg);
  667. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  668. }
  669. void CThermalPrintFSM::OnPrintFailed()
  670. {
  671. // 广播给业务,发送任务失败
  672. PrintResult evt;
  673. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  674. evt.print_Result=1;
  675. evt.error_code = CSimpleStringA2W(m_errCode);
  676. evt.error_msg = CSimpleStringA2W(m_errMsg);
  677. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  678. }
  679. void CThermalPrintFSM::OnPrintSucc()
  680. {
  681. // 广播给业务,发送任务失败
  682. PrintResult evt;
  683. evt.uuid = CSimpleStringA2W(m_PrintTaskUUID);
  684. evt.print_Result=0;
  685. evt.error_code = L"";
  686. evt.error_msg = L"";
  687. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PrintResult), SP_MSG_SIG_OF(PrintResult), evt);
  688. }
  689. //预检查实现
  690. int CThermalPrintFSM::PreCheckPrinter()
  691. {
  692. if(m_bDevOpen){
  693. ThermalState thState;
  694. if(m_hDevHelper->GetDevState(thState)==Error_Succeed){
  695. Dbg("打印预检查:纸状态 %d , 硬件状态 %d",(int)thState.paperState,(int)thState.hardwareState);
  696. if(thState.hardwareState==STATE_OK){
  697. if(thState.paperState==PAPER_FULL){
  698. return 0;
  699. }else if(thState.paperState==PAPER_LOW){
  700. m_errCode=Error_Paper_low;
  701. m_errMsg="凭条打印机少纸";
  702. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_LOW,"thermal print paper low.");
  703. return 0;
  704. }else if(thState.paperState==PAPER_EMPTY){
  705. m_errCode=Error_Paper_empty;
  706. m_errMsg="凭条打印机缺纸";
  707. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_EMPTY,"thermal print paper empty.");
  708. return 1;
  709. }else if(thState.paperState==PAPER_JAMMED){
  710. m_errCode=Error_Paper_jammed;
  711. m_errMsg="凭条打印机卡纸";
  712. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_PAPER_JAMMED,"thermal print paper jammed.");
  713. return 1;
  714. }else{
  715. m_errCode=Error_PreCheckPrint;
  716. m_errMsg="凭条打印机硬件故障:故障码未知";
  717. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault undefined.");
  718. return 1;
  719. }
  720. }else if(thState.hardwareState==STATE_OTHER_ERROR){
  721. DevErrorInfo devOpenErrInfo = {0};
  722. ThermalState thermalState;
  723. CSimpleStringA err_msg="";
  724. if((m_hDevHelper->GetLastErrState(thermalState,devOpenErrInfo))==Error_Succeed)
  725. {
  726. err_msg = devOpenErrInfo.szErrMsg;
  727. }
  728. else
  729. {
  730. Dbg("device GetDevState failed : GetLastErrState failed.");
  731. }
  732. m_errCode=Error_OtherDevFault;
  733. m_errMsg="凭条打印机硬件故障:";
  734. m_errMsg.Append(err_msg);
  735. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault.");
  736. return 1;
  737. }else{
  738. m_errCode=Error_PreCheckPrint;
  739. m_errMsg="凭条打印机硬件故障:故障码未知";
  740. LogWarn(Severity_Middle,Error_Unexpect,LOG_ERR_THERMAL_PRINTER_OTHER_DEV_FAULT,"thermal print other dev fault undefined.");
  741. return 1;
  742. }
  743. }else{
  744. DevErrorInfo devOpenErrInfo = {0};
  745. if((m_hDevHelper->GetLastErr(devOpenErrInfo))==Error_Succeed)
  746. {
  747. Dbg("device GetDevState failed : %s.", devOpenErrInfo.szErrMsg);
  748. }
  749. else
  750. {
  751. Dbg("device GetDevState failed : GetLastErr failed.");
  752. }
  753. m_errCode=Error_PreCheckPrint;
  754. m_errMsg="调用热敏适配器GetDevState方法失败";
  755. return 1;
  756. }
  757. }else{
  758. m_errCode=Error_DevNotOpen;
  759. m_errMsg="厂商设备还未打开";
  760. return 1;
  761. }
  762. }
  763. //打印实现
  764. int CThermalPrintFSM::Print()
  765. {
  766. if(m_bDevOpen){
  767. //开始调用beginPrint
  768. if(m_hDevHelper->BeginPrint(m_paperType,m_paperWidth)!=Error_Succeed){
  769. //失败
  770. m_errCode=Error_Print;
  771. m_errMsg="调用热敏适配器BeginPrint方法失败";
  772. return 1;
  773. }
  774. //循环调用打印命令
  775. bool isOK =true;
  776. CSimpleStringA strCMD;
  777. list<PrintCommand*>::iterator iter;
  778. for(iter=m_pCommandList->begin();iter!=m_pCommandList->end();++iter){
  779. PrintCommand* cmd= *iter;
  780. if(cmd){
  781. strCMD = cmd->strCommandType;
  782. //执行单个命令
  783. if(ExecutePrintCMD(cmd)!=Error_Succeed){
  784. Dbg("执行%s命令失败",strCMD.GetData());
  785. //尝试把可能执行了一半的错误纸张吐出来,以免影响后面的任务
  786. m_hDevHelper->ControlAction(ACTION_CUT_ALL,1);
  787. isOK=false;
  788. break;
  789. }
  790. }else{
  791. strCMD="null";
  792. isOK=false;
  793. break;
  794. }
  795. }
  796. if(isOK){
  797. return 0;
  798. }else{
  799. m_errCode=Error_Print;
  800. m_errMsg="凭条打印机打印失败";
  801. return 1;
  802. }
  803. }else{
  804. m_errCode=Error_DevNotOpen;
  805. m_errMsg="厂商设备还未打开";
  806. return 1;
  807. }
  808. }
  809. int CThermalPrintFSM::ExecutePrintCMD(PrintCommand* cmd)
  810. {
  811. //针对不同的指令调不同的打印命令
  812. if(cmd->eCommandType<10){
  813. //CommandType
  814. return ExecuteParamCMD(cmd);
  815. }else if(cmd->eCommandType>=10&&cmd->eCommandType<100){
  816. //FontStyle
  817. return ExecuteFontCMD(cmd);
  818. }else if(cmd->eCommandType>=100&&cmd->eCommandType<200){
  819. //PrintAction
  820. return ExecuteActionCMD(cmd);
  821. }else if(cmd->eCommandType>=200){
  822. //printImage or QR
  823. return ExecuteImageCMD(cmd);
  824. }
  825. }
  826. int CThermalPrintFSM::ExecuteParamCMD(PrintCommand* cmd){
  827. DWORD value1=0;
  828. DWORD value2=0;
  829. if(cmd->eCommandType==CMD_COMMON_ROW_SPACE){
  830. value1=(DWORD)atoi(cmd->strCommand);
  831. return m_hDevHelper->SetParam(COMMON_ROW_SPACE,value1);
  832. }else if(cmd->eCommandType==CMD_COMMON_ALIGN){
  833. value1=(DWORD)atoi(cmd->strCommand);
  834. return m_hDevHelper->SetParam(COMMON_ALIGN,value1);
  835. }else if(cmd->eCommandType==CMD_COMMON_REVERSE){
  836. value1=(DWORD)atoi(cmd->strCommand);
  837. return m_hDevHelper->SetParam(COMMON_REVERSE,value1);
  838. }else if(cmd->eCommandType==CMD_COMMON_LEFT_MARGIN){
  839. value1=(DWORD)atoi(cmd->strCommand);
  840. return m_hDevHelper->SetParam(COMMON_LEFT_MARGIN,value1);
  841. }else if(cmd->eCommandType==CMD_COMMON_PRINTABLE_AREA){
  842. value1=(DWORD)atoi(cmd->strCommand);
  843. return m_hDevHelper->SetParam(COMMON_PRINTABLE_AREA,value1);
  844. }else {
  845. Dbg("打印命令不存在");
  846. return Error_Exception;
  847. }
  848. }
  849. int CThermalPrintFSM::ExecuteFontCMD(PrintCommand* cmd){
  850. DWORD value1=0;
  851. DWORD value2=0;
  852. if(cmd->eCommandType==CMD_FONT_UNDERLINE){
  853. value1=(DWORD)atoi(cmd->strCommand);
  854. return m_hDevHelper->SetFont(FONT_UNDERLINE,value1);
  855. }else if(cmd->eCommandType==CMD_FONT_BOLD){
  856. value1=(DWORD)atoi(cmd->strCommand);
  857. return m_hDevHelper->SetFont(FONT_BOLD,value1);
  858. }else if(cmd->eCommandType==CMD_FONT_INVERSE){
  859. value1=(DWORD)atoi(cmd->strCommand);
  860. return m_hDevHelper->SetFont(FONT_INVERSE,value1);
  861. }else if(cmd->eCommandType==CMD_FONT_DOUBLEHEIGHT){
  862. value1=(DWORD)atoi(cmd->strCommand);
  863. return m_hDevHelper->SetFont(FONT_DOUBLEHEIGHT,value1);
  864. }else if(cmd->eCommandType==CMD_FONT_DOUBLEWIDE){
  865. value1=(DWORD)atoi(cmd->strCommand);
  866. return m_hDevHelper->SetFont(FONT_DOUBLEWIDE,value1);
  867. }else if(cmd->eCommandType==CMD_FONT_CUSTOM_SIZE){
  868. //2个参数
  869. CAutoArray<CSimpleStringA> valueArray =cmd->strCommand.Split('|');
  870. if (valueArray.GetCount() != 2)
  871. {
  872. Dbg("CMD_FONT_CUSTOM_SIZE 参数错误:%s",cmd->strCommand.GetData());
  873. return Error_Exception;
  874. }
  875. value1 = (DWORD)atoi((LPCTSTR)valueArray[0]);
  876. value2 = (DWORD)atoi((LPCTSTR)valueArray[1]);
  877. return m_hDevHelper->SetFont(FONT_CUSTOM_SIZE,value1,value2);
  878. }else if(cmd->eCommandType==CMD_FONT_ROTATE){
  879. value1=(DWORD)atoi(cmd->strCommand);
  880. return m_hDevHelper->SetFont(FONT_ROTATE,value1);
  881. }else if(cmd->eCommandType==CMD_FONT_LEFT_RIGHT_SPACE){
  882. //暂时只支持一个参数,参数只有右边距
  883. value2=(DWORD)atoi(cmd->strCommand);
  884. return m_hDevHelper->SetFont(FONT_LEFT_RIGHT_SPACE,0,value2);
  885. }else {
  886. Dbg("打印命令不存在");
  887. return Error_Exception;
  888. }
  889. }
  890. int CThermalPrintFSM::ExecuteActionCMD(PrintCommand* cmd){
  891. DWORD value1=0;
  892. DWORD value2=0;
  893. if(cmd->eCommandType==CMD_ACTION_PRINT_ONE_LINE){
  894. value1=(DWORD)atoi(cmd->strCommand);
  895. return m_hDevHelper->ControlAction(ACTION_PRINT_ONE_LINE,value1);
  896. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEFORWRAD_LINES){
  897. value1=(DWORD)atoi(cmd->strCommand);
  898. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEFORWRAD_LINES,value1);
  899. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACKWRAD_LINES){
  900. value1=(DWORD)atoi(cmd->strCommand);
  901. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACKWRAD_LINES,value1);
  902. }else if(cmd->eCommandType==CMD_ACTION_CUT_ALL){
  903. value1=(DWORD)atoi(cmd->strCommand);
  904. return m_hDevHelper->ControlAction(ACTION_CUT_ALL,value1);
  905. }else if(cmd->eCommandType==CMD_ACTION_CUT_HALF){
  906. value1=(DWORD)atoi(cmd->strCommand);
  907. return m_hDevHelper->ControlAction(ACTION_CUT_HALF,value1);
  908. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_POSITION_RELATIVE){
  909. value1=(DWORD)atoi(cmd->strCommand);
  910. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_POSITION_RELATIVE,value1);
  911. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_FORWRAD_LENGTH){
  912. value1=(DWORD)atoi(cmd->strCommand);
  913. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_FORWRAD_LENGTH,value1);
  914. }else if(cmd->eCommandType==CMD_ACTION_MOVE_TO_BLACKMARK){
  915. value1=(DWORD)atoi(cmd->strCommand);
  916. return m_hDevHelper->ControlAction(ACTION_MOVE_TO_BLACKMARK,value1);
  917. }else if(cmd->eCommandType==CMD_ACTION_PRINT_MOVEBACK_TO_LINE){
  918. value1=(DWORD)atoi(cmd->strCommand);
  919. return m_hDevHelper->ControlAction(ACTION_PRINT_MOVEBACK_TO_LINE,value1);
  920. }else {
  921. Dbg("打印命令不存在");
  922. return Error_Exception;
  923. }
  924. }
  925. int CThermalPrintFSM::ExecuteImageCMD(PrintCommand* cmd){
  926. if(cmd->eCommandType==CMD_PRINT_IMAGE){
  927. Dbg("要打印的图片长度:%d",cmd->strCommand.GetLength());
  928. //int ilen = cmd->strCommand.GetLength();
  929. //int begin=0;
  930. //while(begin<ilen){
  931. // CSimpleStringA str1;
  932. // if(begin+1000<ilen){
  933. // str1 = cmd->strCommand.SubString(begin,1000);
  934. // }else{
  935. // str1 = cmd->strCommand.SubString(begin,ilen);
  936. // }
  937. // Dbg("要打印的图片内容:%s",str1.GetData());//内容超长分批打印
  938. // begin=begin+1000;
  939. //}
  940. BYTE* data = (BYTE*)cmd->strCommand.GetData();
  941. DWORD len = (DWORD)cmd->strCommand.GetLength();
  942. return m_hDevHelper->PrintImage(data,len);
  943. }else if(cmd->eCommandType==CMD_PRINT_TEXT){
  944. //Dbg("要打印的文本长度:%d",cmd->strCommand.GetLength());
  945. //Dbg("要打印的文本内容:%s",cmd->strCommand.GetData());
  946. BYTE* data = (BYTE*)cmd->strCommand.GetData();
  947. DWORD len = (DWORD)cmd->strCommand.GetLength();
  948. return m_hDevHelper->PrintText(data,len);
  949. }else if(cmd->eCommandType==CMD_PRINT_BARCODE){
  950. //3个参数
  951. //CAutoArray<CSimpleStringA> valueArray =cmd->strParam.Split('|');
  952. //if (valueArray.GetCount() != 3)
  953. //{
  954. // Dbg("CMD_PRINT_BARCODE 参数错误:%s",cmd->strParam.GetData());
  955. // return Error_Exception;
  956. //}
  957. //BarCodeType eType = cmd->eBarcodeType;
  958. //BYTE* data = (BYTE*)cmd->strCommand.GetData();
  959. //DWORD len = (DWORD)cmd->strCommand.GetLength();
  960. //DWORD unitWidth = (DWORD)atoi((LPCTSTR)valueArray[0]);
  961. //DWORD height =(DWORD)atoi((LPCTSTR)valueArray[1]);
  962. //HriPosition position =(HriPosition)atoi((LPCTSTR)valueArray[2]);
  963. //return m_hDevHelper->PrintBarCode(eType,data,len,unitWidth,height,position);
  964. Dbg("CMD_PRINT_BARCODE 打印命令暂不支持");
  965. return Error_Exception;
  966. }else if(cmd->eCommandType==CMD_PRINT_QR){
  967. Dbg("CMD_PRINT_QR 打印命令暂不支持");
  968. return Error_Exception;
  969. }else {
  970. Dbg("打印命令不存在");
  971. return Error_Exception;
  972. }
  973. }
  974. void CThermalPrintFSM::ClearPrintCMD()
  975. {
  976. if(m_pCommandList){
  977. //循环删除里面的对象
  978. list<PrintCommand*>::iterator iter;
  979. for(iter=m_pCommandList->begin();iter!=m_pCommandList->end();++iter){
  980. PrintCommand* cmd= *iter;
  981. delete cmd;
  982. }
  983. //清空集合
  984. m_pCommandList->clear();
  985. }
  986. }
  987. char* CThermalPrintFSM::ConvertUtf8ToGBK(char* strUtf8)
  988. {
  989. #if defined(RVC_OS_WIN)
  990. int len = MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, NULL, 0);
  991. WCHAR* wszGBK = new WCHAR[len + 1];
  992. memset(wszGBK, 0, len * 2 + 2);
  993. MultiByteToWideChar(CP_UTF8, 0, strUtf8, -1, wszGBK, len);
  994. len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
  995. char* szGBK = new char[len + 1];
  996. memset(szGBK, 0, len + 1);
  997. WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, szGBK, len, NULL, NULL);
  998. delete[] wszGBK;
  999. return szGBK;
  1000. #else
  1001. std::string str(strUtf8);
  1002. std::string result = SP::Utility::UTF8ToGBK(str);
  1003. const int len = result.length();
  1004. char* szGBK = new char[len + 1];
  1005. memset(szGBK, 0, len + 1);
  1006. strcpy(szGBK, result.c_str());
  1007. return szGBK;
  1008. #endif //RVC_OS_WIN
  1009. }