ctkDICOMFindContext.cpp 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "ctkDICOMFindContext.h"
  2. #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
  3. #include "dcmtk/dcmqrdb/dcmqrcbf.h"
  4. #include "dcmtk/dcmqrdb/dcmqrcnf.h"
  5. #include "dcmtk/dcmdata/dcdeftag.h"
  6. #include "dcmtk/dcmqrdb/dcmqropt.h"
  7. #include "dcmtk/dcmnet/diutil.h"
  8. #include "dcmtk/dcmdata/dcfilefo.h"
  9. #include "dcmtk/dcmqrdb/dcmqrdbs.h"
  10. #include "dcmtk/dcmqrdb/dcmqrdbi.h"
  11. // CTK includes
  12. #include "ctkLogger.h"
  13. static ctkLogger logger ("org.commontk.dicom.DcmFindContext");
  14. //------------------------------------------------------------------------------
  15. ctkDICOMFindContext::ctkDICOMFindContext(DIC_US priorStat, QObject* parent):
  16. QObject(parent),
  17. priorStatus(priorStat),
  18. ourAETitle()
  19. {
  20. }
  21. //------------------------------------------------------------------------------
  22. void ctkDICOMFindContext::callbackHandler(
  23. /* in */
  24. OFBool cancelled, T_DIMSE_C_FindRQ *request,
  25. DcmDataset *requestIdentifiers, int responseCount,
  26. /* out */
  27. T_DIMSE_C_FindRSP *response,
  28. DcmDataset **responseIdentifiers,
  29. DcmDataset **stDetail)
  30. {
  31. OFCondition dbcond = EC_Normal;
  32. DcmQueryRetrieveDatabaseStatus dbStatus(priorStatus);
  33. if (responseCount == 1) {
  34. /* start the database search */
  35. DCMQRDB_INFO("Find SCP Request Identifiers:" << OFendl << DcmObject::PrintHelper(*requestIdentifiers));
  36. dbcond = this->startFindRequest(
  37. request->AffectedSOPClassUID, requestIdentifiers, &dbStatus);
  38. if (dbcond.bad()) {
  39. DCMQRDB_ERROR("findSCP: Database: startFindRequest Failed ("
  40. << DU_cfindStatusString(dbStatus.status()) << "):");
  41. }
  42. }
  43. /* only cancel if we have pending responses */
  44. if (cancelled && DICOM_PENDING_STATUS(dbStatus.status())) {
  45. this->cancelFindRequest(&dbStatus);
  46. }
  47. if (DICOM_PENDING_STATUS(dbStatus.status())) {
  48. dbcond = this->nextFindResponse(responseIdentifiers, &dbStatus);
  49. if (dbcond.bad()) {
  50. DCMQRDB_ERROR("findSCP: Database: nextFindResponse Failed ("
  51. << DU_cfindStatusString(dbStatus.status()) << "):");
  52. }
  53. }
  54. if (*responseIdentifiers != NULL)
  55. {
  56. if (! DU_putStringDOElement(*responseIdentifiers, DCM_RetrieveAETitle, ourAETitle.c_str())) {
  57. DCMQRDB_ERROR("DO: adding Retrieve AE Title");
  58. }
  59. }
  60. /* set response status */
  61. response->DimseStatus = dbStatus.status();
  62. *stDetail = dbStatus.extractStatusDetail();
  63. OFString str;
  64. logger.info(QString("Find SCP Response ") + QString::number(responseCount)
  65. + "[status:" + DU_cfindStatusString(dbStatus.status()) + "]");
  66. DIMSE_dumpMessage(str, *response, DIMSE_OUTGOING);
  67. logger.debug(str.c_str());
  68. if (DICOM_PENDING_STATUS(dbStatus.status()) && (*responseIdentifiers != NULL))
  69. //DCMQRDB_DEBUG("Find SCP Response Identifiers:" << OFendl << DcmObject::PrintHelper(**responseIdentifiers));
  70. if (*stDetail)
  71. //DCMQRDB_DEBUG(" Status detail:" << OFendl << DcmObject::PrintHelper(**stDetail));
  72. this->priorStatus = dbStatus.status();
  73. }