Changeset 8124


Ignore:
Timestamp:
May 24, 2019, 3:39:13 PM (3 years ago)
Author:
kopal
Message:

DECODEDatabaseTools:

  • download progress of files and images is now shown
  • fixed titles of test login message boxes
Location:
trunk/CrypPlugins/DECODEDatabaseTools
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/DECODEDatabaseTools/DECODEDownloader.cs

    r8121 r8124  
    174174                return;
    175175            }
     176            ProgressChanged(0, 1);
    176177            try
    177178            {
     
    183184                GuiLogMessage(String.Format("Could not download record from DECODE database: {0}", ex.Message), NotificationLevel.Error);
    184185            }
    185             ProgressChanged(0, 1);
     186            ProgressChanged(1, 1);
    186187           
    187188        }
  • trunk/CrypPlugins/DECODEDatabaseTools/DECODESettingsTab.xaml.cs

    r8121 r8124  
    111111                if (loginOk)
    112112                {
    113                     MessageBox.Show(Properties.Resources.CredentialsOK, null, MessageBoxButton.OK, MessageBoxImage.Information);
     113                    MessageBox.Show(Properties.Resources.CredentialsOK, Properties.Resources.CredentialsOKTitle, MessageBoxButton.OK, MessageBoxImage.Information);
    114114                }
    115115                else
    116116                {
    117                     MessageBox.Show(Properties.Resources.CredentialsWrong,null,MessageBoxButton.OK,MessageBoxImage.Error);
     117                    MessageBox.Show(Properties.Resources.CredentialsWrong, Properties.Resources.CredentialsWrongTitle, MessageBoxButton.OK,MessageBoxImage.Error);
    118118                }
    119119            }
  • trunk/CrypPlugins/DECODEDatabaseTools/DECODEViewer.cs

    r8123 r8124  
    4242        private bool _running;
    4343        private Thread _workerThread;
     44        private readonly DownloadProgress _downloadProgress = new DownloadProgress();
     45
    4446        #endregion
    4547
     
    5153            _settings = new DECODEViewerSettings();
    5254            _presentation = new DECODEViewerPresentation(this);
     55            _downloadProgress.NewDownloadProgress += _downloadProgress_NewDownloadProgress;
    5356        }
    5457
    5558        #region Data Properties
    5659
    57        
     60
    5861        /// <summary>
    5962        /// Input of a json record of the DECODE database
     
    196199                _presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    197200                {
     201                    _presentation.IsEnabled = false;
    198202                    _presentation.ImageList.Items.Clear();
    199203                }, null);
     
    242246                    //translation
    243247                    _presentation.HasTranslationCheckbox.IsChecked = record.documents.translation.Count > 0;
     248
     249                    _presentation.IsEnabled = true;
    244250                }, null);
    245251            }
     
    326332                try
    327333                {
    328                     imageBytes = image.GetFullImage;
     334                    imageBytes = image.GetFullImage(_downloadProgress);
    329335                }
    330336                catch (Exception ex)
     
    348354            try
    349355            {
     356                _presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     357                {
     358                    _presentation.IsEnabled = false;
     359                }, null);
    350360                string text = Encoding.UTF8.GetString(imageBytes);
    351361                //this is a hacky check... if the database returns text instead of an image
     
    381391                GuiLogMessage(String.Format("Exception occured during creation of image: {0}", ex.Message), NotificationLevel.Error);
    382392            }
     393            finally
     394            {
     395                _presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     396                {
     397                    _presentation.IsEnabled = true;
     398                }, null);
     399            }
    383400        }
    384401
     
    396413        }
    397414
     415        /// <summary>
     416        /// Do download of a document
     417        /// </summary>
     418        /// <param name="document"></param>
    398419        private void DoDownloadDocument(Document document)
    399420        {
    400421            try
    401422            {
    402                 OutputDocument = document.DownloadDocument();
     423                _presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     424                {
     425                    _presentation.IsEnabled = false;
     426                }, null);
     427
     428                OutputDocument = document.DownloadDocument(_downloadProgress);
    403429                OnPropertyChanged("OutputDocument");
    404430            }
     
    407433                GuiLogMessage(String.Format("Exception during downloading of document: {0}", ex.Message), NotificationLevel.Error);
    408434            }
    409         }
     435            finally
     436            {
     437                _presentation.Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     438                {
     439                    _presentation.IsEnabled = true;
     440                }, null);
     441            }
     442        }
     443
     444        /// <summary>
     445        /// Fired, when download progress changed
     446        /// </summary>
     447        /// <param name="sender"></param>
     448        /// <param name="downloadProgressEventArgs"></param>
     449        private void _downloadProgress_NewDownloadProgress(object sender, DownloadProgressEventArgs downloadProgressEventArgs)
     450        {
     451            ProgressChanged(downloadProgressEventArgs.BytesDownloaded, downloadProgressEventArgs.TotalBytes);
     452        }
     453
    410454    }
    411455}
  • trunk/CrypPlugins/DECODEDatabaseTools/DataObjects.cs

    r8121 r8124  
    132132        private byte[] full_data;
    133133
    134         public byte[] GetFullImage
    135         {
    136             get
    137             {
    138                 if (full_data == null)
    139                 {
    140                     full_data = JsonDownloaderAndConverter.GetData(full_url);
    141                 }
    142                 return full_data;
    143             }
     134        public byte[] GetFullImage(DownloadProgress downloadProgress)
     135        {
     136            if (full_data == null)
     137            {
     138                full_data = JsonDownloaderAndConverter.GetData(full_url, downloadProgress);
     139            }
     140            return full_data;
    144141        }
    145142
     
    208205        /// Tries to download the document; if it fails, it returns null
    209206        /// </summary>
    210         public byte[] DownloadDocument()
     207        public byte[] DownloadDocument(DownloadProgress downloadProgress)
    211208        {                   
    212209            if (document_data == null)
    213210            {
    214                 document_data = JsonDownloaderAndConverter.GetData(download_url);
     211                document_data = JsonDownloaderAndConverter.GetData(download_url, downloadProgress);
    215212            }
    216213            return document_data;
  • trunk/CrypPlugins/DECODEDatabaseTools/JsonDownloaderAndConverter.cs

    r8121 r8124  
    2222using System.Runtime.Serialization.Json;
    2323using System.Text;
     24using System.Threading.Tasks;
    2425
    2526namespace Cryptool.Plugins.DECODEDatabaseTools
     
    141142
    142143        /// <summary>
    143         /// Get a records object from a string containing Record json data
    144         /// </summary>
    145         /// <param name="data"></param>
    146         public static Records ConvertStringToRecords(string data)
    147         {
    148             try
    149             {
    150                 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Records));
    151                 using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(data)))
    152                 {
    153                     stream.Position = 0;
    154                     Records records = (Records)serializer.ReadObject(stream);
    155                     return records;
    156                 }
    157             }
    158             catch (Exception ex)
    159             {
    160                 throw new Exception(String.Format("Could not deserialize json data: {0}", ex.Message), ex);
    161             }
    162         }
    163 
    164         /// <summary>
    165144        /// Get a record object from a string containing Record json data
    166145        /// </summary>
     
    187166        /// Downloads data from the specified URL and returns it as byte array
    188167        /// </summary>
    189         public static byte[] GetData(string url)
     168        public static byte[] GetData(string url, DownloadProgress downloadProgress = null)
    190169        {
    191170            try
     
    200179                    client.DefaultRequestHeaders.Add("User-Agent", UserAgent);
    201180                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    202 
    203                     var response = client.GetAsync(url).Result;
    204 
    205                     switch (response.StatusCode)
    206                     {
    207                         case HttpStatusCode.OK:
    208                             return response.Content.ReadAsByteArrayAsync().Result;
    209                         default:
    210                             throw new Exception(String.Format("Error: Status code was {0}", response.StatusCode));
    211                     }
     181                    var fileBytes = DownloadFile(client, url, downloadProgress).Result;
     182                    return fileBytes;
    212183                }
    213184            }
     
    216187                throw new Exception(String.Format("Error while downloading data from {0}: {1}", url, ex.Message), ex);
    217188            }
    218         }
     189        }
     190
     191        /// <summary>
     192        /// Downloads the file and also triggers progress
     193        /// </summary>
     194        /// <param name="client"></param>
     195        /// <param name="url"></param>
     196        /// <returns></returns>
     197        private static async Task<byte[]> DownloadFile(HttpClient client, string url, DownloadProgress downloadProgress = null)
     198        {
     199            using (var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
     200            {
     201                response.EnsureSuccessStatusCode();
     202                var totalBytes = response.Content.Headers.ContentLength;
     203                var totalBytesRead = 0;
     204                var lastTotalBytesRead = 0;
     205                var fileBytes = new byte[(int)totalBytes];
     206                using (var contentStream = await response.Content.ReadAsStreamAsync())
     207                {
     208                    var isMoreToRead = true;
     209                    do
     210                    {
     211                        var bytesRead = await contentStream.ReadAsync(fileBytes, totalBytesRead, fileBytes.Length - totalBytesRead);
     212                        if (bytesRead == 0)
     213                        {
     214                            isMoreToRead = false;
     215
     216                            continue;
     217                        }
     218                        totalBytesRead += bytesRead;
     219                        if (downloadProgress != null && totalBytesRead > lastTotalBytesRead + 1024)
     220                        {
     221                            lastTotalBytesRead = totalBytesRead;
     222                            downloadProgress.FireEvent(new DownloadProgressEventArgs((long)totalBytes, totalBytesRead));
     223                        }
     224                    }while (isMoreToRead);
     225
     226                    if (downloadProgress != null)
     227                    {
     228                        downloadProgress.FireEvent(new DownloadProgressEventArgs((long)totalBytes, (long)totalBytes));
     229                    }
     230
     231                }
     232                return fileBytes;
     233            }
     234        }
     235
    219236
    220237        /// <summary>
     
    235252        }
    236253    }
     254
     255    /// <summary>
     256    /// "Callback" for download progress
     257    /// </summary>
     258    public class DownloadProgress
     259    {
     260        public event EventHandler<DownloadProgressEventArgs> NewDownloadProgress;
     261        public void FireEvent(DownloadProgressEventArgs args)
     262        {
     263            if(NewDownloadProgress != null)
     264            {
     265                NewDownloadProgress.Invoke(this, args);
     266            }
     267        }
     268    }
     269
     270    /// <summary>
     271    /// EventArgs for download progress callback
     272    /// </summary>
     273    public class DownloadProgressEventArgs : EventArgs
     274    {
     275        public long TotalBytes { get; set; }
     276        public long BytesDownloaded { get; set; }
     277        public DownloadProgressEventArgs(long totalBytes, long bytesDownloaded)
     278        {
     279            TotalBytes = totalBytes;
     280            BytesDownloaded = bytesDownloaded;
     281        }
     282    }
    237283}
  • trunk/CrypPlugins/DECODEDatabaseTools/Properties/Resources.Designer.cs

    r8122 r8124  
    170170       
    171171        /// <summary>
     172        ///   Sucht eine lokalisierte Zeichenfolge, die Success ähnelt.
     173        /// </summary>
     174        internal static string CredentialsOKTitle {
     175            get {
     176                return ResourceManager.GetString("CredentialsOKTitle", resourceCulture);
     177            }
     178        }
     179       
     180        /// <summary>
    172181        ///   Sucht eine lokalisierte Zeichenfolge, die Login credentials are wrong! ähnelt.
    173182        /// </summary>
     
    175184            get {
    176185                return ResourceManager.GetString("CredentialsWrong", resourceCulture);
     186            }
     187        }
     188       
     189        /// <summary>
     190        ///   Sucht eine lokalisierte Zeichenfolge, die Failed ähnelt.
     191        /// </summary>
     192        internal static string CredentialsWrongTitle {
     193            get {
     194                return ResourceManager.GetString("CredentialsWrongTitle", resourceCulture);
    177195            }
    178196        }
  • trunk/CrypPlugins/DECODEDatabaseTools/Properties/Resources.de.resx

    r8122 r8124  
    298298    <value>Anmeldedaten sind falsch!</value>
    299299  </data>
     300  <data name="CredentialsOKTitle" xml:space="preserve">
     301    <value>Erfolg</value>
     302  </data>
     303  <data name="CredentialsWrongTitle" xml:space="preserve">
     304    <value>Fehlgeschlagen</value>
     305  </data>
    300306</root>
  • trunk/CrypPlugins/DECODEDatabaseTools/Properties/Resources.resx

    r8122 r8124  
    302302    <value>Login credentials are wrong!</value>
    303303  </data>
     304  <data name="CredentialsOKTitle" xml:space="preserve">
     305    <value>Success</value>
     306  </data>
     307  <data name="CredentialsWrongTitle" xml:space="preserve">
     308    <value>Failed</value>
     309  </data>
    304310</root>
  • trunk/CrypPlugins/DECODEDatabaseTools/Properties/Resources.ru.resx

    r8122 r8124  
    298298    <value>Учетные данные неверны!</value>
    299299  </data>
     300  <data name="CredentialsOKTitle" xml:space="preserve">
     301    <value>успех</value>
     302  </data>
     303  <data name="CredentialsWrongTitle" xml:space="preserve">
     304    <value>не удалось</value>
     305  </data>
    300306</root>
Note: See TracChangeset for help on using the changeset viewer.