changeset 2293:6edb3e47a45b draft

Encapsulate mapCommands in class CRPCTable
author Pieter Wuille <pieter.wuille@gmail.com>
date Wed, 18 Apr 2012 22:42:17 +0200
parents 2787ea03c90c
children bc7f29fbeed5
files src/bitcoinrpc.cpp
diffstat 1 files changed, 38 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -47,7 +47,17 @@
     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;
 
@@ -177,23 +187,13 @@
 /// Note: This interface may still be subject to change.
 ///
 
-
-Value help(const Array& params, bool fHelp)
+string CRPCTable::help(string strCommand) const
 {
-    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;
     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;
         // We already filter duplicates, but these deprecated screw up the sort order
         if (strMethod == "getamountreceived" ||
@@ -226,6 +226,20 @@
     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)
 {
@@ -2065,15 +2079,8 @@
     { "importprivkey",          &importprivkey,          false },
 };
 
-map<string, CRPCCommand*> mapCommands;
-
-static void RegisterRPCCommands()
+CRPCTable::CRPCTable()
 {
-    static bool registered = false;
-    if (registered)
-        return;
-    registered = true;
-
     unsigned int vcidx;
     for (vcidx = 0; vcidx < (sizeof(vRPCCommands) / sizeof(vRPCCommands[0])); vcidx++)
     {
@@ -2084,6 +2091,13 @@
     }
 }
 
+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
@@ -2363,8 +2377,6 @@
 {
     printf("ThreadRPCServer started\n");
 
-    RegisterRPCCommands();
-
     strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
     if (mapArgs["-rpcpassword"] == "")
     {
@@ -2516,11 +2528,10 @@
                 throw JSONRPCError(-32600, "Params must be an array");
 
             // Find method
-            if (!mapCommands.count(strMethod))
+            const CRPCCommand *pcmd = tableRPC[strMethod];
+            if (!pcmd)
                 throw JSONRPCError(-32601, "Method not found");
 
-            CRPCCommand *pcmd = mapCommands[strMethod];
-
             // Observe safe mode
             string strWarning = GetWarnings("rpc");
             if (strWarning != "" && !GetBoolArg("-disablesafemode") &&