/// <summary> /// Download the view from the server /// </summary> protected bool LoadView(Type viewType, int viewID, DateTime viewAge, ref BaseView view, out DateTime newViewAge) { var viewProps = GetViewProps(viewID); newViewAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Itf, viewProps.Path); if (newViewAge == DateTime.MinValue) { throw new ScadaException("Unable to receive view file modification time."); } if (newViewAge == viewAge) { return(false); // view file changed } // creating and loading a new view if (view == null) { view = (BaseView)Activator.CreateInstance(viewType); } if (serverComm.ReceiveView(viewProps.Path, view)) { return(true); } throw new ScadaException("Unable to receive view."); }
/// <summary> /// Загрузить представление от сервера /// </summary> protected bool LoadView(Type viewType, int viewID, DateTime viewAge, ref BaseView view, out DateTime newViewAge) { UiObjProps viewProps = GetViewProps(viewID); newViewAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Itf, viewProps.Path); if (newViewAge == DateTime.MinValue) { throw new ScadaException(Localization.UseRussian ? "Не удалось принять время изменения файла представления." : "Unable to receive view file modification time."); } else if (newViewAge != viewAge) // файл представления изменён { // создание и загрузка нового представления if (view == null) { view = (BaseView)Activator.CreateInstance(viewType); } view.SetArgs(viewProps.Args); if (serverComm.ReceiveView(viewProps.Path, view)) { view.UpdateTitle(viewProps.ShortTitle); return(true); } else { throw new ScadaException(Localization.UseRussian ? "Не удалось принять представление." : "Unable to receive view."); } } else { return(false); } }
/// <summary> /// Получить представление из кэша или от сервера /// </summary> public T GetView <T>(int viewID, bool throwOnError = false) where T : BaseView { try { T view = null; // получение представления из кеша DateTime utcNowDT = DateTime.UtcNow; Cache <int, BaseView> .CacheItem cacheItem = cache.GetItem(viewID, utcNowDT); BaseView viewFromCache; DateTime viewAge; // время изменения файла представления bool viewIsNotValid; // представление могло устареть if (cacheItem == null) { viewFromCache = null; viewAge = DateTime.MinValue; viewIsNotValid = true; } else { viewFromCache = cacheItem.Value; viewAge = cacheItem.ValueAge; viewIsNotValid = utcNowDT - cacheItem.ValueRefrDT > ViewValidSpan; } // получение представления от сервера if (viewFromCache == null || viewIsNotValid) { ViewProps viewProps = dataAccess.GetViewProps(viewID); if (viewProps == null) { if (throwOnError) { throw new ScadaException(Localization.UseRussian ? "Отсутствуют свойства представления." : "View properties are missing."); } } else { DateTime newViewAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Itf, viewProps.FileName); if (newViewAge == DateTime.MinValue) { if (throwOnError) { throw new ScadaException(Localization.UseRussian ? "Не удалось принять время изменения файла представления." : "Unable to receive view file modification time."); } } else if (newViewAge != viewAge) // файл представления изменён { // создание и загрузка нового представления view = (T)Activator.CreateInstance(typeof(T)); if (serverComm.ReceiveView(viewProps.FileName, view)) { if (cacheItem == null) { // добавление представления в кеш cache.AddValue(viewID, view, newViewAge, utcNowDT); } else { // обновление представления в кеше cache.UpdateItem(cacheItem, view, newViewAge, utcNowDT); } } else { if (throwOnError) { throw new ScadaException(Localization.UseRussian ? "Не удалось принять представление." : "Unable to receive view."); } } } } } // использование представление из кеша if (view == null && viewFromCache != null) { view = viewFromCache as T; if (view == null && throwOnError) { throw new ScadaException(Localization.UseRussian ? "Несоответствие типа представления." : "View type mismatch."); } } return(view); } catch (Exception ex) { string errMsg = string.Format(Localization.UseRussian ? "Ошибка при получении представления с ид.={0} из кэша или от сервера" : "Error getting view with ID={0} from the cache or from the server", viewID); log.WriteException(ex, errMsg); if (throwOnError) { throw new ScadaException(errMsg); } else { return(null); } } }