private String GetText(WaitObject waitObject)
 {
     return(" " + r_manager.GetValue(waitObject.Address) +
            " Type: " + ((WaitObjectType)waitObject.ObjectType).ToString() +
            " Handle: " + r_manager.GetValue(waitObject.Handle) +
            " Name: " + waitObject.Name);
 }
Beispiel #2
0
        public static double GetCCT(IDataTable <DataRow> data, string a, string b, WaitObject flag)
        {
            int     count = data.RowCount;
            double  xyS   = 0;
            double  xS    = 0;
            double  yS    = 0;
            double  x2S   = 0;
            double  y2S   = 0;
            double  tempx = 0;
            double  tempy = 0;
            DataRow temprow;

            flag.Flags = new int[1];
            flag.Max   = count;
            for (int i = 0; i < count; i++)
            {
                temprow = data[i];
                tempx   = temprow[a].ConvertToDouble();
                tempy   = temprow[b].ConvertToDouble();
                xyS    += tempx * tempy;
                xS     += tempx;
                yS     += tempy;
                x2S    += tempx * tempx;
                y2S    += tempy * tempy;
                flag.Flags[0]++;
            }
            return((xyS * count - xS * yS) / (Math.Pow((x2S * count - xS * xS), 0.5) * Math.Pow((y2S * count - yS * yS), 0.5)));
        }
Beispiel #3
0
 public KMeans(CancellationTokenSource canceltoken, IDataTable <DataRow> data, string[] properties, int maxcount, int minclustercount, int maxclustercount, double[] mean, double[] v, WaitObject wt, int initialmode, int methodmode, int maxthread)
 {
     this.Data            = data;
     this.Properties      = properties;
     this.MaxCount        = maxcount;
     this.DataCount       = data.RowCount;
     this.ParaCount       = properties.Length;
     this.Distences       = new double[this.DataCount, this.ParaCount];
     this.MaxClusterCount = maxclustercount;
     this.MinClusterCount = minclustercount;
     this.WaitObj         = wt;
     this.InitialMode     = initialmode;
     this.MethodMode      = methodmode;
     this.Mean            = mean;
     this.Stdev           = v;
     this.MaxThreadCount  = maxthread;
     this.Distences       = new double[DataCount, DataCount];
     this.cancelToken     = canceltoken;
     Parallel.For(0, this.DataCount - 1, new Action <int>((i) =>
     {
         for (int j = i + 1; j < this.DataCount; j++)
         {
             var temp             = Assess.GetEdistence(this.Data, i, j, this.Properties, this.ParaCount);
             this.Distences[i, j] = temp;
             this.Distences[j, i] = temp;
         }
     }));
 }
 private String GetUnownedObjectText(WaitObject unownedObject)
 {
     return " "          + r_manager.GetValue(unownedObject.Address) +
            " Type: "    + r_manager.GetValue(unownedObject.ObjectType) +
            " Handle: "  + r_manager.GetValue(unownedObject.Handle) +
            " Name: "    + unownedObject.Name;
 }
 private String GetText(WaitObject waitObject)
 {
     return " " + r_manager.GetValue(waitObject.Address) +
            " Type: " + ((WaitObjectType)waitObject.ObjectType).ToString() +
            " Handle: " + r_manager.GetValue(waitObject.Handle) +
            " Name: " + waitObject.Name;
 }
Beispiel #6
0
 private String GetUnownedObjectText(WaitObject unownedObject)
 {
     return(" " + r_manager.GetValue(unownedObject.Address) +
            " Type: " + r_manager.GetValue(unownedObject.ObjectType) +
            " Handle: " + r_manager.GetValue(unownedObject.Handle) +
            " Name: " + unownedObject.Name);
 }
