Encapsulate mapCommands in class CRPCTable

This commit is contained in:
Pieter Wuille 2012-04-18 22:42:17 +02:00
parent dc42bf52c1
commit 9862229d4d

View file

@ -47,7 +47,17 @@ public:
bool okSafeMode; bool okSafeMode;
}; };
extern map<string, CRPCCommand*> mapCommands; class CRPCTable
{
private:
map<string, const CRPCCommand*> mapCommands;
public:
CRPCTable();
const CRPCCommand* operator[](string name) const;
string help(string name) const;
};
const CRPCTable tableRPC;
static std::string strRPCUserColonPass; static std::string strRPCUserColonPass;
@ -177,23 +187,13 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex)
/// Note: This interface may still be subject to change. /// Note: This interface may still be subject to change.
/// ///
string CRPCTable::help(string strCommand) const
Value help(const Array& params, bool fHelp)
{ {
if (fHelp || params.size() > 1)
throw runtime_error(
"help [command]\n"
"List commands, or get help for a command.");
string strCommand;
if (params.size() > 0)
strCommand = params[0].get_str();
string strRet; string strRet;
set<rpcfn_type> setDone; set<rpcfn_type> setDone;
for (map<string, CRPCCommand*>::iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi) for (map<string, const CRPCCommand*>::const_iterator mi = mapCommands.begin(); mi != mapCommands.end(); ++mi)
{ {
CRPCCommand *pcmd = mi->second; const CRPCCommand *pcmd = mi->second;
string strMethod = mi->first; string strMethod = mi->first;
// We already filter duplicates, but these deprecated screw up the sort order // We already filter duplicates, but these deprecated screw up the sort order
if (strMethod == "getamountreceived" || if (strMethod == "getamountreceived" ||
@ -226,6 +226,20 @@ Value help(const Array& params, bool fHelp)
return strRet; return strRet;
} }
Value help(const Array& params, bool fHelp)
{
if (fHelp || params.size() > 1)
throw runtime_error(
"help [command]\n"
"List commands, or get help for a command.");
string strCommand;
if (params.size() > 0)
strCommand = params[0].get_str();
return tableRPC.help(strCommand);
}
Value stop(const Array& params, bool fHelp) Value stop(const Array& params, bool fHelp)
{ {
@ -2065,15 +2079,8 @@ static CRPCCommand vRPCCommands[] =
{ "importprivkey", &importprivkey, false }, { "importprivkey", &importprivkey, false },
}; };
map<string, CRPCCommand*> mapCommands; CRPCTable::CRPCTable()
static void RegisterRPCCommands()
{ {
static bool registered = false;
if (registered)
return;
registered = true;
unsigned int vcidx; unsigned int vcidx;
for (vcidx = 0; vcidx < (sizeof(vRPCCommands) / sizeof(vRPCCommands[0])); vcidx++) for (vcidx = 0; vcidx < (sizeof(vRPCCommands) / sizeof(vRPCCommands[0])); vcidx++)
{ {
@ -2084,6 +2091,13 @@ static void RegisterRPCCommands()
} }
} }
const CRPCCommand *CRPCTable::operator[](string name) const
{
map<string, const CRPCCommand*>::const_iterator it = mapCommands.find(name);
if (it == mapCommands.end())
return NULL;
return (*it).second;
}
// //
// HTTP protocol // HTTP protocol
@ -2363,8 +2377,6 @@ void ThreadRPCServer2(void* parg)
{ {
printf("ThreadRPCServer started\n"); printf("ThreadRPCServer started\n");
RegisterRPCCommands();
strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"]; strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
if (mapArgs["-rpcpassword"] == "") if (mapArgs["-rpcpassword"] == "")
{ {
@ -2516,11 +2528,10 @@ void ThreadRPCServer2(void* parg)
throw JSONRPCError(-32600, "Params must be an array"); throw JSONRPCError(-32600, "Params must be an array");
// Find method // Find method
if (!mapCommands.count(strMethod)) const CRPCCommand *pcmd = tableRPC[strMethod];
if (!pcmd)
throw JSONRPCError(-32601, "Method not found"); throw JSONRPCError(-32601, "Method not found");
CRPCCommand *pcmd = mapCommands[strMethod];
// Observe safe mode // Observe safe mode
string strWarning = GetWarnings("rpc"); string strWarning = GetWarnings("rpc");
if (strWarning != "" && !GetBoolArg("-disablesafemode") && if (strWarning != "" && !GetBoolArg("-disablesafemode") &&