It is often desirable for a Jabber/XMPP application (commonly but not necessarily a client) to take different actions depending on the capabilities of another application from which it receives presence information. Examples include:

Showing a different set of icons depending on the capabilities of other clients. Not sending XHTML-IM content to plaintext clients such as cell phones. Allowing the initiation of Voice over IP (VoIP) sessions only to clients that support VoIP. Not showing a "Send a File" button if another user's client does not support File Transfer.

Recently, some existing Jabber clients have begun sending Software Version requests to each entity from which they receive presence. That solution is impractical on a larger scale, particularly for users or applications with large rosters. This document proposes a more robust and scalable solution: namely, a presence-based mechanism for exchanging information about entity capabilities.

상속: Element
예제 #1
0
        public DiscoInfo Get(Capabilities capabilities)
        {
            DiscoInfo discoInfo;

            _cache.TryGetValue(GetCapsString(capabilities), out discoInfo);

            return discoInfo;
        }
예제 #2
0
 /// <summary>
 /// Retourne les fonctionnalit� du client
 /// </summary>
 /// <returns>Fonctionnalit�s</returns>
 public static Capabilities getCapabilities()
 {
     agsXMPP.protocol.extensions.caps.Capabilities caps = new agsXMPP.protocol.extensions.caps.Capabilities(Queries.DiscoInfoToVersion(Queries.getDiscoInfo()), "http://microphage71.hostarea.org/caps");
     caps.AddExtension("mood");
     caps.AddExtension("tune");
     caps.AddExtension("geoloc");
     caps.AddExtension("activity");
     caps.AddExtension("cs");
     caps.AddExtension("ep-notify");
     return caps;
 }
예제 #3
0
 /// <summary>
 /// Retourne les fonctionnalité du client
 /// </summary>
 /// <returns>Fonctionnalités</returns>
 public static Capabilities getCapabilities()
 {
     agsXMPP.protocol.extensions.caps.Capabilities caps = new agsXMPP.protocol.extensions.caps.Capabilities(Queries.DiscoInfoToVersion(Queries.getDiscoInfo()), "http://microphage71.hostarea.org/caps");
     caps.AddExtension("mood");
     caps.AddExtension("tune");
     caps.AddExtension("geoloc");
     caps.AddExtension("activity");
     caps.AddExtension("cs");
     caps.AddExtension("ep-notify");
     return(caps);
 }
예제 #4
0
 public void AddToCache(Capabilities capabilities, DiscoInfo discoInfo)
 {
     if (discoInfo.GetFeatures().Length > 0)
     {
         lock (_cacheLock)
         {
             string caps = GetCapsString(capabilities);
             _cache[GetCapsString(capabilities)] = discoInfo;
             Database.SaveCapsCache(caps, discoInfo.ToString());
         }
     }
 }
예제 #5
0
파일: Presence.cs 프로젝트: don59/agsXmpp
        internal Presence()
        {
            agsXMPP.protocol.client.Presence pres = new agsXMPP.protocol.client.Presence();
            pres.Show = agsXMPP.protocol.client.ShowType.xa;
            pres.Status = "Away from the computer.";
            pres.Priority = 5;

            Capabilities caps = new Capabilities();
            caps.Node = "http://www.ag-software.de/caps";
            caps.Version = "1.1.0";
            // don't use the follwing anymore, its deprecated
            caps.Extensions = new string[] { "rtf", "html-im", "crypt"};

            Avatar avatar = new Avatar();
            avatar.Hash = "1bb12134f2528c4617fcc393180ddcfcc8462311";

            pres.AddChild(caps);
            pres.AddChild(avatar);
                        
            Console.WriteLine("Custom Presence Packet:");
            Program.Print(pres);           
        }
예제 #6
0
        static string GetCapsString(Capabilities capabilities)
        {
            if (string.IsNullOrEmpty(capabilities.Version))
            {
                return capabilities.Version;
            }

            string[] extensions = capabilities.Extensions;

            if (extensions != null && extensions.Length > 0)
            {
                Array.Sort(extensions);

                return string.Format("{0}#{1}<{2}", capabilities.Node,
                                     capabilities.Version,
                                     string.Join("<", extensions));
            }
            else
            {
                return String.Empty;
            }
        }
