-/* +------------------------------------+
- * | Inspire Internet Relay Chat Daemon |
- * +------------------------------------+
+/*
+ * InspIRCd -- Internet Relay Chat Daemon
*
- * InspIRCd: (C) 2002-2010 InspIRCd Development Team
- * See: http://wiki.inspircd.org/Credits
+ * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
+ * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
+ * Copyright (C) 2003-2005, 2007 Craig Edwards <craigedwards@brainbox.cc>
*
- * This program is free but copyrighted software; see
- * the file COPYING for details.
+ * This file is part of InspIRCd. InspIRCd 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, version 2.
*
- * ---------------------------------------------------
+ * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __BASE_H__
-#define __BASE_H__
+
+#pragma once
#include <map>
#include <deque>
#include <string>
+#include <list>
/** Dummy class to help enforce culls being parent-called up to classbase */
class CullResult
{
public:
interfacebase() {}
+ static inline void* operator new(size_t, void* m) { return m; }
private:
interfacebase(const interfacebase&);
void operator=(const interfacebase&);
- void* operator new(size_t);
- void operator delete(void*);
+ static void* operator new(size_t);
+ static void operator delete(void*);
};
/** The base class for inspircd classes that support reference counting.
refcountbase();
virtual ~refcountbase();
inline unsigned int GetReferenceCount() const { return refcount; }
- void* operator new(size_t);
- void operator delete(void*);
+ static inline void* operator new(size_t, void* m) { return m; }
+ static void* operator new(size_t);
+ static void operator delete(void*);
inline void refcount_inc() const { refcount++; }
inline bool refcount_dec() const { refcount--; return !refcount; }
private:
if (value && value->refcount_dec())
delete value;
}
- inline operator bool() const { return value; }
+
+ inline reference<T>& operator=(T* other)
+ {
+ if (value != other)
+ {
+ if (value && value->refcount_dec())
+ delete value;
+ value = other;
+ if (value)
+ value->refcount_inc();
+ }
+
+ return *this;
+ }
+
+ inline operator bool() const { return (value != NULL); }
inline operator T*() const { return value; }
inline T* operator->() const { return value; }
inline T& operator*() const { return *value; }
inline bool operator<(const reference<T>& other) const { return value < other.value; }
inline bool operator>(const reference<T>& other) const { return value > other.value; }
+ static inline void* operator new(size_t, void* m) { return m; }
private:
- void* operator new(size_t);
- void operator delete(void*);
+#ifndef _WIN32
+ static void* operator new(size_t);
+ static void operator delete(void*);
+#endif
};
/** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
/** Source of the exception
*/
const std::string source;
+
public:
- /** Default constructor, just uses the error mesage 'Core threw an exception'.
- */
- CoreException() : err("Core threw an exception"), source("The core") {}
/** This constructor can be used to specify an error message before throwing.
+ * @param message Human readable error message
*/
CoreException(const std::string &message) : err(message), source("The core") {}
/** This constructor can be used to specify an error message before throwing,
* and to specify the source of the exception.
+ * @param message Human readable error message
+ * @param src Source of the exception
*/
CoreException(const std::string &message, const std::string &src) : err(message), source(src) {}
/** This destructor solves world hunger, cancels the world debt, and causes the world to end.
* Actually no, it does nothing. Never mind.
* @throws Nothing!
*/
- virtual ~CoreException() throw() {};
+ virtual ~CoreException() throw() {}
/** Returns the reason for the exception.
- * The module should probably put something informative here as the user will see this upon failure.
+ * @return Human readable description of the error
*/
- virtual const char* GetReason()
- {
- return err.c_str();
- }
+ const std::string& GetReason() const { return err; }
- virtual const char* GetSource()
- {
- return source.c_str();
- }
+ /** Returns the source of the exception
+ * @return Source of the exception
+ */
+ const std::string& GetSource() const { return source; }
};
+class Module;
class CoreExport ModuleException : public CoreException
{
public:
/** is a data processing provider (MD5, SQL) */
SERVICE_DATA,
/** is an I/O hook provider (SSL) */
- SERVICE_IOHOOK
+ SERVICE_IOHOOK,
+ /** Service managed by a module */
+ SERVICE_CUSTOM
};
/** A structure defining something that a module can provide */
const std::string name;
/** Type of service (must match object type) */
const ServiceType service;
- ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type)
- : creator(Creator), name(Name), service(Type) {}
+ ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type);
virtual ~ServiceProvider();
-};
+ /** Register this service in the appropriate registrar
+ */
+ virtual void RegisterService();
-#endif
+ /** If called, this ServiceProvider won't be registered automatically
+ */
+ void DisableAutoRegister();
+};