¿Como saber si existe
una versión nueva o más actualizada
de la aplicación que estamos usando ?
A este tema le he intentado dar solución hace ya tiempo (ver este enlace) pero sin buenos resultados, dependía de donde se ejecutaba la aplicación para que funcionase correctamente.
Ahora lo he vuelto a estudiar, dando con una solución que parece que es la definitiva.
En vez de usar el comando wget, uso el control gb.net y gb.net.curl, con los cuales me bajo el contendido de una dirección web, y extraigo la información que me interesa.
He creado una clase "up", que tiene las siguiente propiedades: ruta con el nombre del archivo que contiene la información (en el ejemplo update_rayo2.info) y la versión actual del programa que estamos usando.
'Primero lo que hago es hacer una instancia de la clase up
DIM update AS NEW up
'ruta donde se encuentra el archivo con la informacion necesaria
update.ruta = "http://jsbsan.tk/update_rayo2.info"
'version del programa actual que estoy actualizando
update.version = "0.0.2"
update.programa = "update_rayo"
y uso el método que hace la comprobación y muestra la información por pantalla:
update.comprobar()
Opcionalmente se le puede poner de parámetro un label en el método comprobar(), para que escriba un mensaje mientras se conecta a internet y se descarga la información en ese label.
En archivo .info tendrá esta estructura:
' nombre del programa del cual estamos comprobando la versión
[programa]
update_rayo
[/programa]
'version alojada en el servidor (la mas actual)
[version]
0.0.2
[/version]
'texto donde contamos las mejoras de la versión con respecto a la anterior
[mejoras]
Hola estas son las mejoras:
esta es la 1º
esta es la 2º
[/mejoras]
'en esta zona indicamos la url donde debemos acceder para ver la versión mas actual
[direccion]
http://www.gambas-es.org/
[/direccion]
Y este es el mensaje resultante, por ejemplo, si estamos usando una versión inferior:
Al pulsar "ir a la pagina web", abrira el firefox en la página que indica el archivo .info.
En esa página web, podemos añadir más información: pantallazos, información de la versión, y por supuesto el enlace de descarga del programa.
Este es el código fuente de la clase up:
' Gambas class file
PRIVATE MiHttp AS NEW HttpClient
PUBLIC version AS String
PUBLIC ruta AS String
PUBLIC programa AS String
PUBLIC SUB comprobar(OPTIONAL label1 AS label)
DIM a AS Integer
DIM Buffer, programa, VersionEnInternet, mensaje, mejoras, direccion, comando AS String
DIM res AS Integer
MiHttp.url = ruta
MiHttp.Get()
IF label1 <> NULL THEN label1.Caption = "Espere..."
WHILE (Lof(MiHttp) = FALSE AND a < 10)
'espero 1 segundo o que llegue a>10
a = a + 1
WAIT 1
WEND
IF a = 10 OR Lof(MiHttp) = FALSE THEN
message("No ha sido posible conectarse al servidor \n No puedo comprobar si hay nueva versión")
RETURN
ENDIF
IF Lof(MiHttp) THEN
READ #MiHttp, Buffer, Lof(MiHttp)
END IF
programa = eliminar(Between(Buffer, "[programa]", "[/programa]"), "\n")
VersionEnInternet = eliminar(Between(buffer, "[version]", "[/version]"), "\n")
mejoras = Between(buffer, "[mejoras]", "[/mejoras]")
direccion = eliminar(Between(buffer, "[direccion]", "[/direccion]"), "\n")
IF Upper$(programa) <> Upper$(ME.programa) THEN
message.Error("El archivo de versión no es para este programa")
ELSE
IF ME.version < VersionEnInternet THEN
mensaje = "Existe una nueva version\nPrograma: " & programa & "\n Version encontrada:" & VersionEnInternet & "\n Mejoras:\n" & mejoras & " \n Direccion Url de descarga: \n" & direccion
res = Message.Question(Mensaje, "Ir a la pagina web", "Saltar Actualizacion")
IF res = 1 THEN
'----------------------------------------------------------
'correccion version 0.0.4
'----------------------------------------------------------
'correccion version 0.0.4
'----------------------------------------------------------
comando = "firefox " & direccion
comando = "firefox " & direccion
SHELL comando
ENDIF
ELSE
mensaje = "La version actual: " & ME.version & " \n es igual o superior que la que hay en el servidor (" & VersionEnInternet & ")\n No necesita actualizarla"
message.info(mensaje)
ENDIF
ENDIF
IF label1 <> NULL THEN label1.Caption = ""
END
PRIVATE FUNCTION eliminar(cadena AS String, caracter AS String) AS String
RETURN Replace$(cadena, caracter, "")
END
PRIVATE FUNCTION Between(Datos AS String, Cadena1 AS String, Cadena2 AS String) AS String
DIM iinf AS Integer
DIM isup AS Integer
iinf = InStr(Datos, Cadena1) + Len(Cadena1)
isup = InStr(Datos, Cadena2, iinf)
RETURN Mid(Datos, iinf, isup - iinf)
END
La función Between es la que se encargada de buscar y extraer el texto contenido entre los dos comando, por ejemplo [version] y [/version] (autor Juan Luis Lopez, url: foro gambas-es org, extraer información de una pagina web)
Y la función eliminar(), elimina caracteres que no deseamos del texto. Por ejemplo en mi caso no me interesa los retornos de carro "\n".
Podeis descargaros el código y un pequeño ejemplo en: Update_Rayo-0.0.4.tar.gz
Saludos
Nota:
Version 0.0.4. 19 de octubre de 2011: corregido bug ya que no enviaba a la direccion indicada en el archivo info, sino al foro de gambas-es.org.
Nota:
Version 0.0.4. 19 de octubre de 2011: corregido bug ya que no enviaba a la direccion indicada en el archivo info, sino al foro de gambas-es.org.