/// <summary> /// Обработчик создания сервиса /// </summary> public override void OnCreate() { //Инициализируем базу данных CreateDB(); //Инициализируем класс обмена с сервером UserAccess.Init(); //Подключаем обработчик ошибок UserAccess.OnError += UserAccess_OnError; //Инициализируем кэш иконок _iconsCache = new PhotoCache(this, 1000, 10000000, 20000); //Инициализируем кэш полных описаний событий _eventsFullCache = new EventFullCache(this, 200, 1000000, 5000); //Выводим информационное сообщение Toast.MakeText(this, "Сервис AEC запущен", ToastLength.Long).Show(); }
/// <summary> /// Получение списка сообщений /// </summary> /// <param name="pos"></param> /// <param name="count"></param> /// <param name="events"></param> /// <returns></returns> public bool GetEventsList(int pos, int count, out EventShort[] events) { //Задаём начальные выходные значения events = null; //Результат операции bool result = true; //Получаем события с сервера result &= UserAccess.Execute <EventShort[]>(() => UserAccess.Client.GetEventsList(SessionId, pos, count), out events); //Если ошибка if (!result) { //Выходим с ошибкой return(false); } //Выходим с успехом return(true); }
/// <summary> /// Получение списка категорий /// </summary> /// <param name="parentId"></param> /// <param name="rootId"></param> /// <param name="pos"></param> /// <param name="count"></param> /// <param name="categories"></param> /// <returns></returns> public bool GetCategoriesList(long parentId, long rootId, int pos, int count, out CategoryShort[] categories) { //Задаём начальные выходные значения categories = null; //Результат операции bool result = true; //Получаем события с сервера result &= UserAccess.Execute <CategoryShort[]>(() => UserAccess.Client.GetCategoriesListForCurrentAccount(SessionId, parentId, rootId, pos, count), out categories); //Если ошибка if (!result) { //Выходим с ошибкой return(false); } //Выходим с успехом return(true); }
/// <summary> /// Вызов методов сервера с обработкой ошибок (для методов без возвращаемого значения) /// </summary> /// <param name="method"></param> /// <returns></returns> public static bool Execute(Expression <Action> method) { //Если объект клиента ещё не создан if (Client == null) { //Создаём его Client = new UserAccess(); //Формируем выражение для вызова метода с новым объектом method = Expression.Lambda <Action>((method.Body as MethodCallExpression).Update(Expression.Constant(Client), (method.Body as MethodCallExpression).Arguments)); } //Цикл повторения запроса for (int tryNum = 0; tryNum < TRY_METHOD_CALLS_MAX_NUM; tryNum += 1) { try { //Если объект обмена в невменяемом состоянии if (Client.State == CommunicationState.Faulted) { //Закрываем старое подключение Client.Abort(); //Освобождаем ресурсы (Client as IDisposable).Dispose(); //Создаём новое подключение Client = new UserAccess(); //Формируем выражение для вызова метода с новым объектом method = Expression.Lambda <Action>((method.Body as MethodCallExpression).Update(Expression.Constant(Client), (method.Body as MethodCallExpression).Arguments)); } //Выполняем запрос method.Compile()(); //Выходим с успехом return(true); } //Если контролируемое исключение сервера catch (FaultException <ESException> ex) { //Если обработчик события ошибки определён if (OnError != null) { //Вызываем событие обработки ошибки OnError.Invoke(ex.Detail.Description); } //Выходим с ошибкой return(false); } //Если точка доступа к серверу недоступна catch (EndpointNotFoundException) { //Ничего не делаем и повторяем попытку } //Если исключение обмена по сети catch (CommunicationException) { //Ничего не делаем и повторяем попытку } } //Если обработчик события ошибки определён if (OnError != null) { //Вызываем событие обработки ошибки OnError.Invoke("Не удалось связаться с сервером!"); } //Выходим с ошибкой return(false); }
/// <summary> /// Переопределяемый метод получения объекта с сервера /// </summary> /// <param name="id">Идентификатор объекта</param> /// <param name="obj">Возвращаемый объект</param> /// <returns>Признак успешного нахождени на сервере</returns> protected override bool GetFromServer(Int64 id, out Photo obj) { //Получаем фото с сервера return(UserAccess.Execute <Photo>(() => UserAccess.Client.GetPhoto(_service.SessionId, id), out obj)); }
/// <summary> /// Переопределяемый метод получения объекта с сервера /// </summary> /// <param name="id">Идентификатор объекта</param> /// <param name="obj">Возвращаемый объект</param> /// <returns>Признак успешного нахождени на сервере</returns> protected override bool GetFromServer(Int64 id, out EventFullGet obj) { //Получаем фото с сервера return(UserAccess.Execute <EventFullGet>(() => UserAccess.Client.GetEventFullDescription(_service.SessionId, id), out obj)); }