*-------------------------------------------------------------------------------------------------------------------------------------------------------- * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- *< FOXBIN2PRG: Version="1.21" SourceFile="updateapp.scx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * * DEFINE CLASS dataenvironment AS dataenvironment *< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="1" /> * DataSource = .NULL. Height = 0 Left = 0 Name = "Dataenvironment" Top = 0 Width = 0 * ENDDEFINE DEFINE CLASS frmcodeupdate AS form *< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" /> *-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder *< OBJECTDATA: ObjPath="Label1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="lblVersion" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="edtNews" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Label2" UniqueID="" Timestamp="" /> * *m: checkfornewversion && Checks for new version and optionally downloads the new version. *m: makevbsfile *m: setexefile *m: setinifile *m: setversionnumber *m: update *m: updateversion *p: cdownloadpath *p: cexefile *p: cinifile *p: cnewsmessage *p: csuperpath *p: cversion * * AutoCenter = .T. BorderStyle = 1 Caption = "Auto Update" cdownloadpath = cexefile = cinifile = cnewsmessage = csuperpath = cversion = 1.00 DoCreate = .T. Height = 421 Name = "frmCodeUpdate" ShowWindow = 2 Width = 432 * ADD OBJECT 'edtNews' AS editbox WITH ; ControlSource = "thisform.cNewsMessage", ; Height = 288, ; Left = 12, ; Name = "edtNews", ; ReadOnly = .T., ; TabIndex = 5, ; Top = 120, ; Width = 408 *< END OBJECT: BaseClass="editbox" /> ADD OBJECT 'Label1' AS label WITH ; Alignment = 2, ; BackStyle = 0, ; Caption = "Auto Update", ; FontBold = .T., ; FontName = "Verdana", ; FontSize = 18, ; Height = 36, ; Left = 12, ; Name = "Label1", ; TabIndex = 8, ; Top = 24, ; Width = 408 *< END OBJECT: BaseClass="label" /> ADD OBJECT 'Label2' AS label WITH ; AutoSize = .T., ; BackStyle = 0, ; Caption = "Modificari", ; FontBold = .T., ; Height = 17, ; Left = 12, ; Name = "Label2", ; TabIndex = 10, ; Top = 102, ; Width = 58 *< END OBJECT: BaseClass="label" /> ADD OBJECT 'lblVersion' AS label WITH ; Alignment = 2, ; BackStyle = 0, ; Caption = "Version Number here", ; FontName = "Tahoma", ; FontSize = 8, ; Height = 24, ; Left = 72, ; Name = "lblVersion", ; TabIndex = 9, ; Top = 60, ; Width = 289 *< END OBJECT: BaseClass="label" /> PROCEDURE checkfornewversion && Checks for new version and optionally downloads the new version. LOCAL loUpdate, loAPI, lcURL, lcVersion, lcDownloadPath, lnPos, lcUpdateDirectory *** Retrieve the URL to use for version checks *** This is an XML file loAPI = CREATEOBJECT("wwAPI") ldLastCheckDate = NVL(CTOD(loApi.GetProfileString(this.cInifile, "Main", "LastVersionCheck")), {}) IF ISNULL(loApi.GetProfileString(this.cInifile, "Main", "UpdateFrequency")) loAPI.WriteProfileString(this.cInifile, "Main", "UpdateFrequency", "-1") ENDIF lnUpdateFrequency = VAL(loApi.GetProfileString(this.cInifile, "Main", "UpdateFrequency")) DO CASE CASE lnUpdateFrequency = -1 && check every time ldCheckDate = DATE() CASE lnUpdateFrequency = 0 && never check ldCheckDate = {} OTHERWISE ldCheckDate = ldLastCheckDate + lnUpdateFrequency ENDCASE *** Check only on UpdateFrequency IF ldCheckDate # DATE() *** Skip version check RETURN ENDIF *** Update the LastCheckDate *** And write out the updated version number loAPI.WriteProfileString(this.cInifile, "Main", "LastVersionCheck", TRANSFORM(DATE())) lcUrl = loAPI.GetProfileString(this.cInifile,"Main","VersionUpdateUrl") IF isnull(lcUrl) loAPI.WriteProfileString(this.cInifile, "Main", "VersionUpdateUrl", "http://localhost/codeupdate/") lcUrl = loAPI.GetProfileString(this.cInifile,"Main","VersionUpdateUrl") ENDIF lcDownloadPath = loAPI.GetProfileString(this.cInifile,"Main","DownloadPath") lcSuperPath = ADDBS(JUSTPATH(this.cExeFile)) lnPos = AT('\', lcSuperPath, 2) IF lnPos > 0 lcSuperPath = LEFT(lcSuperPath, lnPos) ENDIF IF EMPTY(ALLTRIM(TRANSFORM(NVL(lcDownloadPath,"")))) OR !DIRECTORY(NVL(lcDownloadPath,"")) lcDownloadPath = ADDBS(UPPER(lcSuperPath)) + 'CODEUPDATE\' IF !DIRECTORY(lcDownloadPath) md(lcDownloadPath) ENDIF loAPI.WriteProfileString(this.cInifile, "Main", "DownloadPath", lcDownloadPath) ENDIF this.cDownloadPath = ADDBS(lcDownloadPath) this.cSuperPath = ADDBS(lcSuperPath) loUpdate=CREATEOBJECT("wwCodeUpdate") *** Url where to check for new versions (XML file) loUpdate.cVersionUrl = lcUrl loUpdate.cVersionType = "C" *** DownloadPath loUpdate.cDownloadPath = this.cDownloadPath *** Name of the application's EXE file to hotswap loUpdate.cEXEFile = this.cExeFile && "sampleapp.exe" *** Returns the current available version from the XML file lcVersion = loUpdate.GetVersionInfo() this.cNewsMessage = loUpdate.cNewsMessage this.edtNews.Refresh() *** If no version we couldn't get the info from *** the Web Server IF EMPTY(lcVersion) *** Couldn't retrieve version info *** so just exit RETURN ENDIF *** Compare the version number against *** the app's version number - here a property of the form *** Usually you'd use a .H setting, database field or Config object IF lcVersion # THIS.cVersion *** Display message for the user and ask to download IF aMessageBox(loUpdate.cUserMessage + CHR(13) + CHR(13) +; "Doriti sa descarcati acum? (" + ; LTRIM(TRANSFORM(loUpdate.nFileSize,"999,999,999")) + ; "kb)",32+4,"Romfast") = 6 * loUpdate.CreateHTTPClient() * loUpdate.oHTTP.cCaption = "Download SampleApp Update" IF !loUpdate.DownloadUpdate(.T., FORCEEXT(JUSTFNAME(this.cExeFile),'xml')) aMessageBox(loUpdate.cErrorMsg,48,"Eroare download") ELSE lcFileVBS = this.cSuperPath + [codeupdate\CodeUpdate.vbs] IF !FILE(lcFileVBS) this.makeVBSFile(lcFileVBS) ENDIF lcUpdateDirectory = JUSTPATH(SYS(16,0)) CD (lcUpdateDirectory) *** Run the generic CodeUpdate Exe and quit application *--------------------- lcNumeArhiva = JUSTFNAME(loUpdate.cOnlineFileUrl) lcUpdateExe = ADDBS(JUSTPATH(ShortPath(lcFileVBS))) + lcNumeArhiva *MESSAGEBOX(lcUpdateExe,0,"lcUpdateExe") *!* lcCodeUpdate = [WSCRIPT ] + SHORTPATH(lcFileVBS) + [ "] + this.cExeFile + [" "] + ; *!* SHORTPATH(this.cSuperPath + [codeupdate\] + JUSTSTEM(this.cExeFile) + [.sfx.exe]) + ; *!* [ /auto ] + ADDBS(JUSTPATH(this.cExeFile)) + [" ] +; *!* ["] + UPPER(JUSTSTEM(this.cExeFile)) + [" "] + IIF(TYPE("gcParameters")="C",gcParameters,"") + ["] lcCodeUpdate = [WSCRIPT ] + SHORTPATH(lcFileVBS) + [ "] + this.cExeFile + [" "] + ; lcUpdateExe + ; [ -o] + ADDBS(JUSTPATH(this.cExeFile)) + [ -y " ] +; ["] + UPPER(JUSTSTEM(this.cExeFile)) + [" "] + IIF(TYPE("gcParameters")="C",gcParameters,"") + ["] *=============================== *MESSAGEBOX(lcCodeUpdate) _cliptext = lcCodeUpdate loUpdate.RunUpdateExe(lcCodeUpdate) this.Release() QUIT && Just to be safe ENDIF ENDIF ENDIF RETURN ENDPROC PROCEDURE Init LPARAMETERS tcExeFileName, tcIniFileName *** Load the class libraries required DO wwCodeUpdate *** Profile INI usage SET PROCEDURE TO wwAPI Additive THIS.setExeFile(tcExeFileName) THIS.setIniFile(tcIniFileName) *** Update the version label THIS.SetVersionNumber() *** And simply check for a new version THIS.CheckForNewVersion() *** Check for Data File Update requirements and update THIS.UpdateVersion() ENDPROC PROCEDURE makevbsfile LPARAMETERS tcVBSFile LOCAL lcVBS IF EMPTY(tcVBSFile) RETURN ENDIF TEXT TO lcVBS NOSHOW if WScript.Arguments.Length < 3 then WScript.Echo("Numar invalid de parametri." + vbcrlf + _ "Sintaxa: WSCRIPT CodeUpdate.vbs ") Wscript.Quit(1) end if lcExe = WScript.Arguments(0) lcUpdateExe = WScript.Arguments(1) lcAppName = WScript.Arguments(2) lcCommandLineParameters = WScript.Arguments(3) Set oShell = Wscript.CreateObject("Wscript.Shell") '*** Wait for 5 seconds for app to shut down lnResult = oShell.Popup("Astept inchiderea aplicatiei... ",5,lcAppName + " Update ",64) '*** Run the Update Exe oShell.Exec(lcUpdateExe) lnResult = oShell.Popup("Actualizez programul... ",5,lcAppName + " Update ",64) '*** Check that the Exe exists Set oFile = CreateObject("Scripting.FileSystemObject") if not oFile.FileExists(lcExe) then lnResult = oShell.Popup("Actualizez programul...... ",5,lcAppName + " Update ",64) end if lcExeParam = lcExe + " " + lcCommandLineParameters oShell.Exec(lcExeParam) ENDTEXT STRTOFILE(lcVBS, tcVBSFile) ENDPROC PROCEDURE Release ies=.t. QUIT ENDPROC PROCEDURE setexefile LPARAMETERS tcExeFileName IF PCOUNT() = 0 OR TYPE('tcExeFileName') # 'C' lcExeFileName = SYS(16,0) ELSE lcExeFileName = tcExeFileName ENDIF THIS.cExefile = lcExeFileName ENDPROC PROCEDURE setinifile LPARAMETERS tcExeFileName IF PCOUNT() = 0 OR TYPE('tcIniFileName') # 'C' lcIniFileName = FORCEEXT(SYS(16,0), 'ini') ELSE lcIniFileName = tcIniFileName ENDIF THIS.cInifile = lcIniFileName ENDPROC PROCEDURE setversionnumber LOCAL laFiles, lcVersion, lcExeFile, lnElements DIMENSION laFiles[1] lcExeFile = ADDBS(JUSTPATH(SYS(16,0))) + JUSTFNAME(this.cExeFile) IF FILE(lcExeFile) lnElements = AGETFILEVERSION(laFiles, lcExeFile) IF lnElements >= 4 lcVersion = laFiles[4] ELSE lcVersion = "" ENDIF ELSE lcVersion = "" ENDIF this.cversion = lcVersion THIS.lblVersion.Caption = "Versiunea " + TRANSFORM(lcVersion) ENDPROC PROCEDURE update *** And simply check for a new version THIS.CheckForNewVersion() *** Check for Data File Update requirements and update THIS.UpdateVersion() ENDPROC PROCEDURE updateversion loAPI = CREATEOBJECT("wwAPI") lcVersion = loAPI.GetProfileString(THIS.cInifile, "Main", "Version") IF lcVersion = THISFORM.cVersion *** Nothing to do RETURN ELSE *** Code to perform data updates goes here WAIT WINDOW "Numarul versiunii nu este actualizat. Actualizare..." NOWAIT *** COD DE EFECTUAT LA PRIMA RULARE A UNEI VERSIUNI ACTUALIZATE *** And write out the updated version number loAPI.WriteProfileString(THIS.cInifile, "Main", "Version", LTRIM(TRANSFORM(THISFORM.cVersion))) RETURN ENDIF ENDPROC ENDDEFINE