Skip to content
Snippets Groups Projects
Commit 0e444807 authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files

Add event API to enumerate registered LLCommandHandler instances.

parent 6ed6bed5
No related branches found
No related tags found
No related merge requests found
......@@ -31,6 +31,11 @@ LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher*
"[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
"[\"trusted\"] boolean indicating trusted browser [default true]",
&LLCommandDispatcherListener::dispatch);
add("enumerate",
"Post to [\"reply\"] a map of registered LLCommandHandler instances, containing\n"
"name key and (e.g.) untrusted flag",
&LLCommandDispatcherListener::enumerate,
LLSD().with("reply", LLSD()));
}
void LLCommandDispatcherListener::dispatch(const LLSD& params) const
......@@ -45,3 +50,11 @@ void LLCommandDispatcherListener::dispatch(const LLSD& params) const
LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
trusted_browser);
}
void LLCommandDispatcherListener::enumerate(const LLSD& params) const
{
LLReqID reqID(params);
LLSD response(LLCommandDispatcher::enumerate());
reqID.stamp(response);
LLEventPumps::instance().obtain(params["reply"]).post(response);
}
......@@ -23,6 +23,7 @@ public:
private:
void dispatch(const LLSD& params) const;
void enumerate(const LLSD& params) const;
//LLCommandDispatcher* mDispatcher;
};
......
......@@ -36,6 +36,7 @@
#include "llcommandhandler.h"
#include "llnotificationsutil.h"
#include "llcommanddispatcherlistener.h"
#include "stringize.h"
// system includes
#include <boost/tokenizer.hpp>
......@@ -67,6 +68,7 @@ public:
bool trusted_browser);
private:
friend LLSD LLCommandDispatcher::enumerate();
std::map<std::string, LLCommandHandlerInfo> mMap;
};
......@@ -175,3 +177,56 @@ bool LLCommandDispatcher::dispatch(const std::string& cmd,
return LLCommandHandlerRegistry::instance().dispatch(
cmd, params, query_map, web, trusted_browser);
}
static std::string lookup(LLCommandHandler::EUntrustedAccess value);
LLSD LLCommandDispatcher::enumerate()
{
LLSD response;
LLCommandHandlerRegistry& registry(LLCommandHandlerRegistry::instance());
for (std::map<std::string, LLCommandHandlerInfo>::const_iterator chi(registry.mMap.begin()),
chend(registry.mMap.end());
chi != chend; ++chi)
{
LLSD info;
info["untrusted"] = chi->second.mUntrustedBrowserAccess;
info["untrusted_str"] = lookup(chi->second.mUntrustedBrowserAccess);
response[chi->first] = info;
}
return response;
}
/*------------------------------ lookup stuff ------------------------------*/
struct symbol_info
{
const char* name;
LLCommandHandler::EUntrustedAccess value;
};
#define ent(SYMBOL) \
{ \
#SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */ \
SYMBOL \
}
symbol_info symbols[] =
{
ent(LLCommandHandler::UNTRUSTED_ALLOW), // allow commands from untrusted browsers
ent(LLCommandHandler::UNTRUSTED_BLOCK), // ignore commands from untrusted browsers
ent(LLCommandHandler::UNTRUSTED_THROTTLE) // allow untrusted, but only a few per min.
};
#undef ent
static std::string lookup(LLCommandHandler::EUntrustedAccess value)
{
for (symbol_info *sii(symbols), *siend(symbols + (sizeof(symbols)/sizeof(symbols[0])));
sii != siend; ++sii)
{
if (sii->value == value)
{
return sii->name;
}
}
return STRINGIZE("UNTRUSTED_" << value);
}
......@@ -34,6 +34,8 @@
#ifndef LLCOMMANDHANDLER_H
#define LLCOMMANDHANDLER_H
#include "llsd.h"
/* Example: secondlife:///app/foo/<uuid>
Command "foo" that takes one parameter, a UUID.
......@@ -103,6 +105,9 @@ public:
// Execute a command registered via the above mechanism,
// passing string parameters.
// Returns true if command was found and executed correctly.
/// Return an LLSD::Map of registered LLCommandHandlers and associated
/// info (e.g. EUntrustedAccess).
static LLSD enumerate();
};
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment