/// <summary> /// Uploads CAN object to CAN server. /// </summary> /// <param name="ObjectData">CAN object to upload.</param> /// <returns>Structure describing whether the function succeeded and response provided by CAN server.</returns> public async Task <CanUploadResult> CanUploadObject(byte[] ObjectData) { log.Trace("(ObjectData.Length:{0})", ObjectData.Length); CanApiResult apiResult = await SendRequest("add", new NameValueCollection(), "file", "object", ObjectData); CanUploadResult res = CanUploadResult.FromApiResult(apiResult); if (res.Success) { log.Trace("(-):*.Success={0},*.Hash='{1}'", res.Success, res.Hash.ToBase58()); } else { log.Trace("(-):*.Success={0},*.Message='{1}'", res.Success, res.Message); } return(res); }
/// <summary> /// Creates a new object based on a result from CAN API including validation checks. /// </summary> /// <param name="ApiResult">CAN API result object to copy values from.</param> /// <returns>Structure describing result of CAN upload operation.</returns> public static CanUploadResult FromApiResult(CanApiResult ApiResult) { log.Trace("()"); CanUploadResult res = new CanUploadResult(ApiResult); if (res.Success) { bool error = false; try { CanUploadObjectResponse response = JsonConvert.DeserializeObject <CanUploadObjectResponse>(res.DataStr); if (!string.IsNullOrEmpty(response.Hash)) { res.Hash = Base58Encoding.Encoder.DecodeRaw(response.Hash); if (res.Hash == null) { log.Error("Unable to decode hash '{0}'.", response.Hash); error = true; } } else { log.Error("Empty hash in CAN response."); error = true; } } catch (Exception e) { log.Error("Exception occurred: {0}", e.ToString()); error = true; } if (error) { res.Success = false; res.Message = "Invalid CAN response."; res.IsCanError = false; } } log.Trace("(-)"); return(res); }
/// <summary> /// Thread that is initializes CAN objects during the profile server startup. /// </summary> private async void InitThread() { log.Info("()"); initThreadFinished.Reset(); if (Base.Configuration.CanProfileServerContactInformationHash != null) { log.Debug("Old CAN object hash is '{0}', object {1} change.", Base.Configuration.CanProfileServerContactInformationHash.ToBase58(), Base.Configuration.CanProfileServerContactInformationChanged ? "DID" : "did NOT"); } else { log.Debug("No CAN object found."); } bool deleteOldObject = Base.Configuration.CanProfileServerContactInformationChanged && (Base.Configuration.CanProfileServerContactInformationHash != null); byte[] canObject = canContactInformation.ToByteArray(); log.Trace("CAN object: {0}", canObject.ToHex()); while (!ShutdownSignaling.IsShutdown) { // First delete old CAN object if there is any. bool error = false; if (deleteOldObject) { string objectPath = CanApi.CreateIpfsPathFromHash(Base.Configuration.CanProfileServerContactInformationHash); CanDeleteResult cres = await canApi.CanDeleteObject(objectPath); if (cres.Success) { log.Info("Old CAN object hash '{0}' deleted.", Base.Configuration.CanProfileServerContactInformationHash.ToBase58()); } else { log.Warn("Failed to delete old CAN object hash '{0}', error message '{1}', will retry.", Base.Configuration.CanProfileServerContactInformationHash.ToBase58(), cres.Message); error = true; } } else { log.Trace("No old object to delete."); } if (ShutdownSignaling.IsShutdown) { break; } if (!error) { if (Base.Configuration.CanProfileServerContactInformationChanged) { // Now upload the new object. CanUploadResult cres = await canApi.CanUploadObject(canObject); if (cres.Success) { canContactInformationHash = cres.Hash; log.Info("New CAN object hash '{0}' added.", canContactInformationHash.ToBase58()); break; } log.Warn("Unable to add new object to CAN, error message: '{0}'", cres.Message); } else { canContactInformationHash = Base.Configuration.CanProfileServerContactInformationHash; log.Info("CAN object unchanged since last time, hash is '{0}'.", canContactInformationHash.ToBase58()); break; } } // Retry in 10 seconds. try { await Task.Delay(10000, ShutdownSignaling.ShutdownCancellationTokenSource.Token); } catch { // Catch cancellation exception. } } if (canContactInformationHash != null) { if (Base.Configuration.CanProfileServerContactInformationChanged) { // Save the new data to the database. if (!await SaveProfileServerContactInformation()) { log.Error("Failed to save new profile server contact information values to database."); } } // Finally, start IPNS record refreshing timer. await IpnsRecordRefresh(); } initThreadFinished.Set(); log.Info("(-)"); }