comparison Plugins/Engine/OrthancPlugins.cpp @ 3662:d8371b4302ff storage-commitment

OrthancPluginRegisterStorageCommitmentScpCallback()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 11 Feb 2020 19:59:53 +0100
parents 94f4a18a79cc
children 85acfcc15829
comparison
equal deleted inserted replaced
3661:25117919a36b 3662:d8371b4302ff
680 return parameters_; 680 return parameters_;
681 } 681 }
682 }; 682 };
683 683
684 684
685
686 class StorageCommitmentScp : public IStorageCommitmentFactory
687 {
688 private:
689 class Handler : public IStorageCommitmentFactory::ILookupHandler
690 {
691 private:
692 _OrthancPluginRegisterStorageCommitmentScpCallback parameters_;
693 void* handler_;
694
695 public:
696 Handler(_OrthancPluginRegisterStorageCommitmentScpCallback parameters,
697 void* handler) :
698 parameters_(parameters)
699 {
700 if (handler == NULL)
701 {
702 throw OrthancException(ErrorCode_NullPointer);
703 }
704 }
705
706 virtual ~Handler()
707 {
708 assert(handler_ != NULL);
709 parameters_.destructor(handler_);
710 handler_ = NULL;
711 }
712
713 virtual StorageCommitmentFailureReason Lookup(const std::string& sopClassUid,
714 const std::string& sopInstanceUid)
715 {
716 assert(handler_ != NULL);
717 OrthancPluginStorageCommitmentFailureReason reason =
718 OrthancPluginStorageCommitmentFailureReason_Success;
719 OrthancPluginErrorCode error = parameters_.lookup(
720 &reason, handler_, sopClassUid.c_str(), sopInstanceUid.c_str());
721 if (error == OrthancPluginErrorCode_Success)
722 {
723 return Plugins::Convert(reason);
724 }
725 else
726 {
727 throw OrthancException(static_cast<ErrorCode>(error));
728 }
729 }
730 };
731
732 _OrthancPluginRegisterStorageCommitmentScpCallback parameters_;
733
734 public:
735 StorageCommitmentScp(_OrthancPluginRegisterStorageCommitmentScpCallback parameters) :
736 parameters_(parameters)
737 {
738 }
739
740 virtual ILookupHandler* CreateStorageCommitment(
741 const std::string& jobId,
742 const std::string& transactionUid,
743 const std::vector<std::string>& sopClassUids,
744 const std::vector<std::string>& sopInstanceUids,
745 const std::string& remoteAet,
746 const std::string& calledAet) ORTHANC_OVERRIDE
747 {
748 const size_t n = sopClassUids.size();
749
750 if (sopInstanceUids.size() != n)
751 {
752 throw OrthancException(ErrorCode_ParameterOutOfRange);
753 }
754
755 std::vector<const char*> a, b;
756 a.resize(n);
757 b.resize(n);
758
759 for (size_t i = 0; i < n; i++)
760 {
761 a[i] = sopClassUids[i].c_str();
762 b[i] = sopInstanceUids[i].c_str();
763 }
764
765 void* handler = parameters_.factory(jobId.c_str(), transactionUid.c_str(),
766 a.empty() ? NULL : &a[0], b.empty() ? NULL : &b[0],
767 static_cast<uint32_t>(n),
768 remoteAet.c_str(), calledAet.c_str());
769 if (handler == NULL)
770 {
771 return NULL;
772 }
773 else
774 {
775 return new Handler(parameters_, handler);
776 }
777 }
778 };
779
780
685 class ServerContextLock 781 class ServerContextLock
686 { 782 {
687 private: 783 private:
688 boost::mutex::scoped_lock lock_; 784 boost::mutex::scoped_lock lock_;
689 ServerContext* context_; 785 ServerContext* context_;
722 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters; 818 typedef std::list<OrthancPluginIncomingHttpRequestFilter> IncomingHttpRequestFilters;
723 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2; 819 typedef std::list<OrthancPluginIncomingHttpRequestFilter2> IncomingHttpRequestFilters2;
724 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks; 820 typedef std::list<OrthancPluginDecodeImageCallback> DecodeImageCallbacks;
725 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers; 821 typedef std::list<OrthancPluginJobsUnserializer> JobsUnserializers;
726 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks; 822 typedef std::list<OrthancPluginRefreshMetricsCallback> RefreshMetricsCallbacks;
823 typedef std::list<StorageCommitmentScp*> StorageCommitmentScpCallbacks;
727 typedef std::map<Property, std::string> Properties; 824 typedef std::map<Property, std::string> Properties;
728 825
729 PluginsManager manager_; 826 PluginsManager manager_;
730 827
731 RestCallbacks restCallbacks_; 828 RestCallbacks restCallbacks_;
738 JobsUnserializers jobsUnserializers_; 835 JobsUnserializers jobsUnserializers_;
739 _OrthancPluginMoveCallback moveCallbacks_; 836 _OrthancPluginMoveCallback moveCallbacks_;
740 IncomingHttpRequestFilters incomingHttpRequestFilters_; 837 IncomingHttpRequestFilters incomingHttpRequestFilters_;
741 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_; 838 IncomingHttpRequestFilters2 incomingHttpRequestFilters2_;
742 RefreshMetricsCallbacks refreshMetricsCallbacks_; 839 RefreshMetricsCallbacks refreshMetricsCallbacks_;
840 StorageCommitmentScpCallbacks storageCommitmentScpCallbacks_;
743 std::auto_ptr<StorageAreaFactory> storageArea_; 841 std::auto_ptr<StorageAreaFactory> storageArea_;
744 842
745 boost::recursive_mutex restCallbackMutex_; 843 boost::recursive_mutex restCallbackMutex_;
746 boost::recursive_mutex storedCallbackMutex_; 844 boost::recursive_mutex storedCallbackMutex_;
747 boost::recursive_mutex changeCallbackMutex_; 845 boost::recursive_mutex changeCallbackMutex_;
748 boost::mutex findCallbackMutex_; 846 boost::mutex findCallbackMutex_;
749 boost::mutex worklistCallbackMutex_; 847 boost::mutex worklistCallbackMutex_;
750 boost::mutex decodeImageCallbackMutex_; 848 boost::mutex decodeImageCallbackMutex_;
751 boost::mutex jobsUnserializersMutex_; 849 boost::mutex jobsUnserializersMutex_;
752 boost::mutex refreshMetricsMutex_; 850 boost::mutex refreshMetricsMutex_;
851 boost::mutex storageCommitmentScpMutex_;
753 boost::recursive_mutex invokeServiceMutex_; 852 boost::recursive_mutex invokeServiceMutex_;
754 853
755 Properties properties_; 854 Properties properties_;
756 int argc_; 855 int argc_;
757 char** argv_; 856 char** argv_;
1258 sizeof(int32_t) != sizeof(OrthancPluginInstanceOrigin) || 1357 sizeof(int32_t) != sizeof(OrthancPluginInstanceOrigin) ||
1259 sizeof(int32_t) != sizeof(OrthancPluginJobStepStatus) || 1358 sizeof(int32_t) != sizeof(OrthancPluginJobStepStatus) ||
1260 sizeof(int32_t) != sizeof(OrthancPluginConstraintType) || 1359 sizeof(int32_t) != sizeof(OrthancPluginConstraintType) ||
1261 sizeof(int32_t) != sizeof(OrthancPluginMetricsType) || 1360 sizeof(int32_t) != sizeof(OrthancPluginMetricsType) ||
1262 sizeof(int32_t) != sizeof(OrthancPluginDicomWebBinaryMode) || 1361 sizeof(int32_t) != sizeof(OrthancPluginDicomWebBinaryMode) ||
1362 sizeof(int32_t) != sizeof(OrthancPluginStorageCommitmentFailureReason) ||
1263 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeBinary) != static_cast<int>(DicomToJsonFlags_IncludeBinary) || 1363 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeBinary) != static_cast<int>(DicomToJsonFlags_IncludeBinary) ||
1264 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePrivateTags) != static_cast<int>(DicomToJsonFlags_IncludePrivateTags) || 1364 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePrivateTags) != static_cast<int>(DicomToJsonFlags_IncludePrivateTags) ||
1265 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeUnknownTags) != static_cast<int>(DicomToJsonFlags_IncludeUnknownTags) || 1365 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludeUnknownTags) != static_cast<int>(DicomToJsonFlags_IncludeUnknownTags) ||
1266 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePixelData) != static_cast<int>(DicomToJsonFlags_IncludePixelData) || 1366 static_cast<int>(OrthancPluginDicomToJsonFlags_IncludePixelData) != static_cast<int>(DicomToJsonFlags_IncludePixelData) ||
1267 static_cast<int>(OrthancPluginDicomToJsonFlags_ConvertBinaryToNull) != static_cast<int>(DicomToJsonFlags_ConvertBinaryToNull) || 1367 static_cast<int>(OrthancPluginDicomToJsonFlags_ConvertBinaryToNull) != static_cast<int>(DicomToJsonFlags_ConvertBinaryToNull) ||
1301 for (PImpl::ChunkedRestCallbacks::iterator it = pimpl_->chunkedRestCallbacks_.begin(); 1401 for (PImpl::ChunkedRestCallbacks::iterator it = pimpl_->chunkedRestCallbacks_.begin();
1302 it != pimpl_->chunkedRestCallbacks_.end(); ++it) 1402 it != pimpl_->chunkedRestCallbacks_.end(); ++it)
1303 { 1403 {
1304 delete *it; 1404 delete *it;
1305 } 1405 }
1406
1407 for (PImpl::StorageCommitmentScpCallbacks::iterator
1408 it = pimpl_->storageCommitmentScpCallbacks_.begin();
1409 it != pimpl_->storageCommitmentScpCallbacks_.end(); ++it)
1410 {
1411 delete *it;
1412 }
1306 } 1413 }
1307 1414
1308 1415
1309 static void ArgumentsToPlugin(std::vector<const char*>& keys, 1416 static void ArgumentsToPlugin(std::vector<const char*>& keys,
1310 std::vector<const char*>& values, 1417 std::vector<const char*>& values,
1858 1965
1859 boost::mutex::scoped_lock lock(pimpl_->refreshMetricsMutex_); 1966 boost::mutex::scoped_lock lock(pimpl_->refreshMetricsMutex_);
1860 1967
1861 LOG(INFO) << "Plugin has registered a callback to refresh its metrics"; 1968 LOG(INFO) << "Plugin has registered a callback to refresh its metrics";
1862 pimpl_->refreshMetricsCallbacks_.push_back(p.callback); 1969 pimpl_->refreshMetricsCallbacks_.push_back(p.callback);
1970 }
1971
1972
1973 void OrthancPlugins::RegisterStorageCommitmentScpCallback(const void* parameters)
1974 {
1975 const _OrthancPluginRegisterStorageCommitmentScpCallback& p =
1976 *reinterpret_cast<const _OrthancPluginRegisterStorageCommitmentScpCallback*>(parameters);
1977
1978 boost::mutex::scoped_lock lock(pimpl_->storageCommitmentScpMutex_);
1979 LOG(INFO) << "Plugin has registered a storage commitment callback";
1980
1981 pimpl_->storageCommitmentScpCallbacks_.push_back(new PImpl::StorageCommitmentScp(p));
1863 } 1982 }
1864 1983
1865 1984
1866 void OrthancPlugins::AnswerBuffer(const void* parameters) 1985 void OrthancPlugins::AnswerBuffer(const void* parameters)
1867 { 1986 {
3880 3999
3881 case _OrthancPluginService_RegisterRefreshMetricsCallback: 4000 case _OrthancPluginService_RegisterRefreshMetricsCallback:
3882 RegisterRefreshMetricsCallback(parameters); 4001 RegisterRefreshMetricsCallback(parameters);
3883 return true; 4002 return true;
3884 4003
4004 case _OrthancPluginService_RegisterStorageCommitmentScpCallback:
4005 RegisterStorageCommitmentScpCallback(parameters);
4006 return true;
4007
3885 case _OrthancPluginService_RegisterStorageArea: 4008 case _OrthancPluginService_RegisterStorageArea:
3886 { 4009 {
3887 LOG(INFO) << "Plugin has registered a custom storage area"; 4010 LOG(INFO) << "Plugin has registered a custom storage area";
3888 const _OrthancPluginRegisterStorageArea& p = 4011 const _OrthancPluginRegisterStorageArea& p =
3889 *reinterpret_cast<const _OrthancPluginRegisterStorageArea*>(parameters); 4012 *reinterpret_cast<const _OrthancPluginRegisterStorageArea*>(parameters);
4537 return true; 4660 return true;
4538 } 4661 }
4539 } 4662 }
4540 } 4663 }
4541 } 4664 }
4665
4666
4667 IStorageCommitmentFactory::ILookupHandler* OrthancPlugins::CreateStorageCommitment(
4668 const std::string& jobId,
4669 const std::string& transactionUid,
4670 const std::vector<std::string>& sopClassUids,
4671 const std::vector<std::string>& sopInstanceUids,
4672 const std::string& remoteAet,
4673 const std::string& calledAet)
4674 {
4675 boost::mutex::scoped_lock lock(pimpl_->storageCommitmentScpMutex_);
4676
4677 for (PImpl::StorageCommitmentScpCallbacks::iterator
4678 it = pimpl_->storageCommitmentScpCallbacks_.begin();
4679 it != pimpl_->storageCommitmentScpCallbacks_.end(); ++it)
4680 {
4681 assert(*it != NULL);
4682 IStorageCommitmentFactory::ILookupHandler* handler = (*it)->CreateStorageCommitment
4683 (jobId, transactionUid, sopClassUids, sopInstanceUids, remoteAet, calledAet);
4684
4685 if (handler != NULL)
4686 {
4687 return handler;
4688 }
4689 }
4690
4691 return NULL;
4692 }
4542 } 4693 }