2 * InspIRCd -- Internet Relay Chat Daemon
4 * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
5 * Copyright (C) 2006-2007 Oliver Lupton <oliverlupton@gmail.com>
6 * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
7 * Copyright (C) 2003-2005, 2007 Craig Edwards <craigedwards@brainbox.cc>
9 * This file is part of InspIRCd. InspIRCd is free software: you can
10 * redistribute it and/or modify it under the terms of the GNU General Public
11 * License as published by the Free Software Foundation, version 2.
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
30 /** Dummy class to help enforce culls being parent-called up to classbase */
34 friend class classbase;
37 /** The base class for all inspircd classes with a well-defined lifetime.
38 * Classes that inherit from this may be destroyed through GlobalCulls,
39 * and may rely on cull() being called prior to their deletion.
41 class CoreExport classbase
47 * Called just prior to destruction via cull list.
49 virtual CullResult cull();
53 classbase(const classbase&);
54 void operator=(const classbase&);
57 /** The base class for inspircd classes that provide a wrapping interface, and
58 * should only exist while being used. Prevents heap allocation.
60 class CoreExport interfacebase
64 static inline void* operator new(size_t, void* m) { return m; }
66 interfacebase(const interfacebase&);
67 void operator=(const interfacebase&);
68 static void* operator new(size_t);
69 static void operator delete(void*);
72 /** The base class for inspircd classes that support reference counting.
73 * Any objects that do not have a well-defined lifetime should inherit from
74 * this, and should be assigned to a reference<type> object to establish their
77 * Reference objects should not hold circular references back to themselves,
78 * even indirectly; this will cause a memory leak because the count will never
81 * Using a normal pointer for the object is recommended if you can assure that
82 * at least one reference<> will remain as long as that pointer is used; this
83 * will avoid the slight overhead of changing the reference count.
85 class CoreExport refcountbase
87 mutable unsigned int refcount;
90 virtual ~refcountbase();
91 inline unsigned int GetReferenceCount() const { return refcount; }
92 static inline void* operator new(size_t, void* m) { return m; }
93 static void* operator new(size_t);
94 static void operator delete(void*);
95 inline void refcount_inc() const { refcount++; }
96 inline bool refcount_dec() const { refcount--; return !refcount; }
99 refcountbase(const refcountbase&);
100 void operator=(const refcountbase&);
103 /** Base class for use count tracking. Uses reference<>, but does not
104 * cause object deletion when the last user is removed.
106 * Safe for use as a second parent class; will not add a second vtable.
108 class CoreExport usecountbase
110 mutable unsigned int usecount;
112 usecountbase() : usecount(0) { }
114 inline unsigned int GetUseCount() const { return usecount; }
115 inline void refcount_inc() const { usecount++; }
116 inline bool refcount_dec() const { usecount--; return false; }
119 usecountbase(const usecountbase&);
120 void operator=(const usecountbase&);
123 template <typename T>
128 reference() : value(0) { }
129 reference(T* v) : value(v) { if (value) value->refcount_inc(); }
130 reference(const reference<T>& v) : value(v.value) { if (value) value->refcount_inc(); }
131 reference<T>& operator=(const reference<T>& other)
134 other.value->refcount_inc();
135 this->reference::~reference();
142 if (value && value->refcount_dec())
146 inline reference<T>& operator=(T* other)
150 if (value && value->refcount_dec())
154 value->refcount_inc();
160 inline operator bool() const { return (value != NULL); }
161 inline operator T*() const { return value; }
162 inline T* operator->() const { return value; }
163 inline T& operator*() const { return *value; }
164 inline bool operator<(const reference<T>& other) const { return value < other.value; }
165 inline bool operator>(const reference<T>& other) const { return value > other.value; }
166 static inline void* operator new(size_t, void* m) { return m; }
169 static void* operator new(size_t);
170 static void operator delete(void*);
174 /** This class can be used on its own to represent an exception, or derived to represent a module-specific exception.
175 * When a module whishes to abort, e.g. within a constructor, it should throw an exception using ModuleException or
176 * a class derived from ModuleException. If a module throws an exception during its constructor, the module will not
177 * be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user
178 * attempting to load the module, or dumped to the console if the ircd is currently loading for the first time.
180 class CoreExport CoreException : public std::exception
183 /** Holds the error message to be displayed
185 const std::string err;
186 /** Source of the exception
188 const std::string source;
191 /** This constructor can be used to specify an error message before throwing.
192 * @param message Human readable error message
194 CoreException(const std::string &message) : err(message), source("The core") {}
195 /** This constructor can be used to specify an error message before throwing,
196 * and to specify the source of the exception.
197 * @param message Human readable error message
198 * @param src Source of the exception
200 CoreException(const std::string &message, const std::string &src) : err(message), source(src) {}
201 /** This destructor solves world hunger, cancels the world debt, and causes the world to end.
202 * Actually no, it does nothing. Never mind.
205 virtual ~CoreException() throw() {}
206 /** Returns the reason for the exception.
207 * @return Human readable description of the error
209 const std::string& GetReason() const { return err; }
211 /** Returns the source of the exception
212 * @return Source of the exception
214 const std::string& GetSource() const { return source; }
218 class CoreExport ModuleException : public CoreException
221 /** This constructor can be used to specify an error message before throwing.
223 ModuleException(const std::string &message, Module* me = NULL);
226 typedef const reference<Module> ModuleRef;
231 /** is a ModeHandler */
233 /** is a metadata descriptor */
235 /** is a data processing provider (MD5, SQL) */
237 /** is an I/O hook provider (SSL) */
239 /** Service managed by a module */
243 /** A structure defining something that a module can provide */
244 class CoreExport ServiceProvider : public classbase
247 /** Module that is providing this service */
249 /** Name of the service being provided */
250 const std::string name;
251 /** Type of service (must match object type) */
252 const ServiceType service;
253 ServiceProvider(Module* Creator, const std::string& Name, ServiceType Type);
254 virtual ~ServiceProvider();
256 /** Register this service in the appropriate registrar
258 virtual void RegisterService();
260 /** If called, this ServiceProvider won't be registered automatically
262 void DisableAutoRegister();