*!* 21.07.2009
*!* marius.mutu
*!* set library to inainte de dezarhivarea arhivelor (vezi comunroa care are vfpencryption si da conflict)

*!*	19.03.2024
*!*	marius.mutu
*!* updatecheck: s-a inlocuit dezarhivarea cu vfpcompression cu shell.copyhere

*!*	comun\programe\
*!*	oupdate.prg
*!*	iniacces.prg 
*!*	procese.prg
*!*	version.prg
*!*	xmlaccess.prg
*!*	xmlparser.prg
*!*	filebringer.prg
*!*	wwcodeupdate.prg
*!*	wwhttp.prg 
*!*	wwapi.prg 

*!*	comun\include\
*!*	security.h

*!*	comun\clase\
*!*	wwdialogs.vcx

*!* main.prg
*!*	PRIVATE gcDirMare
*!*	gcDirMare=Left(gcAppPath,liat)

*!*	SET CLASSLIB TO wwdialogs ADDITIVE 

#Define crlf Chr(13)+Chr(10)
Define Class oUpdate As Custom
	oInterfataXml = Null
	oContainerAfisare = Null
	cFisier = Null
	cExtensieFisier = [.zip]
	cExtensieFisierExe = [.exe]			&&	pentru romfast_suport

	Procedure Init
		Lparameters tcFisier,toContainerAfisare,tcProgram
		Declare ExitProcess In WIN32API Integer

		Return This.initializeazaDate(tcFisier,toContainerAfisare,tcProgram)
	Endproc

	Function reinitializeazaDate
		Lparameters tcFisier,toContainerAfisare,tcProgram
		This.oInterfataXml = Null
		Return This.initializeazaDate(tcFisier,toContainerAfisare,tcProgram)
	Endfunc

	Function initializeazaDate
		Lparameters tcFisier,toContainerAfisare,tcProgram
		Local llReturn
		llReturn = .T.
		This.oContainerAfisare = toContainerAfisare
		If Empty(tcFisier)
			This.cFisier= This.getServer()
		Else
			This.cFisier = tcFisier
		Endif
		This.oInterfataXml = Createobject("xmlAccess",This.cFisier)
		If Type('This.oInterfataXml') <> 'O'
			This.actualizeazaContainerAfisare("Nu se pot face actualizări!")
			If !Empty(tcProgram)
				lcVersiune = Iif(Left(tcProgram,3)='ROA',Getversion(tcProgram),GetTxtVersion(tcProgram))
				lcVersiune = Iif(lcVersiune = [0.0.0],[...],[ ] + lcVersiune)
				This.actualizeazaContainerAfisare("Se lansează " + tcProgram + lcVersiune)
			Endif
			llReturn = .F.
		Endif
		Return llReturn
	Endfunc

	Procedure actualizeazaContainerAfisare
		Lparameters tcMesaj	&&,tlSelStart	modificare ROASTART v 2.0.23
		If Type('this.oContainerAfisare') = 'O'
			This.oContainerAfisare.Value = This.oContainerAfisare.Value + tcMesaj + crlf
*!*	modificare ROASTART v 2.0.23
*!*				If tlSelStart
*!*					This.oContainerAfisare.SelStart = Len(This.oContainerAfisare.Value)
*!*				Endif
*!*	modificare ROASTART v 2.0.23	^
			This.oContainerAfisare.Refresh()
		Endif
	Endproc

	Function getServer
		Local lcnumeserver

		lcnumeserver=[]
		If Type('goFirma') = 'O' And Type('goFirma.nume_server') <> 'U'
			lcnumeserver = Alltrim(goFirma.nume_server)
		Else
			lcSql = [select nume_server from syn_nom_firme where id_firma=?gnIdFirma]
			lnSucces = goExecutor.oExecute(lcSql,[crsnf])
			If lnSucces < 0
				aMessagebox(goExecutor.ceroare,64,'Eroare')
			Else
				Select crsnf
				lcnumeserver = Alltrim(nume_server)
			Endif
			If Used('crsnf')
				Use In crsnf
			Endif
		Endif
		Return lcnumeserver
	Endfunc
	Procedure createUpdateCursor
		Lparameters tcNumeCursor
		This.oInterfataXml.getXmlItems(tcNumeCursor)
	Endproc

	Function Getversion
		Lparameters tcProgram
		Return This.oInterfataXml.Getversion(tcProgram)
	Endfunc

	Function updatecheckTxt
		Lparameters tcCurrentProg, tlSilent, tlLocalFileExist
		* tlLocalFileExist: daca exista fisierul pe calculator. se descarca chiar daca versiunile din fisierul de setari si cel de pe internet sunt la fel, dar nu exista fisierul pe local
		
		Local lcCaleActualizari, lcVersiuneLocal, lcVersiuneInternet, lcFisier, lcFisierVersiuniInternet, lcSectiune, lcExtensieFisier
		Local lcLibraryPath, loEx As Exception
		lcLibraryPath = gcDirMare + [COMUNROA\vfpconnection.fll]
