/* * * Copyright (C) 1996-2011, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by * * OFFIS e.V. * R&D Division Health * Escherweg 2 * D-26121 Oldenburg, Germany * * * Module: dcmwlm * * Author: Thomas Wilkens * * Purpose: Class for connecting to a file-based data source. * */ #ifndef WlmDataSourceFileSystem_h #define WlmDataSourceFileSystem_h #include "dcmtk/config/osconfig.h" #include "dcmtk/dcmwlm/wlds.h" #include "dcmtk/dcmwlm/wlfsim.h" //class WlmFileSystemInteractionManager; class DcmItem; class DcmDataset; class OFCondition; class DcmElement; class DcmItem; /** This class encapsulates data structures and operations for connecting to a file-based * data source in the framework of the DICOM basic worklist management service. */ class DCMTK_DCMWLM_EXPORT WlmDataSourceFileSystem : public WlmDataSource { protected: /// manager for file system interaction WlmFileSystemInteractionManager fileSystemInteractionManager; /// path to database files OFString dfPath; /// indicates if wl-files which are lacking return type 1 attributes or information in such attributes shall be rejected or not OFBool enableRejectionOfIncompleteWlFiles; /// handle to the read lock file int handleToReadLockFile; /** This function sets a read lock on the LOCKFILE in the directory * that is specified through dfPath and calledApplicationEntityTitle. * @return true in case the read lock has been set successfully, false otherwise. */ OFBool SetReadlock(); /** This function releases a read lock on the LOCKFILE in the given directory. * @return true in case the read lock has been released successfully, false otherwise. */ OFBool ReleaseReadlock(); /** This function takes care of handling a certain non-sequence element whithin * the structure of a certain result dataset. This function assumes that all * elements in the result dataset are supported. In detail, a value for the * current element with regard to the currently processed matching record will * be requested from the fileSystemInteractionManager, and this value will be * set in the element. * @param element Pointer to the currently processed element. * @param idx Index of the matching record (identifies this record). */ void HandleNonSequenceElementInResultDataset( DcmElement *element, unsigned long idx ); /** This function takes care of handling a certain sequence element within the structure * of a certain result dataset. On the basis of the matching record from the data source, * this function will add items and values for all elements in these items to the current * sequence element in the result dataset. This function assumes that all elements in the * result dataset are supported. In case the current sequence element contains no items or * more than one item, this element will be left unchanged. * @param element Pointer to the currently processed element. * @param idx Index of the matching record (identifies this record). */ void HandleSequenceElementInResultDataset( DcmElement *element, unsigned long idx ); /** Protected undefined copy-constructor. Shall never be called. * @param Src Source object. */ WlmDataSourceFileSystem( const WlmDataSourceFileSystem &Src ); /** Protected undefined operator=. Shall never be called. * @param Src Source object. * @return Reference to this. */ WlmDataSourceFileSystem &operator=( const WlmDataSourceFileSystem &Src ); public: /** default constructor. */ WlmDataSourceFileSystem(); /** destructor */ ~WlmDataSourceFileSystem(); /** Connects to the data source. * @return Indicates if the connection was established succesfully. */ OFCondition ConnectToDataSource(); /** Disconnects from the data source. * @return Indicates if the disconnection was completed succesfully. */ OFCondition DisconnectFromDataSource(); /** Set value in member variable. * @param value The value to set. */ void SetDfPath( const OFString& value ); /** Set value in member variable. * @param value The value to set. */ void SetEnableRejectionOfIncompleteWlFiles( OFBool value ); /** Checks if the called application entity title is supported. This function expects * that the called application entity title was made available for this instance through * WlmDataSource::SetCalledApplicationEntityTitle(). If this is not the case, OFFalse * will be returned. * @return OFTrue, if the called application entity title is supported; * OFFalse, if the called application entity title is not supported or it is not given. */ OFBool IsCalledApplicationEntityTitleSupported(); /** This function performs a check on two attributes in the given dataset. At two different places * in the definition of the DICOM worklist management service, a description attribute and a code * sequence attribute with a return type of 1C are mentioned, and the condition specifies that * either the description attribute or the code sequence attribute or both shall be supported by * an SCP. (I am talking about RequestedProcedureDescription vs. RequestedProcedureCodeSequence * and ScheduledProcedureStepDescription vs. ScheduledProtocolCodeSequence.) In both cases, this * implementation actually supports both, the description _and_ the code sequence attributes. * In cases where the description attribute is actually empty or the code sequence attribute * is actually empty or contains exactly one item with an empty CodeValue and an empty * CodingSchemeDesignator, we want to remove the empty attribute from the dataset. This is what * this function does. (Please note, that this function will always only delete one of the two, * and this function will start checking the sequence attribute. * @param dataset Dataset in which the consistency of the two attributes shall be checked. * @param descriptionTagKey DcmTagKey of the description attribute which shall be checked. * @param codeSequenceTagKey DcmTagKey of the codeSequence attribute which shall be checked. */ void HandleExistentButEmptyDescriptionAndCodeSequenceAttributes( DcmItem *dataset, const DcmTagKey &descriptionTagKey, const DcmTagKey &codeSequenceTagKey ); /** This function performs a check on a sequence attribute in the given dataset. At two different places * in the definition of the DICOM worklist management service, a sequence attribute with a return type * of 2 is mentioned containing two 1C attributes in its item; the condition of the two 1C attributes * specifies that in case a sequence item is present, then these two attributes must be existent and * must contain a value. (I am talking about ReferencedStudySequence and ReferencedPatientSequence.) * In cases where the sequence attribute contains exactly one item with an empty ReferencedSOPClass * and an empty ReferencedSOPInstance, we want to remove the item from the sequence. This is what * this function does. * @param dataset Dataset in which the consistency of the sequence attribute shall be checked. * @param sequenceTagKey DcmTagKey of the sequence attribute which shall be checked. */ void HandleExistentButEmptyReferencedStudyOrPatientSequenceAttributes( DcmDataset *dataset, const DcmTagKey &sequenceTagKey ); /** Based on the search mask which was passed, this function determines all the records in the * worklist database files which match the values of matching key attributes in the search mask. * For each matching record, a DcmDataset structure is generated which will later be * returned to the SCU as a result of query. The DcmDataset structures for all matching * records will be stored in the protected member variable matchingDatasets. * @param findRequestIdentifiers Contains the search mask. * @return A WlmDataSourceStatusType value denoting the following: * WLM_SUCCESS: No matching records found; * WLM_PENDING: Matching records found, all return keys supported by this application; * WLM_PENDING_WARNING: Matching records found, not all return keys supported by this application; * WLM_FAILED_IDENTIFIER_DOES_NOT_MATCH_SOP_CLASS: Error in the search mask encountered. */ WlmDataSourceStatusType StartFindRequest( const DcmDataset &findRequestIdentifiers ); /** This function will return the next dataset that matches the given search mask, if * there is one more resulting dataset to return. In such a case, rstatus will be set * to WLM_PENDING or WLM_PENDING_WARNING, depending on if an unsupported key attribute * was encountered in the search mask or not. If there are no more datasets that match * the search mask, this function will return an empty dataset and WLM_SUCCESS in rstatus. * @param rStatus A value of type WlmDataSourceStatusType that can be used to * decide if there are still elements that have to be returned. * @return The next dataset that matches the given search mask, or an empty dataset if * there are no more matching datasets in the worklist database files. */ DcmDataset *NextFindResponse( WlmDataSourceStatusType &rStatus ); }; #endif