private void OnQueryErrorReceived(IQ message)
        {
            this.pendingMessages.Remove(message.ID);

            if (message.Error.FeatureNotImplemented != null)
            {
                this.SupportsServiceDiscovery = false;
            }
        }
        private void OnServiceDiscoveryMessage(IQ message)
        {
            this.pendingMessages.Remove(message.ID);

            foreach (ServiceItemQuery item in message.Items)
            {
                foreach (ServiceItem sitem in item.Items)
                {
                    this.features.Add(sitem.Node);
                }

                this.NotifyPropertyChanged(() => SupportsUserTune);
                this.NotifyPropertyChanged(() => SupportsUserMood);

                if (this.SupportsUserTune)
                {
                    this.nowPlayingListener.Start();
                }
            }
        }
Example #3
0
        /// <summary>
        /// Stops user tune publications
        /// </summary>
        public IXmppSession StopTunePublication()
        {
            IQ 				iq 		= new IQ();
            PubSub			pubsub	= new PubSub();
            PubSubPublish 	publish = new PubSubPublish();
            PubSubItem		item	= new PubSubItem();
            Tune			tune	= new Tune();

            iq.Items.Add(pubsub);
            pubsub.Items.Add(publish);
            publish.Items.Add(item);

            iq.From			= this.UserId.ToString();
            iq.ID			= XmppIdentifierGenerator.Generate();
            iq.Type 		= IQType.Set;
            publish.Node	= XmppFeatures.UserMood;
            item.Item		= tune;

            this.Send(iq);

            return this;
        }
        /// <summary>
        /// Performs the gateway registration process
        /// </summary>
        /// <param name="username"></param>
        /// <param name="password"></param>
        public void Register(string username, string password)
        {
            RegisterQuery 	query 	= new RegisterQuery();
            IQ 				iq 		= new IQ();

            iq.ID   = XmppIdentifierGenerator.Generate();
            iq.Type = IQType.Set;
            iq.From = this.Session.UserId;
            iq.To   = this.Identifier;

            iq.Items.Add(query);

            query.UserName = username;
            query.Password = password;

            this.PendingMessages.Add(iq.ID);

            this.Session.Send(iq);
        }
Example #5
0
        /// <summary>
        /// Publishes the avatar.
        /// </summary>
        /// <param name="mimetype">The mimetype.</param>
        /// <param name="hash">The hash.</param>
        /// <param name="avatarImage">The avatar image.</param>
        public IXmppSession PublishAvatar(string mimetype, string hash, Image avatarImage)
        {
            MemoryStream avatarData = new MemoryStream();

            try
            {
                avatarImage.Save(avatarData, ImageFormat.Png);

                // Publish the avatar
                IQ          iq      = new IQ();
                VCardData   vcard   = new VCardData();

                iq.ID   = XmppIdentifierGenerator.Generate();
                iq.Type = IQType.Set;
                iq.From = this.UserId.ToString();

                vcard.Photo.Type    = mimetype;
                vcard.Photo.Photo   = avatarData.ToArray();

                iq.Items.Add(vcard);

                this.Send(iq);

                // Save the avatar
                this.avatarStorage.SaveAvatar(this.UserId.BareIdentifier, hash, avatarData);

                // Update session configuration
                this.avatarStorage.Save();
            }
            catch
            {
                throw;
            }
            finally
            {
                if (avatarData != null)
                {
                    avatarData.Close();
                    avatarData.Dispose();
                    avatarData = null;
                }
            }

            return this;
        }