*!*	modificare	06.03.2014	:	am adaugat lcExtensieFisier in loc de This.cExtensieFisier
		lcExtensieFisier = IIF(INLIST(tcCurrentProg, [romfast_suport], [roascreenshot]),This.cExtensieFisierExe,This.cExtensieFisier)
		If File(lcLibraryPath)
			Try
				Set Library To (lcLibraryPath) Additive
				lcCaleActualizari = [http://www.romfast.ro/romfastsuport/files/]
				lcFisierVersiuniInternet = [versiune_aplicatii.txt]
				lcSectiune = [versiuni]
				lcFisier = lcCaleActualizari + lcFisierVersiuniInternet
				If !HTTPGet(lcFisier, gcTempPath+lcFisierVersiuniInternet, [MyProgressHandler("] + lcFisier + [")])
					IF !m.tlSilent
						polog.Log("Nu se poate descarca fisierul cu versiuni! " + m.lcFisier, Program())
						Messagebox("Nu se poate descarca fisierul cu versiuni!",16,"Eroare")
					ENDIF 	
				Else
					lcBuffer=Space(255)
					
					DECLARE INTEGER GetPrivateProfileString ;
					   IN WIN32API ;
					   STRING cSection,;
					   STRING cEntry,;
					   STRING cDefault,;
					   STRING @cRetVal,;
					   INTEGER nSize,;
					   STRING cFileName					
					
					GetPrivateProfileString(lcSectiune,tcCurrentProg,"",@lcBuffer, Len(lcBuffer),  gcTempPath+lcFisierVersiuniInternet)
					lcVersiuneInternet = Alltrim(Strtran(lcBuffer,Chr(0),""))
					Delete File (gcTempPath+lcFisierVersiuniInternet)
					loIniHandler = Createobject("iniaccess")
					lcVersiuneLocal = loIniHandler.getCValue(lcSectiune,tcCurrentProg)
					polog.Log("Program: " + tcCurrentProg + " VersiuneLocal: " + lcVersiuneLocal + " VersiuneInternet: " + lcVersiuneInternet + " LocalFileExist: " + TRANSFORM(m.tlLocalFileExist), Program())
					If ((Empty(lcVersiuneLocal) Or lcVersiuneLocal < lcVersiuneInternet) And !Empty(lcVersiuneInternet)) OR !m.tlLocalFileExist
*!*	modificare	28.06.2012	:	am adaugat This.cExtensieFisier in loc de .exe
*!*	modificare	06.03.2014	:	am adaugat lcExtensieFisier in loc de This.cExtensieFisier
						lcFisier = lcCaleActualizari + tcCurrentProg + lcExtensieFisier 
						If (Bringfile(lcFisier,tcCurrentProg,gcDirMare+tcCurrentProg+lcExtensieFisier )=.F.)
							IF !m.tlSilent
								polog.Log("Eroare la copierea "+tcCurrentProg + ", versiunea "+lcVersiuneInternet+"!", Program())
								Messagebox("Eroare la copierea "+tcCurrentProg + ", versiunea "+lcVersiuneInternet+"!",16,"Eroare")
							ENDIF 	
						Else
							loIniHandler.setCValue(lcSectiune,tcCurrentProg,lcVersiuneInternet)
						Endif
					Endif
					Release loIniHandler
				Endif
			Catch To loEx
				IF !m.tlSilent
					polog.Log('vfpconnection ' + loEx.Message, Program())
					Messagebox('vfpconnection ' + loEx.Message)
				ENDIF 	
			Endtry
		Endif
		Return .T.
	Endfunc

	Function updatecheck
		Lparameters tccurrentprog,tlmsgshow,tnTipActualizare,tcDefaultDir
		* tccurrentprog este programul care trebuie actualizat
		* lcmsgshow - daca e true,atunci se citeste din ini daca apare mesajul de confirmare sau nu
		* tnTipActualizare - 0	=	este din numeserver.xml	;
		1  = 	este din roastart.xml ;
		2	=	programul se actualizeaza singur la pornire
		* tcDefaultDir - directorul in care se copiaza actualizarile pentru configurarile USER... ;
		( de ex.: DEV_USERREPORTS e tccurrentprog,dar trebuie sa fie copiat in USERREPORTS )

		Local iniHandler As Object,lnTipFisier,lnTipActualizare	&&	modificare v 2.0.14 : am adaugat lnTipFisier
		LOCAL lcOldLibrary
		
		lnTipActualizare = Iif(!Empty(tnTipActualizare),tnTipActualizare,0)
		*!*	modificare v 2.0.6
		*!*		If Used("SERVER_INFO")
		*!*			Use In SERVER_INFO
		*!*		Endif
		*!*	modificare v 2.0.6	^
		If lnTipActualizare<>2
			If At("_",tccurrentprog)#0
				lccurrentUR=Substr(tccurrentprog,At("_",tccurrentprog)+1)
			Else
				lccurrentUR=tccurrentprog
			Endif

			********************************************
			* Rularea procedurii de update pentru
			* toate programele in afara de ROASTART
			********************************************


			lbrun=.T.
			Local lraspuns
			lraspuns=4
			Local loex1,loex2,loex As Exception
			*!* Verifica daca trebuie rulate
			*!* procedurile de update
			This.actualizeazaContainerAfisare(tccurrentprog + " se verifică ultima versiune")
			iniHandler=Createobject("iniaccess")
			If lnTipActualizare = 0
				lnTipFisier = 0
				If Empty(This.cFisier) Or This.cFisier = "ROASTART"
					XmlData="nu s-a putut conecta"
				Else
					polog.Log("S-a gasit serverul "+This.cFisier,Program())
					polog.Log("Se cauta pentru "+This.cFisier+".XML",Program())
					XmlData=This.oInterfataXml.ReadXmlFile(tccurrentprog)
				Endif
			Else
				If Left(tccurrentprog,3)="ROA"
					lnTipFisier = 0
				Else
					lnTipFisier = 1
				Endif
				polog.Log("Se cauta xml-ul pentru "+tccurrentprog,Program())
				XmlData=This.oInterfataXml.ReadXmlFile(tccurrentprog)
			Endif
			Do Case
				Case XmlData$"<>(){}"
					polog.Log("Nu s-au gasit in fisierul Xml inregistrari pentru "+tccurrentprog,Program())
				Case XmlData$"nu s-a putut conecta"
					If iniHandler.getURL()!=""
						This.actualizeazaContainerAfisare("Nu s-a găsit actualizare pe internet.")
					else
						This.actualizeazaContainerAfisare("Nu s-a găsit actualizare în rețea/local.")	&&,.T.	modificare ROASTART v 2.0.23					
					Endif
				Otherwise

					If tlmsgshow=.F.
						lcallowconfirm=.T.
					Else
						lcallowconfirm=.F.
						If(iniHandler.getAllowConfirm())
							lcallowconfirm=.T.
						Endif
					Endif

					If Compareversion(stripXmlVersion(XmlData),XmlData,;
							IIF(Empty(tcDefaultDir),tccurrentprog,tcDefaultDir),lcallowconfirm,lnTipFisier)
						polog.Log("S-a gasit versiunea " + stripXmlVersion(XmlData) + " pentru "+tccurrentprog + " (" + Getversion(tccurrentprog) + ")",Program())
						lcconfirm=0
						If iniHandler.getAllowConfirm()
							lcconfirm = aMessagebox(stripXmlMsg(XmlData)+crlf+"Doriți să-l încărcați?",36,"Confirmare actualizare")
						Else
							lcconfirm = 6
						Endif
						If lcconfirm = 6
							This.actualizeazaContainerAfisare(tccurrentprog + " se actualizează versiunea "+stripXmlVersion(XmlData))&&,.T.	modificare ROASTART v 2.0.23
							polog.Log("Se incepe actualizarea "+tccurrentprog+" la versiunea "+stripXmlVersion(XmlData),Program())
							*!* Verifica daca nu cumva programul este in procese
							*This.oContainerAfisare.value = This.oContainerAfisare.value+"Se verfica daca se poate face updateul" + crlf
							polog.Log("Se verifica daca nu cumva programul este in procese ",Program())
							lnWinHandle=1
							Do While lnWinHandle=1 And lraspuns=4
								lnWinHandle=0

								If CheckProcess(tccurrentprog)
									lnWinHandle=1
									*This.oContainerAfisare.value = This.oContainerAfisare.value+"Nu se poate face updateul(fisier in uz)" + crlf
									polog.Log("Programul s-a gasit printre procesele care ruleaza",Program())
								Endif

								If lnWinHandle =1
									lraspuns=aMessagebox("Închideti toate instantele " + tccurrentprog + " și apăsați pe Repetă pentru a actualiza programul!",21,"Actualizare")
								Else
									Exit
								Endif
							Enddo
							If lraspuns=2
								polog.Log("S-a respins actualizarea",Program())
								This.actualizeazaContainerAfisare("S-a respins actualizarea " + tccurrentprog)&&,.T.	modificare ROASTART v 2.0.23
							Endif

							If lnWinHandle =0
								************review ..CV
								************03.oct.2007
								polog.Log("Se aduce fisierul",Program())
								myfilestr=StripXmlFile(XmlData)
								If iniHandler.getDefault()="URL"
									If Occurs("http",myfilestr)>0
										lcFileToBeBrought=myfilestr
									Else
										If Left(myfilestr,1)="\"
											lcFileToBeBrought=Right(myfilestr,Len(myfilestr)-1)
										Else
											lcFileToBeBrought=myfilestr
										Endif
										lcFileToBeBrought=iniHandler.getURL()+"/"+lcFileToBeBrought
									Endif
									lcFileToBeBrought = strtran(lcFileToBeBrought,[\],[/])		&&	modificare	ROASTART v 2.1.3
								Else
									If Left(myfilestr,1)="\"
										lcFileToBeBrought=Right(myfilestr,Len(myfilestr)-1)
									Else
										lcFileToBeBrought=myfilestr
									Endif
									lcFileToBeBrought=Addbs(ShortPath(iniHandler.getNetworkPath()))+lcFileToBeBrought
								Endif
								****************review***Cristian Vasile***
								****************cale relativa URL**********
								******************************03.10.2007***
								If(Bringfile(lcFileToBeBrought,tccurrentprog)=.F.)
									aMessagebox("A intervenit o eroare la copierea fisierului!",16,"Copiere")
									polog.Log("A intervenit o eroare la copierea fisierului",Program())
									*This.oContainerAfisare.txt_Mesaj.Caption = This.oContainerAfisare.txt_Mesaj.Caption+"A intervenit o eroare la copierea fisierului" + crlf
								Else
									tempfile = GetCurrentTempPath(tccurrentprog)
									Cd Addbs(Justpath(tempfile))

*!*										lcEncryptionFile = gcComunPath+"vfpcompression.fll"
*!*										IF !"vfpcompression"$LOWER(SET("Library"))
*!*											SET LIBRARY TO (lcEncryptionFile) ADDITIVE
*!*										ENDIF
*!*										UnzipQuick(tempfile)
									
									lcErrorMessage = ''
									lcUnzipDir = JUSTPATH(m.tempfile)
									llSucces = UnzipQuickShell(m.tempfile, @lcUnzipDir, @lcErrorMessage)
									IF m.llSucces
										polog.Log("S-a actualizat "+ tccurrentprog + " la versiunea "+stripXmlVersion(XmlData),Program())
										This.actualizeazaContainerAfisare(tccurrentprog + " s-a actualizat la versiunea "+stripXmlVersion(XmlData))&&,.T.	modificare ROASTART v 2.0.23									
									ELSE
											
										polog.Log("Nu s-a actualizat "+ tccurrentprog + " la versiunea "+stripXmlVersion(XmlData),Program())
										This.actualizeazaContainerAfisare(tccurrentprog + " NU s-a actualizat la versiunea "+stripXmlVersion(XmlData) + " " + m.lcErrorMessage)&&,.T.	modificare ROASTART v 2.0.23
									ENDIF 	
									lcDir=Addbs(Justpath(Sys(16,0)))
									*!* Stergere temporar
									*!*
									Try
*!*				modificare	28.06.2012
*!*											Delete File "&tempfile"
										DELETE FILE (tempfile)
*!*				modificare	28.06.2012	^
									Catch To loex2
										If loex2.ErrorNo=1705
											This.actualizeazaContainerAfisare("NU s-a putut sterge fisierul temporar!")&&,.T.	modificare ROASTART v 2.0.23
										Endif
									Endtry

									*!*

									If Atc("PROCEDURE",lcDir) > 0
										lcDir = Substr(lcDir,Rat(":",lcDir)-1)
									Endif
									Cd (lcDir)

								Endif
							Else
								*				MESSAGEBOX("Inchideti toate instantele de ale ROA - Financiar contabilitate pentru a actualiza programul.",16,"Actualizare !")
								lbrun=.F.
							Endif
						Else
							*!*						Strtofile(Dtoc(Date())+" "+Time()+"   > S-a respins de utillizator updateul programului "+tccurrentprog+Chr(13)+Chr(10),gcDirMare + "updates.log",1)
							polog.Log("S-a respins de utilizator actualizarea programului "+tccurrentprog,Program())

						Endif

					Else
						polog.Log(tccurrentprog + " " + stripXmlVersion(XmlData)+" este cea mai noua versiune.",Program())
						This.actualizeazaContainerAfisare(tccurrentprog + " " + stripXmlVersion(XmlData)+" este cea mai nouă versiune.")&&,.T.	modificare ROASTART v 2.0.23
					Endif
			Endcase


			*!*			Release InterfataXml
			Release iniHandler


			Return lbrun

			********************************************
			* Rularea procedurii de update pentru
			* toate programele in afara de ROASTART
			********************************************
		Else
			Try
*!*	modificare	28.06.2012
*!*				Delete file "temporar.exe"
				Delete File "temporar"+This.cExtensieFisier
*!*	modificare	28.06.2012	^
				Delete File "test.vbs"
			Endtry
			*MESSAGEBOX("Verificare")
			*!*			InterfataXml=Createobject("xmlAccess")
			iniHandler=Createobject("iniaccess")

			XmlData=This.oInterfataXml.ReadXmlFile(tccurrentprog)
			Do Case
				Case XmlData$"<>(){}"
					polog.Log("Nu s-au gasit in fisierul Xml inregistrari pentru "+tccurrentprog,Program())
				Case XmlData$"nu s-a putut conecta"
					If iniHandler.getURL()!=""
						This.actualizeazaContainerAfisare("Nu s-a găsit actualizare pe internet.")
					ELSE
						This.actualizeazaContainerAfisare("Nu s-a găsit actualizare în rețea/local.")&&,.T.	modificare ROASTART v 2.0.23					
					Endif
				Otherwise
					polog.Log("Am inceput update "+tccurrentprog+" !",Program())
					polog.Log("Versiunea din xml este " + stripXmlVersion(XmlData))
					If Compareversion(stripXmlVersion(XmlData),XmlData,tccurrentprog,iniHandler.getAllowConfirm())
						polog.Log("Am detectat versiuni diferite",Program())
						lcconfirm=0
						If iniHandler.getAllowConfirm()
							lcconfirm = aMessagebox(stripXmlMsg(XmlData)+crlf+"Doriți să-l încărcați?",292,"Confirmare actualizare")
						Else
							lcconfirm = 6
						Endif
						
						If lcconfirm = 6
							polog.Log("Trebuie sa aduca programul",Program())
							************review ..CV
							************03.oct.2007
							myfilestr=StripXmlFile(XmlData)
							If iniHandler.getDefault()="URL"
								If Occurs("http",myfilestr)>0
									lcFileToBeBrought=myfilestr
								Else
									If Left(myfilestr,1)="\"
										lcFileToBeBrought=Right(myfilestr,Len(myfilestr)-1)
									Else
										lcFileToBeBrought=myfilestr
									Endif
									lcFileToBeBrought=iniHandler.getURL()+"/"+lcFileToBeBrought
								Endif

							Else
								If Left(myfilestr,1)="\"
									lcFileToBeBrought=Right(myfilestr,Len(myfilestr)-1)
								Else
									lcFileToBeBrought=myfilestr
								Endif
								lcFileToBeBrought=Addbs(ShortPath(iniHandler.getNetworkPath()))+lcFileToBeBrought
							Endif
							****************review***Cristian Vasile***
							****************cale relativa URL**********
							******************************03.10.2007***
							If(Bringfile(lcFileToBeBrought,tccurrentprog)=.F.)
								aMessagebox("A intervenit o eroare la încercarea copierii fișierului de actualizare!",16,"Actualizare")
							Else
								polog.Log("Am adus programul",Program())
*!*									tempfile = GetCurrentTempPath(tccurrentprog)		&&	modificare	28.06.2012
*!*	modificare	v 2.0.29
*!*									lcrunvbs=[Run /N7 ]+Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\updater.exe ] + ;
*!*										STRTRAN(Addbs(Justpath(Sys(16,0))),[ ],[~])+tccurrentprog+[.EXE]
								lcrunvbs=[Run /N7 ]+shortpath(Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2))))+[COMUNROA\updater.exe |] + ;
									shortpath(Addbs(Justpath(Sys(16,0))))+tccurrentprog+[.EXE]
