Kristof hat recht, die Docs sind spärlich - aber sie werden besser. Es gibt eine gute, wenn auch schwer zu findende Zusammenstellung von Dokumenten zu Erweiterungen. Der PubSub ist unter http://www.igniterealtime.org/fisheye/browse/~raw,r=11613/svn-org/smack/trunk/documentation/extensions/pubsub.html.
Nachdem ich die benutzerdefinierte IQ-Provider-Route von Anfang an mit einer Erweiterung durchlaufen hatte, stellte ich fest, dass es einfacher war, die Manager so oft wie möglich zu verwenden. Die Entwickler, die den Managern geschrieben haben, haben viele der Schmerzpunkte abstrahiert.
Beispiel (modifizierte-for-Geoloc Version eines rcollier schrieb am Forum Smack):
ConfigureForm form = new ConfigureForm(FormType.submit);
form.setPersistentItems(false);
form.setDeliverPayloads(true);
form.setAccessModel(AccessModel.open);
PubSubManager manager
= new PubSubManager(connection, "pubsub.communitivity.com");
Node myNode = manager.createNode("http://jabber.org/protocol/geoloc", form);
StringBuilder body = new StringBuilder(); //ws for readability
body.append("<geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>");
body.append(" <country>Italy</country>");
body.append(" <lat>45.44</lat>");
body.append(" <locality>Venice</locality>");
body.append(" <lon>12.33</lon>");
body.append(" <accuracy>20</accuracy>");
body.append("</geoloc>");
SimplePayload payload = new SimplePayload(
"geoloc",
"http://jabber.org/protocol/geoloc",
body.toString());
String itemId = "zz234";
Item<SimplePayload> item = new Item<SimplePayload>(itemId, payload);
// Required to recieve the events being published
myNode.addItemEventListener(myEventHandler);
// Publish item
myNode.publish(item);
Oder zumindest, dass die harte Art und Weise ist :). Nur in Erinnerung gibt es jetzt einen PEPManager ...
PEPProvider pepProvider = new PEPProvider();
pepProvider.registerPEPParserExtension(
"http://jabber.org/protocol/tune", new TuneProvider());
ProviderManager.getInstance().addExtensionProvider(
"event",
"http://jabber.org/protocol/pubsub#event", pepProvider);
Tune tune = new Tune("jeff", "1", "CD", "My Title", "My Track");
pepManager.publish(tune);
Sie müssen die GeoLocProvider und Geoloc Klassen schreiben.
Wo finde ich diese 'TuneProvider'- und' Tune'-Klasse in Smack oder Asmack? – Hunt
Das Beispiel stammt aus der Smack-Dokumentation. Nicht sicher, welche Implementierung von XEP-0118 sie auch beziehen, da Smack immer noch einen offenen Fehler hat, XEP-0118 Unterstützung hinzuzufügen, letzte Aktualisierung im Mai 2011. Ich hatte meine eigene Version für ein Experiment zusammengeschustert, aber nicht Habe den Code mehr. Ich würde es wieder zusammenwerfen, aber ich habe keine Zeit. Es gibt jetzt ein gutes Beispiel für das Erstellen einer eigenen Erweiterung von PEPItem und das Veröffentlichen eines Elements hier: http://oneminutedistraction.wordpress.com/2010/08/26/. Damit bleibt nur der Parsing-Teil (im TuneProvider, ein PEPProvider). –
Ich verwende Smack 4.2.0 und kann PEPProvider nicht finden? – umerk44