Home | History | Annotate | Download | only in xmpp
      1 /*
      2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #ifndef WEBRTC_LIBJINGLE_XMPP_MODULEIMPL_H_
     12 #define WEBRTC_LIBJINGLE_XMPP_MODULEIMPL_H_
     13 
     14 #include "webrtc/libjingle/xmpp/module.h"
     15 #include "webrtc/libjingle/xmpp/xmppengine.h"
     16 
     17 namespace buzz {
     18 
     19 //! This is the base implementation class for extension modules.
     20 //! An engine is registered with the module and the module then hooks the
     21 //! appropriate parts of the engine to implement that set of features.  It is
     22 //! important to unregister modules before destructing the engine.
     23 class XmppModuleImpl {
     24 protected:
     25   XmppModuleImpl();
     26   virtual ~XmppModuleImpl();
     27 
     28   //! Register the engine with the module.  Only one engine can be associated
     29   //! with a module at a time.  This method will return an error if there is
     30   //! already an engine registered.
     31   XmppReturnStatus RegisterEngine(XmppEngine* engine);
     32 
     33   //! Gets the engine that this module is attached to.
     34   XmppEngine* engine();
     35 
     36   //! Process the given stanza.
     37   //! The module must return true if it has handled the stanza.
     38   //! A false return value causes the stanza to be passed on to
     39   //! the next registered handler.
     40   virtual bool HandleStanza(const XmlElement *) { return false; };
     41 
     42 private:
     43 
     44   //! The ModuleSessionHelper nested class allows the Module
     45   //! to hook into and get stanzas and events from the engine.
     46   class ModuleStanzaHandler : public XmppStanzaHandler {
     47     friend class XmppModuleImpl;
     48 
     49     ModuleStanzaHandler(XmppModuleImpl* module) :
     50       module_(module) {
     51     }
     52 
     53     bool HandleStanza(const XmlElement* stanza) {
     54       return module_->HandleStanza(stanza);
     55     }
     56 
     57     XmppModuleImpl* module_;
     58   };
     59 
     60   friend class ModuleStanzaHandler;
     61 
     62   XmppEngine* engine_;
     63   ModuleStanzaHandler stanza_handler_;
     64 };
     65 
     66 
     67 // This macro will implement the XmppModule interface for a class
     68 // that derives from both XmppModuleImpl and XmppModule
     69 #define IMPLEMENT_XMPPMODULE \
     70   XmppReturnStatus RegisterEngine(XmppEngine* engine) { \
     71     return XmppModuleImpl::RegisterEngine(engine); \
     72   }
     73 
     74 }
     75 
     76 #endif  // WEBRTC_LIBJINGLE_XMPP_MODULEIMPL_H_
     77