Hi - I have a working evolution address backend (attached as patch against evolution-sharp, dashboard & horrible contact renderer). Issues I see - You have to hardcode the path to your addressbook - Way too many try {} catch {} statements (evolution-sharp generates errors when something is undefined - this behavior should probably be changed) Things I'd like to do - Write a decent renderer (I'm a horrible web designer) - Load contact images from e-book backend (could be difficult) - Allow for more dynamic contact subtypes - so a match would contain lists of phone numbers, email address etc., at this moment I just grab the default one But this code seems to work pretty well (it chains and everything else). -- Matt Jones
Attachment:
ContactMatchRenderer.cs
Description: Binary data
Index: evolution/Contact.custom =================================================================== RCS file: /cvs/gnome/evolution-sharp/evolution/Contact.custom,v retrieving revision 1.2 diff -r1.2 Contact.custom 32a33,44 > public string FullName { > get { > GLib.Value val = new GLib.Value (Handle, "full_name"); > GetProperty("full_name", val); > string ret = (string) val; > return ret; > } > set { > SetProperty("full_name", new GLib.Value(value)); > } > } >
? EvoAddress.patch ? renderers/ContactMatchRenderer.cs Index: backends/EvolutionAddressbookBackend.cs =================================================================== RCS file: /cvs/gnome/dashboard/backends/EvolutionAddressbookBackend.cs,v retrieving revision 1.9 diff -r1.9 EvolutionAddressbookBackend.cs 17c17 < public class EvolutionAddressbookBackend : Backend { --- > public class EvolutionAddressbookBackend : BackendSimple { 20a21,22 > > string address_book_location = "file:///home/matt/.evolution/addressbook/local/OnThisComputer/1076640723 2454 0 localhost localdomain"; 45a48,64 > // private string GetAddressbookUri() > // { > // GConf.Client client = new GConf.Client (); > // string uri; > // > // ArrayList rawxml = (ArrayList)client.Get ("/apps/evolution/addressbook/sources" ); > // > // foreach (string temp in rawxml ) > // Console.WriteLine( temp ); > // temp = (string)rawxml[0]; > // > // Console.WriteLine( "Got key " + temp ); > // > // return ""; > // > // } > 49c68,75 < addressbook.LoadLocalAddressbook (); --- > // addressbook.LoadLocalAddressbook (); > > // string temp = GetAddressbookUri(); > > // public static unsafe bool GetAddressbooks(Evolution.SourceList addressbook_sources) > // public Source(string xml) > > addressbook.LoadUri(address_book_location, true); 61a88 > { 62a90,92 > foreach ( Match match in ProcessClueSimple( c ) ) > result.AddMatch( match ); > } 64c94,107 < return resultset; --- > return result; > } > > protected override ArrayList ProcessClueSimple( Clue clue ) > { > ArrayList contacts; > ArrayList matches = new ArrayList(); > > contacts = FindContacts ( clue ); > > foreach (Contact contact in contacts ) > matches.Add(GenerateMatchForContact( contact, clue )); > > return matches; 69a113 > ArrayList resultset = new ArrayList(); 71c115 < Console.WriteLine ("Evolution 2.0 addressbook backend got clue: " + c.ToString ()); --- > // Console.WriteLine ("Evolution 2.0 addressbook backend got clue: " + c.ToString ()); 78c122 < GenerateCluesForContact (resultpoiewjfoiewjfoiewjfoiewjfoiewjfoiewjf this is broken FIXME --- > GenerateCluesForContact ( resultset, contact, m ); 80c124 < GenerateClues (resultset, contacts, c); --- > GenerateClues (result, contacts, c); 85d128 < 91,94d133 < private void GenerateResult (BackendResult result, ArrayList contacts, Clue c) < { < } < 100c139,142 < GenerateCluesForContact (clues, contact, c); --- > { > Match m = GenerateMatchForContact(contact, c); > GenerateCluesForContact (clues, contact, m); > } 107,109c149,162 < AddClue (clues, c, contact.FullName, "full_name"); < AddClue (clues, c, contact.Email1, "email"); < --- > > try > { > AddClue (clues, triggering_match, contact.FullName, "full_name"); > } > catch {} > > try > { > if ( contact.Email1.Length > 0 ) > AddClue (clues, triggering_match, contact.Email1, "email"); > } > catch {} > 111c164 < AddClue (clues, c, contact.ImAim [0], "aim_name"); --- > AddClue (clues, triggering_match, contact.ImAim [0], "aim_name"); 114c167 < AddClue (clues, c, contact.ImMsn [0], "msn_name"); --- > AddClue (clues, triggering_match, contact.ImMsn [0], "msn_name"); 117c170 < AddClue (clues, c, contact.ImIcq [0], "icq_name"); --- > AddClue (clues, triggering_match, contact.ImIcq [0], "icq_name"); 120c173 < AddClue (clues, c, contact.ImJabber [0], "jabber_name"); --- > AddClue (clues, triggering_match, contact.ImJabber [0], "jabber_name"); 123c176 < AddClue (clues, c, contact.ImYahoo [0], "yahoo_name"); --- > AddClue (clues, triggering_match, contact.ImYahoo [0], "yahoo_name"); 125,126c178,190 < AddClue (clues, c, contact.HomepageUrl, "url"); < AddClue (clues, c, contact.BlogUrl, "rss"); --- > try > { > if ( contact.HomepageUrl.Length > 0) > AddClue (clues, triggering_match, contact.HomepageUrl, "url"); > } > catch {} > > try > { > if ( contact.BlogUrl.Length > 0 ) > AddClue (clues, triggering_match, contact.BlogUrl, "rss"); > } > catch {} 135c199 < private BackendMatch GenerateMatchForContact (Contact contact) --- > private Match GenerateMatchForContact (Contact contact, Clue c) 137c201 < BackendMatch result = new BackendMatch (); --- > Match result = new Match ( "Contact", c ); 139,140c203,215 < if (contact.FullName != null && contact.FullName != "") < result.AddItem (new BackendMatchItem ("Name", contact.FullName, "text", "xml")); --- > try > { > if (contact.FullName != null && contact.FullName != "") > result["Name"] = contact.FullName; > } > catch {} > > try > { > if (contact.Email1 != null && contact.Email1 != "") > result["EMail"] = contact.Email1; > } > catch {} 142,143c217,226 < if (contact.Email1 != null && contact.Email1 != "") < result.AddItem (new BackendMatchItem ("EMail", contact.Email1, "text", "xml")); --- > ArrayList phonenumbers = GetContactPhoneNumbers( contact ); > try > { > if ( phonenumbers[0] != null) > result["Phone"] = phonenumbers[0]; > } > catch {} > > return result; > } 145,146c228,251 < if (contact.PrimaryPhone != null && contact.PrimaryPhone != "") < result.AddItem (new BackendMatchItem ("Phone", contact.PrimaryPhone, "text", "xml")); --- > private ArrayList GetContactPhoneNumbers( Contact contact ) > { > ArrayList numbers = new ArrayList(); > > try > { > if (contact.PrimaryPhone != null && contact.PrimaryPhone != "") > numbers.Add( contact.PrimaryPhone ); > } > catch {} > > try > { > if (contact.AssistantPhone != null && contact.AssistantPhone != "") > numbers.Add( contact.AssistantPhone ); > } > catch {} > > try > { > if (contact.BusinessPhone != null && contact.BusinessPhone != "") > numbers.Add( contact.BusinessPhone ); > } > catch {} 148c253,352 < return result; --- > try > { > if (contact.BusinessPhone2 != null && contact.BusinessPhone2 != "") > numbers.Add( contact.BusinessPhone ); > } > catch {} > > try > { > if (contact.BusinessFax != null && contact.BusinessFax != "") > numbers.Add( contact.BusinessFax ); > } > catch {} > > try > { > if (contact.CallbackPhone != null && contact.CallbackPhone != "") > numbers.Add( contact.CallbackPhone ); > } > catch {} > > try > { > if (contact.CarPhone != null && contact.CarPhone != "") > numbers.Add( contact.CarPhone ); > } > catch {} > > try > { > if (contact.CompanyPhone != null && contact.CompanyPhone != "") > numbers.Add( contact.CompanyPhone ); > } > catch {} > > try > { > if (contact.CallbackPhone != null && contact.CallbackPhone != "") > numbers.Add( contact.CallbackPhone ); > } > catch {} > > try > { > if (contact.CallbackPhone != null && contact.CallbackPhone != "") > numbers.Add( contact.CallbackPhone ); > } > catch {} > > try > { > if (contact.HomePhone != null && contact.HomePhone != "") > numbers.Add( contact.HomePhone ); > } > catch {} > > try > { > if (contact.HomePhone2 != null && contact.HomePhone2 != "") > numbers.Add( contact.HomePhone2 ); > } > catch {} > > try > { > if (contact.IsdnPhone != null && contact.IsdnPhone != "") > numbers.Add( contact.IsdnPhone ); > } > catch {} > > try > { > if (contact.MobilePhone != null && contact.MobilePhone != "") > numbers.Add( contact.MobilePhone ); > } > catch {} > > try > { > if (contact.OtherPhone != null && contact.OtherPhone != "") > numbers.Add( contact.OtherPhone ); > } > catch {} > > try > { > if (contact.OtherFax != null && contact.OtherFax != "") > numbers.Add( contact.OtherFax ); > } > catch {} > > try > { > if (contact.Pager != null && contact.Pager != "") > numbers.Add( contact.Pager ); > } > catch {} > > return numbers; > 153c357 < if (c.Type == "*" || c.Type == "keyword") --- > if (c.Type == "*" || c.Type == "keyword" || c.Type == "aim_name") // FIXME: frontend should be passing in a wildcard clue type, not an aim_name clue type 157,163c361,367 < // return BookQuery.Andv (BookQuery.FieldTest (ContactField.PhonePrimary, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhoneBusiness, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhoneHome, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhoneHome2, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhoneHomeFax, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhoneMobile, BookQueryTest.Is, Clue.Text), < // BookQuery.FieldTest (ContactField.PhonePager, BookQueryTest.Is, Clue.Text)); --- > // return BookQuery.Or (BookQuery.FieldTest (ContactField.PhonePrimary, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhoneBusiness, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhoneHome, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhoneHome2, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhoneHomeFax, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhoneMobile, BookQueryTest.Contains, Clue.Text), > // BookQuery.FieldTest (ContactField.PhonePager, BookQueryTest.Contains, Clue.Text)); 167c371 < return BookQuery.FieldTest (MapClueTypeToField (c), BookQueryTest.Is, c.Text); --- > return BookQuery.FieldTest (MapClueTypeToField (c), BookQueryTest.Contains, c.Text); Index: renderers/Makefile.am =================================================================== RCS file: /cvs/gnome/dashboard/renderers/Makefile.am,v retrieving revision 1.4 diff -r1.4 Makefile.am 13c13,14 < DefaultMatchRenderer.dll --- > DefaultMatchRenderer.dll \ > ContactMatchRenderer.dll 23c24,25 < $(srcdir)/DefaultMatchRenderer.cs --- > $(srcdir)/DefaultMatchRenderer.cs \ > $(srcdir)/ContactMatchRenderer.cs