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