/// <summary>
        ///    Throttle requests using W(O) = mO(t) + c where W is the wait period, O is the opertaion duration, m and c are positive constants
        ///    Uses a new client every time which is released before return
        /// </summary>
        #region ThrottleRequest
        public void ThrottleRequest(DicomRequest dicomRequest, GracefulCancellationToken cancellationToken)
        {
            var client = new DicomClient();

            ThrottleRequest(dicomRequest, client, cancellationToken);
            client.Release();
        }
        /// <summary>
        ///     Blocks until the request is received so calling code doesn't have to deal with asynchrony (see the EventWaitHandle in TrySend).
        ///     Only the timeout is applied no Throtelling
        /// </summary>
        /// <param name="dicomRequest"></param>
        #region SendRequest
        public void SendRequest(DicomRequest dicomRequest)
        {
            var client = new DicomClient();

            SendRequest(dicomRequest, client);
            client.Release();
        }
        public override Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout)
        {
            RemoveRequestFromPendingList(request);

            _dicomClient.NotifyRequestTimedOut(new RequestTimedOutEventArgs(request, timeout));

            return(CompletedTaskProvider.CompletedTask);
        }
        public override Task AddRequestAsync(DicomRequest dicomRequest)
        {
            _dicomClient.QueuedRequests.Enqueue(new StrongBox <DicomRequest>(dicomRequest));

            _onRequestAddedTaskCompletionSource.TrySetResultAsynchronously(true);

            return(CompletedTaskProvider.CompletedTask);
        }
        public override Task AddRequestAsync(DicomRequest dicomRequest)
        {
            _dicomClient.QueuedRequests.Enqueue(new StrongBox <DicomRequest>(dicomRequest));

            _sendMoreRequests.Set();

            return(CompletedTaskProvider.CompletedTask);
        }
        public RoutedItemClonable(RoutedItemManager manager)
        {
            Throw.IfNull(manager);

            _ruleDicomTags   = manager.ruleDicomTags;
            _ruleDicomTag    = manager.ruleDicomTag;
            _rules           = manager.rules;
            _sourceDicomFile = manager.sourceDicomFile;
            _destDicomFile   = manager.destDicomFile;
            _dicomRequest    = manager.dicomRequest;
            _stream          = manager.stream;
        }
Example #7
0
        public void MyDelegate(MyParameters p)
        {
            Leadtools.AddIn.StorageCommit.StorageCommit commit = new Leadtools.AddIn.StorageCommit.StorageCommit();
            DicomRequest request = new DicomRequest(p._client);

            this.AddCommitItem(p._ds, DicomTag.ReferencedPerformedProcedureStepSequence, commit);
            this.AddCommitItem(p._ds, DicomTag.ReferencedSOPSequence, commit);
            foreach (StorageCommitItem item in commit.Items)
            {
                string          sql = string.Format("SELECT * FROM Images WHERE SOPInstanceUID = '{0}'", item.SOPInstanceUID);
                SqlCeDataReader r   = SqlCeHelper.ExecuteReader(p._connectionString, sql);
                if (r.Read())
                {
                    if (r["SOPClassUID"].ToString() == item.SOPClassUID)
                    {
                        string referencedFile = r["referencedFile"].ToString();
                        if (File.Exists(referencedFile))
                        {
                            item.Status = DicomCommandStatusType.Success;
                        }
                        else
                        {
                            item.Status = DicomCommandStatusType.NoSuchObjectInstance;
                        }
                    }
                    else
                    {
                        item.Status = DicomCommandStatusType.ClaseInstanceConflict;
                    }
                    item.StudyInstanceUID = r["StudyInstanceUID"].ToString();
                }
                else
                {
                    item.Status = DicomCommandStatusType.NoSuchObjectInstance;
                }
                r.Close();
            }
            DicomDataSet        commitDS = BuildDataset(p._client, commit, p.ServerAE);
            PresentationContext pc       = new PresentationContext();

            pc.AbstractSyntax = DicomUidType.StorageCommitmentPushModelClass;
            pc.TransferSyntaxes.Add(DicomUidType.ImplicitVRLittleEndian);
            request.PresentationContexts.Add(pc);
            request.RequireMessagePump = true;

            request.ReceiveNReportResponse += new ReceiveNReportResponseDelegate(request_ReceiveNReportResponse);
            request.ConnectType             = ConnectType.Conditional;

            _DicomRequest.SendNReportRequest(request, p._presentationId, p._messageId, DicomUidType.StorageCommitmentPushModelClass,
                                             DicomUidType.StorageCommitmentPushModelInstance,
                                             commit.FailedCount > 0 ? 2 : 1, commitDS);
        }
        private void UpdateMppsStatusInLocalCollections(DicomRequest request)
        {
            var description = string.Format("{0} -> {1}", request.Dataset.Get <string>(DicomTag.PatientID), request.Dataset.Get <string>(DicomTag.PerformedProcedureStepStatus));

            var patientId = request.Dataset.Get <string>(DicomTag.PatientID);
            var status    = request.Dataset.Get <string>(DicomTag.PerformedProcedureStepStatus);

            var item = m_WorklistRepository.WorklistItems.Single(w => w.Get <string>(DicomTag.PatientID).Equals(patientId));

            item.AddOrUpdate(DicomTag.PerformedProcedureStepStatus, status);

            SetMppsStatusFromItem(item);
        }
