diff options
| author | Alan Conway <aconway@apache.org> | 2007-06-29 17:59:00 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2007-06-29 17:59:00 +0000 |
| commit | fda6dadde945a9c73c97b73dc79e93368b743348 (patch) | |
| tree | d7755539ae485efdfbc46298cd1ef6632515159e /cpp/src/qpid/Plugin.h | |
| parent | 79cd6c772da003ddc917eff362f9adaa99e28b49 (diff) | |
| download | qpid-python-fda6dadde945a9c73c97b73dc79e93368b743348.tar.gz | |
* Summary:
- Improved plugin framework and HandlerUpdater interface.
- Cluster handlers for traffic to/from cluster.
- Cluster HandlerUpdater configures channel chains for cluster.
- Cluster PluginProvider registers cluster objects with broker.
* src/qpid/framing/AMQFrame.h: Made data members public. Handlers
need to be able to modify frame data, getters/setters are just a
nuisance here.
* src/tests/Cluster.cpp: Updated for cluster changes, using
handlers instead of friendship to hook test into Cluster code.
* src/qpid/framing/amqp_types.h: Added CHANNEL_MAX and
CHANNEL_HIGH_BIT constants.
* src/qpid/framing/HandlerUpdater.h: Renamed ChannelInitializer,
broke dependency on broker channel types.
* src/qpid/framing/Handler.h: Added constructors and nextHandler()
* src/qpid/framing/AMQFrame.h (class AMQFrame): Inlined getChannel()
* src/qpid/cluster/ClusterPluginProvider.cpp: Provider for cluster
plugins.
* src/qpid/cluster/Cluster.cpp: Use ChannelManager. Factor out
plugin details to ClusterPluginProvider.
* src/qpid/cluster/ChannelManager.h: Insert cluster handlers
into channel chains, route frames between cluster and channels.
* src/qpid/broker/BrokerAdapter.cpp (startOk): use CHANNEL_MAX
constant.
* src/qpid/broker/Broker.cpp:
- Refactored for new plugin framework.
- Added getUrl().
* src/qpid/Url.h: Added constructor from Address.
* src/qpid/Plugin.h: Generalized plugin framework, broke
dependency on Broker interfaces. We may want to use plug-ins for
clients also at some point.
* src/tests/run_test: Fix bug when VALGRIND is not set.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@551981 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/Plugin.h')
| -rw-r--r-- | cpp/src/qpid/Plugin.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/cpp/src/qpid/Plugin.h b/cpp/src/qpid/Plugin.h new file mode 100644 index 0000000000..48fb16a541 --- /dev/null +++ b/cpp/src/qpid/Plugin.h @@ -0,0 +1,111 @@ +#ifndef QPID_PLUGIN_H +#define QPID_PLUGIN_H + +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "qpid/shared_ptr.h" +#include <boost/noncopyable.hpp> +#include <vector> +#include <boost/function.hpp> + + +/**@file Generic plug-in framework. */ + +namespace qpid { +class Options; + +/** Generic base class to allow dynamic casting of generic Plugin objects + * to concrete types. + */ +struct Plugin : private boost::noncopyable { + virtual ~Plugin() {} +}; + +/** Generic interface for anything that uses plug-ins. */ +struct PluginUser : boost::noncopyable { + virtual ~PluginUser() {} + /** + * Called by a PluginProvider to provide a plugin. + * + * A concrete PluginUser will dynamic_pointer_cast plugin to a + * class it knows how to use. A PluginUser should ignore plugins + * it does not recognize. + * + * The user will release its shared_ptr when it is finished using + * plugin. + */ + virtual void use(const shared_ptr<Plugin>& plugin) = 0; +}; + + +/** + * Base for classes that provide plug-ins. + */ +class PluginProvider : boost::noncopyable +{ + public: + /** + * Register the provider to appear in getProviders() + * + * A concrete PluginProvider is instantiated as a global or static + * member variable in a library so it is registered during static + * initialization when the library is loaded. + */ + PluginProvider(); + + virtual ~PluginProvider(); + + /** + * Returns configuration options for the plugin. + * Then will be updated during option parsing by the host program. + * + * @return An options group or 0 for no options. Default returns 0. + * PluginProvider retains ownership of return value. + */ + virtual Options* getOptions(); + + /** Provide plugins to a PluginUser. + * + * The provider can dynamic_cast the user if it only provides + * plugins to certain types of user. Providers should ignore + * users they don't recognize. + */ + virtual void provide(PluginUser& user) = 0; + + /** Get the list of pointers to the registered providers. + * Caller must not delete the pointers. + */ + static const std::vector<PluginProvider*>& getProviders(); + + private: + static std::vector<PluginProvider*> providers; +}; + +/** Load a shared library, registering any PluginProvider it contains. + * + * This is just a convenient portable wrapper for normal shared + * library loading. A global PluginProvider instance loaded or + * linked in any way will get registered. + */ +void dlopen(const char* libname); + + +} // namespace qpid + +#endif /*!QPID_PLUGIN_H*/ |
