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); } }
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); }
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; }