コード例 #1
0
ファイル: ConfigureDialog.cs プロジェクト: sakpung/webstudy
        private void toolStripButtonViewInfo_Click(object sender, EventArgs e)
        {
            StoreFailure      failure = listViewDatasets.SelectedItems[0].Tag as StoreFailure;
            ViewDatasetDialog dlgView = new ViewDatasetDialog(failure.Dataset);

            dlgView.ShowDialog(this);
        }
コード例 #2
0
        private Dictionary <string, StoreFailure> LoadStoreFailures(string failureDirectory)
        {
            Dictionary <string, StoreFailure> failures = new Dictionary <string, StoreFailure>();
            IEnumerable <FileInfo>            files    = FileSearcher.GetFiles(new DirectoryInfo(failureDirectory), "store*.fail", SearchOption.TopDirectoryOnly);

            foreach (FileInfo file in files.OrderBy(f => f.CreationTime))
            {
                try
                {
                    StoreFailure failure = Utils.LoadFromXml <StoreFailure>(file.FullName);

                    if (!string.IsNullOrEmpty(failure.FileName))
                    {
                        failure.Dataset = new DicomDataSet();
                        failure.Dataset.Load(failure.FileName, DicomDataSetLoadFlags.None);
                    }

                    failures.Add(file.FullName, failure);
                }
                catch (Exception e)
                {
                    Messager.ShowError(_View as Form, e);
                }
            }
            return(failures);
        }