Beispiel #7
0
        /// <summary>
        /// Asynchronously expects <see langword="event"/> until they occur or until canceled <br/>
        /// <![CDATA[Version: 1.0.0.2]]> <br/>
        /// <![CDATA[Dependency: WaitObject]]> <br/>
        /// </summary>
        /// <param name="value"></param>
        /// <param name="eventName"></param>
        /// <param name="cancellationToken"></param>
        /// <typeparam name="T">EventArgs type</typeparam>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException"></exception>
        /// <exception cref="InvalidOperationException"></exception>
        /// <exception cref="OperationCanceledException"></exception>
        /// <returns></returns>
        public static async Task <T> WaitEventAsync <T>(this object value, string eventName, CancellationToken cancellationToken = default)
        {
            value     = value ?? throw new ArgumentNullException(nameof(value));
            eventName = eventName ?? throw new ArgumentNullException(nameof(eventName));
            var eventInfo = value.GetType().GetEvent(eventName)
                            ?? throw new ArgumentException($"Event \"{eventName}\" is not found");

            var taskCompletionSource = new TaskCompletionSource <T>();

            using var registration = cancellationToken.Register(() => taskCompletionSource.TrySetCanceled());

            var waitObject = new WaitObject <T>
            {
                Source = taskCompletionSource,
            };
            var method = waitObject.GetType().GetMethod(nameof(WaitObject <int> .HandleEvent))
                         ?? throw new InvalidOperationException("HandleEvent method is not found");
            // ReSharper disable once ConstantNullCoalescingCondition
            var eventHandlerType = eventInfo.EventHandlerType
                                   ?? throw new InvalidOperationException("Event Handler Type is null");
            var delegateObject = Delegate.CreateDelegate(eventHandlerType, waitObject, method, true);

            try
            {
                eventInfo.AddEventHandler(value, delegateObject);

                return(await taskCompletionSource.Task.ConfigureAwait(false));
            }
            finally
            {
                eventInfo.RemoveEventHandler(value, delegateObject);
            }
        }
Beispiel #8
0
 public static double GetCCT(IDataTable<DataRow> data, string a, string b, WaitObject flag)
 {
     int count = data.RowCount;
     double xyS = 0;
     double xS = 0;
     double yS = 0;
     double x2S = 0;
     double y2S = 0;
     double tempx = 0;
     double tempy = 0;
     DataRow temprow;
     flag.Flags = new int[1];
     flag.Max = count;
     for (int i = 0; i < count; i++)
     {
         temprow = data[i];
         tempx = temprow[a].ConvertToDouble();
         tempy = temprow[b].ConvertToDouble();
         xyS += tempx * tempy;
         xS += tempx;
         yS += tempy;
         x2S += tempx * tempx;
         y2S += tempy * tempy;
         flag.Flags[0]++;
     }
     return (xyS * count - xS * yS) / (Math.Pow((x2S * count - xS * xS), 0.5) * Math.Pow((y2S * count - yS * yS), 0.5));
 }
Beispiel #9
0
        private static void CallVCoverService_ReadData(WaitObject @object)
        {
            Task.Factory.StartNew((o) =>
            {
                WaitObject obj         = (WaitObject)o;
                m_WaitObjects[obj.Key] = obj;
                List <FileInfo> files  = (List <FileInfo>)obj.Value;

                try
                {
                    StringBuilder b = new StringBuilder();
                    b.Append(obj.Key);
                    b.Append(";");

                    foreach (FileInfo info in files)
                    {
                        b.Append(info.FullName);
                        b.Append(";");
                    }

                    NamedPipes.SendMessage("VCOVER", b.ToString());
                }
                catch (Exception ex)
                {
                    obj.Err = ex;
                }
            }, @object);
        }
Beispiel #10
0
        public void Invalidate(int wait_ms)
        {
            isValid = false;

            //     SignalMeasurement wait = new SignalMeasurement();
            //     waitThread = new Thread(wait.waitToValidate);
            //     waitThread.Start(wait_ms);

            WaitObject wait = new WaitObject(wait_ms, this);

            waitThread = new Thread(wait.waitToValidate);
            waitThread.Start();
        }
        internal ThreadStackOwnedNode(ThreadStackNodeManager manager, TreeNode threadStackNode, int index, WaitObject waitObject)
        {
            if (threadStackNode == null)
                throw new ArgumentNullException("r_threadStackNode");

            if (manager == null)
                throw new ArgumentNullException("manager");

            r_manager = manager;
            r_threadStackNode = threadStackNode;

            r_ownedNode = r_threadStackNode.Nodes.Insert(index, GetText(waitObject));
            r_ownedNode.ImageKey = "key.png";
            r_ownedNode.SelectedImageKey = r_ownedNode.ImageKey;
            r_ownedNode.Tag = this;
        }
