Пример #1
0
 protected override bool IsThisTheMessageThatIAmInterestedIn(cResponseDataFetch pFetch) => pFetch.MSN == mMSN;
Пример #2
0
                private void ZFetch(cResponseDataFetch pFetch, cTrace.cContext pParentContext)
                {
                    var lContext = pParentContext.NewMethod(nameof(cSelectedMailboxCache), nameof(ZFetch));

                    var lFetchedItem = mItems[(int)pFetch.MSN - 1];

                    lFetchedItem.Update(pFetch, out var lAttributesSet, out var lPropertiesChanged);

                    bool lSetMailboxStatus = false;

                    if ((lAttributesSet & fMessageCacheAttributes.flags) != 0)
                    {
                        if (pFetch.Flags.Contains(kMessageFlag.Seen))
                        {
                            if (lFetchedItem.Unseen == null)
                            {
                                lFetchedItem.Unseen = false;
                                mUnseenUnknownCount--;
                                lSetMailboxStatus = true;
                            }
                            else if (lFetchedItem.Unseen.Value)
                            {
                                lFetchedItem.Unseen = false;
                                mUnseenCount--;
                                lSetMailboxStatus = true;
                            }
                        }
                        else
                        {
                            if (lFetchedItem.Unseen == null)
                            {
                                lFetchedItem.Unseen = true;
                                mUnseenUnknownCount--;
                                mUnseenCount++;
                                lSetMailboxStatus = true;
                            }
                            else if (!lFetchedItem.Unseen.Value)
                            {
                                lFetchedItem.Unseen = true;
                                mUnseenCount++;
                                lSetMailboxStatus = true;
                            }
                        }
                    }

                    if ((lAttributesSet & fMessageCacheAttributes.uid) != 0 && lFetchedItem.UID != null)
                    {
                        mUIDIndex.Add(lFetchedItem.UID, lFetchedItem);

                        if (pFetch.MSN > mUIDNextMessageCount)
                        {
                            mUIDNextUnknownCount--;
                            if (lFetchedItem.UID.UID + 1 > mUIDNext)
                            {
                                mUIDNext = lFetchedItem.UID.UID + 1;
                            }
                            lSetMailboxStatus = true;
                        }
                    }

                    if (lFetchedItem.ModSeq > mPendingHighestModSeq)
                    {
                        mPendingHighestModSeq = lFetchedItem.ModSeq.Value;
                    }

                    mSynchroniser.InvokeMessagePropertiesChanged(lFetchedItem, lPropertiesChanged, lContext);
                    if (lSetMailboxStatus)
                    {
                        ZSetMailboxStatus(lContext);
                    }
                }
Пример #3
0
 protected abstract bool IsThisTheMessageThatIAmInterestedIn(cResponseDataFetch pFetch);
Пример #4
0
                public void Update(cResponseDataFetch lFetch, out fMessageCacheAttributes rAttributesSet, out fMessageProperties rPropertiesChanged)
                {
                    rAttributesSet     = ~mAttributes & lFetch.Attributes;
                    rPropertiesChanged = 0;

                    if ((rAttributesSet & fMessageCacheAttributes.flags) != 0)
                    {
                        Flags = lFetch.Flags;
                    }
                    else if (lFetch.Flags != null)
                    {
                        foreach (var lFlag in Flags.SymmetricDifference(lFetch.Flags))
                        {
                            rAttributesSet     |= fMessageCacheAttributes.flags;
                            rPropertiesChanged |= fMessageProperties.flags | LMessageProperty(lFlag);
                        }

                        Flags = lFetch.Flags;
                    }

                    if ((rAttributesSet & fMessageCacheAttributes.envelope) != 0)
                    {
                        Envelope = lFetch.Envelope;
                    }
                    if ((rAttributesSet & fMessageCacheAttributes.received) != 0)
                    {
                        Received = lFetch.Received;
                    }
                    if ((rAttributesSet & fMessageCacheAttributes.size) != 0)
                    {
                        Size = lFetch.Size;
                    }
                    if ((rAttributesSet & fMessageCacheAttributes.body) != 0)
                    {
                        mBody = lFetch.Body;
                    }
                    if ((rAttributesSet & fMessageCacheAttributes.bodystructure) != 0)
                    {
                        BodyStructure = lFetch.BodyStructure;
                    }
                    if ((rAttributesSet & fMessageCacheAttributes.uid) != 0 && mMessageCache.UIDValidity != 0)
                    {
                        UID = new cUID(mMessageCache.UIDValidity, lFetch.UID.Value);
                    }

                    if (!mMessageCache.NoModSeq)
                    {
                        if ((rAttributesSet & fMessageCacheAttributes.modseq) != 0)
                        {
                            mModSeq = lFetch.ModSeq;
                        }
                        else if (lFetch.ModSeq != null && lFetch.ModSeq != mModSeq)
                        {
                            rAttributesSet     |= fMessageCacheAttributes.modseq;
                            rPropertiesChanged |= fMessageProperties.modseq;
                            mModSeq             = lFetch.ModSeq;
                        }
                    }

                    HeaderFields += lFetch.HeaderFields;
                    BinarySizes  += lFetch.BinarySizes;

                    mAttributes |= lFetch.Attributes;

                    fMessageProperties LMessageProperty(string pFlag)
                    {
                        if (pFlag.Equals(kMessageFlag.Answered, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.answered);
                        }
                        if (pFlag.Equals(kMessageFlag.Flagged, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.flagged);
                        }
                        if (pFlag.Equals(kMessageFlag.Deleted, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.deleted);
                        }
                        if (pFlag.Equals(kMessageFlag.Seen, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.seen);
                        }
                        if (pFlag.Equals(kMessageFlag.Draft, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.draft);
                        }
                        if (pFlag.Equals(kMessageFlag.Recent, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.recent);
                        }
                        // see comments elsewhere as to why this is commented out
                        //if (pFlag.Equals(kMessageFlagName.MDNSent, StringComparison.InvariantCultureIgnoreCase)) return fMessageProperties.mdnsent;
                        if (pFlag.Equals(kMessageFlag.Forwarded, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.forwarded);
                        }
                        if (pFlag.Equals(kMessageFlag.SubmitPending, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.submitpending);
                        }
                        if (pFlag.Equals(kMessageFlag.Submitted, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return(fMessageProperties.submitted);
                        }
                        return(0);
                    }
                }