//------------------------------------------------------------------------------ void ctkDICOMIndexer::addDirectory(ctkDICOMDatabase& ctkDICOMDatabase, const QString& directoryName, const QString& destinationDirectoryName) { Q_D(ctkDICOMIndexer); const std::string src_directory(directoryName.toStdString()); std::string dcmFilePath = directoryName.toStdString() + "/DICOMDIR"; const char* dcmDirFilePath = dcmFilePath.c_str(); //if(OFStandard::fileExists(dcmDirFilePath)) //{ // //this->addFromDICOMDIR(ctkDICOMDatabase, directoryName, destinationDirectoryName); //}else{ OFList<OFString> originalDcmtkFileNames; OFList<OFString> dcmtkFileNames; OFStandard::searchDirectoryRecursively( QDir::toNativeSeparators(src_directory.c_str()).toAscii().data(), originalDcmtkFileNames, "", ""); int totalNumberOfFiles = originalDcmtkFileNames.size(); // hack to reverse list of filenames (not neccessary when image loading works correctly) for ( OFListIterator(OFString) iter = originalDcmtkFileNames.begin(); iter != originalDcmtkFileNames.end(); ++iter ) { dcmtkFileNames.push_front( *iter ); } OFListIterator(OFString) iter = dcmtkFileNames.begin(); OFListIterator(OFString) last = dcmtkFileNames.end(); if(iter == last) return; emit foundFilesToIndex(totalNumberOfFiles); /* iterate over all input filenames */ int fileNumber = 0; int currentProgress = -1; d->Canceled = false; while (iter != last) { if (d->Canceled) { break; } emit indexingFileNumber(++fileNumber); int newProgress = ( fileNumber * 100 ) / totalNumberOfFiles; if (newProgress != currentProgress) { currentProgress = newProgress; emit progress( currentProgress ); } QString filePath((*iter).c_str()); this->addFile(ctkDICOMDatabase, filePath, destinationDirectoryName); ++iter; } //} }
//------------------------------------------------------------------------------ bool ctkDICOMRetrievePrivate::get ( const QString& studyInstanceUID, const QString& seriesInstanceUID, const RetrieveType retrieveType ) { Q_Q(ctkDICOMRetrieve); DcmDataset *retrieveParameters = new DcmDataset(); if (! this->initializeSCU(studyInstanceUID, seriesInstanceUID, retrieveType, retrieveParameters) ) { delete retrieveParameters; return false; } // Issue request logger.debug ( "Sending Get Request" ); emit q->progress("Sending Get Request"); emit q->progress(0); OFList<RetrieveResponse*> responses; T_ASC_PresentationContextID presID = this->SCU.findPresentationContextID( UID_GETStudyRootQueryRetrieveInformationModel, "" /* don't care about transfer syntax */ ); if (presID == 0) { logger.error ( "GET Request failed: No valid Study Root GET Presentation Context available" ); if (!this->KeepAssociationOpen) { this->SCU.closeAssociation(DCMSCU_RELEASE_ASSOCIATION); } delete retrieveParameters; return false; } emit q->progress("Found Presentation Context"); emit q->progress(1); // do the actual move request OFCondition status = this->SCU.sendCGETRequest ( presID, retrieveParameters, &responses ); emit q->progress("Sent Get Request"); emit q->progress(2); // Close association if we do not want to explicitly keep it open if (!this->KeepAssociationOpen) { this->SCU.closeAssociation(DCMSCU_RELEASE_ASSOCIATION); } // Free some (little) memory delete retrieveParameters; // If we do not receive a single response, something is fishy if ( responses.begin() == responses.end() ) { logger.error ( "No responses received at all! (at least one empty response always expected)" ); //throw std::runtime_error( std::string("No responses received from server!") ); emit q->progress("No Responses from Server!"); return false; } emit q->progress("Got Responses"); emit q->progress(3); /* The server is permitted to acknowledge every image that was received, or * to send a single move response. * If there is only a single response, this can mean the following: * 1) No images to transfer (Status Success and Number of Completed Subops = 0) * 2) All images transferred (Status Success and Number of Completed Subops > 0) * 3) Error code, i.e. no images transferred * 4) Warning (one or more failures, i.e. some images transferred) */ if ( responses.size() == 1 ) { RetrieveResponse* rsp = *responses.begin(); logger.debug ( "GET response receveid with status: " + QString(DU_cmoveStatusString(rsp->m_status)) ); if ( (rsp->m_status == STATUS_Success) || (rsp->m_status == STATUS_GET_Warning_SubOperationsCompleteOneOrMoreFailures)) { if (rsp->m_numberOfCompletedSubops == 0) { logger.error ( "No images transferred by PACS!" ); //throw std::runtime_error( std::string("No images transferred by PACS!") ); return false; } } else { logger.error("GET request failed, server does report error"); QString statusDetail("No details"); if (rsp->m_statusDetail != NULL) { std::ostringstream out; rsp->m_statusDetail->print(out); statusDetail = "Status Detail: " + statusDetail.fromStdString(out.str()); } statusDetail.prepend("GET request failed: "); logger.error(statusDetail); //throw std::runtime_error( statusDetail.toStdString() ); return false; } } // Select the last GET response to output meaningful status information OFIterator<RetrieveResponse*> it = responses.begin(); Uint32 numResults = responses.size(); for (Uint32 i = 1; i < numResults; i++) { it++; } logger.debug ( "GET responses report for study: " + studyInstanceUID +"\n" + QString::number(static_cast<unsigned int>((*it)->m_numberOfCompletedSubops)) + " images transferred, and\n" + QString::number(static_cast<unsigned int>((*it)->m_numberOfWarningSubops)) + " images transferred with warning, and\n" + QString::number(static_cast<unsigned int>((*it)->m_numberOfFailedSubops)) + " images transfers failed"); emit q->progress("Finished Get"); emit q->progress(100); return true; }