void Association ::drop() { if(!this->is_associated()) { throw Exception("Not associated"); } ASC_acknowledgeRelease(this->_association); ASC_dropSCPAssociation(this->_association); ASC_destroyAssociation(&this->_association); this->_association = NULL; }
OFCondition AssociationCleanup(T_ASC_Association *assoc) { OFString temp_str; OFCondition cond = ASC_dropSCPAssociation(assoc); if (cond.bad()) { LOG(FATAL) << cond.text(); return cond; } cond = ASC_destroyAssociation(&assoc); if (cond.bad()) { LOG(FATAL) << cond.text(); return cond; } return cond; }
OFCondition RetrieveDICOMFilesFromPACS::subOperationSCP(T_ASC_Association **subAssociation) { // Ens convertim com en un servei. El PACS ens fa peticions que nosaltres hem de respondre, ens pot demanar descarregar una imatge o fer un echo T_DIMSE_Message dimseMessage; T_ASC_PresentationContextID presentationContextID; if (!ASC_dataWaiting(*subAssociation, 0)) { return DIMSE_NODATAAVAILABLE; } OFCondition condition = DIMSE_receiveCommand(*subAssociation, DIMSE_BLOCKING, 0, &presentationContextID, &dimseMessage, NULL); if (condition == EC_Normal) { switch (dimseMessage.CommandField) { case DIMSE_C_STORE_RQ: condition = storeSCP(*subAssociation, &dimseMessage, presentationContextID); break; case DIMSE_C_ECHO_RQ: condition = echoSCP(*subAssociation, &dimseMessage, presentationContextID); break; default: ERROR_LOG("El PACS ens ha sol.licitat un tipus d'operacio invalida"); condition = DIMSE_BADCOMMANDTYPE; break; } } // Clean up on association termination if (condition == DUL_PEERREQUESTEDRELEASE) { INFO_LOG("El PACS sol.licita tancar la connexio per on ens ha enviat els fitxers"); condition = ASC_acknowledgeRelease(*subAssociation); ASC_dropSCPAssociation(*subAssociation); ASC_destroyAssociation(subAssociation); return condition; } else if (condition == DUL_PEERABORTEDASSOCIATION) { INFO_LOG("El PACS ha abortat la connexió"); } else if (condition != EC_Normal) { ERROR_LOG("S'ha produit un error reben la peticio d'una suboperacio, descripcio error: " + QString(condition.text())); condition = ASC_abortAssociation(*subAssociation); } else if (m_abortIsRequested) { INFO_LOG("Abortarem les connexions amb el PACS, perque han sol.licitant cancel.lar la descarrega"); condition = ASC_abortAssociation(*subAssociation); if (!condition.good()) { ERROR_LOG("Error al abortar la connexio pel qual rebem les imatges" + QString(condition.text())); } // Tanquem la connexió amb el PACS perquè segons indica la documentació DICOM al PS 3.4 (Baseline Behavior of SCP) C.4.2.3.1 si abortem // la connexió per la qual rebem les imatges, el comportament del PACS és desconegut, per exemple DCM4CHEE tanca la connexió amb el PACS, però // el RAIM_Server no la tanca i la manté fent que no sortim mai d'aquesta classe. Degut a que no es pot saber en aquesta situació com actuaran // els PACS es tanca aquí la connexió amb el PACS. condition = ASC_abortAssociation(m_pacsConnection->getConnection()); if (!condition.good()) { ERROR_LOG("Error al abortar la connexio pel amb el PACS" + QString(condition.text())); } else { INFO_LOG("Abortada la connexio amb el PACS"); } } if (condition != EC_Normal) { ASC_dropAssociation(*subAssociation); ASC_destroyAssociation(subAssociation); } return condition; }