$PBExportHeader$w_updown.srw forward global type w_updown from window end type type cb_1 from uo_imflatbutton within w_updown end type type lb_1 from listbox within w_updown end type type dw_1 from datawindow within w_updown end type type cb_8 from uo_imflatbutton within w_updown end type type st_5 from statictext within w_updown end type type st_1 from statictext within w_updown end type type gb_2 from groupbox within w_updown end type end forward global type w_updown from window integer width = 1993 integer height = 900 boolean titlebar = true string title = "企精灵历史更新恢复" boolean controlmenu = true windowtype windowtype = response! long backcolor = 67108864 string icon = "AppIcon!" boolean center = true cb_1 cb_1 lb_1 lb_1 dw_1 dw_1 cb_8 cb_8 st_5 st_5 st_1 st_1 gb_2 gb_2 end type global w_updown w_updown type prototypes //function boolean UnZipTo(string strZipFileName,string strDirectoryPath,boolean IsKeepPaths,string strPassword) Library 'wfZip18_DLL.dll' alias for "UnZipTo;Ansi"; FUNCTION ULong GetModuleFileName(Long hinstModule, Ref String lpszPath, ULong cchPath) LIBRARY "kernel32.dll" ALIAS FOR "GetModuleFileNameA;Ansi"; end prototypes type variables nvo_ftp n_ftp uo_atudexe uo_autoupdateexe s_descrpfile ss_descrpfile[1 to 100] String is_servername,is_username,is_password string app_parth_q string tmpzipupdatexefilename='upload.tmp' s_update s_L1_zx,s_L1_wd,s_QJL_zx,s_QJL_wd //L1,企精灵 最新和稳定 Integer ii_port integer xx=1 end variables forward prototypes public function integer read_xml (string arg_filepath, ref string arg_msg) public function integer ftp_connect () public function integer wf_updown (string arg_filename, ref string arg_msg) public function integer up_software () public function integer up_datebase (string arg_filepath, string arg_version, ref string arg_msg, integer arg_client_bak) public function integer wf_download (string arg_version, ref string arg_msg) end prototypes public function integer read_xml (string arg_filepath, ref string arg_msg);Int rslt = 1 IF Not FileExists(arg_filepath) THEN rslt = 0 arg_msg = '文件' + arg_filepath + '不存在' GOTO ext END IF //功能:读取文本节点 到数组里 //参数 as_xml 需要解析的xml ,as_xmlreturn[] 返回的数组 String st,st1 PBDOM_BUILDER pbdom_builder_new PBDOM_DOCUMENT pbdom_doc Int i,j pbdom_builder_new = Create PBDOM_BUILDER //解析xml,生成Document pbdom_doc = pbdom_builder_new.buildfromfile(arg_filepath) //PBDOM元素 PBDOM_ELEMENT pbdom_elem,pbdom_elem_product pbdom_elem_product = Create PBDOM_ELEMENT pbdom_elem = Create PBDOM_ELEMENT pbdom_elem = pbdom_doc.GetRootElement() //messagebox("ii",pbdom_elem.getName()) //取得最外层节点名称 //messagebox("i11i",pbdom_elem.hasChildElements())//element的所有子元素个数 //得到跟节点下的所有row子节点 PBDOM_ELEMENT pbdom_elems_product[] PBDOM_ELEMENT pbdom_elems_L1_Release[] PBDOM_ELEMENT pbdom_elems_QJL_Release[] PBDOM_ELEMENT pbdom_elems_L1_updatetime[] PBDOM_ELEMENT pbdom_elems_QJL_updatetime[] PBDOM_ELEMENT pbdom_elems_L1_dscrp[] PBDOM_ELEMENT pbdom_elems_QJL_dscrp[] PBDOM_ELEMENT pbdom_elems_L1_rar[] PBDOM_ELEMENT pbdom_elems_QJL_rar[] pbdom_elem.GetChildElements("Product",pbdom_elems_product[]) FOR i = 1 To UpperBound(pbdom_elems_product) st = pbdom_elems_product[i].GetAttributeValue("Name") // MessageBox("",st) IF st = "L1-ERP" THEN pbdom_elems_product[i].GetChildElements("Release",pbdom_elems_L1_Release[]) FOR j = 1 To UpperBound(pbdom_elems_L1_Release) st1 = pbdom_elems_L1_Release[j].GetAttributeValue("stable") IF st1 = "true" THEN //L1-ERP最新版 s_L1_zx.Name = "L1-ERP最新版" s_L1_zx.version = pbdom_elems_L1_Release[j].GetAttributeValue("Version") pbdom_elems_L1_Release[j].GetChildElements("updatetime",pbdom_elems_L1_updatetime[]) s_L1_zx.updatetime = pbdom_elems_L1_updatetime[1].GetText() pbdom_elems_L1_Release[j].GetChildElements("dscrp",pbdom_elems_L1_dscrp[]) s_L1_zx.dscrp = pbdom_elems_L1_dscrp[1].GetText() pbdom_elems_L1_Release[j].GetChildElements("rar",pbdom_elems_L1_rar[]) s_L1_zx.rar = pbdom_elems_L1_rar[1].GetText() END IF IF st1 = "false" THEN //L1-ERP稳定版 s_L1_wd.Name = "L1-ERP稳定版" s_L1_wd.version = pbdom_elems_L1_Release[j].GetAttributeValue("Version") pbdom_elems_L1_Release[j].GetChildElements("updatetime",pbdom_elems_L1_updatetime[]) s_L1_wd.updatetime = pbdom_elems_L1_updatetime[1].GetText() pbdom_elems_L1_Release[j].GetChildElements("dscrp",pbdom_elems_L1_dscrp[]) s_L1_wd.dscrp = pbdom_elems_L1_dscrp[1].GetText() pbdom_elems_L1_Release[j].GetChildElements("rar",pbdom_elems_L1_rar[]) s_L1_wd.rar = pbdom_elems_L1_rar[1].GetText() END IF NEXT END IF IF st = "企精灵" THEN pbdom_elems_product[i].GetChildElements("Release",pbdom_elems_QJL_Release[]) FOR j = 1 To UpperBound(pbdom_elems_QJL_Release) st1 = pbdom_elems_QJL_Release[j].GetAttributeValue("stable") IF st1 = "true" THEN //企精灵最新版 s_QJL_zx.Name = "企精灵最新版" s_QJL_zx.version = pbdom_elems_QJL_Release[j].GetAttributeValue("Version") pbdom_elems_QJL_Release[j].GetChildElements("updatetime",pbdom_elems_QJL_updatetime[]) s_QJL_zx.updatetime = pbdom_elems_QJL_updatetime[1].GetText() pbdom_elems_QJL_Release[j].GetChildElements("dscrp",pbdom_elems_QJL_dscrp[]) s_QJL_zx.dscrp = pbdom_elems_QJL_dscrp[1].GetText() pbdom_elems_QJL_Release[j].GetChildElements("rar",pbdom_elems_QJL_rar[]) s_QJL_zx.rar = pbdom_elems_QJL_rar[1].GetText() END IF IF st1 = "false" THEN //企精灵稳定版 s_QJL_wd.Name = "企精灵稳定版" s_QJL_wd.version = pbdom_elems_QJL_Release[j].GetAttributeValue("Version") pbdom_elems_QJL_Release[j].GetChildElements("updatetime",pbdom_elems_QJL_updatetime[]) s_QJL_wd.updatetime = pbdom_elems_QJL_updatetime[1].GetText() pbdom_elems_QJL_Release[j].GetChildElements("dscrp",pbdom_elems_QJL_dscrp[]) s_QJL_wd.dscrp = pbdom_elems_QJL_dscrp[1].GetText() pbdom_elems_QJL_Release[j].GetChildElements("rar",pbdom_elems_QJL_rar[]) s_QJL_wd.rar = pbdom_elems_QJL_rar[1].GetText() END IF NEXT END IF NEXT // //MessageBox("1",s_L1_zx.Name ) //MessageBox("2",s_L1_zx.version ) //MessageBox("3",s_L1_zx.updatetime ) //MessageBox("4",s_L1_zx.dscrp ) //MessageBox("5",s_L1_zx.rar ) // // //MessageBox("1",s_L1_wd.Name ) //MessageBox("2",s_L1_wd.version ) //MessageBox("3",s_L1_wd.updatetime ) //MessageBox("4",s_L1_wd.dscrp ) //MessageBox("5",s_L1_wd.rar ) // // //MessageBox("1",s_QJL_zx.Name ) //MessageBox("2",s_QJL_zx.version ) //MessageBox("3",s_QJL_zx.updatetime ) //MessageBox("4",s_QJL_zx.dscrp ) //MessageBox("5",s_QJL_zx.rar ) // // //MessageBox("1",s_QJL_wd.Name ) //MessageBox("2",s_QJL_wd.version ) //MessageBox("3",s_QJL_wd.updatetime ) //MessageBox("4",s_QJL_wd.dscrp ) //MessageBox("5",s_QJL_wd.rar ) ext: RETURN rslt end function public function integer ftp_connect ();int rts Long ll_connect,i_index String ls_filename,ls_info,ls_filemask,ls_temp Long ll_row is_servername = "dufff6.oicp.net" //dufff6.oicp.net is_username = "" is_password = "" ii_port = 21 ll_connect = n_ftp.uf_ftpconnect(is_servername,is_username,is_password,ii_port) IF ll_connect = 0 THEN RETURN 1 END IF st_1.Text = "正在连接到Ftp服务器:"+is_servername+",请稍候..." ls_filename = n_ftp.uf_ftpgetcurrentdir() FOR i_index = 1 To 100 ss_descrpfile[i_index].Filename = "" ss_descrpfile[i_index].filesize = 0 ss_descrpfile[i_index].filetime = DateTime("1900-01-01 00:00:00") NEXT ls_filename = n_ftp.uf_remotefilelist('') DO WHILE ls_filename <> "?" ll_row = ll_row + 1 ls_temp = n_ftp.uf_cutstring(ls_filename,'?',1) ss_descrpfile[ll_row ].Filename = ls_temp ss_descrpfile[ll_row ].filesize = Long(n_ftp.uf_cutstring(ls_filename,'?',2)) ls_temp = n_ftp.uf_cutstring(ls_filename,'?',3) ss_descrpfile[ll_row ].filetime = DateTime(Date(Left(ls_temp,10)),Time(Mid(ls_temp,12))) ls_filename = n_ftp.uf_remotefilelist('') Yield() LOOP st_1.Text = '已成功连接到远程更新服务器' return rts end function public function integer wf_updown (string arg_filename, ref string arg_msg);int rts=1 Long ll_row,ll_insert,ll_count,ll_select String ls_filename,ls_dir,ls_localdir,ls_temp ls_filename =arg_filename//"updatelong.xml" //ss_descrpfile[2].filename ls_dir = n_ftp.uf_ftpgetcurrentdir()//这个判断“/” IF Len(ls_dir) = 1 THEN ls_temp = ls_dir +ls_filename ELSE ls_temp = ls_dir + '/' +ls_filename END IF ls_filename=app_parth_q +"\updatexetmp\autoupdate\" + ls_filename IF FileExists(ls_filename) THEN filedelete(ls_filename) END IF IF n_ftp.uf_ftpgetfile(ls_temp,ls_filename) THEN rts=1 ELSE arg_msg="下载文件" + arg_filename +"出错" rts=0 END IF RETURN rts end function public function integer up_software ();String arg_msg,dtt_filename,ls_msg Long rts = 1,ls_i,rts1 = 1 Int needreg,needrun String Filename,dscrp,Filepath string ls_md5 Filepath = n_ftp.uf_getcurrentdir() + "\" Open(w_sys_wait_jdt) //初始化进度条 w_sys_wait_jdt.Show() w_sys_wait_jdt.wf_accepttol(lb_1.TotalItems()) w_sys_wait_jdt.wf_inc(0) w_sys_wait_jdt.st_msg.Text = "正在上传更新程序文件列表..." FOR ls_i = 1 To lb_1.TotalItems() Filename = Filepath +lb_1.Text(ls_i) // ls_md5=string(md5.getMd5(Filename)) rts = uo_autoupdateexe.f_uploadexe(sqlca,Filename,& "[默认]",0,0,dscrp,arg_msg) IF rts = 0 THEN ls_msg = ls_msg + '上传操作失败> '+Filename + '~r~n' rts1 = 0 ELSE ls_msg = ls_msg + '上传操作成功! '+ Filename + '~r~n' rts1 = 1 END IF NEXT Close(w_sys_wait_jdt) //OpenWithParm(w_message_err,ls_msg) IF rts1 = 0 THEN MessageBox("失败","更新失败,请稍候再试或联系软件提供商") st_1.Text = '更新系统失败' DELETE From sys_autoudexe; COMMIT; ELSE MessageBox("成功","更新成功,请重新登录软件") st_1.Text = '更新系统成功' END IF RETURN rts1 end function public function integer up_datebase (string arg_filepath, string arg_version, ref string arg_msg, integer arg_client_bak);Int rts = 1 Int row,li_FileNum Long ll_billid DateTime server_dt SELECT count(*) Into :row From sys_update_download Where version = :arg_version; IF sqlca.SQLCode <> 0 THEN arg_msg = "查询操作失败,更新版本" rts = 0 RETURN rts END IF IF row >= 1 THEN RETURN rts END IF ll_billid = f_sys_scidentity(0,"sys_update_download","id",arg_msg,True,sqlca) SELECT Top 1 getdate() Into :server_dt From u_user Using sqlca; IF sqlca.SQLCode <> 0 THEN rts = 0 arg_msg = "查询操作失败,日期 " GOTO ext END IF INSERT INTO sys_update_download ( id, version, down_status, opdate, opemp, client_bak ) VALUES ( :ll_billid, :arg_version, 2, :server_dt, :publ_operator, :arg_client_bak ) Using sqlca; IF sqlca.SQLCode <> 0 THEN rts = 0 arg_msg = '插入新数据传送记录失败>'+sqlca.SQLErrText ROLLBACK Using sqlca; GOTO ext END IF COMMIT Using sqlca; //读入数据 long flen,loops,ls_i,bytes_read,new_pos blob b_dtdata_p,tot_b flen = FileLength(arg_filepath) li_FileNum = FileOpen(arg_filepath, StreamMode!, Read!, LockRead!) if li_FileNum=-1 then rts=0 arg_msg='打开文件'+arg_filepath+'操作失败!' fileclose(li_FileNum) goto ext end if IF flen > 32765 THEN IF Mod(flen, 32765) = 0 THEN loops = flen/32765 ELSE loops = (flen/32765) + 1 END IF ELSE loops = 1 END IF new_pos = 1 FOR ls_i = 1 to loops bytes_read = FileRead(li_FileNum, b_dtdata_p) if bytes_read=0 then rts=0 arg_msg='读取文件'+arg_filepath+'操作失败!' fileclose(li_FileNum) goto ext end if tot_b = tot_b + b_dtdata_p NEXT fileclose(li_FileNum) ///////////////////////// //用updateblob Updateblob sys_update_download set filedata =:tot_b where (version = :arg_version) using sqlca; if sqlca.sqlcode<>0 then arg_msg='保存文件包失败>'+sqlca.sqlerrtext rollback; delete sys_update_download where version = :arg_version using sqlca; if sqlca.sqlcode<>0 then rollback using sqlca; else commit using sqlca; end if rts=0 goto ext else commit using sqlca; end if //////////////// ext: RETURN rts end function public function integer wf_download (string arg_version, ref string arg_msg);Int rts = 1 Long fend,fend_t String cur_path,tmpfilepathname,Filepath1 Blob b_dtdata, b_dtdata_p Int li_FileNum,ls_i,ls_jh arg_msg = '' SetNull(b_dtdata) tmpfilepathname = app_parth_q+'\updatexetmp\autoupdate\'+'upload.tmp' Filepath1 = app_parth_q +"\updatexetmp\autoupdate" IF FileExists(tmpfilepathname) THEN FileDelete(tmpfilepathname) //提取数据包 SelectBlob filedata Into :b_dtdata From sys_update_download Where sys_update_download.version = :arg_version Using sqlca ; IF sqlca.SQLCode <> 0 THEN rts = 0 arg_msg = '提取数据包操作失败>'+sqlca.SQLErrText GOTO ext END IF IF Len(b_dtdata) < 1 Or IsNull(b_dtdata) THEN rts = 1 arg_msg = '空数据包!' GOTO ext END IF // //写临时文件 fend = Len(b_dtdata) IF fend <= 32765 THEN fend_t = 1 ELSE fend_t = fend/32765 IF Mod(fend,32765) <> 0 THEN fend_t = fend_t+1 END IF END IF li_FileNum = FileOpen( tmpfilepathname,StreamMode!, Write!, LockWrite!) IF li_FileNum <= 0 THEN arg_msg = "打开文件"+tmpfilepathname+"失败" rts = 0 FileClose(li_FileNum) GOTO ext END IF FOR ls_i = 1 To fend_t b_dtdata_p = BlobMid(b_dtdata,1+(ls_i - 1 )*32765,32765) ls_jh = FileWrite(li_FileNum, b_dtdata_p) IF ls_jh <= 0 THEN arg_msg = "写文件"+tmpfilepathname+"失败" rts = 0 FileClose(li_FileNum) GOTO ext END IF NEXT FileClose(li_FileNum) Yield() // rslt=uo_autoupdateexe.uf_unzipfile(tmpfilepathname,cur_path+updatexepath,arg_msg) //IF UnZipTo(tmpfilepathname,Filepath1,True,"") THEN IF uo_autoupdateexe.uf_unzipfile(tmpfilepathname,Filepath1 + "\temp",arg_msg) = 1 THEN st_1.Text = '解压更新包成功' ELSE st_1.Text = '解压更新包失败' arg_msg = '解压更新包失败' + arg_msg rts = 0 MessageBox("Error",arg_msg) GOTO ext END IF DELETE From sys_autoudexe; COMMIT; lb_1.DirList(Filepath1 + "\temp\*.*",0) IF up_software() <> 1 THEN rts=0 END IF lb_1.DirList(app_parth_q + "\*.*",0) IF FileExists(tmpfilepathname) THEN FileDelete(tmpfilepathname) RETURN rts ext: IF FileExists(tmpfilepathname) THEN FileDelete(tmpfilepathname) RETURN rts end function on w_updown.create this.cb_1=create cb_1 this.lb_1=create lb_1 this.dw_1=create dw_1 this.cb_8=create cb_8 this.st_5=create st_5 this.st_1=create st_1 this.gb_2=create gb_2 this.Control[]={this.cb_1,& this.lb_1,& this.dw_1,& this.cb_8,& this.st_5,& this.st_1,& this.gb_2} end on on w_updown.destroy destroy(this.cb_1) destroy(this.lb_1) destroy(this.dw_1) destroy(this.cb_8) destroy(this.st_5) destroy(this.st_1) destroy(this.gb_2) end on event open;string arg_msg dw_1.SetTransObject (sqlca) dw_1.retrieve() n_ftp = Create nvo_ftp uo_autoupdateexe=create uo_atudexe uo_autoupdateexe.f_trycreate_sys_autoudexe(sqlca,arg_msg) app_parth_q=n_ftp.uf_getcurrentdir() CreateDirectory ( app_parth_q + "\updatexetmp" ) CreateDirectory ( app_parth_q + "\updatexetmp\autoupdate" ) CreateDirectory ( app_parth_q + "\updatexetmp\autoupdate\temp" ) //ftp_connect()//连接服务器 ///////////////////////// ////删除wfsoft.com文件夹里的文件 //string ls_directorypath //string ls_tmpfilepath //ls_directorypath = app_parth_q+'\updatexetmp\autoupdate\'+'wfsoft.com' // ////ddplb_1是listbox的实例 //lb_1.dirlist(ls_directorypath + '/*.*',1) //if lb_1.totalitems() > 0 then // long i // for i = 1 to lb_1.totalitems() // filedelete(ls_directorypath + '/'+lb_1.text(i)) // next //end if //lb_1.DirList(app_parth_q + "*.*",0) /////////////////////// end event type cb_1 from uo_imflatbutton within w_updown integer x = 1426 integer y = 604 integer width = 425 integer taborder = 60 boolean bringtotop = true string text = "退出" end type event clicked;call super::clicked;close(parent) end event type lb_1 from listbox within w_updown boolean visible = false integer x = 2779 integer y = 476 integer width = 480 integer height = 300 integer taborder = 30 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 borderstyle borderstyle = stylelowered! end type type dw_1 from datawindow within w_updown integer x = 37 integer y = 84 integer width = 1915 integer height = 468 integer taborder = 30 string title = "none" string dataobject = "dw_version" boolean hscrollbar = true boolean vscrollbar = true boolean livescroll = true borderstyle borderstyle = stylelowered! end type event rowfocuschanged;IF currentrow <=0 THEN RETURN this.selectrow(0,false) this.selectrow(currentrow,true) end event event clicked;IF row <=0 THEN RETURN this.setrow(row) end event type cb_8 from uo_imflatbutton within w_updown integer x = 101 integer y = 592 integer width = 425 integer height = 112 integer taborder = 50 boolean bringtotop = true string text = "恢复" toolbaralignment pic_align = alignatright! end type event clicked;call super::clicked;Long LS_ROW String version,arg_msg Yield() IF Not f_power_ind(5) THEN MessageBox('提示','你没有使用权限!',information!,OK!) RETURN END IF LS_ROW = dw_1.GetRow() IF LS_ROW <= 0 THEN RETURN SELECT update_version Into :version From sys_DB_version ; IF version = dw_1.Object.version[LS_ROW] THEN MessageBox('提示','你选择更新的版本和当前系统版本一致',information!,OK!) RETURN END IF version = dw_1.Object.version[LS_ROW] UPDATE sys_DB_version Set updating_flag = 1 ; //在数据库声明我正在更新 COMMIT; st_1.Text = '正从数据库中下载备份更新包,请稍候' IF wf_download(version,arg_msg) = 1 THEN //恢复更新成功 //更改系统版本 UPDATE sys_DB_version Set update_version = :version,updating_flag = 0; COMMIT; END IF ///////////////////// // //删除wfsoft.com文件夹里的文件 String ls_directorypath String ls_tmpfilepath ls_directorypath = app_parth_q+'\updatexetmp\autoupdate\'+'temp' //ddplb_1是listbox的实例 lb_1.DirList(ls_directorypath + '/*.*',1) IF lb_1.TotalItems() > 0 THEN Long i FOR i = 1 To lb_1.TotalItems() FileDelete(ls_directorypath + '/'+lb_1.Text(i)) NEXT END IF lb_1.DirList(app_parth_q + "*.*",0) /////////////////// // end event type st_5 from statictext within w_updown integer y = 752 integer width = 530 integer height = 72 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 134217857 long backcolor = 67108864 string text = "提示信息:" alignment alignment = center! boolean focusrectangle = false end type type st_1 from statictext within w_updown integer x = 526 integer y = 752 integer width = 2734 integer height = 76 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 long backcolor = 67108864 boolean focusrectangle = false end type type gb_2 from groupbox within w_updown integer x = 23 integer y = 20 integer width = 1957 integer height = 700 integer taborder = 30 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 long backcolor = 67108864 string text = "历史版本" end type