Diagnosing Feed Reading Problems in IE, Part 1
Posted: January 10, 2010 Filed under: Windows Internals Leave a comment »For several months, I’ve been having an annoying problem with IE8. This is going to be a long post, an excuse to explain some IE RSS internals.
I use IE’s built in RSS reader and read items as seen in the screenshot above. Unfortunately, when I close one feed and go to the next, the feed is often still marked as unread, even though I’ve read it. The popup tells the truth: I’ve read all the posts in Gadget Freak, yet the feed name is still highlighted, meaning “unread”, as is the common convention for RSS readers (and Usenet/web forum readers before that.)
The IE RSS feeds manager is a component built into IE that is available to all Windows applications. It’s documented in MSDN and known as the Windows RSS Platform. It can be accessed through the COM object “Microsoft.Feedsmanager”, and it is very useable and discoverable in PowerShell.
First, reference the Feedsmanager:
$feeds = new-object -com "Microsoft.FeedsManager"
What can we do? Get its methods:
$feeds | gm
TypeName: System.__ComObject#{a74029cc-1f1a-4906-88f0-810638d86591}
Name MemberType Definition
---- ---------- ----------
AsyncSyncAll Method void AsyncSyncAll ()
BackgroundSync Method void BackgroundSync (FEEDS_BACKGROUNDSYNC_ACTION)
DeleteFeed Method void DeleteFeed (string)
DeleteFolder Method void DeleteFolder (string)
ExistsFeed Method bool ExistsFeed (string)
ExistsFolder Method bool ExistsFolder (string)
GetFeed Method IDispatch GetFeed (string)
GetFeedByUrl Method IDispatch GetFeedByUrl (string)
GetFolder Method IDispatch GetFolder (string)
IsSubscribed Method bool IsSubscribed (string)
Normalize Method string Normalize (string)
BackgroundSyncStatus Property FEEDS_BACKGROUNDSYNC_STATUS BackgroundSyncStatus () {get}
DefaultInterval Property int DefaultInterval () {get} {set}
ItemCountLimit Property int ItemCountLimit () {get}
RootFolder Property IDispatch RootFolder () {get}
You may remember the Default Interval and Item Count Limit if you’ve configured RSS in IE.
Let’s get the root folder and its properties:
$feedsfolder = $Feeds.RootFolder
$feedsfolder | gm
TypeName: System.__ComObject#{81f04ad1-4194-4d7d-86d6-11813cec163c}
Name MemberType Definition
---- ---------- ----------
ItemCount AliasProperty ItemCount = TotalItemCount
UnreadItemCount AliasProperty UnreadItemCount = TotalUnreadItemCount
CreateFeed Method IDispatch CreateFeed (string, string)
CreateSubfolder Method IDispatch CreateSubfolder (string)
Delete Method void Delete ()
ExistsFeed Method bool ExistsFeed (string)
ExistsSubfolder Method bool ExistsSubfolder (string)
GetFeed Method IDispatch GetFeed (string)
GetSubfolder Method IDispatch GetSubfolder (string)
GetWatcher Method IDispatch GetWatcher (FEEDS_EVENTS_SCOPE, FEEDS_EVENTS_MASK)
Move Method void Move (string)
Rename Method void Rename (string)
Feeds Property IDispatch Feeds () {get}
IsRoot Property bool IsRoot () {get}
Name Property string Name () {get}
Parent Property IDispatch Parent () {get}
Path Property string Path () {get}
Subfolders Property IDispatch Subfolders () {get}
TotalItemCount Property int TotalItemCount () {get}
TotalUnreadItemCount Property int TotalUnreadItemCount () {get}
Type ScriptProperty System.Object Type {get="folder";}
Now, subfolders:
$feedsfolder.Subfolders Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- folder Microsoft Feeds 396 302 folder Moisan's Feeds 40015 1459
Let’s skip ahead. My feeds are stored in “Moisan’s Feeds” and I want to see the “Technology” folder:
$feedstech = (($feedsfolder.GetSubfolder("Moisan's Feeds")).GetSubfolder("Technology")).Feeds $feedstech Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- feed adafruit industries blog 200 0 feed bunnie's blog 77 0 feed Dark Roasted Blend 200 0 feed Design News - Gadget Freak 57 0 feed Flylogic Engineering's Analytical Blog 16 0 feed Gadget Freak 200 0 feed hack a day 200 0 feed Hacked Gadgets 200 10 feed HacknMod.com - You name it. We hack it. 200 0 feed Hotsolder 37 1 feed How To Spot A Psychopath 200 1 feed It Ain't Dead Yet 30 0 feed Jeff Duntemann's ContraPositive Diary 200 1 feed Keith's Electronics Blog 88 2 feed LED Luminaries 78 1 feed Lifehacker 200 9 feed Made By Monkeys 159 2 feed MAKE: Blog 200 103 feed Modern Mechanix 200 0 feed Neato Coolville 200 0 feed OTA HDTV Reception Q&A 37 0 feed Paleo-Future Blog 88 1 feed Retro Thing 200 7 feed Safety Graphic Fun 200 12 feed There, I Fixed It. 200 20 feed Toolmonger 200 32 feed Uplinks
We’ll get Toolmonger:
$feedstoolmonger = (($feedsfolder.GetSubfolder("Moisan's Feeds")).GetSubfolder("Technology")).GetFeed("Toolmonger") $feedstoolmonger Type Name ItemCount UnreadItemCount ---- ---- --------- --------------- feed Toolmonger 200 32
Here are the properties of the feed:
$feedstoolmonger | gm TypeName: System.__ComObject#{33f2ea09-1398-4ab9-b6a4-f94b49d0a42e} Name MemberType Definition ---- ---------- ---------- AsyncDownload Method void AsyncDownload () CancelAsyncDownload Method void CancelAsyncDownload () ClearCredentials Method void ClearCredentials () Delete Method void Delete () Download Method void Download () GetItem Method IDispatch GetItem (int) GetItemByEffectiveId Method IDispatch GetItemByEffectiveId (int) GetWatcher Method IDispatch GetWatcher (FEEDS_EVENTS_SCOPE, FEEDS_EVENTS_MASK) MarkAllItemsRead Method void MarkAllItemsRead () Merge Method void Merge (string, string) Move Method void Move (string) Rename Method void Rename (string) SetCredentials Method void SetCredentials (string, string) Xml Method string Xml (int, FEEDS_XML_SORT_PROPERTY, FEEDS_XML_SORT_ORDER, FEEDS_XML_FILTER_FLAGS, FEEDS_XM... Copyright Property string Copyright () {get} Description Property string Description () {get} DownloadEnclosuresAutomatically Property bool DownloadEnclosuresAutomatically () {get} {set} DownloadStatus Property FEEDS_DOWNLOAD_STATUS DownloadStatus () {get} DownloadUrl Property string DownloadUrl () {get} Image Property string Image () {get} Interval Property int Interval () {get} {set} IsList Property bool IsList () {get} ItemCount Property int ItemCount () {get} Items Property IDispatch Items () {get} Language Property string Language () {get} LastBuildDate Property Date LastBuildDate () {get} LastDownloadError Property FEEDS_DOWNLOAD_ERROR LastDownloadError () {get} LastDownloadTime Property Date LastDownloadTime () {get} LastItemDownloadTime Property Date LastItemDownloadTime () {get} LastWriteTime Property Date LastWriteTime () {get} Link Property string Link () {get} LocalEnclosurePath Property string LocalEnclosurePath () {get} LocalId Property string LocalId () {get} MaxItemCount Property int MaxItemCount () {get} {set} Name Property string Name () {get} Parent Property IDispatch Parent () {get} Password Property string Password () {get} Path Property string Path () {get} PubDate Property Date PubDate () {get} SyncSetting Property FEEDS_SYNC_SETTING SyncSetting () {get} {set} Title Property string Title () {get} Ttl Property int Ttl () {get} UnreadItemCount Property int UnreadItemCount () {get} Url Property string Url () {get} {set} Username Property string Username () {get} Type ScriptProperty System.Object Type {get="feed";}
An excerpt of the feed itself:
$feedstoolmonger.Items Title : Overpriced Center Finder Link : http://toolmonger.com/2009/11/30/overpriced-center-finder/ Guid : http://toolmonger.com/?p=35079 Description : <p><a href="http://toolmonger.com/wp-content/uploads/2009/11/center-finder.jpg"><img class="aligncenter size-full wp-image-3509 8" src="http://toolmonger.com/wp-content/uploads/2009/11/center-finder.jpg" alt="" width=450 height=475></a></p> <p>When I first saw Eagle’s Marking Center Finder, I thought, “Cool, that works on the same principle as <a title="Previous Art icle" href="http://toolmonger.com/feed/2008/03/17/center-mortises-with-rocklers-router-baseplate/">Rockler’s mortise-centering router baseplate</a>.” Looking at the PVC-made jig, I figured it’d be 5 to 10 bucks tops, but then I saw $25 price tag and figu red I’d tell everyone they should spend 15 minutes in the shop and make one with a with a piece of scrap wood and a section of dowel instead.</p> <p>It’s simple geometry that if you build it right, drilling three evenly spaced holes on a line, the resulting jig should be p retty accurate in finding the center of a board. And if you build your own you won’t be limited to the width of a 2×4 like Eagl e’s model.</p> <p><span id=more-35079></span> Why would you want to build one in the first place? It’s handy for marking the center of board e dge when you’re laying out mortises, holes for dowels, centering biscuits, and doing plenty of other operations. If you find yo u’d actually want to purchase Eagle America’s marking center finder, they generously throw in a pencil for your $25.</p> <p><a title="Marking Center Finder Manufacturer" href="http://www.eagleamerica.com/product/400-2048/eagle_originals">Center Fin der</a> [Eagle America]<br> <a title="Marking Center Finder At Amazon" href="http://www.amazon.com/dp/B001CMNCAU?tag=toolmonger-20">Via Amazon</a> [<a href ="http://toolmonger.com/amazon-links/">What’s This?</a>]</p> PubDate : 11/30/2009 12:05:29 PM Comments : http://toolmonger.com/2009/11/30/overpriced-center-finder/#comments Author : Benjamen Johnson Enclosure : IsRead : True LocalId : 2830 Parent : System.__ComObject DownloadUrl : http://toolmonger.com/feed/ LastDownloadTime : 11/30/2009 10:25:27 PM Modified : 11/30/2009 12:05:29 PM EffectiveId : -77766319
How many unread items are in Toolmonger?
$feedstoolmonger.UnreadItemCount 32
Let’s mark them all read to see if IE updates the status:
$feedstoolmonger.MarkAllItemsRead() $feedstoolmonger.UnreadItemCount 0
They are marked as unread.
Did it work? See the next post, which explains where IE stores its feed database and what do to for common problems.
