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
17namespace 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.
23class XmppModuleImpl {
24protected:
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
42private:
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