Mercurial > hg > orthanc-transfers
diff Framework/HttpQueries/DetectTransferPlugin.cpp @ 0:95226b754d9e
initial release
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 17 Sep 2018 11:34:55 +0200 |
parents | |
children | 1ed03945c057 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Framework/HttpQueries/DetectTransferPlugin.cpp Mon Sep 17 11:34:55 2018 +0200 @@ -0,0 +1,90 @@ +/** + * Transfers accelerator plugin for Orthanc + * Copyright (C) 2018 Osimis, Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + **/ + + +#include "DetectTransferPlugin.h" + +#include "../TransferToolbox.h" +#include "HttpQueriesRunner.h" + +#include <Core/OrthancException.h> + +#include <json/reader.h> + + +namespace OrthancPlugins +{ + DetectTransferPlugin::DetectTransferPlugin(std::set<std::string>& target, + const std::string& peer) : + target_(target), + peer_(peer), + uri_(URI_PLUGINS) + { + } + + + void DetectTransferPlugin::ReadBody(std::string& body) const + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + + void DetectTransferPlugin::HandleAnswer(const void* answer, + size_t size) + { + Json::Reader reader; + Json::Value value; + + if (reader.parse(reinterpret_cast<const char*>(answer), + reinterpret_cast<const char*>(answer) + size, value) && + value.type() == Json::arrayValue) + { + for (Json::Value::ArrayIndex i = 0; i < value.size(); i++) + { + if (value[i].type() == Json::stringValue && + value[i].asString() == PLUGIN_NAME) + { + target_.insert(peer_); + } + } + } + } + + + void DetectTransferPlugin::Apply(std::set<std::string>& activePeers, + OrthancPluginContext* context, + size_t threadsCount, + unsigned int timeout) + { + OrthancPlugins::HttpQueriesQueue queue(context); + + queue.GetOrthancPeers().SetTimeout(timeout); + queue.Reserve(queue.GetOrthancPeers().GetPeersCount()); + + for (size_t i = 0; i < queue.GetOrthancPeers().GetPeersCount(); i++) + { + queue.Enqueue(new OrthancPlugins::DetectTransferPlugin + (activePeers, queue.GetOrthancPeers().GetPeerName(i))); + } + + { + OrthancPlugins::HttpQueriesRunner runner(queue, threadsCount); + queue.WaitComplete(); + } + } +}