Mapping Openfire Custom plugin with aSmack Client

前端 未结 3 377
时光取名叫无心
时光取名叫无心 2020-12-04 04:12

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 kno

相关标签:
3条回答
  • 2020-12-04 04:39

    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!

    0 讨论(0)
  • 2020-12-04 04:40

    This is a sample of plugin implementation:

    First, you should implement the Plugin interface:

    public class MotDPlugin implements Plugin
    

    Then, this requires implementation of the intitalizePlugin and destroyPlugin methods, as shown below:

    public void initializePlugin(PluginManager manager, File pluginDirectory) {
       serverAddress = new JID(XMPPServer.getInstance().getServerInfo().getName());
       router = XMPPServer.getInstance().getMessageRouter();
    
       SessionEventDispatcher.addListener(listener);
    }
    
    public void destroyPlugin() {
       SessionEventDispatcher.removeListener(listener);
    
       listener = null;
       serverAddress = null;
       router = null;
    }
    

    The more about this sample, you may refer to the Openfire Plugin Development: Message of the Day.

    Hope it helps.

    0 讨论(0)
  • 2020-12-04 04:53

    There is a simple instance about plugin:

    public class TestIQHandle extends IQHandler {
        private static final String MODULE_NAME = "test plugin";
        private static final String NAME_SPACE = "com:test:testplug";
        private IQHandlerInfo info;
        public TestIQHandle(){
            super(MODULE_NAME);
            info = new IQHandlerInfo("query", NAME_SPACE);
        }
        public TestIQHandle(String moduleName) {
            super(moduleName);
            info = new IQHandlerInfo("query", NAME_SPACE);
        }
        @Override
        public IQ handleIQ(IQ packet) throws UnauthorizedException {
            IQ reply = IQ.createResultIQ(packet);
            Element groups = packet.getChildElement();
            if(true){
                System.out.println("=======invalid========");
            }
            if(!IQ.Type.get.equals(packet.getType())){
                reply.setChildElement(groups.createCopy());
                reply.setError(PacketError.Condition.bad_request);
                return reply;
            }
            //StringUtils.substringBefore(packet.getFrom().toString(), "@");
            return reply;
        }
        @Override
        public IQHandlerInfo getInfo() {
            // TODO Auto-generated method stub
            return info;
        }
    }
    
    0 讨论(0)
提交回复
热议问题