Beispiel #12
0
 public static double[] GetCCTs(IDataTable<DataRow> data, string target, string[] f,WaitObject flag)
 {
     int count = data.RowCount;
     int length = f.Length;
     double[] fs = new double[length];
     double[] xfs = new double[length];
     double[] f2s = new double[length];
     double[] result = new double[length];
     double xS = 0;
     double x2S = 0;
     int j = 0;
     double tempx = 0;
     double tempy = 0;
     DataRow temprow;
     flag.Flags = new int[1];
     flag.Max = count * length;
     for (int i = 0; i < count; i++)
     {
         temprow = data[i];
         tempx = temprow[target].ConvertToDouble();
         xS += tempx;
         x2S += tempx * tempx;
         for(j=0;j<length;j++)
         {
             tempy = temprow[f[j]].ConvertToDouble();
             xfs[j] += tempx * tempy;
             fs[j] += tempy;
             f2s[j] += tempy * tempy;
             flag.Flags[0]++;
         }
     }
     double down;
     for (j = 0; j < length; j++)
     {
         down = (Math.Pow((x2S * count - xS * xS), 0.5) * Math.Pow((f2s[j] * count - fs[j] * fs[j]), 0.5));
         if (down != 0)
             result[j] = (xfs[j] * count - xS * fs[j]) / down;
         else if (x2S == 0)
             result[j] = 1;
         else
             result[j] = 0;
     }
     return result;
 }
        internal UnownedObjectNode(ThreadStackNodeManager manager, TreeNode unownedObjectsNode, WaitObject unownedObject)
        {
            if (unownedObjectsNode == null)
                throw new ArgumentNullException("unownedObjectsNode");

            if (manager == null)
                throw new ArgumentNullException("manager");

            if (unownedObject == null)
                throw new ArgumentNullException("unownedObject");

            r_manager = manager;
            r_unownedObjectsNode = unownedObjectsNode;

            String text = GetUnownedObjectText(unownedObject);
            r_unownedObjectNode = r_unownedObjectsNode.Nodes.Add(text);
            r_unownedObjectNode.ImageKey = "arrow_branch.png";
            r_unownedObjectNode.SelectedImageKey = r_unownedObjectNode.ImageKey;
            r_unownedObjectNode.Tag = this;
        }
Beispiel #14
0
        private string NamedPipes_ReceivedData(string data)
        {
            WaitObject obj = null;
            Guid       id  = Guid.Empty;

            try
            {
                var strs = data.FromStr();
                id = Guid.Parse(strs[0]);

                obj = (WaitObject)m_WaitObjects[id];
                if (obj == null)
                {
                    throw new ApplicationException("Cannot find key " + id);
                }

                List <FileInfo> files = (List <FileInfo>)obj.Value;
                files.AddRange(strs.Skip(1).Where(s => !string.IsNullOrWhiteSpace(s)).ToList().ConvertAll <FileInfo>(s => new FileInfo(s)));
                return(string.Empty);
            }
            catch (Exception ex)
            {
                if (obj != null)
                {
                    obj.Err = ex;
                }
                return(string.Empty);
            }
            finally
            {
                if (obj != null)
                {
                    obj.Signal();
                }
                m_WaitObjects.Remove(id);
            }
        }
        private void RefreshOwnedObjects(ThreadStack threadStack)
        {
            List <WaitObject> newOwnedNodes = new List <WaitObject>(threadStack.OwnedObjects.Values);

            int indexDelta = r_waitedNodes.Count;
            int countOld   = r_ownedNodes.Count;
            int countNew   = newOwnedNodes.Count;
            int to         = countNew;

            if (countNew < countOld)
            {
                for (int i = countNew; i < countOld; ++i)
                {
                    r_ownedNodes[countNew].Remove();
                    r_ownedNodes.RemoveAt(countNew);
                }
            }
            else if (countOld < countNew)
            {
                to = countOld;
                int index = countOld;

                for (int i = 0; i < (countNew - countOld); ++i)
                {
                    WaitObject           objectAddress = newOwnedNodes[index];
                    ThreadStackOwnedNode ownedNode     = new ThreadStackOwnedNode(r_manager, r_threadStackNode, index + indexDelta, objectAddress);
                    r_ownedNodes.Add(ownedNode);
                    ++index;
                }
            }

            for (int i = 0; i < to; ++i)
            {
                r_ownedNodes[i].Refresh(newOwnedNodes[i]);
            }
        }
