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(); } } }
/// <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); }
/// <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; }
/// <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); } } }
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); } }
/// <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); }
/// <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); } } } }
/// <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);
/// <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); }
/// <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(); }
/// <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(); } }
/// <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); }
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); }