Beispiel #1
0
 /// <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;
 }
Beispiel #2
0
 /// <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;
 }
Beispiel #3
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);
        }
Beispiel #4
0
 /// <summary>
 /// Инициализация переписки с существующим объектом для пользователя
 /// </summary>
 public MessUserCorrespondence(MessageUser usr)
 {
     mMesUser = usr;
     VersionNum = 0;
 }
Beispiel #5
0
 /// <summary>
 /// Инициализация переписки без параметров
 /// </summary>
 public MessUserCorrespondence()
 {
     mMesUser = new MessageUser();
     VersionNum = 0;
 }
Beispiel #6
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;
        }
Beispiel #7
0
        /// <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;
            }
        }
Beispiel #8
0
 /// <summary>
 /// Инициализация переписки с существующим объектом для пользователя
 /// </summary>
 public MessUserCorrespondence(MessageUser usr)
 {
     mMesUser   = usr;
     VersionNum = 0;
 }
Beispiel #9
0
 /// <summary>
 /// Инициализация переписки без параметров
 /// </summary>
 public MessUserCorrespondence()
 {
     mMesUser   = new MessageUser();
     VersionNum = 0;
 }