Encapsulate mapCommands in class CRPCTable
authorPieter Wuille <pieter.wuille@gmail.com>
Wed, 18 Apr 2012 20:42:17 +0000 (22:42 +0200)
committerPieter Wuille <pieter.wuille@gmail.com>
Fri, 20 Apr 2012 23:20:05 +0000 (01:20 +0200)
src/bitcoinrpc.cpp

index 4dfb61b..24b1220 100644 (file)
@@ -47,7 +47,17 @@ public:
     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 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex)
 /// 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 @@ Value help(const Array& params, bool fHelp)
     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 @@ static CRPCCommand vRPCCommands[] =
     { "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 @@ 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
@@ -2363,8 +2377,6 @@ void ThreadRPCServer2(void* parg)
 {
     printf("ThreadRPCServer started\n");
 
-    RegisterRPCCommands();
-
     strRPCUserColonPass = mapArgs["-rpcuser"] + ":" + mapArgs["-rpcpassword"];
     if (mapArgs["-rpcpassword"] == "")
     {
@@ -2516,11 +2528,10 @@ void ThreadRPCServer2(void* parg)
                 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") &&