== Introduction == Support for migrating commonly used windows setting lowers the barriers for new users trying ubuntu. AOL's Aim client represents > 50% of the marketshare of OSCAR clients. Migrating settings from Aim would make it easier for users coming from windows and aim6 to move to ubuntu and pidgin/telepathy. == Scope and Use Cases == Kathy has used aim6 for a few years and has hundreds of saved away messages. She want to use ubuntu, but doesnt feel like recreating them. Adding support for migrating these preferences would mean a more comfortable install for Kathy. == Implemetation Plan == aim 6.5 stores user preferences in SQLite3 databases. It is relatively simple to extract the preferences. As a quick Hello World application, below is the code for a small C# app that will print away messages from the database, to the console.  {{{ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SQLite; namespace AwayMessage_Exporter { class Program { static void Main(string[] args) { Console.WriteLine("AIM Away Message Extraction Tool"); Messages myMessages = new Messages(); myMessages.Populate(@"Data Source=C:\common.cls"); } } class Message { public string Title { get; set; } public string Body { get; set; } public MessageType Type { get; set; } public bool IsDefault { get; set; } public void ToConsole() { Console.WriteLine("Extracted Away Message: {0} Type: {2} \n Code:\n {1} \n", Title, Body, Type); } } enum MessageType { away, idle } enum AimKeys { type, message, title, isDefault } class Messages { private List m_Messages; private const string GetAwayMessages = @" SELECT * FROM preferences WHERE key LIKE '%aol.imApp.status.messages%'"; public void Populate(string path) { Dictionary AimKvps = new Dictionary(); using (SQLiteConnection conn = new SQLiteConnection(path)) { conn.Open(); SQLiteCommand cmd = new SQLiteCommand(GetAwayMessages, conn); SQLiteDataReader rdr = cmd.ExecuteReader(); while (rdr.Read()) { string[] idparam = rdr.GetString(0).Split('.'); if (!(AimKvps.ContainsKey(idparam[4]))) AimKvps[idparam[4]] = new Message(); AimKeys ak = (AimKeys)Enum.Parse(typeof(AimKeys), idparam[5]); switch (ak) { case AimKeys.type: AimKvps[idparam[4]].Type = (MessageType)Enum.Parse(typeof(MessageType), rdr.GetString(1)); break; case AimKeys.title: AimKvps[idparam[4]].Title = rdr.GetString(1); break; case AimKeys.message: AimKvps[idparam[4]].Body = rdr.GetString(1); break; case AimKeys.isDefault: AimKvps[idparam[4]].IsDefault = false; if (Int32.Parse(rdr.GetString(1)) == 1) AimKvps[idparam[4]].IsDefault = true; break; } } conn.Close(); } m_Messages = new List(); foreach (KeyValuePair IdToAwayMessage in AimKvps) { m_Messages.Add(IdToAwayMessage.Value); } foreach (Message m in m_Messages) { m.ToConsole(); } Console.ReadLine(); } } } }}} For a real implementation we will need to write to xml files supported by pidgin instead of the console. This is a trivial step. Correctly handling multiple users is trickier but still doable