So this is what i've come up with using he API v1.
Its part of the Client that I'm witing, but I will package it as an app, give it an installer (Clickonce???) and post it Codeplex.
In the mean while, for geeks' reading pleasure, here is the code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Xml;
using ChatData;
namespace FFDataOut
{
public class Data<T> : List<T> where T : Post
{
private static T GetNewObject<T>()
{
try
{
return (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return default(T);
}
}
public void Write(string filename)
{
using (XmlTextWriter writer = new XmlTextWriter(filename, Encoding.Default))
{
writer.WriteStartDocument();
writer.WriteStartElement("Items");
foreach (T item in this)
{
writer.WriteStartElement("Post");
writer.WriteElementString("Title", item.Title);
writer.WriteElementString("Link", item.Link);
writer.WriteStartElement("User");
writer.WriteElementString("Nickname", item.User.Nickname);
writer.WriteElementString("URL", item.User.ProfileUrl);
writer.WriteEndElement();//end user
if (item is DMPost)
{
//writer.WriteElementString("Origin", item.Origin);
}
writer.WriteStartElement("Service");
writer.WriteElementString("Name",
item.Service.Name);
writer.WriteElementString("ProfileURL", item.Service.ProfileUrl);
writer.WriteElementString("IconURL", item.Service.IconUrl);
writer.WriteEndElement();//end service
writer.WriteElementString("Published", item.Published.ToString());
writer.WriteElementString("Updated", item.Updated.ToString());
writer.WriteStartElement("Likes");
foreach (FriendFeed.Like like in item.Likes)
{
writer.WriteElementString(like.User.Nickname, like.Date.ToString());
}
writer.WriteEndElement();//end likes
writer.WriteStartElement("Media");
foreach (FriendFeed.Media mediatiem in item.Media)
{
writer.WriteStartElement("Item");
writer.WriteElementString("Title", mediatiem.Title);
writer.WriteElementString("Player", mediatiem.Player);
writer.WriteStartElement("Thumbnails");
foreach (FriendFeed.Thumbnail thumb in mediatiem.Thumbnails)
{
writer.WriteStartElement("Thumbnail");
writer.WriteElementString("URL", thumb.Url);
writer.WriteElementString("Width", thumb.Width);
writer.WriteElementString("Height", thumb.Height);
writer.WriteEndElement();//end thumbnail
}
writer.WriteEndElement(); //end thumbs
writer.WriteStartElement("Contents");
foreach (FriendFeed.Content content in mediatiem.Content)
{
writer.WriteStartElement("item");
writer.WriteElementString("URL", content.Url);
writer.WriteElementString("Type", content.Type);
writer.WriteElementString("Width", content.Width);
writer.WriteElementString("Height", content.Height);
writer.WriteEndElement();//end item
}
writer.WriteEndElement(); //end content
writer.WriteEndElement(); //end item
}
writer.WriteEndElement(); //end media
writer.WriteEndElement();// end post
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
public void Read(string filename)
{
if (System.IO.File.Exists(filename) != true)
{
return;
}
XmlDocument doc = new XmlDocument();
doc.Load(filename);
XmlNodeList thelist = doc.SelectNodes("//Post");
T item = GetNewObject<T>();
foreach (XmlNode node in thelist)
{
int currentnode = 0;
item.Title = node.ChildNodes[currentnode].InnerText; //0
item.Link = node.ChildNodes[++currentnode].InnerText;//1
if (node.ChildNodes[++currentnode].HasChildNodes == true)//2
{
FriendFeed.User User = new FriendFeed.User();
XmlNodeList usernodes = node.ChildNodes[currentnode].ChildNodes;//3
User.Nickname = usernodes[0].InnerText;
User.ProfileUrl = usernodes[1].InnerText;
item.User = User;
}
if (node.ChildNodes[++currentnode].InnerText == "Origin")//3 //Direct message support - commented out until v2
{
//node.ChildNodes[currentnode].InnerText
//if (node.ChildNodes[++currentnode].InnerText == "Service")//4
//{
// if (node.ChildNodes[currentnode].HasChildNodes == true)//4
// {
// FriendFeed.Service service = new FriendFeed.Service();
// XmlNodeList servicelist = node.ChildNodes[currentnode].ChildNodes;//4
// service.Name = servicelist[0].InnerText;
// service.ProfileUrl = servicelist[1].InnerText;
// service.IconUrl = servicelist[2].InnerText;
// item.Service = service;
// }
}
else if (node.ChildNodes[currentnode].InnerText == "Service")//3
{
if (node.ChildNodes[currentnode].HasChildNodes == true)//3
{
FriendFeed.Service service = new FriendFeed.Service();
XmlNodeList servicelist = node.ChildNodes[currentnode].ChildNodes;//3
service.Name = servicelist[0].InnerText;
service.ProfileUrl = servicelist[1].InnerText;
service.IconUrl = servicelist[2].InnerText;
item.Service = service;
}
}
item.Published = DateTime.Parse(node.ChildNodes[++currentnode].InnerText);//4/5
item.Updated = DateTime.Parse(node.ChildNodes[++currentnode].InnerText);//5/6
if (node.ChildNodes[++currentnode].HasChildNodes == true)//6/7
{
List<FriendFeed.Like> likes = new List<FriendFeed.Like>();
XmlNodeList listlikes = node.ChildNodes[currentnode].ChildNodes;
foreach (XmlNode like in listlikes)
{
FriendFeed.Like myLike = new FriendFeed.Like(DateTime.Parse(like.InnerText), new FriendFeed.User());
myLike.User.Nickname = like.Name;
likes.Add(myLike);
}
item.Likes = likes;
}
if (node.ChildNodes[++currentnode].HasChildNodes == true)//8/9
{
List<FriendFeed.Media> mymedia = new List<FriendFeed.Media>();
XmlNodeList medianodes = node.ChildNodes[currentnode].ChildNodes;
foreach (XmlNode medianode in medianodes)
{
FriendFeed.Media thismedia = new FriendFeed.Media();
thismedia.Title = medianode.ChildNodes[0].InnerText;
thismedia.Player = medianode.ChildNodes[1].InnerText;
if (medianode.ChildNodes[2].HasChildNodes == true)
{
List<FriendFeed.Thumbnail> thumbnails = new List<FriendFeed.Thumbnail>();
XmlNodeList thumbmnailnodes = medianode.ChildNodes[2].ChildNodes;
foreach (XmlNode thumb in thumbmnailnodes)
{
FriendFeed.Thumbnail temp = new FriendFeed.Thumbnail();
temp.Url = thumb.ChildNodes[0].InnerText;
temp.Width = thumb.ChildNodes[1].InnerText;
temp.Height = thumb.ChildNodes[2].InnerText;
thumbnails.Add(temp);
}
thismedia.Thumbnails = thumbnails;
}
if (medianode.ChildNodes[3].HasChildNodes == true)
{
List<FriendFeed.Content> mycontent = new List<FriendFeed.Content>();
XmlNodeList Contentnodes = medianode.ChildNodes[3].ChildNodes;
foreach (XmlNode contentitem in Contentnodes)
{
FriendFeed.Content temp = new FriendFeed.Content();
temp.Url = contentitem.ChildNodes[0].InnerText;
temp.Type = contentitem.ChildNodes[1].InnerText;
temp.Width = contentitem.ChildNodes[2].InnerText;
temp.Height = contentitem.ChildNodes[3].InnerText;
mycontent.Add(temp);
}
thismedia.Content = mycontent;
}
mymedia.Add(thismedia);
}
item.Media = mymedia;
}
this.Add(item);
item = GetNewObject<T>();
}
}
}
}
I'm going a take a break for lunch now.
i leave you with this philosphical question; After reading that code, how many variables can dance on the head of a pin??