Mercurial > hg > orthanc-stone
view Framework/Toolbox/BaseWebService.cpp @ 443:e9f84e52aad2 am-vsol-upgrade
Close branch am-vsol-upgrade
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 16 Jan 2019 16:10:16 +0100 |
parents | e641d3978856 |
children | 4f2416d519b4 |
line wrap: on
line source
/** * Stone of Orthanc * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics * Department, University Hospital of Liege, Belgium * Copyright (C) 2017-2018 Osimis S.A., 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 "BaseWebService.h" #include <Core/OrthancException.h> #include "Framework/Messages/IObservable.h" #include "Platforms/Generic/IOracleCommand.h" #include <boost/shared_ptr.hpp> namespace OrthancStone { class BaseWebService::BaseWebServicePayload : public Orthanc::IDynamicObject { private: std::auto_ptr< MessageHandler<IWebService::HttpRequestSuccessMessage> > userSuccessHandler_; std::auto_ptr< MessageHandler<IWebService::HttpRequestErrorMessage> > userFailureHandler_; std::auto_ptr< Orthanc::IDynamicObject> userPayload_; public: BaseWebServicePayload(MessageHandler<IWebService::HttpRequestSuccessMessage>* userSuccessHandler, MessageHandler<IWebService::HttpRequestErrorMessage>* userFailureHandler, Orthanc::IDynamicObject* userPayload) : userSuccessHandler_(userSuccessHandler), userFailureHandler_(userFailureHandler), userPayload_(userPayload) { } void HandleSuccess(const IWebService::HttpRequestSuccessMessage& message) const { if (userSuccessHandler_.get() != NULL) { // recreate a success message with the user payload IWebService::HttpRequestSuccessMessage successMessage(message.GetUri(), message.GetAnswer(), message.GetAnswerSize(), message.GetAnswerHttpHeaders(), userPayload_.get()); userSuccessHandler_->Apply(successMessage); } else { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } } void HandleFailure(const IWebService::HttpRequestErrorMessage& message) const { if (userFailureHandler_.get() != NULL) { // recreate a failure message with the user payload IWebService::HttpRequestErrorMessage failureMessage(message.GetUri(), userPayload_.get()); userFailureHandler_->Apply(failureMessage); } } }; void BaseWebService::GetAsync(const std::string& uri, const HttpHeaders& headers, Orthanc::IDynamicObject* payload /* takes ownership */, MessageHandler<IWebService::HttpRequestSuccessMessage>* successCallback, MessageHandler<IWebService::HttpRequestErrorMessage>* failureCallback, unsigned int timeoutInSeconds) { if (cache_.find(uri) == cache_.end()) { GetAsyncInternal(uri, headers, new BaseWebService::BaseWebServicePayload(successCallback, failureCallback, payload), // ownership is transfered new Callable<BaseWebService, IWebService::HttpRequestSuccessMessage> (*this, &BaseWebService::CacheAndNotifyHttpSuccess), new Callable<BaseWebService, IWebService::HttpRequestErrorMessage> (*this, &BaseWebService::NotifyHttpError), timeoutInSeconds); } else { // create a command and "post" it to the Oracle so it is executed and commited "later" NotifyHttpSuccessLater(cache_[uri], payload, successCallback); } } void BaseWebService::NotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) { if (message.HasPayload()) { dynamic_cast<const BaseWebServicePayload&>(message.GetPayload()).HandleSuccess(message); } else { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } } void BaseWebService::CacheAndNotifyHttpSuccess(const IWebService::HttpRequestSuccessMessage& message) { cache_[message.GetUri()] = boost::shared_ptr<CachedHttpRequestSuccessMessage>(new CachedHttpRequestSuccessMessage(message)); NotifyHttpSuccess(message); } void BaseWebService::NotifyHttpError(const IWebService::HttpRequestErrorMessage& message) { if (message.HasPayload()) { dynamic_cast<const BaseWebServicePayload&>(message.GetPayload()).HandleFailure(message); } else { throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); } } }