예제 #1
0
        public override bool SupportsItem(Item item)
        {
            Pidgin.IPurpleObject prpl    = Pidgin.GetPurpleObject();
            PidginAccountItem    account = item as PidginAccountItem;

            return(prpl.PurpleAccountIsConnected(account.Id));
        }
예제 #2
0
        public override void UpdateItems()
        {
            Pidgin.IPurpleObject prpl;
            int [] rawStatuses;
            if (Pidgin.InstanceIsRunning)
            {
                try {
                    prpl = Pidgin.GetPurpleObject();
                    foreach (Item status in statuses.Where(i => i is PidginSavedStatusItem).ToArray())
                    {
                        statuses.Remove(status);
                    }
                    rawStatuses = prpl.PurpleSavedstatusesGetAll();
                    foreach (int status in rawStatuses)
                    {
                        if (!prpl.PurpleSavedstatusIsTransient(status))
                        {
                            int    id, statId;
                            string title, message;

                            title   = prpl.PurpleSavedstatusGetTitle(status);
                            id      = prpl.PurpleSavedstatusFind(title);
                            statId  = prpl.PurpleSavedstatusGetType(status);
                            message = prpl.PurpleSavedstatusGetMessage(status);

                            statuses.Add(new PidginSavedStatusItem(title, message, id, statId));
                        }
                    }
                } catch (Exception e) {
                    Log <PidginSavedStatusItemSource> .Error("Could not read saved statuses: {0}", e.Message);

                    Log <PidginSavedStatusItemSource> .Debug(e.StackTrace);
                }
            }
        }
예제 #3
0
        public override IEnumerable <Item> ChildrenOfItem(Item item)
        {
            if (Pidgin.IsPidgin(item))
            {
                yield return(new PidginBrowseBuddyItem());
            }
            else if (item is PidginBrowseBuddyItem)
            {
                foreach (ContactItem buddy in buddies)
                {
                    yield return(buddy);
                }
            }
            else if (item is ContactItem)
            {
                ContactItem buddy = item as ContactItem;

                IEnumerable <string> icons = buddy.Details.Where(d => d.StartsWith(iconPrefix + "prpl-"));

                IEnumerable <Item> details = buddy.Details
                                             .Where(d => d.StartsWith("prpl-"))
                                             .Select(d => MakeChildren(buddy, d, icons))
                                             .OfType <Item> ();

                foreach (Item detail in details)
                {
                    yield return(detail);
                }
            }
        }
예제 #4
0
        //We're only using this to get link-local (bonjour) buddies
        ContactItem CreateBuddy(int buddyID)
        {
            ContactItem buddy;
            string      alias, proto, icon, accountAlias;

            proto        = "prpl-bonjour";
            icon         = Pidgin.GetBuddyIconPath(buddyID);
            alias        = Pidgin.GetBuddyServerAlias(buddyID);
            accountAlias = Pidgin.GetBuddyLocalAlias(buddyID);
            buddy        = ContactItem.Create(alias);

            //if for some reason this buddy has multiple prpl-bonjour accounts associated with it
            //make sure we add them all in this fashion: prpl-bonjour, prpl-bonjour-1, etc.
            int similarProtos = buddy.Details.Where(k => k.StartsWith(proto)).Count();

            if (similarProtos > 0)
            {
                proto = string.Format("{0}-{1}", proto, similarProtos.ToString());
            }

            buddy[proto] = accountAlias;
            if (!string.IsNullOrEmpty(icon))
            {
                buddy[iconPrefix + proto] = icon;
            }
            if (string.IsNullOrEmpty(buddy["photo"]))
            {
                buddy["photo"] = icon;
            }

            return(buddy);
        }
예제 #5
0
 public PidginHandleContactDetailItem(string proto, string handle, string custom_icon)
 {
     this.proto       = proto;
     this.handle      = handle;
     this.custom_icon = custom_icon;
     this.online      = (Pidgin.BuddyIsOnline(handle)) ? AddinManager.CurrentLocalizer.GetString("Online") : AddinManager.CurrentLocalizer.GetString("Offline");
 }
예제 #6
0
        public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems)
        {
            List <string> names   = new List <string> ();
            string        message = "";

            if (modItems.Any())
            {
                message = (modItems.First() as ITextItem).Text;
            }

            foreach (Item item in items)
            {
                if (item is ContactItem)
                {
                    // Just grab the first protocol we see.
                    ContactItem contact = item as ContactItem;
                    foreach (string detail in contact.Details)
                    {
                        if (!detail.StartsWith("prpl-"))
                        {
                            continue;
                        }
                        //if this buddy is online, add and break
                        if (Pidgin.BuddyIsOnline(contact[detail]))
                        {
                            names.Add(contact[detail]);
                            break;
                        }
                    }
                }
                else if (item is PidginHandleContactDetailItem)
                {
                    names.Add((item as PidginHandleContactDetailItem).Value);
                }
            }


            if (names.Count > 0)
            {
                Services.Application.RunOnThread(() => {
                    Pidgin.StartIfNeccessary();
                    Services.Application.RunOnMainThread(() => {
                        foreach (string name in names)
                        {
                            if (!string.IsNullOrEmpty(message))
                            {
                                Pidgin.OpenConversationWithBuddy(name, message);
                            }
                            else
                            {
                                Pidgin.OpenConversationWithBuddy(name);
                            }
                        }
                    });
                });
            }
            yield break;
        }
