/// <summary> /// Watches the child folder. /// </summary> /// <param name="child">The child folder. Ownership will be taken.</param> private void WatchChild(IFolder child, bool takeOwnership) { if (!_children.ContainsKey(child.EntryID)) { if (_watcher.ShouldFolderBeWatched(this, child)) { Logger.Instance.Trace(this, "Registering child on {0}: {1}", _folder.LogKey, child.FullFolderPath); // Make sure we register the entry id actually before registering any listeners. // That will cause change notifications, which require the entryid to be registered. IFolder childEffective = takeOwnership ? child : child.Clone(); ZPushFolder folder = new ZPushFolder(_watcher, this, childEffective); _children.Add(child.EntryID, folder); folder.Initialise(); return; } else { Logger.Instance.Trace(this, "Excluding child on {0}: {1}", _folder.LogKey, child.FullFolderPath); } } if (takeOwnership) { // Release the folder if not used child.Dispose(); } }
public void WatchItems <TypedItem>(IFolder folder, TypedItemEventHandler <TypedItem> handler, bool reportExisting) where TypedItem : IItem { if (!DebugOptions.GetOption(null, DebugOptions.WATCHER_ENABLED)) { return; } // Must have a ZPush folder to watch events. ZPushFolder zPushFolder = folder.ZPush; // Register the handlers ItemsWatcher watcher = zPushFolder.ItemsWatcher(); watcher.ItemEvent += (item) => { if (item is TypedItem) { handler((TypedItem)item); } }; // Report existing if requested if (reportExisting) { zPushFolder.ReportExistingItems(handler); } }
internal void OnItemChange(ZPushFolder zPushFolder, IItem item) { if (ItemEvent != null) { ItemEvent(item); } }
private void DispatchFolderEvents(ZPushFolder folder, EventKind kind) { // See if anybody is interested foreach (KeyValuePair <FolderRegistration, FolderWatcher> entry in _folderWatchers) { if (entry.Key.IsApplicable(folder.Folder)) { DispatchFolderEvent(entry.Key, entry.Value, folder, kind); } } }
internal bool ShouldFolderBeWatched(ZPushFolder parent, IFolder child) { if (parent.Folder.IsAtDepth(0)) { // Special mail folders cause issues, they are disallowed if (child.DefaultItemType != ItemType.MailItem) { return(true); } return(!IsBlackListedMailFolder(child)); } return(true); }
internal void Dispatch(ZPushFolder folder, EventKind kind) { switch (kind) { case EventKind.Discovered: OnDiscovered(folder.Folder); break; case EventKind.Changed: OnChanged(folder.Folder); break; case EventKind.Removed: OnRemoved(folder.Folder); break; } }
private void DispatchFolderEvent(FolderRegistration reg, FolderWatcher watcher, ZPushFolder folder, EventKind kind) { Logger.Instance.Debug(this, "Folder event: {0}, {1}, {2}", folder, reg, kind); watcher.Dispatch(folder, kind); }
internal void OnFolderRemoved(ZPushFolder folder) { Logger.Instance.Trace(this, "Folder removed: {0}", folder); DispatchFolderEvents(folder, EventKind.Removed); }
internal void OnFolderDiscovered(ZPushFolder folder) { Logger.Instance.Trace(this, "Folder discovered: {0}", folder); _allFolders.Add(folder); DispatchFolderEvents(folder, EventKind.Discovered); }
private void HandleFolderWatchers(ZPushAccount account) { // We need to keep the object alive to keep receiving events _rootFolder = new ZPushFolder(this, account.Account.Store.GetRootFolder()); }