예제 #7
0
파일: Disco.cs 프로젝트: phiree/dzdocs
        internal Disco()
        {
            /*
                <iq from='[email protected]/orchard'
                    id='disco1'
                    to='[email protected]/balcony'
                    type='result'>
                  <query xmlns='http://jabber.org/protocol/disco#info'/>
                    <identity category='client' type='pc'/>
                    <feature var='http://jabber.org/protocol/disco#info'/>
                    <feature var='http://jabber.org/protocol/disco#items'/>
                    <feature var='http://jabber.org/protocol/muc'/>
                  </query>
                </iq>
             */

            DiscoInfoIq diiq = new DiscoInfoIq();
            diiq.Id = "disco1";
            diiq.To = new agsXMPP.Jid("[email protected]/balcony");
            diiq.Type = agsXMPP.protocol.client.IqType.result;

            diiq.Query.AddIdentity(new DiscoIdentity("pc", "client"));

            diiq.Query.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_INFO));
            diiq.Query.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_ITEMS));
            diiq.Query.AddFeature(new DiscoFeature(agsXMPP.Uri.MUC));

            Program.Print(diiq);

            // Build caps from this disco info
            Capabilities caps = new Capabilities();
            caps.Node = "http://www.ag-software.de/miniclient/caps";
            caps.SetVersion(diiq.Query);

            Program.Print(caps);
        }
예제 #8
0
 void RequestCapabilities(Jid jid, Capabilities caps)
 {
     string hash = caps.Node + "#" + caps.Version;
     RequestCapabilities(jid, hash);
 }
예제 #9
0
        private void OnContactPresence(Presence presence, Capabilities capabilities)
        {
            lock (_items._syncObject)
            {
                Contact contact = FindContact(presence.From);

                if (contact == null)
                {
                    if (JidUtil.BareEquals(presence.From, Account.Instance.Self.Jid))
                    {
                        // it's me from another client
                        Events.Instance.OnEvent(this, new EventInfo(
                                                          String.Format(Resources.Event_AnotherClient,
                                                                        presence.From.Resource, presence.Priority,
                                                                        Account.Instance.Self.Jid, presence.Show)));

                        if (presence.Priority > Account.Instance.MyPriority)
                        {
                            Events.Instance.OnEvent(this, new EventInfo(
                                                              String.Format(Resources.Event_AnotherClientHigher,
                                                                            presence.From.Resource)));
                        }
                        else
                        {
                            Events.Instance.OnEvent(this, new EventInfo(
                                                              String.Format(Resources.Event_AnotherClientLower,
                                                                            presence.From.Resource)));
                        }
                    }
                    else
                    {
                        Events.Instance.OnEvent(this,
                                                new EventError(String.Format(Resources.Event_UnknownPresence,
                                                                             presence.From, presence.Nickname), null));
                    }
                }
                else
                {
                    if (contact.Presence == null
                        || contact.Presence.Show != presence.Show)
                    {
                        // only if showtype changes
                        EventPresenceChanged eventPresenceChanged =
                            new EventPresenceChanged(contact, contact.Presence, presence);

                        Events.Instance.OnEvent(this, eventPresenceChanged);
                    }

                    contact.Presence = presence;

                    if (capabilities != null)
                    {
                        contact.Caps = capabilities;
                    }

                    if (!contact.HasDiscoRecieved)
                    {
                        AskForDisco(contact);
                    }
                }
            }
        }
예제 #10
0
        public SelfContact()
        {
            Version.Name = "xeus";
            Version.Ver = "2.0 RC0";
            Version.Os = Environment.OSVersion.ToString();

            _updateTimer.AutoReset = false;
            _updateTimer.Elapsed += _updateTimer_Elapsed;

            _idleTimer.AutoReset = true;
            _idleTimer.Elapsed += _idleTimer_Elapsed;
            _idleTimer.Start();

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.BYTESTREAMS));
            //_caps.AddExtension("bs");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.CAPS));
            //_caps.AddExtension("caps");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.COMMANDS));
            //_caps.AddExtension("cmd");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.CHATSTATES));
            //_caps.AddExtension("cs");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.DISCO_INFO));
            //_caps.AddExtension("di");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.VCARD_UPDATE));
            //_caps.AddExtension("vcup");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.VCARD));
            //_caps.AddExtension("vc");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.IQ_LAST));
            //_caps.AddExtension("las");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.MUC_ADMIN));
            //_caps.AddExtension("adm");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.MUC_OWNER));
            //_caps.AddExtension("own");

            _discoInfo.AddFeature(new DiscoFeature(agsXMPP.Uri.MUC_USER));
            //_caps.AddExtension("usr");

            _discoInfo.AddFeature(new DiscoFeature("urn:xmpp:time"));

               _caps = new Capabilities(TextUtil.GenerateVerAttribute(_discoInfo), "http://xeus.net/#2.0");

            _discoInfo.AddIdentity(_identity);
        }