summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-07-11 21:50:47 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-07-11 21:50:47 +0900
commit59e63d956ee63d99202b67a32e8a277f3b04650d (patch)
tree40bedb5e5b02cb415a59916be2beee39cd20071e /src
parent7c06b903f3493db95fcf4bd42cccc59e3b4d0692 (diff)
Rewrite RPC method factory function
Diffstat (limited to 'src')
-rw-r--r--src/HttpServerBodyCommand.cc4
-rw-r--r--src/RpcMethodFactory.cc101
-rw-r--r--src/RpcMethodFactory.h8
-rw-r--r--src/RpcMethodImpl.cc3
-rw-r--r--src/rpc_helper.cc12
5 files changed, 56 insertions, 72 deletions
diff --git a/src/HttpServerBodyCommand.cc b/src/HttpServerBodyCommand.cc
index 67d660db..3922ff0a 100644
--- a/src/HttpServerBodyCommand.cc
+++ b/src/HttpServerBodyCommand.cc
@@ -226,9 +226,9 @@ bool HttpServerBodyCommand::execute()
addHttpServerResponseCommand();
return true;
}
- auto method = rpc::RpcMethodFactory::create(req.methodName);
A2_LOG_INFO(fmt("Executing RPC method %s", req.methodName.c_str()));
- rpc::RpcResponse res = method->execute(std::move(req), e_);
+ auto res = rpc::getMethod(req.methodName)
+ ->execute(std::move(req), e_);
bool gzip = httpServer_->supportsGZip();
std::string responseData = rpc::toXml(res, gzip);
httpServer_->feedResponse(std::move(responseData), "text/xml");
diff --git a/src/RpcMethodFactory.cc b/src/RpcMethodFactory.cc
index 845a7856..8813a17b 100644
--- a/src/RpcMethodFactory.cc
+++ b/src/RpcMethodFactory.cc
@@ -42,115 +42,114 @@ namespace aria2 {
namespace rpc {
namespace {
-std::shared_ptr<RpcMethod> getNoSuchMethod()
-{
- static std::shared_ptr<RpcMethod> m(new NoSuchMethodRpcMethod());
- return m;
-}
+std::map<std::string, std::unique_ptr<RpcMethod>> cache;
+} // namespace
+
+namespace {
+std::unique_ptr<RpcMethod> noSuchRpcMethod;
} // namespace
namespace {
-std::shared_ptr<RpcMethod>
+std::unique_ptr<RpcMethod>
createMethod(const std::string& methodName)
{
if(methodName == AddUriRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new AddUriRpcMethod());
+ return make_unique<AddUriRpcMethod>();
#ifdef ENABLE_BITTORRENT
} else if(methodName == AddTorrentRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new AddTorrentRpcMethod());
+ return make_unique<AddTorrentRpcMethod>();
#endif // ENABLE_BITTORRENT
#ifdef ENABLE_METALINK
}
else if(methodName == AddMetalinkRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new AddMetalinkRpcMethod());
+ return make_unique<AddMetalinkRpcMethod>();
#endif // ENABLE_METALINK
}
else if(methodName == RemoveRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new RemoveRpcMethod());
+ return make_unique<RemoveRpcMethod>();
} else if(methodName == PauseRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new PauseRpcMethod());
+ return make_unique<PauseRpcMethod>();
} else if(methodName == ForcePauseRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ForcePauseRpcMethod());
+ return make_unique<ForcePauseRpcMethod>();
} else if(methodName == PauseAllRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new PauseAllRpcMethod());
+ return make_unique<PauseAllRpcMethod>();
} else if(methodName == ForcePauseAllRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ForcePauseAllRpcMethod());
+ return make_unique<ForcePauseAllRpcMethod>();
} else if(methodName == UnpauseRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new UnpauseRpcMethod());
+ return make_unique<UnpauseRpcMethod>();
} else if(methodName == UnpauseAllRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new UnpauseAllRpcMethod());
+ return make_unique<UnpauseAllRpcMethod>();
} else if(methodName == ForceRemoveRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ForceRemoveRpcMethod());
+ return make_unique<ForceRemoveRpcMethod>();
} else if(methodName == ChangePositionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ChangePositionRpcMethod());
+ return make_unique<ChangePositionRpcMethod>();
} else if(methodName == TellStatusRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new TellStatusRpcMethod());
+ return make_unique<TellStatusRpcMethod>();
} else if(methodName == GetUrisRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetUrisRpcMethod());
+ return make_unique<GetUrisRpcMethod>();
} else if(methodName == GetFilesRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetFilesRpcMethod());
+ return make_unique<GetFilesRpcMethod>();
#ifdef ENABLE_BITTORRENT
}
else if(methodName == GetPeersRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetPeersRpcMethod());
+ return make_unique<GetPeersRpcMethod>();
#endif // ENABLE_BITTORRENT
} else if(methodName == GetServersRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetServersRpcMethod());
+ return make_unique<GetServersRpcMethod>();
} else if(methodName == TellActiveRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new TellActiveRpcMethod());
+ return make_unique<TellActiveRpcMethod>();
} else if(methodName == TellWaitingRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new TellWaitingRpcMethod());
+ return make_unique<TellWaitingRpcMethod>();
} else if(methodName == TellStoppedRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new TellStoppedRpcMethod());
+ return make_unique<TellStoppedRpcMethod>();
} else if(methodName == GetOptionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetOptionRpcMethod());
+ return make_unique<GetOptionRpcMethod>();
} else if(methodName == ChangeUriRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ChangeUriRpcMethod());
+ return make_unique<ChangeUriRpcMethod>();
} else if(methodName == ChangeOptionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ChangeOptionRpcMethod());
+ return make_unique<ChangeOptionRpcMethod>();
} else if(methodName == GetGlobalOptionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetGlobalOptionRpcMethod());
+ return make_unique<GetGlobalOptionRpcMethod>();
} else if(methodName == ChangeGlobalOptionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ChangeGlobalOptionRpcMethod());
+ return make_unique<ChangeGlobalOptionRpcMethod>();
} else if(methodName == PurgeDownloadResultRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new PurgeDownloadResultRpcMethod());
+ return make_unique<PurgeDownloadResultRpcMethod>();
} else if(methodName == RemoveDownloadResultRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new RemoveDownloadResultRpcMethod());
+ return make_unique<RemoveDownloadResultRpcMethod>();
} else if(methodName == GetVersionRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetVersionRpcMethod());
+ return make_unique<GetVersionRpcMethod>();
} else if(methodName == GetSessionInfoRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetSessionInfoRpcMethod());
+ return make_unique<GetSessionInfoRpcMethod>();
} else if(methodName == ShutdownRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ShutdownRpcMethod());
+ return make_unique<ShutdownRpcMethod>();
} else if(methodName == ForceShutdownRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new ForceShutdownRpcMethod());
+ return make_unique<ForceShutdownRpcMethod>();
} else if(methodName == GetGlobalStatRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new GetGlobalStatRpcMethod());
+ return make_unique<GetGlobalStatRpcMethod>();
} else if(methodName == SystemMulticallRpcMethod::getMethodName()) {
- return std::shared_ptr<RpcMethod>(new SystemMulticallRpcMethod());
+ return make_unique<SystemMulticallRpcMethod>();
} else {
return nullptr;
}
}
} // namespace
-std::map<std::string, std::shared_ptr<RpcMethod> > RpcMethodFactory::cache_;
-
-std::shared_ptr<RpcMethod>
-RpcMethodFactory::create(const std::string& methodName)
+RpcMethod* getMethod(const std::string& methodName)
{
- std::map<std::string, std::shared_ptr<RpcMethod> >::const_iterator itr =
- cache_.find(methodName);
- if(itr == cache_.end()) {
- std::shared_ptr<RpcMethod> m = createMethod(methodName);
+ auto itr = cache.find(methodName);
+ if(itr == cache.end()) {
+ auto m = createMethod(methodName);
if(m) {
- cache_.insert(std::make_pair(methodName, m));
- return m;
+ auto rv = cache.insert(std::make_pair(methodName, std::move(m)));
+ return (*rv.first).second.get();
} else {
- return getNoSuchMethod();
+ if(!noSuchRpcMethod) {
+ noSuchRpcMethod = make_unique<NoSuchMethodRpcMethod>();
+ }
+ return noSuchRpcMethod.get();
}
} else {
- return (*itr).second;
+ return (*itr).second.get();
}
}
diff --git a/src/RpcMethodFactory.h b/src/RpcMethodFactory.h
index 5d479d56..07f83c58 100644
--- a/src/RpcMethodFactory.h
+++ b/src/RpcMethodFactory.h
@@ -38,7 +38,6 @@
#include "common.h"
#include <string>
-#include <map>
#include <memory>
namespace aria2 {
@@ -47,12 +46,7 @@ namespace rpc {
class RpcMethod;
-class RpcMethodFactory {
-public:
- static std::shared_ptr<RpcMethod> create(const std::string& methodName);
-private:
- static std::map<std::string, std::shared_ptr<RpcMethod> > cache_;
-};
+RpcMethod* getMethod(const std::string& methodName);
} // namespace rpc
diff --git a/src/RpcMethodImpl.cc b/src/RpcMethodImpl.cc
index 1edccd63..c7ea16e6 100644
--- a/src/RpcMethodImpl.cc
+++ b/src/RpcMethodImpl.cc
@@ -1381,8 +1381,7 @@ std::unique_ptr<ValueBase> SystemMulticallRpcMethod::process
} else {
paramsList = List::g();
}
- auto method = RpcMethodFactory::create(methodName->s());
- RpcResponse res = method->execute
+ RpcResponse res = getMethod(methodName->s())->execute
({methodName->s(), std::move(paramsList), nullptr, req.jsonRpc}, e);
if(res.code == 0) {
auto l = List::g();
diff --git a/src/rpc_helper.cc b/src/rpc_helper.cc
index 3b953e15..d88ae529 100644
--- a/src/rpc_helper.cc
+++ b/src/rpc_helper.cc
@@ -98,17 +98,9 @@ RpcResponse processJsonRpcRequest(Dict* jsondict, DownloadEngine* e)
return createJsonRpcErrorResponse(-32602, "Invalid params.",
std::move(id));
}
- std::shared_ptr<RpcMethod> method;
- try {
- method = rpc::RpcMethodFactory::create(methodName->s());
- } catch(RecoverableException& e) {
- A2_LOG_INFO_EX(EX_EXCEPTION_CAUGHT, e);
- return createJsonRpcErrorResponse(-32601, "Method not found.",
- std::move(id));
- }
A2_LOG_INFO(fmt("Executing RPC method %s", methodName->s().c_str()));
- return method->execute({methodName->s(), std::move(params),
- std::move(id), true}, e);
+ return getMethod(methodName->s())->execute
+ ({methodName->s(), std::move(params), std::move(id), true}, e);
}
} // namespace rpc