Example #6
0
        /// <summary>
        /// Publishes user mood information
        /// </summary>
        public IXmppSession PublishMood(XmppUserMoodEvent moodEvent)
        {
            IQ 				iq 		= new IQ();
            PubSub			pubsub	= new PubSub();
            PubSubPublish 	publish = new PubSubPublish();
            PubSubItem		item	= new PubSubItem();
            Mood 			mood 	= new Mood();

            iq.Items.Add(pubsub);
            pubsub.Items.Add(publish);
            publish.Items.Add(item);

            iq.From			= this.UserId.ToString();
            iq.ID			= XmppIdentifierGenerator.Generate();
            iq.Type 		= IQType.Set;
            publish.Node	= XmppFeatures.UserMood;
            item.Item		= mood;
            mood.MoodType	= (MoodType)Enum.Parse(typeof(MoodType), moodEvent.Mood);
            mood.Text		= moodEvent.Text;

            this.Send(iq);

            return this;
        }
        private void RequestAvatar()
        {
            if (this.contact.Subscription == XmppContactSubscriptionType.Both ||
                this.contact.Subscription == XmppContactSubscriptionType.To)
            {
                IQ iq = new IQ();

                iq.ID   = XmppIdentifierGenerator.Generate();
                iq.Type = IQType.Get;
                iq.To   = this.ResourceId;
                iq.From = this.session.UserId;

                iq.Items.Add(new VCardData());

                this.session.Send(iq);
            }
        }
 protected virtual void OnQueryErrorMessage(IQ message)
 {
 }
        private void OnServiceDiscoveryMessage(IQ message)
        {
            this.pendingMessages.Remove(message.ID);

            this.Capabilities.Identities.Clear();
            this.Capabilities.Features.Clear();

            // Reponse to our capabilities query
            foreach (object item in message.Items)
            {
                if (item is ServiceQuery)
                {
                    ServiceQuery query = (ServiceQuery)item;

                    foreach (ServiceIdentity identity in query.Identities)
                    {
                        this.Capabilities.Identities.Add
                        (
                            new XmppServiceIdentity(identity.Name, identity.Category, identity.Type)
                        );
                    }

                    foreach (ServiceFeature supportedFeature in query.Features)
                    {
                        this.Capabilities.Features.Add(new XmppServiceFeature(supportedFeature.Name));
                    }
                }
            }

            if (!this.session.ClientCapabilitiesStorage.Exists(this.capabilities.Node, this.capabilities.VerificationString))
            {
                this.session.ClientCapabilitiesStorage.ClientCapabilities.Add(this.Capabilities);
                this.session.ClientCapabilitiesStorage.Save();
            }

            this.NotifyPropertyChanged(() => Capabilities);
        }
        private void OnVCardMessage(IQ message)
        {
            // Update the Avatar image
            VCardData vCard = (VCardData)message.Items[0];

            if (vCard.Photo.Photo != null && vCard.Photo.Photo.Length > 0)
            {
                Image avatarImage = null;

                try
                {
                    this.DisposeAvatarStream();

                    using (MemoryStream avatarStream = new MemoryStream(vCard.Photo.Photo))
                    {
                        // En sure it's a valid image
                        avatarImage = Image.FromStream(avatarStream);

                        // Save avatar
                        if (avatarStream != null && avatarStream.Length > 0)
                        {
                            this.session.AvatarStorage.SaveAvatar(this.ResourceId.BareIdentifier, this.avatarHash, avatarStream);
                        }
                    }

                    this.Avatar = this.session.AvatarStorage.ReadAvatar(this.ResourceId.BareIdentifier);
                }
                catch
                {
            #warning TODO: Handle the exception
                }
                finally
                {
                    if (avatarImage != null)
                    {
                        avatarImage.Dispose();
                        avatarImage = null;
                    }
                }
            }
            else
            {
                this.session.AvatarStorage.RemoveAvatar(this.ResourceId.BareIdentifier);
            }

            this.session.AvatarStorage.Save();
        }
 private void OnQueryErrorMessage(IQ message)
 {
     if (this.pendingMessages.Contains(message.ID))
     {
         this.pendingMessages.Remove(message.ID);
     }
 }
        private void DiscoverCapabilities()
        {
            IQ              requestIq   = new IQ();
            ServiceQuery    request     = new ServiceQuery();

            request.Node    = this.Capabilities.DiscoveryInfoNode;
            requestIq.From  = this.session.UserId;
            requestIq.ID    = XmppIdentifierGenerator.Generate();
            requestIq.To    = this.ResourceId;
            requestIq.Type  = IQType.Get;

            requestIq.Items.Add(request);

            this.pendingMessages.Add(requestIq.ID);

            this.session.Send(requestIq);
        }
        protected override void OnServiceDiscoveryMessage(IQ message)
        {
            // Answers to Entity Capabilities and service discovery info requests
            if (message.Type == IQType.Get)
            {
                if (message.Items[0] is ServiceQuery)
                {
                    ServiceQuery    query       = (ServiceQuery)message.Items[0];
                    ServiceQuery    response    = new ServiceQuery()
                    {
                        Node = ((!String.IsNullOrEmpty(query.Node)) ? this.DiscoveryInfoNode : null)
                    };

                    IQ responseIq = new IQ
                    {
                        From    = this.session.UserId,
                        ID      = message.ID,
                        To      = message.From,
                        Type    = IQType.Result
                    };

                    foreach (XmppServiceIdentity identity in this.Identities)
                    {
                        ServiceIdentity supportedIdentity = new ServiceIdentity
                        {
                            Name        = identity.Name,
                            Category    = identity.Category.ToString().ToLower(),
                            Type        = identity.Type
                        };

                        response.Identities.Add(supportedIdentity);
                    }

                    foreach (XmppServiceFeature supportedFeature in this.Features)
                    {
                        ServiceFeature feature = new ServiceFeature
                        {
                            Name = supportedFeature.Name
                        };

                        response.Features.Add(feature);
                    }

                    responseIq.Items.Add(response);

                    this.session.Send(responseIq);

                    //// Error response
                    //IQ errorIq = new IQ();
                    //ServiceQuery response = new ServiceQuery();
                    //Error error = new Error();

                    //errorIq.From = this.session.UserId.ToString();
                    //errorIq.ID = e.QueryResult.ID;
                    //errorIq.To = e.QueryResult.From;
                    //errorIq.Type = IQType.Error;
                    //errorIq.Error = error;
                    //response.Node = query.Node;
                    //error.Type = ErrorType.Cancel;
                    //error.ItemNotFound = "";

                    //errorIq.Items.Add(response);

                    //this.session.Send(errorIq);
                }
            }
        }