Beispiel #16
0
        public void Refresh(WaitObject unownedObject)
        {
            String text = GetUnownedObjectText(unownedObject);

            r_unownedObjectNode.Text = text;
        }
 internal void Refresh(WaitObject waitObject)
 {
     r_ownedNode.Text = GetText(waitObject);
 }
Beispiel #18
0
        public static DataSet StartCluster(CancellationTokenSource cancelToken, IDataTable <DataRow> data, string[] properties, int maxCount, int minClusterCount, int maxClusterCount, double m, double s, WaitObject wt, int initialmode, int methodmode, int maxthread)
        {
            minClusterCount = minClusterCount < 2 ? 2 : minClusterCount;
            maxClusterCount = maxClusterCount < 2 ? (int)Math.Pow(data.RowCount, 0.5) : maxClusterCount;
            maxCount        = maxCount < 2 ? 20 : maxCount;
            maxthread       = maxthread < 1 ? 1 : maxthread;
            int paracount = properties.Length;
            int i, j, k;

            double[] mean;
            double[] std;
            if (!double.IsNaN(m))
            {
                mean = new double[paracount];
                for (i = 0; i < paracount; i++)
                {
                    mean[i] = m;
                }
            }
            else
            {
                mean = data.Avg(properties);
            }
            if (!double.IsNaN(s))
            {
                std = new double[paracount];
                for (i = 0; i < paracount; i++)
                {
                    std[i] = s;
                }
            }
            else
            {
                std = data.Stdev(properties, mean);
            }
            var       temp          = new KMeans(cancelToken, data, properties, maxCount, minClusterCount, maxClusterCount, mean, std, wt, initialmode, methodmode, maxthread);
            var       clusterreport = temp.ParallelStart();
            var       report        = new DataSet();
            DataTable overview      = new DataTable("OverView");

            overview.Columns.Add(new DataColumn("序号", typeof(int)));
            overview.Columns.Add(new DataColumn("分类数", typeof(int)));
            overview.Columns.Add(new DataColumn("AvgBWP", typeof(double)));
            overview.Columns.Add(new DataColumn("耗时", typeof(double)));
            overview.Columns.Add(new DataColumn("循环次数", typeof(int)));
            DataTable centers = new DataTable("Centers");
            int       len     = properties.Length;

            centers.Columns.Add(new DataColumn("序号", typeof(int)));
            centers.Columns.Add(new DataColumn("类标号", typeof(int)));
            for (i = 0; i < len; i++)
            {
                centers.Columns.Add(new DataColumn(properties[i], typeof(double)));
            }
            DataTable results = new DataTable("Results");

            results.Columns.Add(new DataColumn("序号", typeof(int)));
            results.Columns.Add(new DataColumn("行号", typeof(int)));
            results.Columns.Add(new DataColumn("类标号", typeof(int)));
            results.Columns.Add(new DataColumn("BWP", typeof(double)));
            results.Columns.Add(new DataColumn("B", typeof(double)));
            results.Columns.Add(new DataColumn("W", typeof(double)));
            report.Tables.Add(overview);
            report.Tables.Add(centers);
            report.Tables.Add(results);
            report.Relations.Add(new DataRelation("OverView_Centers", overview.Columns[0], centers.Columns[0]));
            int count     = clusterreport.HisResult.Count;
            int datacount = data.RowCount;

            for (i = 0; i < count; i++)
            {
                var tempresult = clusterreport.HisResult[i];
                var tempreport = clusterreport.HisReport[i];
                overview.Rows.Add(i, tempresult.cCount, tempreport.AvgBWP, tempresult.CostTime, tempresult.LoopCount);
                for (j = 0; j < tempresult.cCount; j++)
                {
                    var temprow = centers.NewRow();
                    temprow[0] = i;
                    temprow[1] = j;
                    for (k = 0; k < len; k++)
                    {
                        temprow[k + 2] = tempresult.Centers[j, k];
                    }
                    centers.Rows.Add(temprow);
                }
                for (j = 0; j < datacount; j++)
                {
                    results.Rows.Add(i, j, tempresult.ClassNumbers[j], tempreport.BWP[j], tempreport.B[j], tempreport.W[j]);
                }
            }
            return(report);
        }
        internal ThreadStackOwnedNode(ThreadStackNodeManager manager, TreeNode threadStackNode, int index, WaitObject waitObject)
        {
            if (threadStackNode == null)
            {
                throw new ArgumentNullException("r_threadStackNode");
            }

            if (manager == null)
            {
                throw new ArgumentNullException("manager");
            }

            r_manager         = manager;
            r_threadStackNode = threadStackNode;

            r_ownedNode                  = r_threadStackNode.Nodes.Insert(index, GetText(waitObject));
            r_ownedNode.ImageKey         = "key.png";
            r_ownedNode.SelectedImageKey = r_ownedNode.ImageKey;
            r_ownedNode.Tag              = this;
        }
 public void Refresh(WaitObject unownedObject)
 {
     String text = GetUnownedObjectText(unownedObject);
     r_unownedObjectNode.Text = text;
 }
