/// <summary>
        /// Starts the task that will download the calibration certificates.
        /// </summary>
        /// <returns>The the things.</returns>
        private Task DoTheThings(CancellationTokenSource source, List <ISerialNumber> failures, Action onLoad)
        {
            return(Task.Factory.StartNew(() => {
                var ion = AppState.context;
                var serials = new List <ISerialNumber>();

                foreach (var device in ion.deviceManager.devices)
                {
                    serials.Add(device.serialNumber);
                }
                /////////testing for specific nist certificate data////////////
                //  var iserial = SerialNumberExtensions.ParseSerialNumber("S816H502");
                //  serials.Add(iserial);
                //iserial = SerialNumberExtensions.ParseSerialNumber("S516H214");
                //serials.Add(iserial);
                ////////////////

                Log.D(this, Arrays.AsString <ISerialNumber>(serials.ToArray()));
                var task = new ION.Core.Net.RequestCalibrationCertificates(ion, serials.ToArray());
                //var task = new RequestCalibrationCertificatesTask(ion, serials.ToArray());
                task.tokenSource = source;

                foreach (var result in task.Request().Result)
                {
                    if (!result.success)
                    {
                        failures.Add(result.serialNumber);
                        continue;
                    }

                    var file = ion.calibrationCertificateFolder.GetFile(result.serialNumber + " Certification.pdf", EFileAccessResponse.ReplaceIfExists);
                    var stream = file.OpenForWriting();

                    try {
                        GaugeDeviceCertificatePdfExporter.Export(ion, result.certificate, stream);
                        Log.D(this, "Device nist date is " + result.certificate.lastTestCalibrationDate.ToShortDateString());
                        var existing = ion.database.Query <ION.Core.Database.LoggingDeviceRow>("SELECT * FROM LoggingDeviceRow WHERE serialNumber = ?", result.serialNumber.rawSerial);

                        if (existing.Count.Equals(0))
                        {
                            Log.D(this, "Creating new entry for device: " + result.serialNumber.rawSerial + " with a calibration date of: " + result.certificate.lastTestCalibrationDate.ToShortDateString());
                            var addDevice = new ION.Core.Database.LoggingDeviceRow()
                            {
                                serialNumber = result.serialNumber.rawSerial, nistDate = result.certificate.lastTestCalibrationDate.ToShortDateString()
                            };
                            ion.database.Insert(addDevice);
                        }
                        else
                        {
                            Log.D(this, "Updated entry for device: " + result.serialNumber.rawSerial + " with a calibration date of: " + result.certificate.lastTestCalibrationDate.ToShortDateString());
                            ion.database.Query <ION.Core.Database.LoggingDeviceRow>("UPDATE LoggingDeviceRow SET nistDate = ? WHERE serialNumber = ?", result.certificate.lastTestCalibrationDate.ToShortDateString(), result.serialNumber.rawSerial);
                        }
                    } catch (Exception e) {
                        Log.E(this, "Failed to export certificate.", e);
                        file.Delete();
                        failures.Add(result.serialNumber);
                    } finally {
                        stream?.Close();
                    }

                    ion.PostToMain(() => {
                        Log.D(this, "Resolved a certification for: " + result.serialNumber);
                        onLoad();
                    });
                }
            }));
        }
Beispiel #2
0
        /// <summary>
        /// Requests the calibration certificates for all of the task's serial numbers.
        /// </summary>
        /// <param name="tokenSource">Token source.</param>
        public async Task <List <CalibrationCertificateRequestResult> > Request()
        {
            started = true;
            Log.D(this, "Inside Request()");
            try {
                var ct  = tokenSource.Token;
                var ret = new List <CalibrationCertificateRequestResult>();

                var data = BuildPostData();

                // Bail if cancelled.
                ct.ThrowIfCancellationRequested();

                // Build Request
                var req = (HttpWebRequest)WebRequest.Create(SERVER);
                req.ContentType = TYPE_JSON;
                req.Method      = METHOD_POST;
                using (var stream = req.GetRequestStream()) {
                    stream.Write(data, 0, data.Length);
                    stream.Flush();
                    stream.Close();
                }

                // Bail if cancelled.
                ct.ThrowIfCancellationRequested();

                // Await Response
                var res = (HttpWebResponse)req.GetResponse();

                // Bail if cancelled.
                ct.ThrowIfCancellationRequested();

                using (var stream = new StreamReader(res.GetResponseStream())) {
                    var result = stream.ReadToEnd();
                    Log.D(this, "Raw result: " + result);
                    var obj = JObject.Parse(result);

                    foreach (var s in obj.Properties())
                    {
                        try {
                            var settings = new JsonSerializerSettings();
                            settings.MissingMemberHandling = MissingMemberHandling.Ignore;
                            var response = JsonConvert.DeserializeObject <CalibrationCertificateResponse>(s.Value.ToString());//, settings);
                            Log.D(this, "Nist date is " + response.calDate);
                            if (response.errorCode != null)
                            {
                                Log.E(this, "Failed to get calibration certificate for: " + response.serialNumber + "{" + response.errorCode + "}");
                                ret.Add(new CalibrationCertificateRequestResult(GaugeSerialNumber.Parse(s.Name)));
                            }
                            else
                            {
                                ret.Add(new CalibrationCertificateRequestResult(response.ToCalibrationCertificate()));
                                var existing = ion.database.Query <ION.Core.Database.LoggingDeviceRow>("SELECT * FROM LoggingDeviceRow WHERE serialNumber = ?", response.serialNumber);

                                if (existing.Count.Equals(0))
                                {
                                    Log.D(this, "Creating new entry for device: " + response.serialNumber + " with a calibration date of: " + response.calDate);
                                    var addDevice = new ION.Core.Database.LoggingDeviceRow()
                                    {
                                        serialNumber = response.serialNumber, nistDate = response.calDate
                                    };
                                    ion.database.Insert(addDevice);
                                }
                                else
                                {
                                    Log.D(this, "Updating last calibration date of: " + response.calDate + " for SN: " + response.serialNumber);
                                    ion.database.Query <ION.Core.Database.LoggingDeviceRow>("UPDATE LoggingDeviceRow SET nistDate = ? WHERE serialNumber = ?", response.calDate, response.serialNumber);
                                }
                            }
                        } catch (Exception e) {
                            Log.E(this, "Failed to parse certificate: " + s.Value, e);
                            ret.Add(new CalibrationCertificateRequestResult(GaugeSerialNumber.Parse(s.Name)));
                        }
                    }
                }

                return(ret);
            } finally {
                started = false;
            }
        }