Example #14
0
        private void OpenSession()
        {
            if (this.SupportsFeature(XmppStreamFeatures.Sessions))
            {
                IQ iq = new IQ();

                iq.Type = IQType.Set;
                iq.To   = this.connectionString.HostName;
                iq.ID   = XmppIdentifierGenerator.Generate();

                iq.Items.Add(new Session());

                this.Send(iq);
            }
        }
Example #15
0
        /// <summary>
        /// Adds to group.
        /// </summary>
        /// <param name="groupName">Name of the group.</param>
        public void AddToGroup(string groupName)
        {
            IQ          iq      = new IQ();
            RosterQuery query   = new RosterQuery();
            RosterItem  item    = new RosterItem();

            if (!this.Groups.Contains(groupName))
            {
                this.Groups.Add(groupName);
            }

            iq.Type = IQType.Set;

            item.Jid            = this.ContactId.BareIdentifier;
            item.Name           = this.Name;
            item.Subscription   = (RosterSubscriptionType)this.Subscription;

            item.Groups.Add(groupName);

            query.Items.Add(item);
            iq.Items.Add(query);

            this.session.Send(iq);
        }
Example #16
0
        /// <summary>
        /// Process an XMPP IQ message
        /// </summary>
        /// <param name="iq"></param>
        private void ProcessQueryMessage(IQ iq)
        {
            if (iq.Items != null && iq.Items.Count > 0)
            {
                foreach (object item in iq.Items)
                {
                    if (iq.Type != IQType.Error)
                    {
                        if (item is Bind)
                        {
                            this.userId = ((Bind)item).Jid;

                            this.bindResourceEvent.Set();
                        }
                        else if (item is RosterQuery)
                        {
                            this.onRosterMessage.OnNext(item as RosterQuery);
                        }
                        else if (item is VCardData)
                        {
                            this.onVCardMessage.OnNext(iq);
                        }
                        else if (item is Ping)
                        {
                            if (iq.Type == IQType.Get)
                            {
                                // Send the "pong" response
                                this.Send
                                (
                                    new IQ
                                    {
                                        ID      = iq.ID,
                                        To      = iq.From,
                                        From    = this.UserId.ToString(),
                                        Type    = IQType.Result
                                    }
                                );
                            }
                        }
                    }

                    if (item is ServiceQuery || item is ServiceItemQuery)
                    {
                        this.onServiceDiscoveryMessage.OnNext(iq);
                    }
                }
            }
        }
