/// <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; } }
/// <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(); } }
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); }