uo_ljws_engine.sru 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. $PBExportHeader$uo_ljws_engine.sru
  2. forward
  3. global type uo_ljws_engine from olecustomcontrol
  4. end type
  5. end forward
  6. global type uo_ljws_engine from olecustomcontrol
  7. integer width = 128
  8. integer height = 112
  9. borderstyle borderstyle = stylelowered!
  10. boolean focusrectangle = false
  11. string binarykey = "uo_ljws_engine.udo"
  12. integer textsize = -12
  13. integer weight = 400
  14. fontcharset fontcharset = ansi!
  15. fontpitch fontpitch = variable!
  16. fontfamily fontfamily = swiss!
  17. string facename = "Arial"
  18. long textcolor = 33554432
  19. event ocx_error ( integer number, string description, long scode, string source, string helpfile, long helpcontext, boolean canceldisplay )
  20. event dataarrival ( long bytestotal )
  21. event ocx_connect ( )
  22. event connectionrequest ( long requestid )
  23. event ocx_close ( )
  24. event sendprogress ( long bytessent, long bytesremaining )
  25. event sendcomplete ( )
  26. event ue_getdatacomplete ( blob arg_bdata )
  27. event timer pbm_timer
  28. event ue_error ( string error_msg )
  29. event ue_thread_dataarrival ( )
  30. event ue_startsend ( )
  31. event ue_send ( )
  32. event ue_thread_send ( )
  33. event ue_thread_getdatacomplete ( )
  34. end type
  35. global uo_ljws_engine uo_ljws_engine
  36. type variables
  37. uo_thread_ws ins_obj_thread
  38. long listenport=7896//监听端口(默认8000)
  39. string remotehost='127.0.0.1'//远程主机名(默认127.0.0.1)
  40. long remoteport=7896 //远程端口(默认8000)
  41. string separator //分割符
  42. long ins_sendblob_size=21000000 // 数据包上限19.9M
  43. long ins_frame_size=1000 // 数据帧上限
  44. long Compress_level =3 //1~9 ->慢
  45. string ins_msg='' //错误信息存放
  46. window parentwindow_p
  47. PROTECTEDWRITE long ins_self_max_cmdid=1 //当前命令ID增量,新命令则+1后取
  48. PROTECTEDWRITE long ins_cur_cmdid=0 //当前执行的命令ID
  49. PROTECTEDWRITE long ins_cur_cmd_staus=0 //当前执行命令状态,0-执行中,1-完成,-1失败
  50. PROTECTEDWRITE blob ins_send_blob_ori //未经处理的要发送的原blob
  51. PROTECTEDWRITE blob ins_send_blob_compress//压缩后的blob
  52. PROTECTEDWRITE blob ins_acc_blob_ori //未经处理的dataarrival事件接收到的原blob
  53. PROTECTEDWRITE blob ins_acc_blob_compress //压缩后的blob
  54. blob ins_dataarrival_blob
  55. PROTECTEDWRITE long ins_send_total=0 //当前次发送数据的总帧数
  56. PROTECTEDWRITE long ins_send_pos=0 //当前次发送数据帧序号
  57. long ins_get_total=0 //当前次接收数据的总帧数
  58. long ins_get_pos=0 //当前次接收数据帧序号
  59. //long ins_client_cmdID=0 //客户端命令ID
  60. //long ins_server_cmdID=0 //服务端命令ID
  61. private blob ins_acc_temp//存放分包合并后完整的命令(string类型)
  62. //private blob ins_cmd_blob//(未解压数据)临时存放数据,每接收到分包都加进此blob
  63. private OLEObject ins_ZIPObject
  64. boolean ins_cancel_flag=false//取消操作标志
  65. end variables
  66. forward prototypes
  67. public subroutine reset ()
  68. public subroutine close ()
  69. public subroutine connecttoserver (string arg_remotehost, long arg_remoteport)
  70. public subroutine connecttoserver ()
  71. public function long getstate ()
  72. public function string getstatemsg ()
  73. public function integer send (blob arg_blob)
  74. private function integer send_fn (long arg_dataframeno)
  75. private function integer decompress ()
  76. private function blob getframeblob (long arg_dataposition)
  77. private function integer getdataframe (blob arg_blobdata)
  78. public subroutine listen ()
  79. private function long get_newcmdid ()
  80. private function blob p_getframeblob (s_dataframe arg_sdf)
  81. private function s_dataframe p_getframestru (blob arg_bdata)
  82. private function integer compress ()
  83. public subroutine setlistenport (long arg_listenport)
  84. public function integer send (string arg_str)
  85. public function integer send ()
  86. end prototypes
  87. event dataarrival(long bytestotal);//ins_obj_thread.of_runue('ue_thread_dataarrival')
  88. this.postevent('ue_thread_dataarrival')
  89. //blob lb_data
  90. //long rslt
  91. //
  92. //this.object.getdata(ref lb_data)//获取blob数据
  93. //
  94. //rslt=getdataframe(lb_data)
  95. //if rslt=0 then
  96. // ins_msg='解释接收数据错误>'+ins_msg
  97. // this.postevent('ue_error')
  98. //end if
  99. end event
  100. event connectionrequest(long requestid);if this.object.state <> 0 then
  101. this.object.close()
  102. end if
  103. this.object.accept(requestID)
  104. end event
  105. event ocx_close();this.object.close()
  106. end event
  107. event timer;//1秒检测一次连接状态
  108. choose case this.object.state()
  109. case 0
  110. // st_msg.text="关闭"
  111. // ib_listen = false
  112. case 1
  113. // st_msg.text="打开"
  114. // ib_listen = true
  115. case 2
  116. // st_msg.text="侦听"
  117. // ib_listen = true
  118. case 3
  119. // st_msg.text="连接挂起"
  120. case 4
  121. // st_msg.text="识别主机"
  122. case 5
  123. // st_msg.text="已识别主机"
  124. case 6
  125. // st_msg.text="正在连接"
  126. case 7
  127. // st_msg.text="已连接"
  128. case 8
  129. // st_msg.text="同级人员正在关闭连接"
  130. this.reset()
  131. //this.object.close()
  132. this.triggerevent('ocx_close')
  133. case 9
  134. // st_msg.text="错误"
  135. this.reset()
  136. //this.object.close()
  137. this.triggerevent('ocx_close')
  138. end choose
  139. end event
  140. event ue_thread_dataarrival();blob lb_data
  141. long rslt
  142. this.object.getdata(ref lb_data)//获取blob数据
  143. lb_data = blob ( String(lb_data,EncodingAnsi!) )
  144. rslt=getdataframe(lb_data)
  145. if rslt=0 then
  146. ins_msg='解释接收数据错误>'+ins_msg
  147. this.postevent('ue_error')
  148. end if
  149. end event
  150. event ue_thread_send();this.postevent('ue_send')
  151. end event
  152. event ue_thread_getdatacomplete();this.postevent('ue_thread_getdatacomplete')
  153. end event
  154. public subroutine reset ();ins_acc_temp=blob('')
  155. ins_send_blob_ori=blob('')
  156. ins_acc_blob_compress=blob('')
  157. ins_cur_cmdid=0
  158. end subroutine
  159. public subroutine close ();this.object.close()
  160. end subroutine
  161. public subroutine connecttoserver (string arg_remotehost, long arg_remoteport);// //使用参数的连接属性连接
  162. //IF THIS.Object.State <> 0 THEN
  163. // THIS.Object.Close()
  164. //END IF
  165. //remotehost = arg_remotehost
  166. //remoteport = arg_remoteport
  167. //THIS.Object.protocol = 0
  168. //THIS.Object.remotehost = arg_remotehost
  169. //THIS.Object.remoteport = arg_remoteport
  170. //
  171. //
  172. //THIS.Object.Connect()
  173. //
  174. remotehost = arg_remotehost
  175. remoteport = arg_remoteport
  176. THIS.ConnectToServer()
  177. end subroutine
  178. public subroutine connecttoserver ();//使用默认连接属性连接,默认连接属性可通过直接给remotehost和remoteport赋值实现
  179. IF THIS.Object.State <> 0 THEN
  180. THIS.Object.Close()
  181. END IF
  182. THIS.Object.protocol = 0
  183. THIS.Object.remotehost = remotehost
  184. THIS.Object.remoteport = remoteport
  185. THIS.Object.Connect()
  186. end subroutine
  187. public function long getstate ();return this.object.state()
  188. end function
  189. public function string getstatemsg ();choose case this.object.state()
  190. case 0
  191. return "关闭"
  192. case 1
  193. return "打开"
  194. case 2
  195. return "侦听"
  196. case 3
  197. return "连接挂起"
  198. case 4
  199. return "识别主机"
  200. case 5
  201. return "已识别主机"
  202. case 6
  203. return "正在连接"
  204. case 7
  205. return "已连接"
  206. case 8
  207. return "同级人员正在关闭连接"
  208. case 9
  209. return "错误"
  210. end choose
  211. end function
  212. public function integer send (blob arg_blob);//发送数据的启动函数
  213. //1.压缩
  214. //2.分包发送->this.send()
  215. Long rslt = 1
  216. Long ls_len
  217. string ls_sendmsg
  218. ins_msg = ''
  219. IF IsNull(arg_blob) OR Len(arg_blob) = 0 THEN
  220. ins_msg = '没有发送内容'
  221. rslt = 0
  222. GOTO ext
  223. END IF
  224. ////Unicode码
  225. //BlobBuf = ToUnicode(Left(sMsg, 1024))//FromUnicode()
  226. ////Ascii码
  227. ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi()
  228. ////BlobBuf = Blob(Left(sMsg, 1024))
  229. //转化成ToUnicode(ls_sendmsg)
  230. ls_sendmsg = String(arg_blob,EncodingAnsi!)
  231. arg_blob = Blob(ls_sendmsg,EncodingUTF16LE!)
  232. ins_send_blob_ori = arg_blob
  233. rslt = THIS.Send()
  234. ext:
  235. RETURN rslt
  236. //////////////////////////////////////////////////////////////////////////压缩处理
  237. //////压缩dll不能在c#中使用
  238. ////rslt = compress( ) //ins_send_blob压缩=>ins_send_blob_compress
  239. ////IF rslt = 0 THEN
  240. //// ins_msg = '发送失败>'+ins_msg
  241. //// GOTO ext
  242. ////END IF
  243. ////
  244. ////ls_len = Len(ins_send_blob_compress) //总长
  245. //
  246. /////////////////////////////////////////////////////////////////////计算总包数
  247. //ls_len = Len(ins_send_blob_ori) //总长
  248. //IF Mod(ls_len,ins_frame_size) = 0 THEN
  249. // ins_send_total = Int(ls_len/ins_frame_size)
  250. //ELSE
  251. // ins_send_total = Int(ls_len/ins_frame_size)+1
  252. //END IF
  253. //
  254. //////////////////////////////////////////////////////////////////////获取本次发包id
  255. //ins_cur_cmdid = get_newcmdid()
  256. //
  257. /////////////////////////////////////////////////////////////////////分包发送数据
  258. ////发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现
  259. //rslt = send_fn(1)
  260. //IF rslt = 0 THEN
  261. // ins_msg = '发送失败>'+ins_msg
  262. // GOTO ext
  263. //END IF
  264. //
  265. //ext:
  266. //RETURN rslt
  267. //
  268. //
  269. end function
  270. private function integer send_fn (long arg_dataframeno);Long ls_state
  271. ls_state = THIS.getstate()
  272. IF ls_state = 7 THEN
  273. THIS.Object.senddata(getframeblob(arg_dataframeno))
  274. RETURN 1
  275. ELSE
  276. ins_msg = "连接失败,状态:"+String(ls_state)
  277. RETURN 0
  278. END IF
  279. end function
  280. private function integer decompress ();Blob lb_null
  281. SetNull(lb_null)
  282. Long l_rslt
  283. Long l_destLen
  284. Long rslt = 1 //0 -失败 ,1-成功
  285. //l_destLen=ins_frame_size*10
  286. l_destLen = ins_frame_size*10000 //这个参数的意义?????????
  287. IF l_destLen < 1000000 THEN
  288. l_destLen = 1000000
  289. END IF
  290. IF NOT Len(ins_acc_blob_compress) > 0 OR IsNull(ins_acc_blob_compress) THEN
  291. ins_msg = '没有要解压缩的数据'
  292. rslt = 0
  293. GOTO ext
  294. END IF
  295. Long ll_status = 0
  296. String a_msg
  297. //if isvalid(ins_zipobject)=false then
  298. ll_status = ins_zipobject.ConnectToNewObject("longjoebz2.bz2")
  299. IF ll_status < 0 THEN
  300. CHOOSE CASE ll_status
  301. CASE -1
  302. a_msg = "Invalid Call: the argument is the Object property of a control"
  303. CASE -2
  304. a_msg = "Class name not found"
  305. CASE -3
  306. a_msg = "Object could not be created"
  307. CASE -4
  308. a_msg = "Could not connect to object"
  309. CASE -9
  310. a_msg = "Other error"
  311. END CHOOSE
  312. ins_msg = a_msg
  313. rslt = 0
  314. GOTO ext
  315. END IF
  316. //处理解压缩
  317. ins_acc_blob_ori = ins_acc_blob_compress
  318. l_rslt = ins_zipobject.z2DeCompressData(REF ins_acc_blob_ori, l_destLen)
  319. IF l_rslt <> 0 THEN //失败
  320. ins_msg = '解压缩调用失败'
  321. rslt = 0
  322. ins_acc_blob_ori = lb_null
  323. GOTO ext
  324. END IF
  325. ext:
  326. RETURN rslt
  327. end function
  328. private function blob getframeblob (long arg_dataposition);//获得包数为arg_dataposition的分包ins_send_blob_compress数据
  329. Long ls_total //总包数
  330. Long ls_len //长度
  331. Blob rslt_b
  332. rslt_b = Blob('')
  333. s_dataframe s_sdf
  334. IF arg_dataposition > ins_send_total THEN
  335. ins_msg = '不合理包序号,'+String(arg_dataposition)+'/'+String(ins_send_total)
  336. GOTO ext
  337. END IF
  338. s_sdf.cmdid = ins_cur_cmdid
  339. s_sdf.totalp = ins_send_total
  340. s_sdf.posp = arg_dataposition
  341. //if arg_dataposition=ls_total then
  342. IF arg_dataposition = ins_send_total THEN
  343. s_sdf.blobdata = BlobMid(ins_send_blob_ori,(arg_dataposition - 1) * ins_frame_size + 1)
  344. ELSE
  345. s_sdf.blobdata = BlobMid(ins_send_blob_ori,(arg_dataposition - 1) * ins_frame_size + 1,ins_frame_size)
  346. END IF
  347. rslt_b = THIS.p_getframeblob(s_sdf)
  348. //生成帧的序号
  349. ins_send_pos = arg_dataposition
  350. ext:
  351. RETURN rslt_b
  352. end function
  353. private function integer getdataframe (blob arg_blobdata);//获取分包数据,判断数据是否已经全收完
  354. //没有发完就继续发
  355. Long l_nextframeno
  356. Long rslt
  357. Boolean if_getdatafinish = FALSE
  358. String ls_strblib
  359. ins_cancel_flag = FALSE //2006.7.8
  360. //THIS.Object.senddata(ToUnicode("[getping]"))
  361. IF String(BlobMid(arg_blobdata,1,Len("[ping]"))) = "[ping]" THEN
  362. IF THIS.getstate() = 7 THEN
  363. THIS.Object.senddata(Blob("[getping]",EncodingUTF16LE!))
  364. //THIS.Object.senddata(ToAnsi ("[getping]"))
  365. END IF
  366. GOTO ext
  367. ELSEIF String(BlobMid(arg_blobdata,1,Len("[getping]"))) = "[getping]" THEN
  368. GOTO ext
  369. ELSEIF String(BlobMid(arg_blobdata,1,Len("[datapos]"))) = "[datapos]" THEN //发包中,继续发包。。。
  370. ls_strblib = String(arg_blobdata)
  371. l_nextframeno = Long(Mid(ls_strblib,Len("[datapos]")+1))
  372. IF l_nextframeno > 0 AND l_nextframeno <= ins_send_total THEN
  373. //发下一个包
  374. rslt = send_fn(l_nextframeno)
  375. IF rslt = 0 THEN
  376. if_getdatafinish = FALSE
  377. ins_msg = '下一个数据包发送失败>'+ins_msg
  378. GOTO ext
  379. END IF
  380. END IF
  381. GOTO ext
  382. ELSEIF String(BlobMid(arg_blobdata,1,Len("[cancel]"))) = "[cancel]" THEN //2006.7.8***
  383. if_getdatafinish = FALSE
  384. ins_cancel_flag = TRUE
  385. ins_msg = '取消命令>'+ins_msg
  386. GOTO ext //2006.7.8******
  387. END IF
  388. /////////////////////////////////////////////// //接收数据包处理
  389. s_dataframe s_sdf
  390. // s_sdf.totalp //获取总包数
  391. // s_sdf.posp//获取的是第几包
  392. s_sdf = p_getframestru( arg_blobdata) //解释接收到的数据
  393. IF s_sdf.Error <> 0 THEN
  394. ins_msg = '接收失败>'+ins_msg
  395. GOTO ext
  396. END IF
  397. IF s_sdf.totalp > 0 AND s_sdf.posp > 0 THEN
  398. IF s_sdf.totalp > s_sdf.posp THEN
  399. IF s_sdf.posp = 1 THEN //收到第一个数据包
  400. ins_acc_temp = s_sdf.blobdata
  401. ELSE //收到其他部分数据包
  402. ins_acc_temp = ins_acc_temp + s_sdf.blobdata
  403. END IF
  404. THIS.Object.senddata(Blob("[datapos]"+String(s_sdf.posp + 1),EncodingUTF16LE!)) //请求下一数据包
  405. if_getdatafinish = FALSE
  406. ELSEIF s_sdf.totalp <= s_sdf.posp THEN
  407. IF s_sdf.totalp = 1 THEN
  408. ins_acc_temp = s_sdf.blobdata
  409. ELSE
  410. ins_acc_temp = ins_acc_temp + s_sdf.blobdata
  411. END IF
  412. if_getdatafinish = TRUE //如果所有数据包传送完毕返回true
  413. END IF
  414. END IF
  415. //////////////////////////////////////////////////////////// //接收完数据,解压,读取
  416. IF if_getdatafinish THEN //如果所有数据包传送完毕返回true
  417. // ins_acc_blob_compress = ins_acc_temp
  418. // rslt = decompress() //ins_acc_blob_compress=>ins_acc_blob_ori
  419. // IF rslt = 0 THEN
  420. // ins_msg = '接收数据完毕,解压失败>'
  421. // END IF
  422. //messagebox(string(len(ins_acc_blob_compress)),string(len(ins_acc_blob_ori)))
  423. ins_acc_blob_ori = ins_acc_temp
  424. ins_acc_temp = Blob('') //reset ins_acc_temp
  425. EVENT ue_getdatacomplete(ins_acc_blob_ori)
  426. ELSE
  427. IF ins_cancel_flag THEN //取消操作
  428. ins_acc_temp = Blob('') //reset ins_acc_temp
  429. END IF
  430. END IF
  431. //////////////////////////////////////////////////////////////// //
  432. ext:
  433. RETURN rslt
  434. end function
  435. public subroutine listen ();IF THIS.Object.State() <> 0 THEN
  436. THIS.Object.Close()
  437. END IF
  438. THIS.Object.localport = listenport //用默认端口
  439. THIS.Object.Listen()
  440. end subroutine
  441. private function long get_newcmdid ();ins_self_max_cmdid=ins_self_max_cmdid+1
  442. return ins_self_max_cmdid
  443. end function
  444. private function blob p_getframeblob (s_dataframe arg_sdf);//从帧结构返回blob
  445. /*
  446. long cmdID //本次命令ID ,对象内自增量 ,0-错误数据格式
  447. long totalp //总包数
  448. long posp //当前包数
  449. blob blobdata //数据包,可能是压缩的
  450. */
  451. blob b_data
  452. b_data=Blob(string(arg_sdf.cmdID) + separator + &
  453. string(arg_sdf.totalp) + separator+ &
  454. string(arg_sdf.posp) + separator,EncodingUTF16LE!) + &
  455. arg_sdf.blobdata
  456. return b_data
  457. end function
  458. private function s_dataframe p_getframestru (blob arg_bdata);//从blob返回数据帧结构内容
  459. s_dataframe s_df
  460. /*
  461. s_dataframe
  462. long cmdID //本次命令ID ,对象内自增量 ,0-错误数据格式
  463. long totalp //总包数
  464. long posp //当前包数
  465. blob blobdata //数据包,可能是压缩的
  466. */
  467. Long ls_p1 = 0,ls_p2 = 0,ls_p3 = 0,ls_len,li = 0
  468. Long lens,ls_separator_no = 0
  469. string ls_str, ls_str1
  470. lens = Len(separator) * 2
  471. ls_len = Len(arg_bdata)
  472. IF ls_len < lens*3+3 THEN
  473. s_df.Error = 1
  474. GOTO ext
  475. END IF
  476. ls_str = string(arg_bdata, EncodingANSI!)
  477. FOR li = 1 TO ls_len step 2
  478. ls_str = String(BlobMid(arg_bdata,li,lens))
  479. IF ls_str = separator THEN
  480. ls_separator_no = ls_separator_no+1
  481. IF ls_separator_no = 1 THEN //cmdID 的位置
  482. ls_p1 = li
  483. ELSEIF ls_separator_no = 2 THEN //totalp 位置
  484. ls_p2 = li
  485. ELSEIF ls_separator_no = 3 THEN //posp 位置
  486. ls_p3 = li
  487. EXIT
  488. END IF
  489. END IF
  490. NEXT
  491. IF ls_p3 = 0 THEN
  492. s_df.Error = 1 //没数据
  493. GOTO ext
  494. END IF
  495. s_df.cmdID = Long(String(BlobMid(arg_bdata,1,ls_p1 - 1)))
  496. s_df.totalp = Long(String(BlobMid(arg_bdata,ls_p1+lens,ls_p2 - ls_p1 - lens)))
  497. s_df.posp = Long(String(BlobMid(arg_bdata,ls_p2+lens,ls_p3 - ls_p2 - lens)))
  498. s_df.blobdata = BlobMid(arg_bdata,ls_p3+lens)
  499. IF s_df.cmdID <= 0 OR s_df.totalp <= 0 OR s_df.posp <= 0 THEN
  500. s_df.Error = 2 //有数据但是不对
  501. GOTO ext
  502. ELSE
  503. s_df.Error = 0 //正确
  504. END IF
  505. ext:
  506. RETURN s_df
  507. end function
  508. private function integer compress ();Blob lb_null
  509. SetNull(lb_null)
  510. Long l_rslt
  511. Long rslt = 1 //0 -失败 ,1-成功
  512. IF NOT Len(ins_send_blob_ori) > 0 OR IsNull(ins_send_blob_ori) THEN
  513. ins_msg = '没有要压缩的数据'
  514. rslt = 0
  515. GOTO ext
  516. END IF
  517. //压缩代码
  518. Long ll_status = 0
  519. String a_msg
  520. //if isvalid(ins_zipobject)=false then
  521. ll_status = ins_zipobject.ConnectToNewObject("longjoebz2.bz2")
  522. IF ll_status < 0 THEN
  523. CHOOSE CASE ll_status
  524. CASE -1
  525. a_msg = "Invalid Call: the argument is the Object property of a control"
  526. CASE -2
  527. a_msg = "Class name not found"
  528. CASE -3
  529. a_msg = "Object could not be created"
  530. CASE -4
  531. a_msg = "Could not connect to object"
  532. CASE -9
  533. a_msg = "Other error"
  534. END CHOOSE
  535. ins_msg = a_msg
  536. rslt = 0
  537. GOTO ext
  538. END IF
  539. //处理压缩
  540. ins_send_blob_compress = ins_send_blob_ori
  541. l_rslt = ins_zipobject.z2CompressData(REF ins_send_blob_compress , Compress_level ) //第二参数是压缩等级
  542. //messagebox('压缩'+string(len(ins_send_blob_compress)),len(ins_send_blob_ori))
  543. IF l_rslt <> 0 THEN //失败
  544. ins_msg = '压缩调用失败'
  545. rslt = 0
  546. ins_send_blob_compress = lb_null
  547. GOTO ext
  548. END IF
  549. ext:
  550. RETURN rslt
  551. end function
  552. public subroutine setlistenport (long arg_listenport);listenport=arg_listenport
  553. //this.listen()
  554. end subroutine
  555. public function integer send (string arg_str);//发送数据的启动函数
  556. //1.压缩
  557. //2.分包发送->this.send()
  558. Long rslt = 1
  559. Long ls_len
  560. ins_msg = ''
  561. IF IsNull(arg_str) OR Len(arg_str) = 0 THEN
  562. ins_msg = '没有发送内容'
  563. rslt = 0
  564. GOTO ext
  565. END IF
  566. //Unicode码
  567. ins_send_blob_ori = Blob(arg_str,EncodingUTF16LE!)//FromUnicode()
  568. ////Ascii码
  569. ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi()
  570. ////BlobBuf = Blob(Left(sMsg, 1024))
  571. rslt = THIS.Send()
  572. ext:
  573. RETURN rslt
  574. /////////////////////////////////////////////////////////////////////计算总包数
  575. //ls_len = Len(ins_send_blob_ori) //总长
  576. //IF Mod(ls_len,ins_frame_size) = 0 THEN
  577. // ins_send_total = Int(ls_len/ins_frame_size)
  578. //ELSE
  579. // ins_send_total = Int(ls_len/ins_frame_size)+1
  580. //END IF
  581. //
  582. //////////////////////////////////////////////////////////////////////获取本次发包id
  583. //ins_cur_cmdid = get_newcmdid()
  584. //
  585. /////////////////////////////////////////////////////////////////////分包发送数据
  586. ////发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现
  587. //rslt = send_fn(1)
  588. //IF rslt = 0 THEN
  589. // ins_msg = '发送失败>'+ins_msg
  590. // GOTO ext
  591. //END IF
  592. //
  593. //ext:
  594. //RETURN rslt
  595. //
  596. //
  597. end function
  598. public function integer send ();//发送数据的启动函数
  599. //1.压缩
  600. //2.分包发送->this.send()
  601. Long rslt = 1
  602. Long ls_len
  603. ins_msg = ''
  604. //Unicode码
  605. //ins_send_blob_ori = ToUnicode(arg_str)//FromUnicode()
  606. ////Ascii码
  607. ////BlobBuf = ToAnsi(Left(sMsg, 1024))//FromAnsi()
  608. ////BlobBuf = Blob(Left(sMsg, 1024))
  609. ////////////////////////////////////////////////////////////////////////压缩处理
  610. ////压缩dll不能在c#中使用
  611. //rslt = compress( ) //ins_send_blob压缩=>ins_send_blob_compress
  612. //IF rslt = 0 THEN
  613. // ins_msg = '发送失败>'+ins_msg
  614. // GOTO ext
  615. //END IF
  616. //
  617. //ls_len = Len(ins_send_blob_compress) //总长
  618. ///////////////////////////////////////////////////////////////////计算总包数
  619. ls_len = Len(ins_send_blob_ori) //总长
  620. if ls_len = 0 then
  621. ins_msg = '没有发送内容'
  622. rslt = 0
  623. GOTO ext
  624. end if
  625. IF Mod(ls_len,ins_frame_size) = 0 THEN
  626. ins_send_total = Int(ls_len/ins_frame_size)
  627. ELSE
  628. ins_send_total = Int(ls_len/ins_frame_size)+1
  629. END IF
  630. ////////////////////////////////////////////////////////////////////获取本次发包id
  631. ins_cur_cmdid = get_newcmdid()
  632. ///////////////////////////////////////////////////////////////////分包发送数据
  633. //发送第一个包,待包发送成功并返回信息时继续发包,在getdataframe处实现
  634. rslt = send_fn(1)
  635. IF rslt = 0 THEN
  636. ins_msg = '发送失败>'+ins_msg
  637. GOTO ext
  638. END IF
  639. ext:
  640. RETURN rslt
  641. end function
  642. on uo_ljws_engine.create
  643. end on
  644. on uo_ljws_engine.destroy
  645. end on
  646. event destructor;destroy ins_ZIPObject
  647. this.object.close()
  648. end event
  649. event constructor;///cjh
  650. ///cjh@longserve.com
  651. ///2006-3
  652. ins_frame_size=long(profilestring('ljprj_wiz.ini','longjoews','frame_size','1000'))
  653. // 封装基本的通讯及压缩功能
  654. ins_ZIPObject=create OLEObject
  655. //listenport=sys_listenport
  656. //separator=char(17)+char(18)
  657. separator=char(17)
  658. parentwindow_p = getparent() //获得祖先
  659. end event
  660. Start of PowerBuilder Binary Data Section : Do NOT Edit
  661. 0Fuo_ljws_engine.bin
  662. 2500000c00e011cfd0e11ab1a1000000000000000000000000000000000003003e0009fffe000000060000000000000000000000010000000100000000000010000000000200000001fffffffe0000000000000000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000004fffffffefffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006f00520074006f004500200074006e00790072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050016ffffffffffffffff00000003000000000000000000000000000000000000000000000000000000000417c8a001cbc90800000003000001000000000000500003004c004200430049004e0045004500530045004b000000590000000000000000000000000000000000000000000000000000000000000000000000000002001cffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000480000000000500003004f0042005800430054005300450052004d0041000000000000000000000000000000000000000000000000000000000000000000000000000000000002001affffffffffffffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000020000002800000000004200500043004f00530058004f00540041005200450047000000000000000000000000000000000000000000000000000000000000000000000000000000000101001a000000020000000100000004248dd89611cfbb458000bc9a8db7e7c7000000000417c8a001cbc9080417c8a001cbc90800000000000000000000000000000001fffffffefffffffefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
  663. 21ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006300320039003400380066003000300063002d00640032002d006400310031006600630039002d00640061002d00360030003000300038003700630037006500370062006400380043003b005c003a007200500067006f006100720020006d006900460065006c005c00730079005300610062006500730053005c004c00511234432100000008000002e5000002e5248dd8920006000000000000000000000000000000000000005c003a007200500067006f006100720020006d006900461234432100000008000002e5000002e5248dd89200060000000000000000000000000000000000000072006500200065003000310053005c006200790073006100200065006500430074006e006100720020006c002e0035002e0030005c0030006900770033006e003b0032003a00430050005c006f007200720067006d006100460020006c0069007300650053005c0062007900730061005c0065006f00500065007700420072006900750064006c0072006500310020002e0031003b0035003a00430057005c004e0049004f004400530057004d005c00630069006f0072006f007300740066004e002e005400450046005c006100720065006d006f0077006b00720076005c002e0032002e00300030003500320037003b003700000000013d002200ff00fe0015028800150288fffffffe00000000fffffffffffffffe006f00430074006e006e00650073007400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001020012ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000300000028000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
  664. 1Fuo_ljws_engine.bin
  665. End of PowerBuilder Binary Data Section : No Source Expected After This Point