*!*	modificare	v 2.0.29	^
								&lcrunvbs
								polog.Log("Am executat updater.exe",Program())
								ExitProcess(0)

							Endif
						Endif
					Endif
			Endcase
			Return .T.
		Endif
	Endfunc
Enddefine

Function updatecheckfiles
*!*	(07.09.09)	tlSilent = .T.	-	daca nu apare mesajul de eroare in caz ca nu poate copia fisierul
	Lparameters lcFisier,tlSilent
	Local loUpdate,cLocalFile,cFilePath
	***************************************
	*
	***************************************
	iniHandler = Createobject("iniaccess")
	If lcFisier="ROA_SECURITY.XML"
		cLocalFile = gcDirMare + "Security\" + lcFisier
	Else
		cLocalFile = gcDirMare + lcFisier
	Endif

	If (iniHandler.getNetworkPath()#"" And iniHandler.getDefault()="NetworkPath")	&&	Or iniHandler.getNetworkPath()#"" And iniHandler.getURL()="")
		cFilePath = Addbs(ShortPath(iniHandler.getNetworkPath())) + lcFisier
	Else
		If(iniHandler.getURL()#"" And iniHandler.getDefault()="URL")				&& Or iniHandler.getURL()#"" And iniHandler.getNetworkPath()="")
			cFilePath =iniHandler.getURL() +"/"+ lcFisier
		Else
			Return .F.
		Endif
	Endif

	If(Bringfile(cFilePath,lcFisier,cLocalFile)=.F.) and !tlSilent
		aMessagebox("A intervenit o eroare la copierea fisierului de actualizare! " + CHR(10) + ;
			TRANSFORM(cFilePath) + CHR(10) + TRANSFORM(lcFisier) + CHR(10) + TRANSFORM(cLocalFile),16,"Actualizare")
	Endif
Endfunc