Beispiel #1
0
        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();
            //        }
        }
Beispiel #2
0
        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;
        }
Beispiel #3
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;
            }
        }