Skip to content

Instantly share code, notes, and snippets.

@javiercampos
Created September 2, 2015 11:50
Show Gist options
  • Save javiercampos/585bd33cc9d375f4a6aa to your computer and use it in GitHub Desktop.
Save javiercampos/585bd33cc9d375f4a6aa to your computer and use it in GitHub Desktop.
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