]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/numericbuilder.h
Merge the latest changes from insp20 into master.
[user/henk/code/inspircd.git] / include / numericbuilder.h
index a7b83125feddf3d1be3752cfd2e1bd04ea68bba2..17aa9e0c866bb1ceafe1bae03a30e24fd482157c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * InspIRCd -- Internet Relay Chat Daemon
  *
- *   Copyright (C) 2015 Attila Molnar <attilamolnar@hush.com>
+ *   Copyright (C) 2015-2016 Attila Molnar <attilamolnar@hush.com>
  *
  * 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
 namespace Numeric
 {
        class WriteNumericSink;
+       class WriteRemoteNumericSink;
 
        template <char Sep, bool SendEmpty, typename Sink>
        class GenericBuilder;
 
        template <char Sep = ',', bool SendEmpty = false>
        class Builder;
+
+       template <unsigned int NumStaticParams, bool SendEmpty, typename Sink>
+       class GenericParamBuilder;
+
+       template <unsigned int NumStaticParams, bool SendEmpty = false>
+       class ParamBuilder;
 }
 
 class Numeric::WriteNumericSink
@@ -46,6 +53,22 @@ class Numeric::WriteNumericSink
        }
 };
 
+class Numeric::WriteRemoteNumericSink
+{
+       User* const user;
+
+ public:
+       WriteRemoteNumericSink(User* u)
+               : user(u)
+       {
+       }
+
+       void operator()(Numeric& numeric) const
+       {
+               user->WriteRemoteNumeric(numeric);
+       }
+};
+
 template <char Sep, bool SendEmpty, typename Sink>
 class Numeric::GenericBuilder
 {
@@ -113,3 +136,63 @@ class Numeric::Builder : public GenericBuilder<Sep, SendEmpty, WriteNumericSink>
        {
        }
 };
+
+template <unsigned int NumStaticParams, bool SendEmpty, typename Sink>
+class Numeric::GenericParamBuilder
+{
+       Sink sink;
+       Numeric numeric;
+       std::string::size_type currlen;
+       std::string::size_type max;
+
+       bool HasRoom(const std::string::size_type additional) const
+       {
+               return (currlen + additional <= max);
+       }
+
+ public:
+       GenericParamBuilder(Sink s, unsigned int num, size_t additionalsize)
+               : sink(s)
+               , numeric(num)
+               , currlen(0)
+               , max(ServerInstance->Config->Limits.MaxLine - ServerInstance->Config->ServerName.size() - additionalsize - 10)
+       {
+       }
+
+       void AddStatic(const std::string& entry)
+       {
+               max -= (entry.length() + 1);
+               numeric.GetParams().push_back(entry);
+       }
+
+       void Add(const std::string& entry)
+       {
+               if (!HasRoom(entry.size()))
+                       Flush();
+
+               currlen += entry.size() + 1;
+               numeric.GetParams().push_back(entry);
+       }
+
+       void Flush()
+       {
+               if ((!SendEmpty) && (IsEmpty()))
+                       return;
+
+               sink(numeric);
+               currlen = 0;
+               numeric.GetParams().erase(numeric.GetParams().begin() + NumStaticParams, numeric.GetParams().end());
+       }
+
+       bool IsEmpty() const { return (numeric.GetParams().size() <= NumStaticParams); }
+};
+
+template <unsigned int NumStaticParams, bool SendEmpty>
+class Numeric::ParamBuilder : public GenericParamBuilder<NumStaticParams, SendEmpty, WriteNumericSink>
+{
+ public:
+       ParamBuilder(LocalUser* user, unsigned int num)
+               : ::Numeric::GenericParamBuilder<NumStaticParams, SendEmpty, WriteNumericSink>(WriteNumericSink(user), num, user->nick.size())
+       {
+       }
+};