Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



sábado, 15 de octubre de 2011

Update_Rayo: Nueva Clase: Up, poder buscar información de actualización de una aplicación



¿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
 '----------------------------------------------------------
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.