comparison Plugins/Engine/OrthancPlugins.cpp @ 1177:5b2d8c280ac2 db-changes

Plugins can monitor changes through callbacks
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 24 Sep 2014 17:37:44 +0200
parents 1ea4094d077c
children c71d25e6a63c
comparison
equal deleted inserted replaced
1176:f24e04838054 1177:5b2d8c280ac2
82 struct OrthancPlugins::PImpl 82 struct OrthancPlugins::PImpl
83 { 83 {
84 typedef std::pair<boost::regex*, OrthancPluginRestCallback> RestCallback; 84 typedef std::pair<boost::regex*, OrthancPluginRestCallback> RestCallback;
85 typedef std::list<RestCallback> RestCallbacks; 85 typedef std::list<RestCallback> RestCallbacks;
86 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks; 86 typedef std::list<OrthancPluginOnStoredInstanceCallback> OnStoredCallbacks;
87 typedef std::list<OrthancPluginOnChangeCallback> OnChangeCallbacks;
87 88
88 ServerContext& context_; 89 ServerContext& context_;
89 RestCallbacks restCallbacks_; 90 RestCallbacks restCallbacks_;
90 OrthancRestApi* restApi_; 91 OrthancRestApi* restApi_;
91 OnStoredCallbacks onStoredCallbacks_; 92 OnStoredCallbacks onStoredCallbacks_;
93 OnChangeCallbacks onChangeCallbacks_;
92 bool hasStorageArea_; 94 bool hasStorageArea_;
93 _OrthancPluginRegisterStorageArea storageArea_; 95 _OrthancPluginRegisterStorageArea storageArea_;
94 96
95 PImpl(ServerContext& context) : 97 PImpl(ServerContext& context) :
96 context_(context), 98 context_(context),
118 { 120 {
119 memcpy(result, &str[0], str.size() + 1); 121 memcpy(result, &str[0], str.size() + 1);
120 } 122 }
121 123
122 return result; 124 return result;
125 }
126
127
128 static OrthancPluginResourceType Convert(ResourceType type)
129 {
130 switch (type)
131 {
132 case ResourceType_Patient:
133 return OrthancPluginResourceType_Patient;
134
135 case ResourceType_Study:
136 return OrthancPluginResourceType_Study;
137
138 case ResourceType_Series:
139 return OrthancPluginResourceType_Series;
140
141 case ResourceType_Instance:
142 return OrthancPluginResourceType_Instance;
143
144 default:
145 throw OrthancException(ErrorCode_ParameterOutOfRange);
146 }
147 }
148
149
150 static OrthancPluginChangeType Convert(ChangeType type)
151 {
152 switch (type)
153 {
154 case ChangeType_AnonymizedPatient:
155 return OrthancPluginChangeType_AnonymizedPatient;
156
157 case ChangeType_AnonymizedSeries:
158 return OrthancPluginChangeType_AnonymizedSeries;
159
160 case ChangeType_AnonymizedStudy:
161 return OrthancPluginChangeType_AnonymizedStudy;
162
163 case ChangeType_CompletedSeries:
164 return OrthancPluginChangeType_CompletedSeries;
165
166 case ChangeType_Deleted:
167 return OrthancPluginChangeType_Deleted;
168
169 case ChangeType_ModifiedPatient:
170 return OrthancPluginChangeType_ModifiedPatient;
171
172 case ChangeType_ModifiedSeries:
173 return OrthancPluginChangeType_ModifiedSeries;
174
175 case ChangeType_ModifiedStudy:
176 return OrthancPluginChangeType_ModifiedStudy;
177
178 case ChangeType_NewInstance:
179 return OrthancPluginChangeType_NewInstance;
180
181 case ChangeType_NewPatient:
182 return OrthancPluginChangeType_NewPatient;
183
184 case ChangeType_NewSeries:
185 return OrthancPluginChangeType_NewSeries;
186
187 case ChangeType_NewStudy:
188 return OrthancPluginChangeType_NewStudy;
189
190 case ChangeType_StablePatient:
191 return OrthancPluginChangeType_StablePatient;
192
193 case ChangeType_StableSeries:
194 return OrthancPluginChangeType_StableSeries;
195
196 case ChangeType_StableStudy:
197 return OrthancPluginChangeType_StableStudy;
198
199 default:
200 throw OrthancException(ErrorCode_ParameterOutOfRange);
201 }
123 } 202 }
124 203
125 204
126 OrthancPlugins::OrthancPlugins(ServerContext& context) 205 OrthancPlugins::OrthancPlugins(ServerContext& context)
127 { 206 {
277 } 356 }
278 } 357 }
279 358
280 359
281 void OrthancPlugins::SignalStoredInstance(DicomInstanceToStore& instance, 360 void OrthancPlugins::SignalStoredInstance(DicomInstanceToStore& instance,
282 const std::string& instanceId) 361 const std::string& instanceId)
283 { 362 {
284 for (PImpl::OnStoredCallbacks::const_iterator 363 for (PImpl::OnStoredCallbacks::const_iterator
285 callback = pimpl_->onStoredCallbacks_.begin(); 364 callback = pimpl_->onStoredCallbacks_.begin();
286 callback != pimpl_->onStoredCallbacks_.end(); ++callback) 365 callback != pimpl_->onStoredCallbacks_.end(); ++callback)
287 { 366 {
290 } 369 }
291 } 370 }
292 371
293 372
294 373
374 void OrthancPlugins::SignalChange(ChangeType changeType,
375 ResourceType resourceType,
376 const std::string& publicId)
377 {
378 for (PImpl::OnChangeCallbacks::const_iterator
379 callback = pimpl_->onChangeCallbacks_.begin();
380 callback != pimpl_->onChangeCallbacks_.end(); ++callback)
381 {
382 try
383 {
384 (*callback) (Convert(changeType), Convert(resourceType), publicId.c_str());
385 }
386 catch (OrthancException&)
387 {
388 // This change type or resource type is not supported by the plugin SDK
389 }
390 }
391 }
392
393
394
295 static void CopyToMemoryBuffer(OrthancPluginMemoryBuffer& target, 395 static void CopyToMemoryBuffer(OrthancPluginMemoryBuffer& target,
296 const void* data, 396 const void* data,
297 size_t size) 397 size_t size)
298 { 398 {
299 target.size = size; 399 target.size = size;
348 const _OrthancPluginOnStoredInstanceCallback& p = 448 const _OrthancPluginOnStoredInstanceCallback& p =
349 *reinterpret_cast<const _OrthancPluginOnStoredInstanceCallback*>(parameters); 449 *reinterpret_cast<const _OrthancPluginOnStoredInstanceCallback*>(parameters);
350 450
351 LOG(INFO) << "Plugin has registered an OnStoredInstance callback"; 451 LOG(INFO) << "Plugin has registered an OnStoredInstance callback";
352 pimpl_->onStoredCallbacks_.push_back(p.callback); 452 pimpl_->onStoredCallbacks_.push_back(p.callback);
453 }
454
455
456 void OrthancPlugins::RegisterOnChangeCallback(const void* parameters)
457 {
458 const _OrthancPluginOnChangeCallback& p =
459 *reinterpret_cast<const _OrthancPluginOnChangeCallback*>(parameters);
460
461 LOG(INFO) << "Plugin has registered an OnChange callback";
462 pimpl_->onChangeCallbacks_.push_back(p.callback);
353 } 463 }
354 464
355 465
356 466
357 void OrthancPlugins::AnswerBuffer(const void* parameters) 467 void OrthancPlugins::AnswerBuffer(const void* parameters)
773 RegisterRestCallback(parameters); 883 RegisterRestCallback(parameters);
774 return true; 884 return true;
775 885
776 case _OrthancPluginService_RegisterOnStoredInstanceCallback: 886 case _OrthancPluginService_RegisterOnStoredInstanceCallback:
777 RegisterOnStoredInstanceCallback(parameters); 887 RegisterOnStoredInstanceCallback(parameters);
888 return true;
889
890 case _OrthancPluginService_RegisterOnChangeCallback:
891 RegisterOnChangeCallback(parameters);
778 return true; 892 return true;
779 893
780 case _OrthancPluginService_AnswerBuffer: 894 case _OrthancPluginService_AnswerBuffer:
781 AnswerBuffer(parameters); 895 AnswerBuffer(parameters);
782 return true; 896 return true;