My Solution to iterating over a directory.

Note :
  • I'm using the FolderInfo class (which i wrote myself) instead of the DirectoryInfo class as FolderInfo is send over WCF as a result of a call.
  • Secondly, Both FolderName and FolderPath are the same value until i get round to writing a regex to get the folder name out of the path.
Here we go:

private List<FolderInfo>loadfolder(FolderInfo folder){

            List<FolderInfo> result = new List<FolderInfo>();
            DirectoryInfo info = new DirectoryInfo(folder.FolderPath);
            foreach (DirectoryInfo thedir in info.GetDirectories()) // get directories N+1 levels down
            {
                FolderInfo temp = new FolderInfo();
                temp.FolderName = thedir.FullName;
                temp.FolderPath = thedir.FullName;
                temp.HasChildFolders = false;
                //return folders 2 levels down
                foreach (DirectoryInfo innerdir in thedir.GetDirectories())//get directories N+2 levels down
                {
                    FolderInfo innertemp = new FolderInfo();
                    innertemp.FolderName = innerdir.FullName;
                    innertemp.FolderPath = innerdir.FullName;
                    if (innerdir.GetDirectories().Length > 0)
                    {
                        innertemp.FoldersContained = loadfolder(innertemp);// get directories N+3 levels down ( or N+N levels)
                        temp.HasChildFolders = true;
                    }
                    else
                    {
                        innertemp.HasChildFolders = false;
                    }
                   
                    temp.FoldersContained.Add(innertemp);
                }
                result.Add(temp);
            }

            return result;
        }

Backing up Friendfeed: Code

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??

Friendfeed Data Out and the Client

I'm witing an app to get all of my FF posts out and saved to disk, probabaly in XML.  I figured that I may as well get the UI straightened out as well.

Now this is not as bad as it appears. I took a University project that I did last year ( that I got an A for, coincedentally) and adapted the Client project to work with the FF API rather than the WCF server it was supposed to. Since this was originally a chat application, its riddiculously similar to FF. Its got support for Direct Messages and Files already built in. Once I post the code to Codeplex, you'll see that the code for those two features has simply been commented out. So when the FF API v2 comes out wiht its C# library i can simply plug it in.

Saving to XMl is very good. I considered doing something using the RSS spec. But the difficulty of the wordpress implementation of this idea made me think twice. So I'll do my own thing, making it easy to re use the files. in saying this, tho, someone did suggest doing exactly that and then importing to Wordpress directly (Thsat idea I'm leaving to more qualified Wordpress geeks).

Its an intersting challenge.... let's see where we go.....

(PS. How this for a first propper Posterous post?)