//------------------------------------------------------------------------------ bool ctkDICOMRetrievePrivate::retrieve ( QString UID, RetrieveType retriveType ) { if ( !this->RetrieveDatabase ) { logger.error ( "Must have RetrieveDatabase for retrieve transaction" ); return false; } // Register the JPEG libraries in case we need them // (registration only happens once, so it's okay to call repeatedly) // register global JPEG decompression codecs DJDecoderRegistration::registerCodecs(); // register global JPEG compression codecs DJEncoderRegistration::registerCodecs(); // register RLE compression codec DcmRLEEncoderRegistration::registerCodecs(); // register RLE decompression codec DcmRLEDecoderRegistration::registerCodecs(); // Set the DCMTK log level log4cplus::Logger rootLogger = log4cplus::Logger::getRoot(); rootLogger.setLogLevel(log4cplus::DEBUG_LOG_LEVEL); // TODO: use this->SCU instead ? DcmSCU scu; scu.setAETitle ( OFString(this->CallingAETitle.toStdString().c_str()) ); scu.setPort ( this->CallingPort ); scu.setPeerAETitle ( OFString(this->CalledAETitle.toStdString().c_str()) ); scu.setPeerHostName ( OFString(this->Host.toStdString().c_str()) ); scu.setPeerPort ( this->CalledPort ); scu.setMoveDestinationAETitle ( OFString(this->MoveDestinationAETitle.toStdString().c_str()) ); logger.info ( "Setting Transfer Syntaxes" ); OFList<OFString> transferSyntaxes; transferSyntaxes.push_back ( UID_LittleEndianExplicitTransferSyntax ); transferSyntaxes.push_back ( UID_BigEndianExplicitTransferSyntax ); transferSyntaxes.push_back ( UID_LittleEndianImplicitTransferSyntax ); scu.addPresentationContext ( UID_FINDStudyRootQueryRetrieveInformationModel, transferSyntaxes ); scu.addPresentationContext ( UID_MOVEStudyRootQueryRetrieveInformationModel, transferSyntaxes ); if ( !scu.initNetwork().good() ) { logger.error ( "Error initializing the network" ); return false; } logger.debug ( "Negotiating Association" ); if ( !scu.negotiateAssociation().good() ) { logger.error ( "Error negotiating association" ); return false;; } logger.debug ( "Setting Parameters" ); // Clear the query unsigned long elements = this->parameters->card(); // Clean it out for ( unsigned long i = 0; i < elements; i++ ) { this->parameters->remove ( 0ul ); } if ( retriveType == RetrieveSeries ) { this->parameters->putAndInsertString ( DCM_QueryRetrieveLevel, "SERIES" ); this->parameters->putAndInsertString ( DCM_SeriesInstanceUID, UID.toStdString().c_str() ); } else { this->parameters->putAndInsertString ( DCM_QueryRetrieveLevel, "STUDY" ); this->parameters->putAndInsertString ( DCM_StudyInstanceUID, UID.toStdString().c_str() ); } logger.debug ( "Sending Move Request" ); MOVEResponses *responses = new MOVEResponses(); OFCondition status = scu.sendMOVERequest ( 0, this->parameters, responses ); if (!status.good()) { logger.error ( "MOVE Request failed: " + QString ( status.text() ) ); return false; } logger.debug ( "Find succeded" ); logger.debug ( "Making Output Directory" ); QDir directory = QDir( RetrieveDatabase->databaseDirectory() ); if ( responses->begin() == responses->end() ) { logger.error ( "No responses!" ); throw std::runtime_error( std::string("No responses!") ); } // Write the responses out to disk for ( OFListIterator(FINDResponse*) it = responses->begin(); it != responses->end(); it++ ) { DcmDataset *dataset = (*it)->m_dataset; if ( dataset != NULL ) { logger.debug ( "Got a valid dataset" ); // Save in correct directory E_TransferSyntax output_transfersyntax = dataset->getOriginalXfer(); dataset->chooseRepresentation( output_transfersyntax, NULL ); if ( !dataset->canWriteXfer( output_transfersyntax ) ) { // Pick EXS_LittleEndianExplicit as our default output_transfersyntax = EXS_LittleEndianExplicit; } DcmXfer opt_oxferSyn( output_transfersyntax ); if ( !dataset->chooseRepresentation( opt_oxferSyn.getXfer(), NULL ).bad() ) { DcmFileFormat* fileformat = new DcmFileFormat ( dataset ); // Follow dcmdjpeg example fileformat->loadAllDataIntoMemory(); OFString SOPInstanceUID; dataset->findAndGetOFString ( DCM_SOPInstanceUID, SOPInstanceUID ); QFileInfo fi ( directory, QString ( SOPInstanceUID.c_str() ) ); logger.debug ( "Saving file: " + fi.absoluteFilePath() ); status = fileformat->saveFile ( fi.absoluteFilePath().toStdString().c_str(), opt_oxferSyn.getXfer() ); if ( !status.good() ) { logger.error ( "Error saving file: " + fi.absoluteFilePath() + " Error is " + status.text() ); } RetrieveDatabase->insert( dataset, true ); delete fileformat; } } } delete responses; //if ( !scu.dropNetwork().good() ) //{ //logger.error ( "Error dropping the network" ); //return false; //} return true; }
int ctkDICOMDatasetTest1( int argc, char * argv [] ) { Q_UNUSED(argc); Q_UNUSED(argv); ctkDICOMDataset dataset; dataset.InitializeFromDataset(0); dataset.InitializeFromFile(QString()); try { dataset.Serialize(); } catch(...) { std::cout << "ctkDICOMDataset::Serialize() throws exceptions" << std::endl; //return EXIT_FAILURE; } try { dataset.Deserialize(); } catch(...) { std::cout << "ctkDICOMDataset::Deserialize() throws exceptions" << std::endl; //return EXIT_FAILURE; } dataset.MarkForInitialization(); try { dataset.EnsureDcmDataSetIsInitialized(); } catch(...) { std::cout << "ctkDICOMDataset::EnsureDcmDataSetIsInitialized() throws" << " exceptions" << std::endl; //return EXIT_FAILURE; } // deactivating the lower part since it (correctly) causes // execptions since it calls methods on an uninitialized object return EXIT_SUCCESS; dataset.CopyElement(0, DcmTagKey(), 0); QString decode = dataset.Decode(DcmTag(),OFString()); if (!decode.isEmpty()) { std::cerr << "ctkDICOMDataset::Decode() failed: " << qPrintable(decode) << std::endl; return EXIT_FAILURE; } OFString encode = dataset.Encode(DcmTag(), decode); DcmElement* element = 0; OFCondition condition = dataset.findAndGetElement(DcmTag(), element); if (ctkDICOMDataset::CheckCondition(condition)) { std::cerr << "ctkDICOMDataset::findAndGetElement() failed" << std::endl; return EXIT_FAILURE; } OFString string; condition = dataset.findAndGetOFString(DcmTag(), string); if (ctkDICOMDataset::CheckCondition(condition)) { std::cerr << "ctkDICOMDataset::findAndGetOFString() failed" << std::endl; return EXIT_FAILURE; } try { QString string = dataset.GetAllElementValuesAsString(DcmTag()); QString string2 = dataset.GetElementAsString(DcmTag()); QStringList list = dataset.GetElementAsStringList(DcmTag()); ctkDICOMPersonName name = dataset.GetElementAsPersonName(DcmTag()); ctkDICOMPersonNameList nameList = dataset.GetElementAsPersonNameList(DcmTag()); QDate date = dataset.GetElementAsDate(DcmTag()); QTime time = dataset.GetElementAsTime(DcmTag()); double doubleValue = dataset.GetElementAsDouble(DcmTag()); int integerValue = dataset.GetElementAsInteger(DcmTag()); int shortValue = dataset.GetElementAsSignedShort(DcmTag()); int ushortValue = dataset.GetElementAsUnsignedShort(DcmTag()); QDateTime dateTime = dataset.GetElementAsDateTime(DcmTag()); Q_UNUSED(string); Q_UNUSED(string2); Q_UNUSED(list); Q_UNUSED(name); Q_UNUSED(nameList); Q_UNUSED(date); Q_UNUSED(time); Q_UNUSED(doubleValue); Q_UNUSED(integerValue); Q_UNUSED(shortValue); Q_UNUSED(ushortValue); Q_UNUSED(dateTime); dataset.SetElementAsString( DcmTag(), QString()); dataset.SetElementAsStringList( DcmTag(), QStringList() ); dataset.SetElementAsPersonName( DcmTag(), ctkDICOMPersonName()); dataset.SetElementAsPersonNameList( DcmTag(), ctkDICOMPersonNameList() ); dataset.SetElementAsDate( DcmTag(), QDate() ); dataset.SetElementAsTime( DcmTag(), QTime() ); dataset.SetElementAsDateTime( DcmTag(), QDateTime() ); dataset.SetElementAsInteger( DcmTag(), 0 ); // type IS dataset.SetElementAsSignedShort( DcmTag(), 0 ); // type SS dataset.SetElementAsUnsignedShort( DcmTag(), 0 ); // type US } catch(...) { std::cout << "ctkDICOMDataset::GetElementValueAsXXX() throws exceptions" << std::endl; //return EXIT_FAILURE; } ctkDICOMDataset::TranslateDefinedTermPatientPosition(QString()); ctkDICOMDataset::TranslateDefinedTermModality(QString()); ctkDICOMDataset::TagKey(DcmTag()); ctkDICOMDataset::TagDescription(DcmTag()); ctkDICOMDataset::TagVR(DcmTag()); return EXIT_SUCCESS; }