public virtual FileMetaInfo NewFileMetaInfo(DataSet ds, String transferSyntaxUID)
 {
     try {
         return new FileMetaInfo().Init(ds.GetString(Tags.SOPClassUniqueId, null),
                                        ds.GetString(Tags.SOPInstanceUniqueId, null), transferSyntaxUID,
                                        Implementation.ClassUID, Implementation.VersionName);
     }
     catch (DcmValueException ex) {
         throw new ArgumentException(ex.Message);
     }
 }
Exemple #2
0
 private String ToFileID(DataSet ds, uint tag)
 {
     try {
         String s = ds.GetString(tag);
         if (string.IsNullOrEmpty(s)) {
             return "__NULL__";
         }
         char[] ins = s.ToUpper().ToCharArray();
         var outs = new char[Math.Min(8, ins.Length)];
         for (int i = 0; i < outs.Length; ++i) {
             outs[i] = ins[i] >= '0' && ins[i] <= '9' || ins[i] >= 'A' && ins[i] <= 'Z' ? ins[i] : '_';
         }
         return new String(outs);
     }
     catch (DcmValueException dcmValueException) {
         Logger.Error(dcmValueException);
         return "__ERR__";
     }
 }
        private FutureDimseResponse SendDataset(IActiveAssociation activeAssociation, DcmParser parser, DataSet dataSet)
        {
            String sopInstUniqueId = dataSet.GetString(Tags.SOPInstanceUniqueId);
            if (string.IsNullOrEmpty(sopInstUniqueId))
            {
                Logger.Error("SOP instance UniqueId is null or empty");
                return null;
            }
            String sopClassUniqueId = dataSet.GetString(Tags.SOPClassUniqueId);
            if (string.IsNullOrEmpty(sopClassUniqueId))
            {
                Logger.Error("SOP class UniqueId is null or empty");
                return null;
            }
            PresentationContext pc = null;
            IAssociation association = activeAssociation.Association;

            if (parser != null)
            {
                if (parser.DcmDecodeParam.encapsulated)
                {
                    String tsUniqueId = dataSet.FileMetaInfo.TransferSyntaxUniqueId;
                    if ((pc = association.GetAcceptedPresContext(sopClassUniqueId, tsUniqueId)) == null)
                    {
                        Logger.Error(SOP_CLASS_UNIQUEID_NOT_SUPPORTED);
                        return null;
                    }
                }
                else if (IsSopClassUniqueIdNotSupported(association, sopClassUniqueId, out pc))
                {
                    Logger.Error(SOP_CLASS_UNIQUEID_NOT_SUPPORTED);
                    return null;
                }

                DicomCommand cStoreRequest = _dcmObjectFactory.NewCommand().InitCStoreRQ(association.NextMsgID(), sopClassUniqueId, sopInstUniqueId, Priority.HIGH);
                return activeAssociation.Invoke(_associationFactory.NewDimse(pc.pcid(), cStoreRequest, new FileDataSource(parser, dataSet, new byte[2048])));
            }
            if ((dataSet.FileMetaInfo != null) && (dataSet.FileMetaInfo.TransferSyntaxUniqueId != null))
            {
                String tsUniqueId = dataSet.FileMetaInfo.TransferSyntaxUniqueId;
                if ((pc = association.GetAcceptedPresContext(sopClassUniqueId, tsUniqueId)) == null)
                {
                    Logger.Error(SOP_CLASS_UNIQUEID_NOT_SUPPORTED);
                    return null;
                }
            }
            else if (IsSopClassUniqueIdNotSupported(association, sopClassUniqueId, out pc))
            {
                Logger.Error(SOP_CLASS_UNIQUEID_NOT_SUPPORTED);
                return null;
            }

            DicomCommand cStoreRq = _dcmObjectFactory.NewCommand().InitCStoreRQ(association.NextMsgID(), sopClassUniqueId, sopInstUniqueId, Priority.HIGH);
            IDimse dimse = _associationFactory.NewDimse(pc.pcid(), cStoreRq, dataSet);
            return activeAssociation.Invoke(dimse);
        }
