/*
 * (c) 2007-2008 Maciej Niedzielski
 */

#include <QObject>
#include <QTextStream>
#include <QDebug>

#include "psiplugin.h"
#include "stanzafilter.h"
#include "stanzasender.h"
#include "stanzasendinghost.h"

class AntiEvilPlugin: public QObject, public PsiPlugin, public StanzaFilter, public StanzaSender
{
	Q_OBJECT
	Q_INTERFACES(PsiPlugin StanzaFilter StanzaSender);

public:
	AntiEvilPlugin()
		: stanzaSender(0)
	{
	}


	//-- PsiPlugin -------------------------------------------

	virtual QString name() const
	{
		// this will be displayed
		return "Machekku's Evil Blocker Plugin";
	}

	virtual QString shortName() const
	{
		// internal name, no spaces please!
		return "antievil";
	}

	virtual QString version() const
	{
		return "0.1";
	}

	virtual QWidget* options()
	{
		return 0;
	}

	virtual bool enable()
	{
		if (stanzaSender) {
			enabled = true;
		}
		return enabled;
	}

	virtual bool disable()
	{
		enabled = false;
		return true;
	}


	//-- StanzaFilter ----------------------------------------

	virtual bool incomingStanza(int account, const QDomElement& stanza)
	{
		bool blocked = false;

		if (enabled) {
			for (QDomNode n = stanza.firstChild(); !n.isNull(); n = n.nextSibling()) {
				QDomElement i = n.toElement();
				if (!i.isNull() && i.tagName() == "evil" && i.attribute("xmlns") == "http://jabber.org/protocol/evil") {
					qDebug("evil blocked! ;)");

					if (stanza.tagName() == "iq") {
						qDebug("sending 'forbidden' error");
						QString sender = stanza.attribute("from");
						QString reply = QString("<iq type='error' %1><error type='modify'><bad-request xmlns='urn:ietf:params:xml:xmpp-stanzas'/></error></iq>")
							.arg(sender.isEmpty() ? "" : QString("to='%1'").arg(sender));

						stanzaSender->sendStanza(account, reply);
					}

					blocked = true;	// stop processing this stanza
					break;
				}
			}
		}

		return blocked;
	}

	virtual bool incomingStanza(int account, QDomElement& stanza)
	{
		Q_UNUSED(account)
		Q_UNUSED(stanza)
		return false;
	}


	//-- StanzaSender ----------------------------------------

	virtual void setStanzaSendingHost(StanzaSendingHost *host)
	{
		stanzaSender = host;
	}

	virtual void applyOptions() {};
	virtual void restoreOptions() {};


private:
	StanzaSendingHost* stanzaSender;
	bool enabled;
};

Q_EXPORT_PLUGIN2(antievil, AntiEvilPlugin)

#include "antievil.moc"