Example #17
0
        /// <summary>
        /// Unblock contact.
        /// </summary>
        public void UnBlock()
        {
            if (this.session.ServiceDiscovery.SupportsBlocking)
            {
                IQ iq = new IQ
                {
                    ID      = XmppIdentifierGenerator.Generate(),
                    From    = this.session.UserId,
                    Type    = IQType.Set
                };

                UnBlock unBlock = new UnBlock();

                unBlock.Items.Add
                (
                    new BlockItem
                    {
                        Jid = this.ContactId.BareIdentifier
                    }
                );

                iq.Items.Add(unBlock);

                this.session.Send(iq);
            }
        }
 protected abstract void OnServiceDiscoveryMessage(IQ message);
Example #19
0
        /// <summary>
        /// Updates the contact data.
        /// </summary>
        public void Update()
        {
            IQ          iq      = new IQ();
            RosterQuery query   = new RosterQuery();
            RosterItem  item    = new RosterItem();

            iq.Type = IQType.Set;

            item.Jid    = this.ContactId.BareIdentifier;
            item.Name   = this.DisplayName;
            item.Subscription = (RosterSubscriptionType)this.Subscription;

            item.Groups.AddRange(this.Groups);

            query.Items.Add(item);
            iq.Items.Add(query);

            this.session.Send(iq);
        }
Example #20
0
        /// <summary>
        /// Publishes the display name.
        /// </summary>
        /// <param name="displayName">The display name.</param>
        public IXmppSession PublishDisplayName(string displayName)
        {
            // Publish the display name ( nickname )
            IQ          iq      = new IQ();
            VCardData   vcard   = new VCardData();

            iq.ID   = XmppIdentifierGenerator.Generate();
            iq.Type = IQType.Set;
            iq.From = this.UserId.ToString();

            vcard.NickName = displayName;

            iq.Items.Add(vcard);

            this.Send(iq);

            return this;
        }
        /// <summary>
        /// Discover item items.
        /// </summary>
        public virtual void DiscoverItems()
        {
            if (!this.featuresRequested)
            {
                this.DiscoverFeatures();
            }

            if (this.items == null)
            {
                this.items = new List<XmppServiceItem>();
            }
            else
            {
                this.items.Clear();
            }

            // Get Service Details
            IQ iq = new IQ
            {
                ID      = XmppIdentifierGenerator.Generate(),
                Type    = IQType.Get,
                From    = this.session.UserId,
                To      = this.Identifier
            };

            iq.Items.Add(new ServiceItemQuery());

            this.itemsRequested = true;
            this.PendingMessages.Add(iq.ID);
            this.session.Send(iq);

            this.waitEvent.WaitOne();
        }
Example #22
0
        /// <summary>
        /// Publishes user tune information
        /// </summary>
        public IXmppSession PublishTune(XmppUserTuneEvent tuneEvent)
        {
            IQ 				iq 		= new IQ();
            PubSub			pubsub	= new PubSub();
            PubSubPublish 	publish = new PubSubPublish();
            PubSubItem		item	= new PubSubItem();
            Tune			tune	= new Tune();

            iq.Items.Add(pubsub);
            pubsub.Items.Add(publish);
            publish.Items.Add(item);

            iq.From			= this.UserId.ToString();
            iq.ID			= XmppIdentifierGenerator.Generate();
            iq.Type 		= IQType.Set;
            publish.Node	= XmppFeatures.UserMood;
            item.Item		= tune;
            tune.Artist		= tuneEvent.Artist;
            tune.Length		= tuneEvent.Length;
            tune.Rating		= tuneEvent.Rating;
            tune.Source		= tuneEvent.Source;
            tune.Title		= tuneEvent.Title;
            tune.Track		= tuneEvent.Track;
            tune.Uri		= tuneEvent.Uri;

            this.Send(iq);

            return this;
        }
        private void OnQueryErrorMessage(IQ message)
        {
            if (this.PendingMessages.Contains(message.ID))
            {
                this.PendingMessages.Remove(message.ID);

                this.waitEvent.Set();
            }
        }