예제 #7
0
 public override bool SupportsItem(Item item)
 {
     if (item is ContactItem)
     {
         ContactItem contact = item as ContactItem;
         return(contact.Details.Where(d => Pidgin.BuddyIsOnline(contact[d])).Any());
     }
     return(true);
 }
예제 #8
0
        public override bool SupportsItem(Item item)
        {
            Pidgin.IPurpleObject prpl;
            try {
                prpl = Pidgin.GetPurpleObject();
                if (!prpl.PurpleAccountIsConnected((item as PidginAccountItem).Id))
                {
                    return(true);
                }
            } catch { }

            return(false);
        }
예제 #9
0
 public override IEnumerable <Item> ChildrenOfItem(Item item)
 {
     if (Pidgin.IsPidgin(item))
     {
         yield return(new PidginBrowseStatusItem());
     }
     else if (item is PidginBrowseStatusItem)
     {
         foreach (Item status in statuses)
         {
             yield return(status);
         }
     }
 }
예제 #10
0
 public override IEnumerable <Item> ChildrenOfItem(Item item)
 {
     if (Pidgin.IsPidgin(item))
     {
         yield return(new PidginBrowseAccountItem());
     }
     else if (item is PidginBrowseAccountItem)
     {
         foreach (PidginAccountItem account in items)
         {
             yield return(account);
         }
     }
 }
예제 #11
0
        public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems)
        {
            int    status;
            string message = "";

            try {
                Pidgin.IPurpleObject prpl = Pidgin.GetPurpleObject();

                if (items.First() is PidginSavedStatusItem)
                {
                    status = (items.First() as PidginSavedStatusItem).ID;
                    prpl.PurpleSavedstatusActivate(status);
                }
                else if (items.First() is PidginStatusTypeItem)
                {
                    status = (items.First() as PidginStatusTypeItem).Status;
                    if (modItems.Any())
                    {
                        message = (modItems.First() as ITextItem).Text;
                    }
                    Pidgin.PurpleSetAvailabilityStatus(status, message);
                }
                else if (items.First() is ITextItem)
                {
                    if (modItems.Any())
                    {
                        status = (modItems.First() as PidginStatusTypeItem).Status;
                    }
                    else
                    {
                        status = prpl.PurpleSavedstatusGetType(prpl.PurpleSavedstatusGetCurrent());
                    }
                    message = (items.First() as ITextItem).Text;
                    Pidgin.PurpleSetAvailabilityStatus(status, message);
                }
            } catch (Exception e) {
                Log <PidginSetStatusAction> .Error("Could not set Pidgin status: {0}", e.Message);

                Log <PidginSetStatusAction> .Debug(e.StackTrace);
            }

            yield break;
        }
예제 #12
0
        public override IEnumerable <Item> Perform(IEnumerable <Item> items, IEnumerable <Item> modItems)
        {
            Pidgin.IPurpleObject prpl;
            PidginAccountItem    account = items.First() as PidginAccountItem;

            try {
                prpl = Pidgin.GetPurpleObject();
                try {
                    prpl.PurpleAccountSetEnabled(account.Id, gtkGaim, (int)0);
                }
                catch {
                    prpl.PurpleAccountSetEnabled(account.Id, gtkGaim, (uint)0);
                }
            } catch (Exception e) {
                Log <PidginDisableAccount> .Error("Could not disable Pidgin account: {0}", e.Message);

                Log <PidginDisableAccount> .Debug(e.StackTrace);
            }
            yield break;
        }
예제 #13
0
        public override void UpdateItems()
        {
            Pidgin.IPurpleObject prpl;
            prpl = Pidgin.GetPurpleObject();
            string name, proto;

            if (Pidgin.InstanceIsRunning)
            {
                items.Clear();
                try {
                    foreach (int account in prpl.PurpleAccountsGetAll())
                    {
                        proto = prpl.PurpleAccountGetProtocolName(account);
                        name  = prpl.PurpleAccountGetUsername(account);
                        items.Add(new PidginAccountItem(name, proto, account));
                    }
                } catch (Exception e) {
                    Log <PidginAccountItemSource> .Error("Could not get Pidgin accounts: {0}", e.Message);

                    Log <PidginAccountItemSource> .Debug(e.StackTrace);
                }
            }
        }
