Read PDVInputStream dicomObject information on onCStoreRQ association request

480 views Asked by At

I am trying to read (and then store to 3rd party local db) certain DICOM object tags "during" an incoming association request.

For accepting association requests and storing locally my dicom files i have used a modified version of dcmrcv() tool. More specifically i have overriden onCStoreRQ method like:

@Override
protected void onCStoreRQ(Association association, int pcid, DicomObject dcmReqObj,
                                PDVInputStream dataStream, String transferSyntaxUID,
                                DicomObject dcmRspObj)
            throws DicomServiceException, IOException {

    final String classUID = dcmReqObj.getString(Tag.AffectedSOPClassUID);
    final String instanceUID = dcmReqObj.getString(Tag.AffectedSOPInstanceUID);

    config = new GlobalConfig();
    final File associationDir = config.getAssocDirFile();

    final String prefixedFileName = instanceUID;
    final String dicomFileBaseName = prefixedFileName + DICOM_FILE_EXTENSION;
    File dicomFile = new File(associationDir, dicomFileBaseName);
    assert !dicomFile.exists();

    final BasicDicomObject fileMetaDcmObj = new BasicDicomObject();
    fileMetaDcmObj.initFileMetaInformation(classUID, instanceUID, transferSyntaxUID);
    final DicomOutputStream outStream = new DicomOutputStream(new BufferedOutputStream(new FileOutputStream(dicomFile), 600000));

    //i would like somewhere here to extract some TAGS from incoming dicom object. By trying to do it using dataStream my dicom files
    //are getting corrupted!
    //System.out.println("StudyInstanceUID: " + dataStream.readDataset().getString(Tag.StudyInstanceUID));

    try {
        outStream.writeFileMetaInformation(fileMetaDcmObj);
        dataStream.copyTo(outStream);

    } finally {

        outStream.close();  
    }
        dicomFile.renameTo(new File(associationDir, dicomFileBaseName));
        System.out.println("DICOM file name: " + dicomFile.getName());
    }

    @Override
    public void associationAccepted(final AssociationAcceptEvent associationAcceptEvent) {
    ....
    @Override
    public void associationClosed(final AssociationCloseEvent associationCloseEvent) {
    ...
}

I would like somewhere between this code to intercept a method wich will read dataStream and will parse specific tags and store to a local database.

However wherever i try to put a piece of code that tries to manipulate (just read for start) dataStream then my dicom files get corrupted!

PDVInputStream is implementing java.io.InputStream ....

Even if i try to just put a:

System.out.println("StudyInstanceUID: " + dataStream.readDataset().getString(Tag.StudyInstanceUID));

before copying datastream to outStream ... then my dicom files are getting corrupted (1KB of size) ...

How am i supposed to use datastream in a CStoreRQ association request to extract some information?

I hope my question is clear ...

1

There are 1 answers

0
cneller On

The PDVInputStream is probably a PDUDecoder class. You'll have to reset the position when using the input stream multiple times.

Maybe a better solution would be to store the DICOM object in memory and use that for both purposes. Something akin to:

DicomObject dcmobj = dataStream.readDataset();
String whatYouWant = dcmobj.get( Tag.whatever );
dcmobj.initFileMetaInformation( transferSyntaxUID );
outStream.writeDicomFile( dcmobj );