summaryrefslogtreecommitdiff
path: root/indra/llmessage/llservice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llmessage/llservice.cpp')
-rw-r--r--indra/llmessage/llservice.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/indra/llmessage/llservice.cpp b/indra/llmessage/llservice.cpp
new file mode 100644
index 0000000000..03b04054dc
--- /dev/null
+++ b/indra/llmessage/llservice.cpp
@@ -0,0 +1,93 @@
+/**
+ * @file llservice.cpp
+ * @author Phoenix
+ * @date 2005-04-20
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "linden_common.h"
+#include "llservice.h"
+
+LLService::creators_t LLService::sCreatorFunctors;
+
+LLService::LLService()
+{
+}
+
+LLService::~LLService()
+{
+}
+
+// static
+bool LLService::registerCreator(const std::string& name, creator_t fn)
+{
+ llinfos << "LLService::registerCreator(" << name << ")" << llendl;
+ if(name.empty())
+ {
+ return false;
+ }
+
+ creators_t::value_type vt(name, fn);
+ std::pair<creators_t::iterator, bool> rv = sCreatorFunctors.insert(vt);
+ return rv.second;
+
+ // alternately...
+ //std::string name_str(name);
+ //sCreatorFunctors[name_str] = fn;
+}
+
+// static
+LLIOPipe* LLService::activate(
+ const std::string& name,
+ LLPumpIO::chain_t& chain,
+ LLSD context)
+{
+ if(name.empty())
+ {
+ llinfos << "LLService::activate - no service specified." << llendl;
+ return NULL;
+ }
+ creators_t::iterator it = sCreatorFunctors.find(name);
+ LLIOPipe* rv = NULL;
+ if(it != sCreatorFunctors.end())
+ {
+ if((*it).second->build(chain, context))
+ {
+ rv = chain[0].get();
+ }
+ else
+ {
+ // empty out the chain, because failed service creation
+ // should just discard this stuff.
+ llwarns << "LLService::activate - unable to build chain: " << name
+ << llendl;
+ chain.clear();
+ }
+ }
+ else
+ {
+ llwarns << "LLService::activate - unable find factory: " << name
+ << llendl;
+ }
+ return rv;
+}
+
+// static
+bool LLService::discard(const std::string& name)
+{
+ if(name.empty())
+ {
+ return false;
+ }
+ creators_t::iterator it = sCreatorFunctors.find(name);
+ if(it != sCreatorFunctors.end())
+ {
+ //(*it).second->discard();
+ sCreatorFunctors.erase(it);
+ return true;
+ }
+ return false;
+}
+