summaryrefslogtreecommitdiff
path: root/src/process.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2012-10-01 01:56:57 -0400
committerAdam <Adam@anope.org>2012-10-01 01:56:57 -0400
commit89428a9d1032e3c2a6e397629a32862b3e58d708 (patch)
treed507904b3fa1cc084f0f3e688c839bcdd47f79d7 /src/process.cpp
parentb937d6310d9a7c0e2434200306b63d513cb2ae61 (diff)
Cleanup of all of the protocol modules, rewrote message handling system to be a bit more C++ ish
Diffstat (limited to 'src/process.cpp')
-rw-r--r--src/process.cpp28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/process.cpp b/src/process.cpp
index 6bfa3fec7..69017f63b 100644
--- a/src/process.cpp
+++ b/src/process.cpp
@@ -12,6 +12,9 @@
#include "services.h"
#include "modules.h"
#include "extern.h"
+#include "protocol.h"
+#include "servers.h"
+#include "users.h"
/** Main process routine
* @param buffer A raw line from the uplink to do things with
@@ -23,7 +26,8 @@ void process(const Anope::string &buffer)
/* Strip all extra spaces */
Anope::string buf = buffer;
- buf = buf.replace_all_cs(" ", " ");
+ while (buf.find(" ") != Anope::string::npos)
+ buf = buf.replace_all_cs(" ", " ");
if (buf.empty())
return;
@@ -74,18 +78,26 @@ void process(const Anope::string &buffer)
Log() << "params " << i << ": " << params[i];
}
- std::vector<Message *> messages = Anope::FindMessage(command);
+ const std::vector<IRCDMessage *> *messages = IRCDMessage::Find(command);
- if (!messages.empty())
+ if (messages && !messages->empty())
{
- bool retVal = true;
+ MessageSource src(source);
- for (std::vector<Message *>::iterator it = messages.begin(), it_end = messages.end(); retVal == true && it != it_end; ++it)
+ bool retVal = true;
+ /* Newer messages take priority */
+ for (unsigned i = messages->size(); retVal && i > 0; --i)
{
- Message *m = *it;
+ IRCDMessage *m = messages->at(i - 1);
- if (m->func)
- retVal = m->func(source, params);
+ if (m->HasFlag(IRCDMESSAGE_SOFT_LIMIT) ? (params.size() < m->GetParamCount()) : (params.size() != m->GetParamCount()))
+ Log(LOG_DEBUG) << "invalid parameters for " << command << ": " << params.size() << " != " << m->GetParamCount();
+ else if (m->HasFlag(IRCDMESSAGE_REQUIRE_USER) && !src.GetUser())
+ Log(LOG_DEBUG) << "unexpected non-user source " << source << " for " << command;
+ else if (m->HasFlag(IRCDMESSAGE_REQUIRE_SERVER) && !source.empty() && !src.GetServer())
+ Log(LOG_DEBUG) << "unexpected non-server soruce " << source << " for " << command;
+ else
+ retVal = m->Run(src, params);
}
}
else