Exemple #4
0
        private FileInfo ToFile(DataSet ds)
        {
            String studyInstanceUniqueId = null;
            try {
                studyInstanceUniqueId = ds.GetString(Tags.StudyInstanceUniqueId);
                if (studyInstanceUniqueId == null) {
                    throw new DcmServiceException(MISSING_UID, "Missing Study Instance UID");
                }
                if (ds.Vm(Tags.SeriesInstanceUniqueId) <= 0) {
                    throw new DcmServiceException(MISSING_UID, "Missing Series Instance UID");
                }
                String instanceUniqueId = ds.GetString(Tags.SOPInstanceUniqueId);
                if (instanceUniqueId == null) {
                    throw new DcmServiceException(MISSING_UID, "Missing SOP Instance UID");
                }
                String classUniqueId = ds.GetString(Tags.SOPClassUniqueId);
                if (classUniqueId == null) {
                    throw new DcmServiceException(MISSING_UID, "Missing SOP Class UID");
                }
                if (!instanceUniqueId.Equals(ds.FileMetaInfo.MediaStorageSOPInstanceUniqueId)) {
                    throw new DcmServiceException(MISMATCH_UID,
                                                  "SOP Instance UID in DataSet differs from Affected SOP Instance UID");
                }
                if (!classUniqueId.Equals(ds.FileMetaInfo.MediaStorageSOPClassUniqueId)) {
                    throw new DcmServiceException(MISMATCH_UID,
                                                  "SOP Class UID in DataSet differs from Affected SOP Class UID");
                }
            }
            catch (DcmValueException e) {
                throw new DcmServiceException(CANNOT_UNDERSTAND, e);
            }

            String pn = ToFileID(ds, Tags.PatientName) + "____";
            FileInfo dir = _archiveDirectory;
            for (int i = 0; i < dirSplitLevel; ++i) {
                dir = new FileInfo(dir.FullName + "\\" + pn.Substring(0, (i + 1) - (0)));
            }
            dir = new FileInfo(dir.FullName + "\\" + studyInstanceUniqueId);
            dir = new FileInfo(dir.FullName + "\\" + ToFileID(ds, Tags.SeriesNumber));
            var file = new FileInfo(dir.FullName + "\\" + ToFileID(ds, Tags.InstanceNumber) + ".dcm");
            return file;
        }
        /// <summary>
        /// Send C-STORE
        /// </summary>
        /// <param name="dataSet"></param>
        public bool CStore(DataSet dataSet)
        {
            int pcid = _presentationContextIdStart;
            _presentationContextIdStart += 2;
            IActiveAssociation active = null;
            try
            {
                //
                // Prepare association
                //
                String classUniqueId = dataSet.GetString(Tags.SOPClassUniqueId);
                String tsUniqueId = dataSet.GetString(Tags.TransferSyntaxUniqueId);

                if (string.IsNullOrEmpty(tsUniqueId) && (dataSet.FileMetaInfo != null))
                {
                    tsUniqueId = dataSet.FileMetaInfo.GetString(Tags.TransferSyntaxUniqueId);
                }

                if (string.IsNullOrEmpty(tsUniqueId))
                {
                    tsUniqueId = UIDs.ImplicitVRLittleEndian;
                }

                _aAssociateRequest.AddPresContext(_associationFactory.NewPresContext(pcid, classUniqueId, new[] { tsUniqueId }));
                active = OpenAssociation();
                if (active != null)
                {
                    bool bResponse = false;
                    FutureDimseResponse frsp = SendDataset(active, null, dataSet);
                    if (frsp != null)
                    {
                        active.WaitOnResponse();
                        bResponse = true;
                    }
                    return bResponse;
                }
            }
            finally
            {
                if (active != null)
                {
                    active.Release(true);
                }
                _aAssociateRequest.RemovePresentationContext(pcid);
            }

            return false;
        }