Created
September 2, 2015 11:50
-
-
Save javiercampos/585bd33cc9d375f4a6aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.ComponentModel; | |
using System.Deployment.Application; | |
using System.Windows.Forms; | |
using LaBoutiqueDelHogar.GestionPedidos.Forms; | |
using LaBoutiqueDelHogar.Tools; | |
namespace LaBoutiqueDelHogar.GestionPedidos.Tools | |
{ | |
public static class ClickOnceUpdate | |
{ | |
private static bool alreadyChecked; | |
private static bool checking; | |
private static bool _checkingUpdates = false; | |
public static int CheckUpdates() | |
{ | |
if (_checkingUpdates) | |
return 0; | |
_checkingUpdates = true; | |
if (!ApplicationDeployment.IsNetworkDeployed) return 0; | |
var ad = ApplicationDeployment.CurrentDeployment; | |
try | |
{ | |
UpdateCheckInfo info; | |
try | |
{ | |
info = ad.CheckForDetailedUpdate(); | |
} | |
catch | |
{ | |
return 0; | |
} | |
if (!info.UpdateAvailable) | |
return -1; | |
return 1; | |
} finally | |
{ | |
_checkingUpdates = false; | |
} | |
} | |
private static FormUpdateProgress frmProj; | |
public static bool TryUpdate() | |
{ | |
UpdateCheckInfo info; | |
if (!ApplicationDeployment.IsNetworkDeployed) return false; | |
var ad = ApplicationDeployment.CurrentDeployment; | |
try | |
{ | |
info = ad.CheckForDetailedUpdate(); | |
} | |
catch (DeploymentDownloadException dde) | |
{ | |
UITools.MostrarError("Error al comprobar actualización", string.Format("La nueva versión del programa no se puede descargar ahora mismo. \n\nPor favor, comprueba la conexión de red o prueba más tarde. Error: {0}", dde.Message), "Error"); | |
return false; | |
} | |
catch (InvalidDeploymentException ide) | |
{ | |
UITools.MostrarError("Error al comprobar actualización", string.Format("No se puede comprobar si hay una nueva versión. El paquete ClickOnce está corrupto. Publicar la aplicación de nuevo y continuar. Error: {0}", ide.Message), "Error"); | |
return false; | |
} | |
catch (InvalidOperationException ioe) | |
{ | |
UITools.MostrarError("Error al comprobar actualización", string.Format("No se puede actualizar la aplicación, probablemente no se esté ejecutando ClickOnce. Error: {0}", ioe.Message), "Error"); | |
return false; | |
} | |
if (!info.UpdateAvailable) | |
{ | |
UITools.MostrarWarning("No hay actualización", "No hay ninguna actualización para descargar en estos momentos. Intentelo más tarde", "Atención"); | |
return false; | |
} | |
alreadyChecked = true; | |
using (new WaitOperation("Actualizando...")) | |
{ | |
ad.UpdateCompleted += ad_UpdateCompleted; | |
ad.UpdateProgressChanged += ad_UpdateProgressChanged; | |
ad.UpdateAsync(); | |
if (frmProj == null) | |
frmProj = new FormUpdateProgress(); | |
var dr = frmProj.ShowDialog(); | |
if (dr == DialogResult.Cancel) | |
{ | |
ad.UpdateAsyncCancel(); | |
} | |
else if(dr == DialogResult.OK) | |
{ | |
var dr2 = UITools.MostrarSiNo("Actualización completa", "La aplicación se ha actualizado. ¿Reiniciar?", "Actualización completa", MessageBoxIcon.Question); | |
if (DialogResult.Yes == dr2) | |
{ | |
Application.Restart(); | |
} | |
} | |
if (frmProj == null) return true; | |
frmProj.Dispose(); | |
frmProj = null; | |
} | |
return true; | |
} | |
private static void ad_UpdateProgressChanged(object sender, DeploymentProgressChangedEventArgs args) | |
{ | |
if (frmProj != null) | |
{ | |
frmProj.prMaj( | |
String.Format("Descargando: {2}. {0:D}Kb de {1:D}Kb.", args.BytesCompleted / 1024, args.BytesTotal / 1024, args.Group), Convert.ToInt32(args.BytesTotal / 1024), Convert.ToInt32(args.BytesCompleted / 1024)); | |
Application.DoEvents(); | |
} | |
} | |
private static void ad_UpdateCompleted(object sender, AsyncCompletedEventArgs e) | |
{ | |
if (e.Error != null) | |
{ | |
if (frmProj != null) | |
{ | |
frmProj.DialogResult = DialogResult.Abort; | |
Application.DoEvents(); | |
} | |
UITools.MostrarError("Error al aplicar actualización", | |
string.Format("Hubo un error al instalar la nueva versión del programa.{1}Error: {0}", e.Error.Message, E.NL), | |
"Error"); | |
return; | |
} | |
if (frmProj != null) | |
{ | |
frmProj.DialogResult = DialogResult.OK; | |
Application.DoEvents(); | |
} | |
} | |
public static void InstallUpdateSyncWithInfo() | |
{ | |
if (checking || alreadyChecked) return; | |
try | |
{ | |
checking = true; | |
UpdateCheckInfo info; | |
if (!ApplicationDeployment.IsNetworkDeployed) return; | |
var ad = ApplicationDeployment.CurrentDeployment; | |
try | |
{ | |
info = ad.CheckForDetailedUpdate(); | |
} | |
catch (DeploymentDownloadException dde) | |
{ | |
MessageBox.Show("La nueva versión del programa no se puede descargar ahora mismo. \n\nPor favor, comprueba la conexión de red o prueba más tarde. Error: " + dde.Message); | |
alreadyChecked = true; | |
return; | |
} | |
catch (InvalidDeploymentException ide) | |
{ | |
MessageBox.Show("No se puede comprobar si hay una nueva versión. El paquete ClickOnce está corrupto. Publicar la aplicación de nuevo y continuar. Error: " + ide.Message); | |
alreadyChecked = true; | |
return; | |
} | |
catch (InvalidOperationException ioe) | |
{ | |
MessageBox.Show("No se puede actualizar la aplicación, probablemente no se esté ejecutando ClickOnce. Error: " + ioe.Message); | |
alreadyChecked = true; | |
return; | |
} | |
if (!info.UpdateAvailable) return; | |
var doUpdate = true; | |
if (!info.IsUpdateRequired) | |
{ | |
var dr = MessageBox.Show("Hay una actualización disponible. ¿Desea actualizar ahora?", "Actualización Disponible", MessageBoxButtons.OKCancel); | |
if (DialogResult.OK != dr) | |
{ | |
doUpdate = false; | |
alreadyChecked = true; | |
} | |
} | |
else | |
{ | |
MessageBox.Show("La aplicación ha detectado una actualización obligatoria de la versión " + | |
"actual a la versión " + info.MinimumRequiredVersion + | |
". La aplicación instalará la actualización y se reiniciará.", | |
"Actualización disponible", MessageBoxButtons.OK, | |
MessageBoxIcon.Information); | |
} | |
if (!doUpdate) return; | |
try | |
{ | |
alreadyChecked = true; | |
ad.Update(); | |
MessageBox.Show("La aplicación ha sido actualizada, y se reiniciará ahora."); | |
Application.Restart(); | |
} | |
catch (DeploymentDownloadException dde) | |
{ | |
MessageBox.Show( | |
"No se puede instalar la última versión de la aplicación. \n\nPor favor comprueba tu conexión de red e inténtalo de nuevo. Error: " + | |
dde); | |
} | |
} | |
finally | |
{ | |
checking = false; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment