public void SaveSendMessageToCache(int uid, string text) { try { MessUserCorrespondence newUserCorrespondence = null; //MessCorrespondence newMessCorrespondence = Cache.Cache.LoadFromCache<MessCorrespondence>(string.Empty, "MessageCorrespondence"); MessCorrespondence newMessCorrespondence = DataModel.Data.MessageCorrespondence; if (newMessCorrespondence == null) { newMessCorrespondence = new MessCorrespondence(); // заводим пользователя newUserCorrespondence = new MessUserCorrespondence(); newMessCorrespondence.mUserCorrespondences.Add(newUserCorrespondence); } else { newMessCorrespondence.SeekCorrespondence(uid, out newUserCorrespondence); if (newUserCorrespondence == null) { // заводим пользователя newUserCorrespondence = new MessUserCorrespondence(); newMessCorrespondence.mUserCorrespondences.Add(newUserCorrespondence); } } newUserCorrespondence.mMesUser.mUserID = uid; MessageCover newMessageCover = new MessageCover(); newUserCorrespondence.mMessages.Add(newMessageCover); newMessageCover.mID = 0; newMessageCover.mTime = DateTime.Now.ToLocalTime(); newMessageCover.mIOType = MessageIOType.Outbox; newMessageCover.mData = new MessageData(); newMessageCover.mData.mText = text; // Обновляем в MessageShortCorrespondence MessShortCorrespondence shortCorr = DataModel.Data.MessageShortCorrespondence; MessShort mess = shortCorr.UserIsInList(new MessageUser {mUserID = uid}) ?? new MessShort(); mess.mID = 0; mess.mIsRead = true; mess.mLastMessageText = text; mess.mTime = newMessageCover.mTime; mess.mType = MessageIOType.Outbox; mess.mUserID = uid; if (shortCorr.UserIsInList(new MessageUser { mUserID = uid }) == null) { User u = DataModel.Data.FriendsListResponseData.GetUserByID(uid.ToString()); mess.mUserName = u.FullName; mess.mUserPhotoURL = u.Photo100px; } // сохранить все в кэш try { bool result; DataModel.Data.MessageCorrespondence = newMessCorrespondence; DataModel.Data.MessageShortCorrespondence = shortCorr; /* result = Cache.Cache.SaveToCache(newMessCorrespondence, string.Empty, "MessageCorrespondence"); if (result) { DebugHelper.WriteLogEntry("MessageCorrespondence сохранены в кэш."); } else { DebugHelper.WriteLogEntry("MessageCorrespondence не сохранены в кэш."); } */ } catch (IOException newException) { DebugHelper.WriteLogEntry("Ошибка сохранения данных MessageCorrespondence в кэш: " + newException.Message); } } catch (Exception) { // } //try // { // newMessCorrespondence = Cache.Cache.LoadFromCache<MessCorrespondence>(string.Empty, "MessageCorrespondence"); // // если в кэше нет нужных данных, переходим к загрузке с сервера // 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(); // } }
public bool UploadNextUserCorrespond(MessShortCorrespondence newMessShortCorrespondence, MessCorrespondence newMessCorrespondence) { try { if (newMessShortCorrespondence == null) { throw new Exception(); } try { foreach (var val in newMessShortCorrespondence.MessList) { if (!newMessCorrespondence.UserIsInList(val.mUserID)) { RefreshUserCorrespondence(val.mUserID, true, false, newMessCorrespondence); // для каждого пользователя грузим цепочку return true; } } } catch (VKException) { throw; } catch (OutOfMemoryException) { throw; } } catch (Exception) { // если нет в кэше то выходим return false; } return false; }
/// <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; } }