/// <summary> /// Инициализировать новый конверт сообщения /// </summary> public MessageCover() { mID = 0; mTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); mMesIsRead = true; mIOType = MessageIOType.Inbox; mMesSender = new MessageUser(); mMesReceiver = new MessageUser(); mData = new MessageData(); mMesIsRead = true; }
/// <summary> /// Возвращает "короткое" сообщение, ассоциированное с пользователем /// </summary> /// <param name="usr">ID пользователя</param> /// <returns>"Короткое" сообщение</returns> public MessShort UserIsInList(MessageUser usr) { foreach (MessShort newMessShort in MessList) { if (newMessShort.mUserID == usr.mUserID) { return(newMessShort); } } return(null); }
/// <summary> /// Инициализация переписки с существующим объектом для пользователя /// </summary> public MessUserCorrespondence(MessageUser usr) { mMesUser = usr; VersionNum = 0; }
/// <summary> /// Инициализация переписки без параметров /// </summary> public MessUserCorrespondence() { mMesUser = new MessageUser(); VersionNum = 0; }
/// <summary> /// Возвращает "короткое" сообщение, ассоциированное с пользователем /// </summary> /// <param name="usr">ID пользователя</param> /// <returns>"Короткое" сообщение</returns> public MessShort UserIsInList(MessageUser usr) { foreach (MessShort newMessShort in MessList) { if (newMessShort.mUserID == usr.mUserID) { return newMessShort; } } return null; }
/// <summary> /// Обновляет переписку с пользователем /// </summary> /// <param name="toUserId">ID пользователя, переписка с которым загружается</param> /// <param name="restoreSession">Возобновить сессию</param> public MessUserCorrespondence RefreshUserCorrespondence(int toUserId, bool isRefresh, bool restoreSession, MessCorrespondence messCorrespondence) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence"); MessCorrespondence newMessCorrespondence = null; MessUserCorrespondence newUserCorrespondence = null; try { // поднимаем данные (все цепочки) из кэша try { if (messCorrespondence == null) { newMessCorrespondence = DataModel.Data.MessageCorrespondence; //newMessCorrespondence = Cache.Cache.LoadFromCache<MessCorrespondence>(string.Empty, "MessageCorrespondence"); } else newMessCorrespondence = messCorrespondence; // если в кэше нет нужных данных, переходим к загрузке с сервера if (newMessCorrespondence == null) { throw new CorrException(); } } catch (IOException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence IO Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence IO Exception stack trace: " + ex.StackTrace); // если ошибка кэша, переходим к загрузке с сервера throw new CorrException(); } MessageUser mU = new MessageUser(); mU.mUserID = toUserId; // есть ли среди данных переписка с пользователем? if (newMessCorrespondence.UserIsInList(toUserId)) { // вытаскиваем из всех цепочек одну newMessCorrespondence.SeekCorrespondence(toUserId, out newUserCorrespondence); if (newUserCorrespondence == null) { throw new CorrException(); } if (!isRefresh) { return newUserCorrespondence; } //bool completeOperation; //do //{ // MessageCover newMessageCover = null; // foreach (var val in newUserCorrespondence.mMessages) // { // if (val.mID == 0) // { // newMessageCover = val; // break; // } // } // if (newMessageCover != null) // { // newUserCorrespondence.mMessages.Remove(newMessageCover); // completeOperation = true; // } // else // { // completeOperation = false; // } //} //while (completeOperation); //// удаляем сообщения с ID = 0, т.к. это пустышки //for (int i = 0; i < newUserCorrespondence.mMessages.Count; i++) //{ // if (newUserCorrespondence.mMessages[i].mID == 0) // { // newUserCorrespondence.mMessages.RemoveAt(i); // } //} ErrorResponse newErrorResponseData = null; MessChangesResponse newMessChangesResponse = null; //WiFi if (_iDataLogic.GetOnlyWIFI() == "1") if (!CoreHelper.TurnWiFi(true)) throw new VKException(ExceptionMessage.NoConnection); // восстановить сессию if (restoreSession) { AutoLogin(); } // загружаем список изменений в цепочке try { newMessChangesResponse = _iCommunicationLogic.LoadMessChanges("message", _iDataLogic.GetUid(), _iDataLogic.GetSessionKey(), toUserId, newUserCorrespondence.VersionNum, out newErrorResponseData); } catch (TimeoutException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Timeout Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Timeout Exception stack trace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (WebException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Web Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Web Exception stack trace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (OutOfMemoryException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence OutOfMemory Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence OutOfMemory Exception stack trace: " + ex.StackTrace); throw; } catch (Exception ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Unknown Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Unknown Exception stack trace: " + ex.StackTrace); } if (newMessChangesResponse == null) // поиск ошибки { if (newErrorResponseData != null) { if (newErrorResponseData.error_code == "1") { if (!restoreSession) { RefreshUserCorrespondence(toUserId, isRefresh, true, null); } else { throw new VKException(ExceptionMessage.ServerUnavalible); } } else if (newErrorResponseData.error_code == "2") { throw new VKException(ExceptionMessage.AccountBloked); } else { throw new VKException(ExceptionMessage.UnknownError); } } else { throw new VKException(ExceptionMessage.UnknownError); } } else { // применяем полученные изменения // UPD: // применяем только события add, чтобы минимизировать количество ошибок // в случае ошибки грузим всю цепочку заново foreach (MessChange сurrentChange in newMessChangesResponse.MessList) { // bugfix: проверка, что сообщение из нужной цепочки // т.к. сервер иногда присылает хрень какую-то if (сurrentChange.Message.mMesReceiver.mUserID == toUserId || сurrentChange.Message.mMesSender.mUserID == toUserId) { switch (сurrentChange.ActionType) { case "add": // есть ли сообщение в списке? if (newUserCorrespondence.MessageIsInList(сurrentChange.Message.mID)) { throw new CorrException(); } newUserCorrespondence.mMessages.Add(сurrentChange.Message); newUserCorrespondence.FromCache = false; // обновляем номер версии if (newUserCorrespondence.VersionNum < сurrentChange.VersionNum) { newUserCorrespondence.VersionNum = сurrentChange.VersionNum; } break; #region // //case "del": // if (!newUserCorrespondence.Delete(сurrentChange.Message.mID)) // { // throw new CorrException(); // } // if (newUserCorrespondence.VersionNum < сurrentChange.VersionNum) // { // newUserCorrespondence.VersionNum = сurrentChange.VersionNum; // } // break; //case "restore": // if (newUserCorrespondence.MessageIsInList(сurrentChange.Message.mID)) // { // throw new CorrException(); // } // newUserCorrespondence.mMessages.Add(сurrentChange.Message); // if (newUserCorrespondence.VersionNum < сurrentChange.VersionNum) // { // newUserCorrespondence.VersionNum = сurrentChange.VersionNum; // } // break; case "read": if (!newUserCorrespondence.MessageIsInList(сurrentChange.Message.mID)) { throw new CorrException(); } newUserCorrespondence.SeekMessage(сurrentChange.Message.mID).mMesIsRead = true; if (newUserCorrespondence.VersionNum < сurrentChange.VersionNum) { newUserCorrespondence.VersionNum = сurrentChange.VersionNum; newUserCorrespondence.FromCache = false; } break; #endregion } } } // удаляем сообщения с id = 0; bool completeOperation; do { MessageCover newMessageCover = null; foreach (var val in newUserCorrespondence.mMessages) { if (val.mID == 0) { newMessageCover = val; break; } } if (newMessageCover != null) { newUserCorrespondence.mMessages.Remove(newMessageCover); newUserCorrespondence.FromCache = false; completeOperation = true; } else { completeOperation = false; } } while (completeOperation); try { //bool result; if (messCorrespondence == null) { DataModel.Data.MessageCorrespondence = newMessCorrespondence; //result = Cache.Cache.SaveToCache(newMessCorrespondence, string.Empty, "MessageCorrespondence"); } //else //result = true; /* if (result) { DebugHelper.WriteLogEntry("MessageCorrespondence сохранены в кэш."); } else { DebugHelper.WriteLogEntry("MessageCorrespondence не сохранены в кэш."); } */ } catch (IOException newException) { DebugHelper.WriteLogEntry("Ошибка сохранения данных MessageCorrespondence в кэш: " + newException.Message); } } return newUserCorrespondence; } else { // переписки с пользователем не нашли throw new CorrException(); } } catch (CorrException) // прогрузка всей цепочки целиком { if (!isRefresh) { return null; } //WiFi if (_iDataLogic.GetOnlyWIFI() == "1") if (!CoreHelper.TurnWiFi(true)) throw new VKException(ExceptionMessage.NoConnection); // восстановить сессию if (restoreSession) { AutoLogin(); } MessResponse newMessResponse = null; MessageUser mU = new MessageUser(); mU.mUserID = toUserId; // т.к. это список цепочек то список может быть не пустой, но гаранитровать мы этого не можем if (newMessCorrespondence == null) { newMessCorrespondence = new MessCorrespondence(); } // если вызывается прогрузка цепочки, то необходимо удалить старую версию и заменить ее новой... // если цепочка была - очищаем // если цепочик не было - добавляем if (!newMessCorrespondence.UserIsInList(toUserId)) { newUserCorrespondence = new MessUserCorrespondence(mU); newMessCorrespondence.mUserCorrespondences.Add(newUserCorrespondence); } else { newMessCorrespondence.SeekCorrespondence(toUserId, out newUserCorrespondence); newUserCorrespondence.mMessages.Clear(); newUserCorrespondence.FromCache = false; newUserCorrespondence.VersionNum = 0; } ErrorResponse newErrorResponseData = null; // размер блока которым мы гшрузим цепочку int messBlockSize = 50; // количество скачанных сообщений int messCount = 0; // общее количество сообщений int messOnServerCount = messBlockSize; while (messCount < messOnServerCount) { newMessResponse = null; newErrorResponseData = null; // поставить обработчик!!! try { newMessResponse = _iCommunicationLogic.LoadMessages("message", _iDataLogic.GetUid(), _iDataLogic.GetSessionKey(), Convert.ToString(messCount), Convert.ToString(messCount + messBlockSize), toUserId, out newErrorResponseData); } catch (TimeoutException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Timeout Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Timeout Exception stack trace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (WebException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Web Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Web Exception stack trace: " + ex.StackTrace); throw new VKException(ExceptionMessage.NoConnection); } catch (OutOfMemoryException ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence OutOfMemory Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence OutOfMemory Exception stack trace: " + ex.StackTrace); throw; } catch (Exception ex) { DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Unknown Exception message: " + ex.Message); DebugHelper.WriteLogEntry("BaseLogic.RefreshUserCorrespondence Unknown Exception stack trace: " + ex.StackTrace); } if (newMessResponse == null) // ищем ошибку { if (newErrorResponseData != null) { if (newErrorResponseData.error_code == "1") { if (!restoreSession) { RefreshUserCorrespondence(toUserId, isRefresh, true, null); } else { throw new VKException(ExceptionMessage.ServerUnavalible); } } else if (newErrorResponseData.error_code == "2") { throw new VKException(ExceptionMessage.AccountBloked); } else { throw new VKException(ExceptionMessage.UnknownError); } } else { throw new VKException(ExceptionMessage.UnknownError); } } else { messOnServerCount = newMessResponse.mCount; // учитываем изменения ts if (newUserCorrespondence.VersionNum < newMessResponse.VersionNum) { newUserCorrespondence.VersionNum = newMessResponse.VersionNum; } foreach (MessageCover CurrentMessage in newMessResponse.mMessages) { newUserCorrespondence.mMessages.Add(CurrentMessage); } newUserCorrespondence.FromCache = false; messCount += messBlockSize; } } try { bool result; if (messCorrespondence == null) { DataModel.Data.MessageCorrespondence = newMessCorrespondence; //result = Cache.Cache.SaveToCache(newMessCorrespondence, string.Empty, "MessageCorrespondence"); } //else //result = true; /* if (result) { DebugHelper.WriteLogEntry("MessageCorrespondence сохранены в кэш."); } else { DebugHelper.WriteLogEntry("MessageCorrespondence не сохранены в кэш."); } */ } catch (IOException newException) { DebugHelper.WriteLogEntry("Ошибка сохранения данных MessageCorrespondence в кэш: " + newException.Message); } return newUserCorrespondence; } }