Example #24
0
        /// <summary>
        /// Performs the gateway unregistration process
        /// </summary>
        public void Unregister()
        {
            RegisterQuery 	query 	= new RegisterQuery();
            IQ 				iq 		= new IQ();

            iq.ID   = XmppIdentifierGenerator.Generate();
            iq.Type = IQType.Set;
            iq.From = this.Session.UserId;
            iq.To   = this.Identifier;

            iq.Items.Add(query);

            query.Remove = "";

            this.PendingMessages.Add(iq.ID);

            this.Session.Send(iq);
        }
        private void OnServiceDiscoveryMessage(IQ message)
        {
            if (this.PendingMessages.Contains(message.ID))
            {
                this.PendingMessages.Remove(message.ID);

                foreach (object item in message.Items)
                {
                    if (item is ServiceItemQuery)
                    {
                        foreach (ServiceItem serviceItem in ((ServiceItemQuery)item).Items)
                        {
                            this.items.Add(new XmppServiceItem(this.session, serviceItem.Jid));
                        }

                        this.NotifyPropertyChanged(() => Items);
                    }
                    else if (item is ServiceQuery)
                    {
                        // Details of available services
                        ServiceQuery query = (ServiceQuery)item;

                        if (this.identities == null)
                        {
                            this.identities = new List<XmppServiceIdentity>();
                        }

                        this.identities.Clear();

                        foreach (ServiceIdentity identity in query.Identities)
                        {
                            this.identities.Add(new XmppServiceIdentity(identity.Name, identity.Category, identity.Type));
                        }

                        foreach (ServiceFeature feature in query.Features)
                        {
                            this.features.Add(new XmppServiceFeature(feature.Name));
                        }

                        this.NotifyPropertyChanged(() => Identities);
                        this.NotifyPropertyChanged(() => Features);
                    }
                }

                this.waitEvent.Set();
            }
        }
        /// <summary>
        /// Discover existing services provided by the XMPP Server
        /// </summary>
        /// <returns></returns>
        public void DiscoverServices()
        {
            this.Clear();

            string  domain      = ((String.IsNullOrEmpty(this.domainName)) ? this.session.UserId.DomainName : this.domainName);
            string  messageId   = XmppIdentifierGenerator.Generate();
            IQ      iq          = new IQ
            {
                ID   = messageId,
                Type = IQType.Get,
                From = this.session.UserId,
                To   = domain
            };

            iq.Items.Add(new ServiceItemQuery());

            this.pendingMessages.Add(messageId);

            this.session.Send(iq);
        }
Example #27
0
        private void BindResource()
        {
            if (this.SupportsFeature(XmppStreamFeatures.ResourceBinding))
            {
                Bind bind		= new Bind();
                bind.Resource	= this.UserId.ResourceName;

                IQ iq   = new IQ();
                iq.Type = IQType.Set;
                iq.ID   = XmppIdentifierGenerator.Generate();

                iq.Items.Add(bind);

                this.Send(iq);

                this.bindResourceEvent.WaitOne();
            }
        }
        private void OnServiceDiscoveryMessageReceived(IQ message)
        {
            this.pendingMessages.Remove(message.ID);
            this.SupportsServiceDiscovery = true;

            foreach (object item in message.Items)
            {
                if (item is ServiceItemQuery)
                {
                    // List of availabl services
                    foreach (ServiceItem serviceItem in ((ServiceItemQuery)item).Items)
                    {
                        this.services.Add(new XmppService(this.session, serviceItem.Jid));
                    }
                }
            }

            this.NotifyPropertyChanged(() => Services);
        }
        /// <summary>
        /// Discover if we have personal eventing support enabled
        /// </summary>
        /// <returns></returns>
        internal void DiscoverSupport()
        {
            ServiceItemQuery	query   = new ServiceItemQuery();
            IQ                  iq      = new IQ();

            iq.ID   = XmppIdentifierGenerator.Generate();
            iq.Type = IQType.Get;
            iq.From = this.session.UserId;
            iq.To   = this.session.UserId.BareIdentifier;

            iq.Items.Add(query);

            this.pendingMessages.Add(iq.ID);
            this.features.Clear();

            this.session.Send(iq);
        }