예제 #14
0
        ContactItem CreateBuddy(XmlNode buddyNode)
        {
            ContactItem buddy;
            string      name, alias, proto;

            Dictionary <string, string> icons  = new Dictionary <string, string> ();
            Dictionary <string, string> protos = new Dictionary <string, string> ();

            alias = name = null;

            //we favor aliases in this order: metacontact alias, local alias, server alias
            //metacontact alias
            try {
                alias = buddyNode.Attributes.GetNamedItem("alias").Value;
            }
            catch {}

            foreach (XmlNode node in buddyNode.ChildNodes)
            {
                switch (node.Name)
                {
                case "buddy":
                    proto = node.Attributes.GetNamedItem("proto").Value;
                    //for metacontacts, add similar protocol keys like this:
                    // prpl-msn, prpl-msn-1, prpl-msn-2 etc.
                    int similarProtos = protos.Keys.Where(k => k.StartsWith(proto)).Count();
                    if (similarProtos > 0)
                    {
                        proto = string.Format("{0}-{1}", proto, similarProtos.ToString());
                    }
                    foreach (XmlNode attr in node.ChildNodes)
                    {
                        switch (attr.Name)
                        {
                        // The screen name.
                        case "name":
                            protos[proto] = attr.InnerText;
                            break;

                        // The alias, or real name, only if one isn't set yet.
                        case "alias":
                            if (string.IsNullOrEmpty(alias))
                            {
                                alias = attr.InnerText;
                            }
                            break;

                        // Buddy icon image file.
                        case "setting":
                            if (attr.Attributes.GetNamedItem("name").Value == "buddy_icon")
                            {
                                icons[iconPrefix + proto] = Path.Combine(BuddyIconDirectory, attr.InnerText);
                                if (!icons.Keys.Contains("default"))
                                {
                                    icons["default"] = icons[iconPrefix + proto];
                                }
                            }
                            break;
                        }
                    }
                    //if the alias is still null, let's try to get the server alias
                    if (string.IsNullOrEmpty(alias))
                    {
                        alias = (string)Pidgin.GetBuddyServerAlias(protos[proto]) ?? null;
                    }
                    break;

                //let's pick up the custom icon as the metacontact's icon
                case "setting":
                    if (node.Attributes.GetNamedItem("name").Value == "custom_buddy_icon")
                    {
                        icons["default"] = Path.Combine(BuddyIconDirectory, node.InnerText);
                    }
                    break;
                }
            }

            //in case we don't have an alias, take one of the proto values for the name
            name = alias ?? protos.Values.FirstOrDefault();

            // If crucial details are missing, we can't make a buddy.
            if (name == null || protos.Values.Count() <= 0)
            {
                return(null);
            }

            // Create a new buddy, add the details we have.
            buddy = ContactItem.Create(alias ?? name);

            //assign the default buddy icon as the ContactItem's photo
            if (icons.Keys.Contains("default"))
            {
                buddy["photo"] = icons["default"];
            }

            //add all of the protocol handles we found for this buddy
            //skip bonjour keys, they'll get picked up later
            foreach (string k in protos.Keys.Where(k => !k.Contains("bonjour")))
            {
                buddy[k] = protos[k];
            }

            //add the icons keys to create individual icons for childitems
            foreach (string k in icons.Keys.Where(k => k != "default" && !k.Contains("bonjour")))
            {
                buddy[k] = icons[k];
            }

            return(buddy);
        }
예제 #15
0
        public override void UpdateItems()
        {
            XmlDocument blist;
            // Add buddies as they are encountered to this hash so we don't create duplicates.
            Dictionary <ContactItem, bool> buddies_seen;

            //remove pidgin related keys from the buddies
            foreach (ContactItem buddy in buddies)
            {
                foreach (string key in buddy.Details.Where(d => d.Contains("prpl")).ToArray())
                {
                    buddy[key] = "";
                }
            }

            buddies.Clear();
            buddies_seen = new Dictionary <ContactItem, bool> ();

            //load buddies from xml file
            blist = new XmlDocument();
            try {
                blist.Load(BuddyListFile);

                foreach (XmlNode contact_node in blist.GetElementsByTagName("contact"))
                {
                    ContactItem buddy;

                    buddy = CreateBuddy(contact_node);
                    if (buddy == null)
                    {
                        continue;
                    }
                    buddies_seen[buddy] = true;
                }
            } catch (Exception e) {
                Log <PidginContactItemSource> .Error("Error reading Pidgin buddy list file: {0}", e.Message);

                Log <PidginContactItemSource> .Debug(e.StackTrace);
            }
            //if Pidgin is running, find bonjour buddies from dbus
            //link-local (bonjour) buddies do not get added to the xml file
            try {
                int bonjourAccount = Pidgin.GetAccountID("", "prpl-bonjour");
                if (bonjourAccount != -1)
                {
                    foreach (int buddyID in Pidgin.FindBuddies(bonjourAccount, ""))
                    {
                        ContactItem buddy;

                        buddy = CreateBuddy(buddyID);
                        buddies_seen [buddy] = true;
                    }
                }
            } catch (Exception e) {
                Log <PidginContactItemSource> .Error("Error reading Bonjour buddies: {0}", e.Message);

                Log <PidginContactItemSource> .Debug(e.StackTrace);
            }
            foreach (ContactItem buddy in buddies_seen.Keys)
            {
                buddies.Add(buddy);
            }
        }
예제 #16
0
 public PidginHandleContactDetailItem(string proto, string handle) : this(proto, handle, Pidgin.GetProtocolIcon(proto))
 {
 }