1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2  * Copyright (c) 2003-2012 by AG-Software 											 *
3  * All Rights Reserved.																 *
4  * Contact information for AG-Software is available at http://www.ag-software.de	 *
5  *																					 *
6  * Licence:																			 *
7  * The agsXMPP SDK is released under a dual licence									 *
8  * agsXMPP can be used under either of two licences									 *
9  * 																					 *
10  * A commercial licence which is probably the most appropriate for commercial 		 *
11  * corporate use and closed source projects. 										 *
12  *																					 *
13  * The GNU Public License (GPL) is probably most appropriate for inclusion in		 *
14  * other open source projects.														 *
15  *																					 *
16  * See README.html for details.														 *
17  *																					 *
18  * For general enquiries visit our website at:										 *
19  * http://www.ag-software.de														 *
20  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
21 
22 using System;
23 using System.Text;
24 
25 using agsXMPP;
26 using agsXMPP.protocol.client;
27 
28 namespace agsXMPP.protocol.extensions.pubsub
29 {
30     public class PubSubManager
31     {
32         private XmppClientConnection	m_connection	= null;
33 
34         #region << Constructors >>
PubSubManager(XmppClientConnection con)35         public PubSubManager(XmppClientConnection con)
36         {
37             m_connection = con;
38         }
39         #endregion
40 
41         #region << Create Instant Node >>
42         /*
43             Example 6. Client requests an instant node
44 
45             <iq type="set"
46                 from="pgm@jabber.org"
47                 to="pubsub.jabber.org"
48                 id="create2">
49                 <pubsub xmlns="http://jabber.org/protocol/pubsub">
50                     <create/>
51                 </pubsub>
52             </iq>
53         */
54 
CreateInstantNode(Jid to)55         public void CreateInstantNode(Jid to)
56         {
57             CreateInstantNode(to, null, null);
58         }
59 
CreateInstantNode(Jid to, Jid from)60         public void CreateInstantNode(Jid to, Jid from)
61         {
62             CreateInstantNode(to, from, null);
63         }
64 
CreateInstantNode(Jid to, IqHandler cb)65         public void CreateInstantNode(Jid to, IqHandler cb)
66         {
67             CreateInstantNode(to, null, cb);
68         }
69 
CreateInstantNode(Jid to, Jid from, IqHandler cb)70         public void CreateInstantNode(Jid to, Jid from, IqHandler cb)
71         {
72             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
73 
74             if (from != null)
75                 pubsubIq.From = from;
76 
77             pubsubIq.PubSub.Create = new Create();
78 
79             if (cb == null)
80                 m_connection.Send(pubsubIq);
81             else
82                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
83         }
84         #endregion
85 
86         #region << Create Node >>
87         /*
88             Example 1. Entity requests a new node with default configuration.
89 
90             <iq type="set"
91                 from="pgm@jabber.org"
92                 to="pubsub.jabber.org"
93                 id="create1">
94                 <pubsub xmlns="http://jabber.org/protocol/pubsub">
95                     <create node="generic/pgm-mp3-player"/>
96                     <configure/>
97                 </pubsub>
98             </iq>
99         */
100         /// <summary>
101         /// Create a Node with default configuration
102         /// </summary>
103         /// <param name="to"></param>
104         /// <param name="node"></param>
CreateNode(Jid to, string node)105         public void CreateNode(Jid to, string node)
106         {
107             CreateNode(to, null, node, true, null);
108         }
109 
CreateNode(Jid to, Jid from, string node)110         public void CreateNode(Jid to, Jid from, string node)
111         {
112             CreateNode(to, from, node, true, null);
113         }
114 
115         /// <summary>
116         /// Create a Node
117         /// </summary>
118         /// <param name="to"></param>
119         /// <param name="from"></param>
120         /// <param name="defaultConfig"></param>
CreateNode(Jid to, Jid from, string node, bool defaultConfig)121         public void CreateNode(Jid to, Jid from, string node, bool defaultConfig)
122         {
123             CreateNode(to, from, node, defaultConfig, null);
124         }
125 
CreateNode(Jid to, string node, bool defaultConfig, IqHandler cb)126         public void CreateNode(Jid to, string node, bool defaultConfig, IqHandler cb)
127         {
128             CreateNode(to, null, node, defaultConfig, cb);
129         }
130 
CreateNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb)131         public void CreateNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb)
132         {
133             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
134 
135             if (from != null)
136                 pubsubIq.From = from;
137 
138             pubsubIq.PubSub.Create = new Create(node);
139 
140             if (defaultConfig)
141                 pubsubIq.PubSub.Configure = new Configure();
142 
143             if (cb == null)
144                 m_connection.Send(pubsubIq);
145             else
146                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
147         }
148         #endregion
149 
150         #region << CreateCollection Node >>
151         /*
152             To create a new collection node, the requesting entity MUST specify a type of "collection" when asking the service to create the node. [20]
153 
154             Example 185. Entity requests a new collection node
155 
156             <iq type='set'
157                 from='bard@shakespeare.lit/globe'
158                 to='pubsub.shakespeare.lit'
159                 id='create3'>
160               <pubsub xmlns='http://jabber.org/protocol/pubsub'>
161                 <create node='announcements' type='collection'/>
162               </pubsub>
163             </iq>
164 
165             Example 186. Service responds with success
166 
167             <iq type='result'
168                 from='pubsub.shakespeare.lit'
169                 to='bard@shakespeare.lit/globe'
170                 id='create3'/>
171 
172         */
CreateCollectionNode(Jid to, string node, bool defaultConfig)173         public void CreateCollectionNode(Jid to, string node, bool defaultConfig)
174         {
175             CreateCollectionNode(to, null, node, defaultConfig, null);
176         }
177 
CreateCollectionNode(Jid to, string node, bool defaultConfig, IqHandler cb)178         public void CreateCollectionNode(Jid to, string node, bool defaultConfig, IqHandler cb)
179         {
180             CreateCollectionNode(to, null, node, defaultConfig, cb);
181         }
182 
CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig)183         public void CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig)
184         {
185             CreateCollectionNode(to, from, node, defaultConfig, null);
186         }
187 
CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb)188         public void CreateCollectionNode(Jid to, Jid from, string node, bool defaultConfig, IqHandler cb)
189         {
190             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
191 
192             if (from != null)
193                 pubsubIq.From = from;
194 
195             pubsubIq.PubSub.Create = new Create(node, Type.collection);
196 
197             if (defaultConfig)
198                 pubsubIq.PubSub.Configure = new Configure();
199 
200             if (cb == null)
201                 m_connection.Send(pubsubIq);
202             else
203                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
204         }
205         #endregion
206 
207         #region << Delete Node >>
208         /*
209             Example 133. Owner deletes a node
210 
211             <iq type='set'
212                 from='hamlet@denmark.lit/elsinore'
213                 to='pubsub.shakespeare.lit'
214                 id='delete1'>
215               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
216                 <delete node='blogs/princely_musings'/>
217               </pubsub>
218             </iq>
219         */
220 
DeleteNode(Jid to, string node)221         public void DeleteNode(Jid to, string node)
222         {
223             DeleteNode(to, null, node, null);
224         }
225 
DeleteNode(Jid to, string node, IqHandler cb)226         public void DeleteNode(Jid to, string node, IqHandler cb)
227         {
228             DeleteNode(to, null, node, cb);
229         }
230 
DeleteNode(Jid to, Jid from, string node)231         public void DeleteNode(Jid to, Jid from, string node)
232         {
233             DeleteNode(to, from, node, null);
234         }
235 
DeleteNode(Jid to, Jid from, string node, IqHandler cb)236         public void DeleteNode(Jid to, Jid from, string node, IqHandler cb)
237         {
238             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
239 
240             if (from != null)
241                 pubsubIq.From = from;
242 
243             pubsubIq.PubSub.Delete = new owner.Delete(node);
244 
245             if (cb == null)
246                 m_connection.Send(pubsubIq);
247             else
248                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
249         }
250         #endregion
251 
252         #region << Purge Node >>
253         /*
254             Example 139. Owner purges all items from a node
255 
256             <iq type='set'
257                 from='hamlet@denmark.lit/elsinore'
258                 to='pubsub.shakespeare.lit'
259                 id='purge1'>
260               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
261                 <purge node='blogs/princely_musings'/>
262               </pubsub>
263             </iq>
264         */
265 
PurgeNode(Jid to, string node)266         public void PurgeNode(Jid to, string node)
267         {
268             PurgeNode(to, null, node, null);
269         }
270 
PurgeNode(Jid to, string node, IqHandler cb)271         public void PurgeNode(Jid to, string node, IqHandler cb)
272         {
273             PurgeNode(to, null, node, cb);
274         }
275 
PurgeNode(Jid to, Jid from, string node)276         public void PurgeNode(Jid to, Jid from, string node)
277         {
278             PurgeNode(to, from, node, null);
279         }
280 
PurgeNode(Jid to, Jid from, string node, IqHandler cb)281         public void PurgeNode(Jid to, Jid from, string node, IqHandler cb)
282         {
283             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
284 
285             if (from != null)
286                 pubsubIq.From = from;
287 
288             pubsubIq.PubSub.Purge = new owner.Purge(node);
289 
290             if (cb == null)
291                 m_connection.Send(pubsubIq);
292             else
293                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
294         }
295         #endregion
296 
297         #region << Publish to a Node >>
298         /*
299             Example 9. Entity publishes an item with an ItemID
300 
301             <iq type="set"
302                 from="pgm@jabber.org"
303                 to="pubsub.jabber.org"
304                 id="publish1">
305               <pubsub xmlns="http://jabber.org/protocol/pubsub">
306                 <publish node="generic/pgm-mp3-player">
307                   <item id="current">
308                     <tune xmlns="http://jabber.org/protocol/tune">
309                       <artist>Ralph Vaughan Williams</artist>
310                       <title>Concerto in F for Bass Tuba</title>
311                       <source>Golden Brass: The Collector's Edition</source>
312                     </tune>
313                   </item>
314                 </publish>
315               </pubsub>
316             </iq>
317         */
318 
319         /// <summary>
320         /// Publish a payload to a Node
321         /// </summary>
322         /// <param name="to"></param>
323         /// <param name="node"></param>
324         /// <param name="payload"></param>
PublishItem(Jid to, string node, Item payload)325         public void PublishItem(Jid to, string node, Item payload)
326         {
327             PublishItem(to, null, node, payload, null);
328         }
329 
330         /// <summary>
331         /// Publish a payload to a Node
332         /// </summary>
333         /// <param name="to"></param>
334         /// <param name="node"></param>
335         /// <param name="payload"></param>
336         /// <param name="cb"></param>
PublishItem(Jid to, string node, Item payload, IqHandler cb)337         public void PublishItem(Jid to, string node, Item payload, IqHandler cb)
338         {
339             PublishItem(to, null, node, payload, cb);
340         }
341 
342         /// <summary>
343         /// Publish a payload to a Node
344         /// </summary>
345         /// <param name="to"></param>
346         /// <param name="from"></param>
347         /// <param name="node"></param>
348         /// <param name="payload"></param>
PublishItem(Jid to, Jid from, string node, Item payload)349         public void PublishItem(Jid to, Jid from, string node, Item payload)
350         {
351             PublishItem(to, from, node, payload, null);
352         }
353 
354         /// <summary>
355         /// Publish a payload to a Node
356         /// </summary>
357         /// <param name="to"></param>
358         /// <param name="from"></param>
359         /// <param name="node"></param>
360         /// <param name="payload"></param>
361         /// <param name="cb"></param>
PublishItem(Jid to, Jid from, string node, Item payload, IqHandler cb)362         public void PublishItem(Jid to, Jid from, string node, Item payload, IqHandler cb)
363         {
364             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
365 
366             if (from != null)
367                 pubsubIq.From = from;
368 
369             Publish publish = new Publish(node);
370             publish.AddItem(payload);
371 
372             pubsubIq.PubSub.Publish = publish;
373 
374             if (cb == null)
375                 m_connection.Send(pubsubIq);
376             else
377                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
378         }
379 
380         #endregion
381 
382         #region << Retract >>
383         /*
384             <iq type="set"
385                 from="pgm@jabber.org"
386                 to="pubsub.jabber.org"
387                 id="deleteitem1">
388               <pubsub xmlns="http://jabber.org/protocol/pubsub">
389                 <retract node="generic/pgm-mp3-player">
390                   <item id="current"/>
391                 </retract>
392               </pubsub>
393             </iq>
394         */
395 
RetractItem(Jid to, string node, string id)396         public void RetractItem(Jid to, string node, string id)
397         {
398             RetractItem(to, null, node, id, null);
399         }
400 
RetractItem(Jid to, string node, string id, IqHandler cb)401         public void RetractItem(Jid to, string node, string id, IqHandler cb)
402         {
403             RetractItem(to, null, node, id, cb);
404         }
405 
406 
RetractItem(Jid to, Jid from, string node, string id)407         public void RetractItem(Jid to, Jid from, string node, string id)
408         {
409             RetractItem(to, from, node, id, null);
410         }
411 
RetractItem(Jid to, Jid from, string node, string id, IqHandler cb)412         public void RetractItem(Jid to, Jid from, string node, string id, IqHandler cb)
413         {
414             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
415 
416             if (from != null)
417                 pubsubIq.From = from;
418 
419 
420             pubsubIq.PubSub.Retract = new Retract(node, id);
421 
422             if (cb == null)
423                 m_connection.Send(pubsubIq);
424             else
425                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
426         }
427         #endregion
428 
429         #region << Subscribe >>
430         /*
431             <iq type="set"
432                 from="sub1@foo.com/home"
433                 to="pubsub.jabber.org"
434                 id="sub1">
435               <pubsub xmlns="http://jabber.org/protocol/pubsub">
436                 <subscribe
437                     node="generic/pgm-mp3-player"
438                     jid="sub1@foo.com"/>
439               </pubsub>
440             </iq>
441         */
442 
443         /// <summary>
444         ///
445         /// </summary>
446         /// <param name="to">Jid of the Publish Subscribe Service</param>
447         /// <param name="subscribe">Jid which should be subscribed</param>
448         /// <param name="node">node to which we want to subscribe</param>
Subscribe(Jid to, Jid subscribe, string node)449         public void Subscribe(Jid to, Jid subscribe, string node)
450         {
451             Subscribe(to, null, subscribe, node, null);
452         }
453 
Subscribe(Jid to, Jid subscribe, string node, IqHandler cb)454         public void Subscribe(Jid to, Jid subscribe, string node, IqHandler cb)
455         {
456             Subscribe(to, null, subscribe, node, cb);
457         }
458 
Subscribe(Jid to, Jid from, Jid subscribe, string node)459         public void Subscribe(Jid to, Jid from, Jid subscribe, string node)
460         {
461             Subscribe(to, from, subscribe, node, null);
462         }
463 
Subscribe(Jid to, Jid from, Jid subscribe, string node, IqHandler cb)464         public void Subscribe(Jid to, Jid from, Jid subscribe, string node, IqHandler cb)
465         {
466             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
467 
468             if (from != null)
469                 pubsubIq.From = from;
470 
471             pubsubIq.PubSub.Subscribe = new Subscribe(node, subscribe);
472 
473             if (cb == null)
474                 m_connection.Send(pubsubIq);
475             else
476                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
477         }
478 
479         #endregion
480 
481         #region << Unsubscribe >>
482         /*
483             Example 38. Entity unsubscribes from a node
484 
485             <iq type='set'
486                 from='francisco@denmark.lit/barracks'
487                 to='pubsub.shakespeare.lit'
488                 id='unsub1'>
489               <pubsub xmlns='http://jabber.org/protocol/pubsub'>
490                  <unsubscribe
491                      node='blogs/princely_musings'
492                      jid='francisco@denmark.lit'/>
493               </pubsub>
494             </iq>
495 
496         */
497 
498         /// <summary>
499         ///
500         /// </summary>
501         /// <param name="to">Jid of the Publish Subscribe Service</param>
502         /// <param name="subscribe">Jid which should be subscribed</param>
503         /// <param name="node">node to which we want to subscribe</param>
Unsubscribe(Jid to, Jid unsubscribe, string node)504         public void Unsubscribe(Jid to, Jid unsubscribe, string node)
505         {
506             Unsubscribe(to, null, unsubscribe, node, null, null);
507         }
508 
Unsubscribe(Jid to, Jid unsubscribe, string node, string subid)509         public void Unsubscribe(Jid to, Jid unsubscribe, string node, string subid)
510         {
511             Unsubscribe(to, null, unsubscribe, node, subid, null);
512         }
513 
Unsubscribe(Jid to, Jid unsubscribe, string node, IqHandler cb)514         public void Unsubscribe(Jid to, Jid unsubscribe, string node, IqHandler cb)
515         {
516             Unsubscribe(to, null, unsubscribe, node, cb);
517         }
518 
Unsubscribe(Jid to, Jid unsubscribe, string node, string subid, IqHandler cb)519         public void Unsubscribe(Jid to, Jid unsubscribe, string node, string subid, IqHandler cb)
520         {
521             Unsubscribe(to, null, unsubscribe, node, subid, cb);
522         }
523 
Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node)524         public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node)
525         {
526             Unsubscribe(to, from, unsubscribe, node, null, null);
527         }
528 
Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid)529         public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid)
530         {
531             Unsubscribe(to, from, unsubscribe, node, subid, null);
532         }
533 
Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, IqHandler cb)534         public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, IqHandler cb)
535         {
536             Unsubscribe(to, from, unsubscribe, node, cb);
537         }
538 
Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid, IqHandler cb)539         public void Unsubscribe(Jid to, Jid from, Jid unsubscribe, string node, string subid, IqHandler cb)
540         {
541             PubSubIq pubsubIq = new PubSubIq(IqType.set, to);
542 
543             if (from != null)
544                 pubsubIq.From = from;
545 
546             Unsubscribe unsub = new Unsubscribe(node, unsubscribe);
547             if (subid != null)
548                 unsub.SubId = subid;
549 
550             pubsubIq.PubSub.Unsubscribe = unsub;
551 
552             if (cb == null)
553                 m_connection.Send(pubsubIq);
554             else
555                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
556         }
557 
558         #endregion
559 
560         #region << Request Subscriptions >>>
561         /*
562             <iq type='get'
563                 from='francisco@denmark.lit/barracks'
564                 to='pubsub.shakespeare.lit'
565                 id='subscriptions1'>
566               <pubsub xmlns='http://jabber.org/protocol/pubsub'>
567                 <subscriptions/>
568               </pubsub>
569             </iq>
570         */
RequestSubscriptions(Jid to)571         public void RequestSubscriptions(Jid to)
572         {
573             RequestSubscriptions(to, null, null);
574         }
575 
RequestSubscriptions(Jid to, IqHandler cb)576         public void RequestSubscriptions(Jid to, IqHandler cb)
577         {
578             RequestSubscriptions(to, null, cb);
579         }
580 
RequestSubscriptions(Jid to, Jid from)581         public void RequestSubscriptions(Jid to, Jid from)
582         {
583             RequestSubscriptions(to, from, null);
584         }
585 
RequestSubscriptions(Jid to, Jid from, IqHandler cb)586         public void RequestSubscriptions(Jid to, Jid from, IqHandler cb)
587         {
588             PubSubIq pubsubIq = new PubSubIq(IqType.get, to);
589 
590             if (from != null)
591                 pubsubIq.From = from;
592 
593             pubsubIq.PubSub.Subscriptions = new Subscriptions();
594 
595             if (cb == null)
596                 m_connection.Send(pubsubIq);
597             else
598                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
599         }
600         #endregion
601 
602         #region << Owner Request Affiliations >>
603         /*
604             <iq type='get'
605                 from='francisco@denmark.lit/barracks'
606                 to='pubsub.shakespeare.lit'
607                 id='affil1'>
608               <pubsub xmlns='http://jabber.org/protocol/pubsub'>
609                 <affiliations/>
610               </pubsub>
611             </iq>
612         */
RequestAffiliations(Jid to)613         public void RequestAffiliations(Jid to)
614         {
615             RequestAffiliations(to, null, null);
616         }
617 
RequestAffiliations(Jid to, IqHandler cb)618         public void RequestAffiliations(Jid to, IqHandler cb)
619         {
620             RequestAffiliations(to, null, cb);
621         }
622 
RequestAffiliations(Jid to, Jid from)623         public void RequestAffiliations(Jid to, Jid from)
624         {
625             RequestAffiliations(to, from, null);
626         }
627 
RequestAffiliations(Jid to, Jid from, IqHandler cb)628         public void RequestAffiliations(Jid to, Jid from, IqHandler cb)
629         {
630             PubSubIq pubsubIq = new PubSubIq(IqType.get, to);
631 
632             if (from != null)
633                 pubsubIq.From = from;
634 
635             pubsubIq.PubSub.Affiliations = new Affiliations();
636 
637             if (cb == null)
638                 m_connection.Send(pubsubIq);
639             else
640                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
641         }
642         #endregion
643 
644         #region << Request Subscription Options >>
645         /*
646             <iq type='get'
647                 from='francisco@denmark.lit/barracks'
648                 to='pubsub.shakespeare.lit'
649                 id='options1'>
650               <pubsub xmlns='http://jabber.org/protocol/pubsub'>
651                 <options node='blogs/princely_musings' jid='francisco@denmark.lit'/>
652               </pubsub>
653             </iq>
654         */
655 
RequestSubscriptionOptions(Jid to, Jid subscribe, string node)656         public void RequestSubscriptionOptions(Jid to, Jid subscribe, string node)
657         {
658             RequestSubscriptionOptions(to, null, subscribe, node, null);
659         }
660 
RequestSubscriptionOptions(Jid to, Jid subscribe, string node, IqHandler cb)661         public void RequestSubscriptionOptions(Jid to, Jid subscribe, string node, IqHandler cb)
662         {
663             RequestSubscriptionOptions(to, null, subscribe, node, cb);
664         }
665 
RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node)666         public void RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node)
667         {
668             RequestSubscriptionOptions(to, from, subscribe, node, null);
669         }
670 
RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node, IqHandler cb)671         public void RequestSubscriptionOptions(Jid to, Jid from, Jid subscribe, string node, IqHandler cb)
672         {
673             PubSubIq pubsubIq = new PubSubIq(IqType.get, to);
674 
675             if (from != null)
676                 pubsubIq.From = from;
677 
678             pubsubIq.PubSub.Options = new Options(subscribe, node);
679 
680             if (cb == null)
681                 m_connection.Send(pubsubIq);
682             else
683                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
684         }
685         #endregion
686 
687         #region << Request All Subscribers >>
688         /*
689             <iq type='get'
690                 from='hamlet@denmark.lit/elsinore'
691                 to='pubsub.shakespeare.lit'
692                 id='subman1'>
693               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
694                 <subscribers node='blogs/princely_musings'/>
695               </pubsub>
696             </iq>
697         */
698 
OwnerRequestSubscribers(Jid to, string node)699         public void OwnerRequestSubscribers(Jid to, string node)
700         {
701             OwnerRequestSubscribers(to, null, node, null);
702         }
703 
OwnerRequestSubscribers(Jid to, string node, IqHandler cb)704         public void OwnerRequestSubscribers(Jid to, string node, IqHandler cb)
705         {
706             OwnerRequestSubscribers(to, null, node, cb);
707         }
708 
OwnerRequestSubscribers(Jid to, Jid from, string node)709         public void OwnerRequestSubscribers(Jid to, Jid from, string node)
710         {
711             OwnerRequestSubscribers(to, from, node, null);
712         }
713 
OwnerRequestSubscribers(Jid to, Jid from, string node, IqHandler cb)714         public void OwnerRequestSubscribers(Jid to, Jid from, string node, IqHandler cb)
715         {
716             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.get, to);
717 
718             if (from != null)
719                 pubsubIq.From = from;
720 
721             pubsubIq.PubSub.Subscribers = new agsXMPP.protocol.extensions.pubsub.owner.Subscribers(node);
722 
723             if (cb == null)
724                 m_connection.Send(pubsubIq);
725             else
726                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
727         }
728         #endregion
729 
730         #region << Modifying single Subscription State >>
731         /*
732             Upon receiving the subscribers list, the node owner MAY modify subscription states.
733             The owner MUST send only modified subscription states (i.e., a "delta"), not the complete list.
734             (Note: If the 'subscription' attribute is not specified in a modification request, then the value
735             MUST NOT be changed.)
736 
737             Example 163. Owner modifies subscriptions
738 
739             <iq type='set'
740                 from='hamlet@denmark.lit/elsinore'
741                 to='pubsub.shakespeare.lit'
742                 id='subman3'>
743               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
744                 <subscribers node='blogs/princely_musings'>
745                   <subscriber jid='polonius@denmark.lit' subscription='none'/>
746                 </subscribers>
747               </pubsub>
748             </iq>
749 
750         */
751 
OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state)752         public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state)
753         {
754             OwnerModifySubscriptionState(to, null, node, subscriber, state, null);
755         }
756 
OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state, IqHandler cb)757         public void OwnerModifySubscriptionState(Jid to, string node, Jid subscriber, SubscriptionState state, IqHandler cb)
758         {
759             OwnerModifySubscriptionState(to, null, node, subscriber, state, cb);
760         }
761 
OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state)762         public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state)
763         {
764             OwnerModifySubscriptionState(to, from, node, subscriber, state, null);
765         }
766 
OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqHandler cb)767         public void OwnerModifySubscriptionState(Jid to, Jid from, string node, Jid subscriber, SubscriptionState state, IqHandler cb)
768         {
769             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
770 
771             if (from != null)
772                 pubsubIq.From = from;
773 
774             owner.Subscribers subs = new owner.Subscribers(node);
775             subs.AddSubscriber(new owner.Subscriber(subscriber, state));
776 
777             pubsubIq.PubSub.Subscribers = subs;
778 
779             if (cb == null)
780                 m_connection.Send(pubsubIq);
781             else
782                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
783         }
784         #endregion
785 
786         #region << Modifying multiple Subscription States >>
787         /*
788             <iq type='set'
789                 from='hamlet@denmark.lit/elsinore'
790                 to='pubsub.shakespeare.lit'
791                 id='subman3'>
792               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
793                 <subscribers node='blogs/princely_musings'>
794                     <subscriber jid='polonius@denmark.lit' subscription='none'/>
795                     <subscriber jid='bard@shakespeare.lit' subscription='subscribed'/>
796                 </subscribers>
797               </pubsub>
798             </iq>
799         */
800 
OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers)801         public void OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers)
802         {
803             OwnerModifySubscriptionStates(to, null, node, subscribers, null);
804         }
805 
OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers, IqHandler cb)806         public void OwnerModifySubscriptionStates(Jid to, string node, owner.Subscriber[] subscribers, IqHandler cb)
807         {
808             OwnerModifySubscriptionStates(to, null, node, subscribers, cb);
809         }
810 
OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers)811         public void OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers)
812         {
813             OwnerModifySubscriptionStates(to, from, node, subscribers, null);
814         }
815 
OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers, IqHandler cb)816         public void OwnerModifySubscriptionStates(Jid to, Jid from, string node, owner.Subscriber[] subscribers, IqHandler cb)
817         {
818             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
819 
820             if (from != null)
821                 pubsubIq.From = from;
822 
823             owner.Subscribers subs = new owner.Subscribers(node);
824             subs.AddSubscribers(subscribers);
825 
826             pubsubIq.PubSub.Subscribers = subs;
827 
828             if (cb == null)
829                 m_connection.Send(pubsubIq);
830             else
831                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
832         }
833         #endregion
834 
835         #region << Owner Request Affiliations >>
836         /*
837             Example 168. Owner requests all affiliated entities
838 
839             <iq type='get'
840                 from='hamlet@denmark.lit/elsinore'
841                 to='pubsub.shakespeare.lit'
842                 id='ent1'>
843               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
844                 <affiliates node='blogs/princely_musings'/>
845               </pubsub>
846             </iq>
847         */
848 
OwnerRequestAffiliations(Jid to, string node)849         public void OwnerRequestAffiliations(Jid to, string node)
850         {
851             OwnerRequestAffiliations(to, null, node, null);
852         }
853 
OwnerRequestAffiliations(Jid to, string node, IqHandler cb)854         public void OwnerRequestAffiliations(Jid to, string node, IqHandler cb)
855         {
856             OwnerRequestAffiliations(to, null, node, cb);
857         }
858 
OwnerRequestAffiliations(Jid to, Jid from, string node)859         public void OwnerRequestAffiliations(Jid to, Jid from, string node)
860         {
861             OwnerRequestAffiliations(to, from, node, null);
862         }
863 
OwnerRequestAffiliations(Jid to, Jid from, string node, IqHandler cb)864         public void OwnerRequestAffiliations(Jid to, Jid from, string node, IqHandler cb)
865         {
866             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.get, to);
867 
868             if (from != null)
869                 pubsubIq.From = from;
870 
871             pubsubIq.PubSub.Affiliates = new owner.Affiliates(node);
872 
873             if (cb == null)
874                 m_connection.Send(pubsubIq);
875             else
876                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
877         }
878         #endregion
879 
880         #region << Owner Set/Modify Affiliation >>
881         /*
882             Owner modifies a single affiliation
883 
884             <iq type='set'
885                 from='hamlet@denmark.lit/elsinore'
886                 to='pubsub.shakespeare.lit'
887                 id='ent2'>
888               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
889                 <affiliates node='blogs/princely_musings'/>
890                   <affiliate jid='hamlet@denmark.lit' affiliation='owner'/>
891                 </affiliates>
892               </pubsub>
893             </iq>
894 
895         */
896 
OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation)897         public void OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation)
898         {
899             OwnerModifyAffiliation(to, null, node, affiliate, affiliation, null);
900         }
901 
OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb)902         public void OwnerModifyAffiliation(Jid to, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb)
903         {
904             OwnerModifyAffiliation(to, null, node, affiliate, affiliation, cb);
905         }
906 
OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation)907         public void OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation)
908         {
909             OwnerModifyAffiliation(to, from, node, affiliate, affiliation, null);
910         }
911 
OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb)912         public void OwnerModifyAffiliation(Jid to, Jid from, string node, Jid affiliate, AffiliationType affiliation, IqHandler cb)
913         {
914             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
915 
916             if (from != null)
917                 pubsubIq.From = from;
918 
919             owner.Affiliates aff = new owner.Affiliates(node);
920             aff.AddAffiliate(new owner.Affiliate(affiliate, affiliation));
921 
922             pubsubIq.PubSub.Affiliates = aff;
923 
924             if (cb == null)
925                 m_connection.Send(pubsubIq);
926             else
927                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
928         }
929         #endregion
930 
931         #region << Owner Modify Affiliations >>
932         /*
933             Owner modifies a single affiliation
934 
935             <iq type='set'
936                 from='hamlet@denmark.lit/elsinore'
937                 to='pubsub.shakespeare.lit'
938                 id='ent2'>
939               <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
940                 <affiliates node='blogs/princely_musings'/>
941                   <affiliate jid='hamlet@denmark.lit' affiliation='owner'/>
942                   <affiliate jid='polonius@denmark.lit' affiliation='none'/>
943                   <affiliate jid='bard@shakespeare.lit' affiliation='publisher'/>
944                 </affiliates>
945               </pubsub>
946             </iq>
947         */
948 
OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates)949         public void OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates)
950         {
951             OwnerModifyAffiliations(to, null, node, affiliates, null);
952         }
953 
OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates, IqHandler cb)954         public void OwnerModifyAffiliations(Jid to, string node, owner.Affiliate[] affiliates, IqHandler cb)
955         {
956             OwnerModifyAffiliations(to, null, node, affiliates, cb);
957         }
958 
OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates)959         public void OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates)
960         {
961             OwnerModifyAffiliations(to, from, node, affiliates, null);
962         }
963 
OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates, IqHandler cb)964         public void OwnerModifyAffiliations(Jid to, Jid from, string node, owner.Affiliate[] affiliates, IqHandler cb)
965         {
966             owner.PubSubIq pubsubIq = new owner.PubSubIq(IqType.set, to);
967 
968             if (from != null)
969                 pubsubIq.From = from;
970 
971             owner.Affiliates affs = new owner.Affiliates(node);
972             affs.AddAffiliates(affiliates);
973 
974             pubsubIq.PubSub.Affiliates = affs;
975 
976             if (cb == null)
977                 m_connection.Send(pubsubIq);
978             else
979                 m_connection.IqGrabber.SendIq(pubsubIq, cb);
980         }
981         #endregion
982     }
983 
984 }