This repository has been archived by the owner on Dec 28, 2021. It is now read-only.
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
licq: split plugin and plugin instance
Plugins now consists of a Licq::Plugin class (Licq::GeneralPlugin or Licq::ProtocolPlugin) and one or more Licq::PluginInstance class(es) (Licq::GeneralPluginInstance or Licq::ProtocolPluginInstance). General plugins always have at most one instance, while protocol plugins can have number of them. Each instance has an unique id and runs in a separate thread.
- Loading branch information
Showing
44 changed files
with
1,510 additions
and
671 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* | ||
* This file is part of Licq, an instant messaging client for UNIX. | ||
* Copyright (C) 2013 Licq Developers <licq-dev@googlegroups.com> | ||
* | ||
* Please refer to the COPYRIGHT file distributed with this source | ||
* distribution for the names of the individual contributors. | ||
* | ||
* Licq is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Licq is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with Licq; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#ifndef LICQ_GENERALPLUGININSTANCE_H | ||
#define LICQ_GENERALPLUGININSTANCE_H | ||
|
||
#include "plugininstance.h" | ||
|
||
namespace Licq | ||
{ | ||
|
||
class GeneralPlugin; | ||
|
||
/** | ||
* Represents an instance of a loaded general plugin. | ||
*/ | ||
class GeneralPluginInstance : public virtual PluginInstance | ||
{ | ||
public: | ||
typedef boost::shared_ptr<GeneralPluginInstance> Ptr; | ||
|
||
/// Get the plugin for this instance | ||
virtual boost::shared_ptr<GeneralPlugin> plugin() const = 0; | ||
|
||
/// Get the plugin's status. | ||
virtual bool isEnabled() const = 0; | ||
|
||
/// Ask the plugin to enable itself | ||
virtual void enable() = 0; | ||
|
||
/// Ask the plugin to disable itself | ||
virtual void disable() = 0; | ||
|
||
protected: | ||
virtual ~GeneralPluginInstance() { /* Empty */ } | ||
}; | ||
|
||
} // namespace Licq | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
/* | ||
* This file is part of Licq, an instant messaging client for UNIX. | ||
* Copyright (C) 2013 Licq Developers <licq-dev@googlegroups.com> | ||
* | ||
* Please refer to the COPYRIGHT file distributed with this source | ||
* distribution for the names of the individual contributors. | ||
* | ||
* Licq is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Licq is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with Licq; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#ifndef LICQ_PLUGININSTANCE_H | ||
#define LICQ_PLUGININSTANCE_H | ||
|
||
#include "plugininterface.h" | ||
|
||
#include <boost/noncopyable.hpp> | ||
#include <boost/shared_ptr.hpp> | ||
|
||
namespace Licq | ||
{ | ||
|
||
/** | ||
* Represents an instance of a loaded plugin. | ||
*/ | ||
class PluginInstance : private boost::noncopyable | ||
{ | ||
public: | ||
/// A smart pointer to a Plugin instance | ||
typedef boost::shared_ptr<PluginInstance> Ptr; | ||
|
||
/// Get the instance's unique id. | ||
virtual int id() const = 0; | ||
|
||
protected: | ||
virtual ~PluginInstance() { } | ||
|
||
virtual boost::shared_ptr<PluginInterface> internalInterface() = 0; | ||
template <typename T> friend boost::shared_ptr<T> plugin_internal_cast(Ptr); | ||
}; | ||
|
||
/** | ||
* Function to cast a plugin instance to a plugin specific interface to get | ||
* access to methods that only apply for a specific plugin. To e.g. get access | ||
* to ICQ specific methods, do: | ||
* @code | ||
* Licq::IcqProtocol::Ptr icq = plugin_internal_cast<Licq::IcqProtocol>( | ||
* Licq::gPluginManager.getProtocolInstance(LICQ_PPID)); | ||
* if (icq) | ||
* icq->icqSendSms(...); | ||
* @endcode | ||
*/ | ||
template <typename T> | ||
inline boost::shared_ptr<T> plugin_internal_cast(PluginInstance::Ptr plugin) | ||
{ | ||
return plugin | ||
? boost::dynamic_pointer_cast<T>(plugin->internalInterface()) | ||
: boost::shared_ptr<T>(); | ||
} | ||
|
||
// plugin_internal_cast<>() is not supposed to be used to cast to | ||
// PluginInterface, GeneralPluginInterface or ProtocolPluginInterface; only to | ||
// plugin specific interfaces. | ||
|
||
template <> inline boost::shared_ptr<PluginInterface> | ||
plugin_internal_cast<PluginInterface>(PluginInstance::Ptr); | ||
|
||
class GeneralPluginInterface; | ||
template <> boost::shared_ptr<GeneralPluginInterface> | ||
plugin_internal_cast<GeneralPluginInterface>(PluginInstance::Ptr); | ||
|
||
class ProtocolPluginInterface; | ||
template <> boost::shared_ptr<ProtocolPluginInterface> | ||
plugin_internal_cast<ProtocolPluginInterface>(PluginInstance::Ptr); | ||
|
||
} // namespace Licq | ||
|
||
// Make available in global namespace | ||
using Licq::plugin_internal_cast; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* This file is part of Licq, an instant messaging client for UNIX. | ||
* Copyright (C) 2013 Licq Developers <licq-dev@googlegroups.com> | ||
* | ||
* Please refer to the COPYRIGHT file distributed with this source | ||
* distribution for the names of the individual contributors. | ||
* | ||
* Licq is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License as published by | ||
* the Free Software Foundation; either version 2 of the License, or | ||
* (at your option) any later version. | ||
* | ||
* Licq is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with Licq; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
#ifndef LICQ_PROTOCOLPLUGININSTANCE_H | ||
#define LICQ_PROTOCOLPLUGININSTANCE_H | ||
|
||
#include "plugininstance.h" | ||
|
||
namespace Licq | ||
{ | ||
|
||
class ProtocolPlugin; | ||
class UserId; | ||
|
||
/** | ||
* Represents an instance of a loaded protocol plugin. | ||
*/ | ||
class ProtocolPluginInstance : public virtual PluginInstance | ||
{ | ||
public: | ||
typedef boost::shared_ptr<ProtocolPluginInstance> Ptr; | ||
|
||
/// Get the plugin for this instance | ||
virtual boost::shared_ptr<ProtocolPlugin> plugin() const = 0; | ||
|
||
/// Get the owner ID that is associated with this protocol instance. | ||
virtual const UserId& ownerId() const = 0; | ||
|
||
protected: | ||
virtual ~ProtocolPluginInstance() { } | ||
}; | ||
|
||
} // namespace Licq | ||
|
||
#endif |
Oops, something went wrong.