Exemplo n.º 1
0
        /// <summary>
        /// Refresh this topic from the server
        /// </summary>
        internal void InternalRefresh()
        {
            if (CIX.Online & !_isFolderRefreshing)
            {
                _isFolderRefreshing = true;
                CIX.FolderCollection.NotifyTopicUpdateStarted(this);

                try
                {
                    // When refreshing, get the last 30 days worth unless the topic is empty in which
                    // case we get everything. The assumption is that if any changes occur with the
                    // read/unread status on the server then 30 days back is enough to sync those
                    // with the local database.
                    DateTime latestReply = new DateTime(1900, 1, 1);
                    if (Messages.Count > 0)
                    {
                        latestReply = DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0));
                    }

                    // First clear the flag so we don't over-refresh
                    RefreshRequired = false;

                    Folder forum = ParentFolder;
                    int    countOfNewMessages = 0;

                    string urlFormat = string.Format("forums/{0}/{1}/allmessages", FolderCollection.EncodeForumName(forum.Name), Name);

                    HttpWebRequest request = APIRequest.GetWithQuery(urlFormat, APIRequest.APIFormat.XML, "maxresults=5000&since=" + latestReply.ToString("yyyy-MM-dd HH:mm:ss"));
                    using (Stream objStream = APIRequest.ReadResponse(request))
                    {
                        if (objStream != null)
                        {
                            countOfNewMessages = FolderCollection.AddMessages(objStream, ref latestReply, false, false);
                        }
                    }
                    if (countOfNewMessages > 0)
                    {
                        LogFile.WriteLine("{0}/{1} refreshed with {2} new messages", forum.Name, Name, countOfNewMessages);
                    }
                }
                catch (Exception e)
                {
                    CIX.ReportServerExceptions("Folder.Refresh", this, e);
                }

                CIX.FolderCollection.NotifyTopicUpdateCompleted(this);
                _isFolderRefreshing = false;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Do a fixup scan of the messages in the folder and make a request to
        /// retrieve any missing ones.
        /// </summary>
        public void Fixup()
        {
            List <Range> listOfRanges  = new List <Range>();
            int          lastMessageID = 0;

            foreach (CIXMessage message in _allMessages.OrderedMessages)
            {
                if (!message.IsPseudo && message.RemoteID != lastMessageID + 1)
                {
                    Range newRange = new Range
                    {
                        TopicName = Name,
                        ForumName = ParentFolder.Name,
                        Start     = lastMessageID + 1,
                        End       = message.RemoteID - 1
                    };
                    listOfRanges.Add(newRange);
                }
                lastMessageID = message.RemoteID;
            }
            if (listOfRanges.Count > 0)
            {
                Thread t = new Thread(() =>
                {
                    try
                    {
                        HttpWebRequest wrGeturl = APIRequest.Post("forums/messagerange", APIRequest.APIFormat.XML, listOfRanges);
                        Stream objStream        = APIRequest.ReadResponse(wrGeturl);
                        if (objStream != null)
                        {
                            DateTime sinceDate = CIX.LastSyncDate;
                            int newMessages    = FolderCollection.AddMessages(objStream, ref sinceDate, true, true);

                            if (newMessages > 0)
                            {
                                LogFile.WriteLine("{0}/{1} refreshed with {2} new messages", ParentFolder.Name, Name, newMessages);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        CIX.ReportServerExceptions("Folder.Fixup", e);
                    }
                });
                t.Start();
            }
        }
Exemplo n.º 3
0
        public void TestForumsFastSync()
        {
            string databasePath = Path.GetTempFileName();

            CIX.Init(databasePath);

            Folder forumFolder = new Folder
            {
                ParentID       = -1,
                Name           = "cix.beta",
                Unread         = 0,
                UnreadPriority = 0
            };

            CIX.FolderCollection.Add(forumFolder);

            Folder topicFolder = new Folder
            {
                Name           = "cixreader",
                ParentID       = forumFolder.ID,
                Unread         = 0,
                UnreadPriority = 0
            };

            CIX.FolderCollection.Add(topicFolder);

            // Seed message as fast sync doesn't work on empty topics
            CIXMessage seedMessage = new CIXMessage
            {
                RemoteID  = 1,
                Author    = "CIX",
                Body      = "Seed message",
                CommentID = 0
            };

            topicFolder.Messages.Add(seedMessage);

            string   userSyncData = Resource1.UserSyncData;
            DateTime sinceDate    = default(DateTime);

            FolderCollection.AddMessages(Utilities.GenerateStreamFromString(userSyncData), ref sinceDate, true, false);

            // On completion, verify that there are no duplicates in the topic
            List <CIXMessage> messages = topicFolder.Messages.OrderBy(fld => fld.RemoteID).ToList();
            int lastMessageID          = -1;

            foreach (CIXMessage cixMessage in messages)
            {
                Assert.AreNotEqual(cixMessage.RemoteID, 0);
                Assert.AreNotEqual(cixMessage.RemoteID, lastMessageID);
                Assert.AreNotEqual(cixMessage.ID, 0);
                lastMessageID = cixMessage.RemoteID;
            }

            // Verify that specific messages are marked read
            CIXMessage message = topicFolder.Messages.MessageByID(2323);

            Assert.IsNotNull(message);
            Assert.IsFalse(message.Unread);

            // Verify that specific messages are marked unread
            message = topicFolder.Messages.MessageByID(2333);
            Assert.IsNotNull(message);
            Assert.IsTrue(message.Unread);

            // Verify the total unread on the folder and globally
            Assert.AreEqual(topicFolder.Unread, 1);
            Assert.AreEqual(topicFolder.UnreadPriority, 6);
            Assert.AreEqual(CIX.FolderCollection.TotalUnread, 1);
            Assert.AreEqual(CIX.FolderCollection.TotalUnreadPriority, 6);
        }