Beispiel #21
0
        public static double[] GetCCTs(IDataTable <DataRow> data, string target, string[] f, WaitObject flag)
        {
            int count  = data.RowCount;
            int length = f.Length;

            double[] fs     = new double[length];
            double[] xfs    = new double[length];
            double[] f2s    = new double[length];
            double[] result = new double[length];
            double   xS     = 0;
            double   x2S    = 0;
            int      j      = 0;
            double   tempx  = 0;
            double   tempy  = 0;
            DataRow  temprow;

            flag.Flags = new int[1];
            flag.Max   = count * length;
            for (int i = 0; i < count; i++)
            {
                temprow = data[i];
                tempx   = temprow[target].ConvertToDouble();
                xS     += tempx;
                x2S    += tempx * tempx;
                for (j = 0; j < length; j++)
                {
                    tempy   = temprow[f[j]].ConvertToDouble();
                    xfs[j] += tempx * tempy;
                    fs[j]  += tempy;
                    f2s[j] += tempy * tempy;
                    flag.Flags[0]++;
                }
            }
            double down;

            for (j = 0; j < length; j++)
            {
                down = (Math.Pow((x2S * count - xS * xS), 0.5) * Math.Pow((f2s[j] * count - fs[j] * fs[j]), 0.5));
                if (down != 0)
                {
                    result[j] = (xfs[j] * count - xS * fs[j]) / down;
                }
                else if (x2S == 0)
                {
                    result[j] = 1;
                }
                else
                {
                    result[j] = 0;
                }
            }
            return(result);
        }
Beispiel #22
0
        internal UnownedObjectNode(ThreadStackNodeManager manager, TreeNode unownedObjectsNode, WaitObject unownedObject)
        {
            if (unownedObjectsNode == null)
            {
                throw new ArgumentNullException("unownedObjectsNode");
            }

            if (manager == null)
            {
                throw new ArgumentNullException("manager");
            }

            if (unownedObject == null)
            {
                throw new ArgumentNullException("unownedObject");
            }

            r_manager            = manager;
            r_unownedObjectsNode = unownedObjectsNode;

            String text = GetUnownedObjectText(unownedObject);

            r_unownedObjectNode                  = r_unownedObjectsNode.Nodes.Add(text);
            r_unownedObjectNode.ImageKey         = "arrow_branch.png";
            r_unownedObjectNode.SelectedImageKey = r_unownedObjectNode.ImageKey;
            r_unownedObjectNode.Tag              = this;
        }
Beispiel #23
0
        public static void ReadDataCallback(IAsyncResult asyncResult)
        {
            BytesRead = Tap.EndRead(asyncResult);

            WaitObject.Set();
        }
 internal void Refresh(WaitObject waitObject)
 {
     r_ownedNode.Text = GetText(waitObject);
 }
Beispiel #25
0
 public static void ReadDataCallback(IAsyncResult asyncResult)
 {
     BytesRead = Tap.EndRead(asyncResult);
     // Console.WriteLine("Read "+ BytesRead.ToString());
     WaitObject.Set();
 }
