Search code examples
javaandroidxmppopenfiresmack

Mapping Openfire Custom plugin with aSmack Client


I'm a newbie to XMPP so forgive me if this question sounds silly. I want to create a custom plugin and map it with my aSmack client on Android. I'm trying to apply my knowledge of Web Services but I'm not winning. So please guide my thinking toward the best approach, an example will be really helpful. Thanx in advance.


Solution

  • There are many types of plugins, let's talk in general pourpose. Igniterealtime Plugin guide

    You want to define a brand new IQ Stanza to manage an UserCustomParam. Let's say:

    <iq from="user1@myserver" to="myserver" type="get">
     <usercustomparam xmls:"com.records.iq" retrive="favouritecolor">
    </iq>
    

    What you have to:

    step 1: define a plugin (class that implemements Plugin) that adds a new handler

    MyCustomHandler colorshandler;
    IQRouter iqRouter = XMPPServer.getInstance().getIQRouter();
    iqRouter.addHandler(colorshandler);
    

    Step2: implements MyCustomHandler as you need (read on database, write on database, read server side and so on).

    public class MyCustomHandler extends IQHandler {
        public static final String NAMESPACE_TICKET_IQ = "com.records.iq";
        public static final String TAG_TICKET_IQ = "usercustomparam ";
    

    Now your server it's ready to manage your custom IQ request.

    Time to go client side:

    Step3: register to your ProviderManager an IQProvider

    ProviderManager.addIQProvider("usercustomparam ","com.records.iq", new IQUserCustomParamProvider());
    

    Step4: implements your IQUserCustomParamProvider as you need

    public class IQUserCustomParamProvider extends IQProvider<IQUserCustomParam>
    

    into Provider you'll parse the incoming IQ from server and you'll create a IQUserCustomParam with an instance param like

    String favouriteColor
    

    Step5: you need to implement IQUserCustomParam

    public class IQUserCustomParam extends IQ
        private final static String childElementName = "usercustomparam";
        private final static String childElementNamespace = "com.records.iq";
    
    public IQUserCustomParam (String color)
        {
            this(childElementName , childElementNamespace );
    
            this.setType(IQ.Type.result);
            this.setFavouriteColor(color);
        }
    

    Step 6: now set up it's completed, but you haven't defined yet when to accept IQUserCustomParam when it comes from server. So you need a StanzaFilter

    public class IQUserCustomParamFilter implements StanzaFilter
    

    Step 7: and you haven't defined yet what to do with IQUserCustomParam when it comes from server. So you need a StanzaListner

    public class IQUserCustomParamListner implements StanzaListener
    

    Step 8: finally you'll have to register the combo filter/listner on your connection:

    AbstractXMPPConnection connection = ...;
    connection.addAsyncStanzaListener(new PersonalConfigListner(this), new IQMUCConfigTicketFIlter();
    

    if that helped, please don't forget to accept the answer!