Example #9
0
        public override Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response)
        {
            _pendingRequests.TryRemove(request.MessageID, out DicomRequest _);

            if (_pendingRequests.IsEmpty)
            {
                if (_dicomClient.QueuedRequests.IsEmpty)
                {
                    _allRequestsHaveCompletedTaskCompletionSource.TrySetResultAsynchronously(new AllRequestsHaveCompletedEvent());
                }
                else
                {
                    _sendMoreRequests.Set();
                }
            }

            return(CompletedTaskProvider.CompletedTask);
        }
        private void RemoveRequestFromPendingList(DicomRequest request)
        {
            _pendingRequests.TryRemove(request.MessageID, out DicomRequest _);

            if (_pendingRequests.IsEmpty)
            {
                if (_dicomClient.QueuedRequests.IsEmpty || _numberOfSentRequests >= _maximumNumberOfRequestsPerAssociation)
                {
                    _allRequestsHaveCompletedTaskCompletionSource.TrySetResultAsynchronously(new AllRequestsHaveCompletedEvent());
                }
                else
                {
                    _sendMoreRequests.Set();
                }
            }
            else if (Connection.IsSendNextMessageRequired)
            {
                _sendMoreRequests.Set();
            }
        }
Example #11
0
 public Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout) => Task.CompletedTask;
 public Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response)
 {
     return(DicomClient.OnRequestCompletedAsync(request, response));
 }
        public override Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response)
        {
            RemoveRequestFromPendingList(request);

            return(CompletedTaskProvider.CompletedTask);
        }
 /// <summary>
 ///    Throttle requests using W(O) = mO(t) + c where W is the wait period, O is the opertaion duration, m and c are positive constants
 ///    The request is added to the client which is unreleased at the end of this request send.
 /// </summary>
 ///
 #region ThrottleRequest
 public void ThrottleRequest(DicomRequest dicomRequest, DicomClient client, CancellationToken cancellationToken)
 {
     client.AddRequestAsync(dicomRequest).Wait(cancellationToken);
     ThrottleRequest(client, cancellationToken);
 }
        /// <summary>
        ///     Blocks until the request is received so calling code doesn't have to deal with asynchrony (see the EventWaitHandle in TrySend).
        ///     Only the timeout is applied no Throtelling
        /// </summary>
        /// <param name="dicomRequest"></param>
        #region SendRequest
        private void SendRequest(DicomRequest dicomRequest, CancellationToken token)
        {
            var client = new DicomClient(_dicomConfiguration.RemoteAetUri.Host, _dicomConfiguration.RemoteAetUri.Port, false, _dicomConfiguration.LocalAetTitle, _dicomConfiguration.RemoteAetTitle);

            SendRequest(dicomRequest, client, token);
        }
 /// <summary>
 /// Initializes an instance of <see cref="RequestTimedOutEventArgs"/>
 /// </summary>
 /// <param name="request"></param>
 /// <param name="timeout"></param>
 public RequestTimedOutEventArgs(DicomRequest request, TimeSpan timeout)
 {
     Request = request;
     Timeout = timeout;
 }
 public Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout)
 {
     return(DicomClient.OnRequestTimedOutAsync(request, timeout));
 }
 public abstract Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout);