Beispiel #26
0
        public Action <TaskProcessOrganizer <string> .TaskItem> GetAction()
        {
            return(new Action <TaskProcessOrganizer <string> .TaskItem>((o) =>
            {
                var fullFilePath = o.Item;

                Bitmap bmp = null;
                StateManager.VoucherItem item = (StateManager.VoucherItem)StateManager.Default.ProcessItem_Begin(true);

                try
                {
                    var info = new FileInfo(fullFilePath);

                    if (info.Exists && !info.IsReadOnly(TRIES))
                    {
                        Global.IgnoreList.Add(fullFilePath);
                        // ".tif"
                        var ext = Path.GetExtension(info.FullName);
                        if (ext.EqualNoCase(".pdf"))
                        {
                            var helper = new PDFFileHelper();
                            var finfo = helper.Run(info, item);
                            fullFilePath = (finfo != null) ? finfo.FullName : "";
                        }

                        bmp = ((Bitmap)Bitmap.FromFile(fullFilePath));

                        var useCrop = StateSaver.Default.Get <bool>(Strings.CROPIMAGE);
                        if (useCrop)
                        {
                            bmp = bmp.Crop2();
                        }

                        item.FileInfoList.Add(new FileInfo(fullFilePath)); // Scanned Image

                        item.FullFileName = fullFilePath;

                        StateManager.VoucherItem vitem = (StateManager.VoucherItem)item;

#if DRAW_ON_VOUCHER
                        bmp.DrawOnImage((gr) =>
                        {
                            var str = string.Format("{0:dd-MM-yyyy hh:mm}", DateTime.Now);
                            ///string user = Program.currentUser.ToString();
                            var an = StateSaver.Default.Get <AssemblyName>(Strings.VERSION);

                            using (var font = new Font(FontFamily.GenericSansSerif, 10f, FontStyle.Regular))
                            {
                                gr.DrawString(str, font, Brushes.Black, new PointF(10, 10));
                                gr.DrawString(an.Name, font, Brushes.Black, new PointF(10, 25));
                                gr.DrawString(an.Version.ToString(), font, Brushes.Black, new PointF(10, 40));
                            }
                        });
#endif

#if COVER_CCD
                        var coverArea = StateSaver.Default.Get <Rectangle>(Strings.VOUCHERCOVERREGION);
                        if (!coverArea.IsEmpty)
                        {
                            var size = StateSaver.Default.Get <int>(Strings.PIXELSIZE, 5);
                            bmp.Pixellate(coverArea);
                        }
#endif
                        string site;
                        int location;
                        if (!VPrinting.Common.CommonTools.ParseSiteCode(info.Name, out site, out location))
                        {
                            throw new Exception("Wrong sitecode");
                        }

                        var vinfo = ServiceDataAccess.Instance.FindVoucherTRSBySiteCode(site, location);
                        if (vinfo == null || !vinfo.IsValid)
                        {
                            vinfo = ServiceDataAccess.Instance.FindVoucherPRBySiteCode(site, location);
                            if (!vinfo.IsValid)
                            {
                                throw new Exception("Cannot find voucher by sitecode");
                            }
                        }

                        item.CountryID = vinfo.IsoId;
                        vitem.RetailerID = vinfo.RetailerId;
                        vitem.VoucherID = vinfo.VoucherId;
                        vitem.Barcode = "";
                        vitem.SiteCode = string.Concat(site, location);

                        if (item.CountryID == 0)
                        {
                            item.CountryID = MainForm.ms_DefaultCountryId;
                        }
#if SAVE_VOUCHER
                        if (!ext.EqualNoCase(".tif"))
                        {
                            bmp.Save(fullFilePath, ImageFormat.Jpeg);
                        }
#endif

                        if (item.Thumbnail == null)
                        {
                            item.Thumbnail = bmp.GetThumbnailImage(45, 45, () => false, IntPtr.Zero);
                        }

                        if (StateSaver.Default.Get <bool>(Strings.USE_VCOVER))
                        {
                            using (WaitObject obj = new WaitObject(item.FileInfoList))
                            {
                                var ptr = StateSaver.Default.Get <IntPtr>(Strings.VCOVER_FUNC);
                                var time = StateSaver.Default.Get <TimeSpan>(Strings.VCOVER_TIMEOUT, TimeSpan.FromMinutes(10));
                                var dlg = ptr.GetDelegate <CallVCoverService_ReadDataDelegate>();
                                dlg.DynamicInvoke(obj);
                                if (!obj.WaitOne(time))
                                {
                                    throw new ApplicationException("VCover timeout");
                                }
                                if (obj.Err != null)
                                {
                                    throw obj.Err;
                                }
                            }
                        }

                        var certificateSigning = StateSaver.Default.Get <bool>(Strings.CERTIFICATE_SIGNING_AVAILABLE);
                        if (certificateSigning)
                        {
                            var crInfo = new PdfCreationInfo()
                            {
                                Title = string.Concat("Voucher ", vitem.VoucherID),
                                Subject = string.Concat("Retailer ", vitem.RetailerID),
                                Author = string.Concat("PTF ", StateSaver.Default.Get <string>(Strings.Certigicate_COUNTRY)),
                                Creator = string.Concat("PTF ", StateSaver.Default.Get <string>(Strings.Certigicate_LOCATION)),
                            };

                            var signInfo = new PdfSignInfo()
                            {
                                pfxFilePath = StateSaver.Default.Get <string>(Strings.COUNTRY_CERTIFICATE_PATH),
                                pfxKeyPass = StateSaver.Default.Get <string>(Strings.COUNTRY_CERTIFICATE_PASS),
                                DocPass = null,
                                SignImagePath = StateSaver.Default.Get <string>(Strings.PTFLogoFileFullPath),
                                ReasonForSigning = string.Concat("Signing electronic copy of voucher ", vitem.Barcode),
                                Location = StateSaver.Default.Get <string>(Strings.Certigicate_LOCATION)
                            };

                            var prtGetMetaData = StateSaver.Default.Get <IntPtr>(Strings.Certigicate_METADATA_FUNC);
                            if (prtGetMetaData != IntPtr.Zero)
                            {
                                crInfo.MetaData = signInfo.MetaData = prtGetMetaData.GetDelegate <GetMetaDataDelegate>().DynamicInvoke(this, vinfo.IsoId, 0, vinfo.RetailerId).cast <ArrayList>();
                                var str = string.Format("{0:dd-MM-yyyy hh:mm}", DateTime.Now);
                                var an = StateSaver.Default.Get <AssemblyName>(Strings.VERSION);
                                crInfo.MetaData.Insert(0, new Tuple <string, string>("", ""));
                                crInfo.MetaData.Insert(0, new Tuple <string, string>("Voucher number", vinfo.VoucherId.ToString()));

                                crInfo.MetaData.Add(new Tuple <string, string>("", ""));
                                crInfo.MetaData.Add(new Tuple <string, string>("Operator", Program.currentUser.Username));
                                crInfo.MetaData.Add(new Tuple <string, string>("App.name", an.Name));
                                crInfo.MetaData.Add(new Tuple <string, string>("App.version", an.Version.ToString()));
                                crInfo.MetaData.Add(new Tuple <string, string>("Create at", str));
                            }

                            var pdfFileName = pdfFileAccess.Instance.CreateSignPdf(bmp, vitem.Barcode, vitem.RetailerID, vitem.VoucherID, crInfo, signInfo);
                            item.FileInfoList.Add(new FileInfo(pdfFileName)); // Signed Image
                        }

                        item.State = StateManager.eState.OK;
                        item.Message = "";
                        StateManager.Default.CompleteItem(item);
                    }
                }
                catch (Exception ex)
                {
                    item.State = StateManager.eState.Err;
                    item.Message = ex.Message;

                    int count = StateManager.Default.SetItemWithErr();
                    DelegateHelper.PostShowItemsWithErrCallback(count);
                    DelegateHelper.FireError(this, ex);
                }
                finally
                {
                    bmp.DisposeSf();

                    DelegateHelper.PostItemScannedCallback(item);

                    try
                    {
                        if (!item.IsSetup)
                        {
                            using (var mngr = new AsyncFormManager <RetailerForm>("Enter voucher details"))
                            {
                                mngr.Result = item;
                                mngr.RunWait();
                                if (!item.IsSetup)
                                {
                                    throw new ApplicationException("Cannot find barcode.");
                                }
                                item.State = StateManager.eState.OK;
                            }
                        }

                        StateManager.Default.AddNewItem(item);
                    }
                    catch (Exception ex0)
                    {
                        item.State = StateManager.eState.Err;
                        item.Message = ex0.Message;
                        DelegateHelper.FireError(this, ex0);
                    }
                }
            }));
        }