示例#1
0
        //@Brief Obtiene una porción de la actualización
        //@Param[in] nSequence Número de la secuencia
        //@Return dc_UpdateWProgram Estructura con los datos de la actualización
        public dc_UpdateRemoteManager GetFileUpdateRemoteManager(int nSequence)
        {
            dc_UpdateRemoteManager updateRemoteManager = new dc_UpdateRemoteManager();

            updateRemoteManager.sequence = -1;
            updateRemoteManager.final    = false;

            try
            {
                m_mutexHostControllerEndpoints.WaitOne();
                foreach (EndpointAddress ep in m_hostControllerEndpoints)
                {
                    BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
                    JBCHostControllerServiceClient serviceClient = new JBCHostControllerServiceClient(binding, ep);

                    serviceClient.Open();
                    updateRemoteManager = serviceClient.GetFileUpdateRemoteManager(nSequence);
                    serviceClient.Close();
                }
            }
            catch (Exception ex)
            {
                LoggerModule.logger.Error(System.Reflection.MethodInfo.GetCurrentMethod().Name + ". Error: " + ex.Message);
            }
            finally
            {
                m_mutexHostControllerEndpoints.ReleaseMutex();
            }

            return(updateRemoteManager);
        }
        private void ProcessUpdate()
        {
            bool bOk = false;

            try
            {
                bool bContinue = false;
                int  nSequence = 1;

                //Carpeta temporal donde guardar la descarga
                string tempFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles), "JBC\\Manager", System.Convert.ToString(My.Settings.Default.TempUpdateFolder));

                //Borra la carpeta temporal
                if ((new Microsoft.VisualBasic.Devices.ServerComputer()).FileSystem.DirectoryExists(tempFolder))
                {
                    (new Microsoft.VisualBasic.Devices.ServerComputer()).FileSystem.DeleteDirectory(tempFolder, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents);
                }

                //Crear carpeta temporal
                Directory.CreateDirectory(tempFolder);

                //Download the update
                do
                {
                    //Actualizar progress bar
                    SetProgressBarValue(nSequence);

                    int nTries = 3;
                    bOk = false;
                    dc_UpdateRemoteManager updateRemoteManager = new dc_UpdateRemoteManager();

                    while (nTries > 0 && !bOk)
                    {
                        updateRemoteManager = m_comHostController.GetFileUpdateRemoteManager(nSequence);
                        bOk       = updateRemoteManager.sequence == nSequence;
                        bContinue = !updateRemoteManager.final;

                        nTries--;
                    }

                    if (!bOk)
                    {
                        break;
                    }
                    nSequence++;

                    (new Microsoft.VisualBasic.Devices.ServerComputer()).FileSystem.WriteAllBytes(Path.Combine(tempFolder, System.Convert.ToString(My.Settings.Default.AppCompressFileName)), updateRemoteManager.bytes, true);
                } while (bContinue);

                if (bOk)
                {
                    bOk = UncompressUpdateFile();

                    //Descomprime la actualización
                    if (bOk)
                    {
                        Interaction.Shell(Directory.GetFiles(tempFolder, "*.exe").First());

                        //Auto cierra la aplicación
                        ProjectData.EndApp();
                    }
                }
            }
            catch (Exception)
            {
                bOk = false;
            }

            if (!bOk)
            {
                ErrorUpdate();
            }
        }