コード例 #3
0
        public void Store()
        {
            StoreFailure storeFailures = new StoreFailure();
            DicomServer  dcmServer     = ServiceLocator.Retrieve <DicomServer>();

            try
            {
                foreach (DicomScp scp in _Scps)
                {
                    string lastStatus = string.Empty;
                    string clientAE   = Module._Options.AETitle.Length > 0 ? Module._Options.AETitle : dcmServer.AETitle;

                    //
                    // If the store operation failed and we have enabled retry we need to schedule this action to be retried again
                    //
                    if (!Store(clientAE, scp, _DataSet, ref lastStatus))
                    {
                        ResendServer server = new ResendServer(scp);

                        server.AETitle    = clientAE;
                        server.RetryCount = NumberOfRetries;
                        server.LastStatus = lastStatus;
                        server.IPAddress  = scp.PeerAddress.ToString();
                        storeFailures.Scps.Add(server);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Global.SystemException(string.Empty, ex);
            }

            if (storeFailures.Scps.Count > 0)
            {
                storeFailures.Dataset = _DataSet;
                if (EnableRetry && NumberOfRetries > 0)
                {
                    Job <StoreFailure> retryJob = new Job <StoreFailure>()
                    {
                        Loops = 1, Data = storeFailures
                    };

                    retryJob.StartTime = Timeout.Milliseconds().FromNow();
                    Module.Scheduler.SubmitJob <StoreFailure>(retryJob, Retry);
                }
                else
                {
                    //
                    // Since we have no retries we will send this to manual resend
                    //
                    storeFailures.Save();
                }
            }
        }
コード例 #4
0
ファイル: ConfigureDialog.cs プロジェクト: sakpung/webstudy
        private void RemoveServerItem(ListViewItem item)
        {
            ResendServer server      = item.Tag as ResendServer;
            ListViewItem failureItem = listViewDatasets.SelectedItems[0];
            StoreFailure failure     = failureItem.Tag as StoreFailure;

            listViewServers.Items.Remove(item);
            failure.Scps.Remove(server);
            if (failure.Scps.Count == 0)
            {
                RemoveFailureItem(failureItem);
            }
        }
コード例 #5
0
ファイル: ConfigureDialog.cs プロジェクト: sakpung/webstudy
        private void LoadServers()
        {
            StoreFailure failure = listViewDatasets.SelectedItems[0].Tag as StoreFailure;

            listViewServers.BeginUpdate();
            listViewServers.Items.Clear();
            foreach (ResendServer server in failure.Scps)
            {
                ListViewItem item = listViewServers.Items.Add(server.LastStatus);

                item.SubItems.Add(server.Scp.AETitle);
                item.SubItems.Add(server.IPAddress);
                item.SubItems.Add(server.Scp.Port.ToString());
                item.Tag = server;
            }
            if (listViewServers.Items.Count > 0)
            {
                listViewServers.Items[0].Selected = true;
            }
            listViewServers.EndUpdate();
        }
コード例 #6
0
ファイル: ConfigureDialog.cs プロジェクト: sakpung/webstudy
        private void RemoveFailureItem(ListViewItem item)
        {
            try
            {
                StoreFailure failure  = item.Tag as StoreFailure;
                string       fileName = item.SubItems[5].Text;

                listViewServers.Items.Clear();
                if (failure != null && failure.Dataset != null)
                {
                    failure.Dataset.Dispose();
                    failure.Dataset = null;
                }
                listViewDatasets.Items.Remove(item);
                failure.Delete();
                File.Delete(fileName);
            }
            catch (Exception e)
            {
                MessageBox.Show(this, e.Message, "Error Deleteting Failure Item", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
コード例 #7
0
ファイル: ConfigureDialog.cs プロジェクト: sakpung/webstudy
        private void SendStoreItem(ListViewItem item)
        {
            StoreFailure failure = item.Tag as StoreFailure;

            using (ProgressDialog progress = new ProgressDialog())
            {
                progress.Title         = "Retrying";
                progress.CancelMessage = "Please wait...";
                progress.Line1         = failure.Dataset.GetValue <string>(DicomTag.PatientName, string.Empty) + "(" + failure.Dataset.GetValue <string>(DicomTag.StudyID, string.Empty) + ")";
                progress.ShowDialog(this, DialogFlags.Modal | DialogFlags.NoMinimize | DialogFlags.AutoTime | DialogFlags.NoProgressBar);
                foreach (ResendServer server in failure.Scps.ToArray())
                {
                    string status = string.Empty;

                    progress.Line2         = server.Scp.AETitle + " - " + server.IPAddress + ":" + server.Scp.Port.ToString();
                    server.Scp.PeerAddress = IPAddress.Parse(server.IPAddress);
                    if (!StoreClient.Store(ProcessorConfiguration.Settings.AETitle, server.Scp, failure.Dataset, ref status))
                    {
                        UpdateServerStatus(server, status);
                    }
                    else
                    {
                        failure.Scps.Remove(server);
                        RemoveServer(server);
                    }
                }
            }

            if (failure.Scps.Count > 0)
            {
                failure.Save();
            }
            else
            {
                listViewDatasets.Items.Remove(item);
                failure.Delete();
            }
        }
コード例 #8
0
        private void Retry(Job <StoreFailure> job, StoreFailure storeFailure)
        {
            int         count     = storeFailure.Scps.Count;
            DicomServer dcmServer = ServiceLocator.Retrieve <DicomServer>();

            foreach (ResendServer server in storeFailure.Scps.ToList())
            {
                string lastStatus = string.Empty;
                bool   success;
                string aetitle = !string.IsNullOrEmpty(server.AETitle) ? server.AETitle : dcmServer.AETitle;

                server.Scp.PeerAddress = IPAddress.Parse(server.IPAddress);
                success = Store(aetitle, server.Scp, storeFailure.Dataset, ref lastStatus);

                server.RetryCount--;
                //
                // If the store operation failed and we do not have not exhausted our retry count we
                // will try to send this dataset again later
                //
                if (!success && server.RetryCount > 0)
                {
                    string retryMessage = server.RetryCount > 0 ? string.Format("are {0} retries", server.RetryCount) : "is only 1 retry";
                    string message      = string.Format("[Rules] Failed to successfully store dataset to {0}. There {1} left.", server.Scp.AETitle, retryMessage);

                    Logger.Global.SystemMessage(LogType.Error, message, string.Empty);
                }
                else
                {
                    //
                    // If the dataset is not successfully store we need to save the info so that it can be manually sent to
                    // its destination.
                    //
                    if (!success)
                    {
                        try
                        {
                            string message = string.Format("[Rules] Failed to successfully store dataset to {0} after {1} retries. Dataset will be added to manual resend queue", server.Scp.AETitle, NumberOfRetries);

                            Logger.Global.SystemMessage(LogType.Error, message, string.Empty);
                        }
                        catch (Exception e)
                        {
                            Logger.Global.SystemException(string.Empty, e);
                        }
                    }
                    else
                    {
                        storeFailure.Scps.Remove(server);
                    }
                }
            }

            //
            // Some items still failed so we need to resubmit
            //
            if (storeFailure.Scps.Count > 0)
            {
                int itemsToRetry = (from scp in storeFailure.Scps
                                    where scp.RetryCount > 0
                                    select scp).Count();


                if (itemsToRetry > 0)
                {
                    Job <StoreFailure> retryJob = new Job <StoreFailure>()
                    {
                        Loops = 1, Data = storeFailure
                    };

                    retryJob.StartTime = Timeout.Milliseconds().FromNow();
                    Module.Scheduler.SubmitJob <StoreFailure>(retryJob, Retry);
                }
                else
                {
                    storeFailure.Save();
                }
            }
        }