/// <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();
            }
        }
示例#2
0
        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);
     }
 }
示例#4
0
 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);
         }
     }
 }
示例#5
0
        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);
        }
示例#6
0
            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;
                }
            }
示例#7
0
 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);
 }
示例#8
0
 internal void OnFolderRemoved(ZPushFolder folder)
 {
     Logger.Instance.Trace(this, "Folder removed: {0}", folder);
     DispatchFolderEvents(folder, EventKind.Removed);
 }
示例#9
0
 internal void OnFolderDiscovered(ZPushFolder folder)
 {
     Logger.Instance.Trace(this, "Folder discovered: {0}", folder);
     _allFolders.Add(folder);
     DispatchFolderEvents(folder, EventKind.Discovered);
 }
示例#10
0
 private void HandleFolderWatchers(ZPushAccount account)
 {
     // We need to keep the object alive to keep receiving events
     _rootFolder = new ZPushFolder(this, account.Account.Store.GetRootFolder());
 }