Example #19
0
        public void HandleNReport(StorageCommitArgs p)
        {
            StorageCommitment       commitRequest = p.RequestDS.Get <StorageCommitment>();
            StorageCommitmentResult commitResult  = new StorageCommitmentResult();

            commitResult.TransactionUID  = commitRequest.TransactionUID;
            commitResult.RetrieveAETitle = p.Client.AETitle; //p.Client.Server.AETitle;

            int failedCount = 0;

            foreach (SopInstanceReference referencedSop in commitRequest.ReferencedSOPSequence)
            {
                string referencedFile = GetInstanceFileName.FindReferencedFile(referencedSop.ReferencedSopInstanceUid);
                bool   success        = !string.IsNullOrEmpty(referencedFile) && File.Exists(referencedFile);

                if (success)
                {
                    // Success
                    if (commitResult.ReferencedSOPSequence == null)
                    {
                        commitResult.ReferencedSOPSequence = new List <SCSOPInstanceReference>();
                    }

                    SCSOPInstanceReference scSopInstanceReference = new SCSOPInstanceReference();
                    scSopInstanceReference.RetrieveAETitle          = commitResult.RetrieveAETitle;
                    scSopInstanceReference.ReferencedSopClassUid    = referencedSop.ReferencedSopClassUid;
                    scSopInstanceReference.ReferencedSopInstanceUid = referencedSop.ReferencedSopInstanceUid;
                    commitResult.ReferencedSOPSequence.Add(scSopInstanceReference);
                }
                else
                {
                    // Fail

                    if (commitResult.FailedSOPSequence == null)
                    {
                        commitResult.FailedSOPSequence = new List <SCFailedSOPInstanceReference>();
                    }

                    SCFailedSOPInstanceReference scFailedSopInstanceReference = new SCFailedSOPInstanceReference();
                    scFailedSopInstanceReference.ReferencedSopClassUid    = referencedSop.ReferencedSopClassUid;
                    scFailedSopInstanceReference.ReferencedSopInstanceUid = referencedSop.ReferencedSopInstanceUid;

                    // The following values and semantics shall be used for the Failure Reason Attribute:
                    // 0110H - DicomCommandStatusType.ProcessingFailure       - Processing failure A general failure in processing the operation was encountered.
                    // 0112H - DicomCommandStatusType.NoSuchObjectInstance    - No such object instance One or more of the elements in the Referenced SOP Instance Sequence was not available.
                    // 0213H - DicomCommandStatusType.ResourceLimitation      - Resource limitation The SCP does not currently have enough resources to store the requested SOP Instance(s).
                    // 0122H - DicomCommandStatusType.ClassNotSupported       - Referenced SOP Class not supported Storage Commitment has been requested for a SOP Instance with a SOP Class thatis not supported by the SCP.
                    // 0119H - DicomCommandStatusType.ClaseInstanceConflict   - Class / Instance conflict The SOP Class of an element in the Referenced SOP Instance Sequence did not correspond to theSOP class registered for this SOP Instance at the SCP.
                    // 0131H - DicomCommandStatusType.DuplicateTransactionUid - Duplicate transaction UID The Transaction UID of the Storage Commitment Request is already in use.
                    scFailedSopInstanceReference.FailureReason = (int)DicomCommandStatusType.NoSuchObjectInstance;

                    commitResult.FailedSOPSequence.Add(scFailedSopInstanceReference);
                    failedCount++;
                }
            }

            DicomDataSet resultDS = new DicomDataSet();

            resultDS.Set(commitResult);

            PresentationContext pc = new PresentationContext();

            pc.AbstractSyntax = DicomUidType.StorageCommitmentPushModelClass;
            pc.TransferSyntaxes.Add(DicomUidType.ImplicitVRLittleEndian);

            DicomRequest request = new DicomRequest(p.Client);

            request.PresentationContexts.Add(pc);
            request.RequireMessagePump = true;

            request.ReceiveNReportResponse += new ReceiveNReportResponseDelegate(request_ReceiveNReportResponse);

            request.ConnectType = ConnectType.Conditional;
            // request.ConnectType = ConnectType.New;

            // eventTypeId   - 1 -- All success
            //               - 2 -- One or more failures
            int eventTypeId = failedCount > 0 ? 2 : 1;

            _dicomRequest.SendNReportRequest(request,
                                             p.PresentationId,
                                             p.MessageId,
                                             DicomUidType.StorageCommitmentPushModelClass,
                                             DicomUidType.StorageCommitmentPushModelInstance,
                                             eventTypeId,
                                             resultDS);
        }
Example #20
0
 public Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout)
 {
     return(CompletedTaskProvider.CompletedTask);
 }
Example #21
0
 public Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response) => Task.CompletedTask;
Example #22
0
 public Task AddRequestAsync(DicomRequest dicomRequest)
 {
     _dicomClient.QueuedRequests.Enqueue(new StrongBox <DicomRequest>(dicomRequest));
     return(Task.CompletedTask);
 }
Example #23
0
 private static void request_ReceiveNReportResponse(DicomRequest request, byte presentationID, int messageID, string affectedClass, string instance, DicomCommandStatusType status, int dicomEvent, DicomDataSet dataSet)
 {
 }
Example #24
0
 internal Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response)
 => State.OnRequestCompletedAsync(request, response);
 public abstract Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response);
Example #26
0
 internal Task OnRequestTimedOutAsync(DicomRequest request, TimeSpan timeout)
 => State.OnRequestTimedOutAsync(request, timeout);
 public abstract Task AddRequestAsync(DicomRequest dicomRequest);
Example #28
0
 public Task AddRequestAsync(DicomRequest dicomRequest)
 => State.AddRequestAsync(dicomRequest);
Example #29
0
 public Task OnRequestCompletedAsync(DicomRequest request, DicomResponse response)
 {
     return(CompletedTaskProvider.CompletedTask);
 }
        /// <summary>
        ///     Blocks until the request is received so calling code doesn't have to deal with asynchrony (see the EventWaitHandle in TrySend).
        ///     Only the timeout is applied no Throtelling, the client is unreleased on return
        /// </summary>
        /// <param name="dicomRequest"></param>
        /// <param name="client"></param>

        #region SendRequest
        public void SendRequest(DicomRequest dicomRequest, DicomClient client, CancellationToken token)
        {
            client.AddRequestAsync(dicomRequest).Wait(token);
            SendRequest(client, token);
        }