/// <summary> /// updates already exisiting p2p record /// </summary> /// <param name="p2P">p2p data</param> /// <returns>publication journal, marks if publication was succesful or where and why publication stopped</returns> public async Task <RegistrationJournal> UpdatePTPConnectionAsync(P2PSite p2P) { RegistrationJournal regJournal = new RegistrationJournal(); if (p2P == null) { regJournal.ThrownException = new Exceptions.MissingParameterException("Missing fixed p2p pair"); return(regJournal); } regJournal.RegistrationId = p2P.StationB.CTUId.ToString(); regJournal.NextPhase(); HttpResponseMessage response = await httpClient.GetAsync(""); if (response.StatusCode != System.Net.HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); return(regJournal); } frontEndToken = await ObtainFrontEndToken(response.Content.ReadAsStreamAsync()); await PTPTechnicalSpec(p2P, regJournal); if (regJournal.SuccessfullRegistration != RegistrationSuccesEnum.Pending) { return(regJournal); } regJournal.NextPhase(); await PTPCollisionAndPublishing(p2P, regJournal); if (regJournal.SuccessfullRegistration != RegistrationSuccesEnum.Pending) { return(regJournal); } regJournal.NextPhase(); return(regJournal); }
/// <summary> /// if succesfull, creates draft with name and gps cordinates. /// </summary> /// <param name="p2P">p2p data</param> /// <param name="regJournal"> registration journal with information abou registration process</param> /// <returns></returns> private async Task PTPLocalisation(P2PSite p2P, RegistrationJournal regJournal) { HttpResponseMessage response = await httpClient.GetAsync(CtuUrlConstants.CreateFSPTPUrl); if (response.StatusCode != System.Net.HttpStatusCode.OK || response.RequestMessage.RequestUri.LocalPath != CtuUrlConstants.CreateFSPTPUrl) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); return; } frontEndToken = await ObtainFrontEndToken(response.Content.ReadAsStreamAsync()); Dictionary <string, string> postContent = new Dictionary <string, string>() { { "_csrf-frontend", frontEndToken }, { "list-stations", "my" }, { "Station[a][name]", p2P.StationA.Name }, { "Station[b][name]", p2P.StationB.Name }, { "Station[a][lng]", p2P.StationA.Longitude.ToString(CultureInfo.GetCultureInfo("en-US")) }, { "Station[a][lat]", p2P.StationA.Latitude.ToString(CultureInfo.GetCultureInfo("en-US")) }, { "Station[b][lng]", p2P.StationB.Longitude.ToString(CultureInfo.GetCultureInfo("en-US")) }, { "Station[b][lat]", p2P.StationB.Latitude.ToString(CultureInfo.GetCultureInfo("en-US")) } }; response = await httpClient.PostAsync(CtuUrlConstants.CreateFSPTPUrl, new FormUrlEncodedContent(postContent)); if (response.StatusCode != HttpStatusCode.OK || !new Regex(@"^/en/station/[0-9]+/2$").IsMatch(response.RequestMessage.RequestUri.LocalPath)) { regJournal.ThrownException = new Exceptions.WebServerException("web ctu did not respond properly.", response.StatusCode); return; } regJournal.RegistrationId = response.RequestMessage.RequestUri.ToString().Split('/')[5]; }
/// <summary> /// attempts to publish new p2p wirelless site. /// </summary> /// <param name="p2P">p2p data</param> /// <returns>publication journal, marks if publication was succesful or where and why publication stopped</returns> public async Task <RegistrationJournal> AddPTPSiteAsync(P2PSite p2P) { RegistrationJournal regJournal = new RegistrationJournal(); if (p2P == null) { regJournal.ThrownException = new Exceptions.MissingParameterException("Missing fixed p2p pair"); return(regJournal); } regJournal.NextPhase(); await PTPLocalisation(p2P, regJournal); if (regJournal.SuccessfullRegistration != RegistrationSuccesEnum.Pending) { return(regJournal); } regJournal.NextPhase(); await PTPTechnicalSpec(p2P, regJournal); if (regJournal.SuccessfullRegistration != RegistrationSuccesEnum.Pending) { return(regJournal); } regJournal.NextPhase(); await PTPCollisionAndPublishing(p2P, regJournal); if (regJournal.SuccessfullRegistration != RegistrationSuccesEnum.Pending) { return(regJournal); } regJournal.NextPhase(); return(regJournal); }
/// <summary> /// if succesfull, then p2p is officialy published on ctu, otherwise saved as draft /// </summary> /// <param name="fpP2P"></param> /// <param name="regJournal"></param> /// <returns></returns> private async Task PTPCollisionAndPublishing(P2PSite fpP2P, RegistrationJournal regJournal) { string techSpecUrl = $"{CtuUrlConstants.StationUrl}/{regJournal.RegistrationId}/3"; HttpResponseMessage response = await httpClient.GetAsync(techSpecUrl); if (response.StatusCode != System.Net.HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); return; } frontEndToken = await ObtainFrontEndToken(response.Content.ReadAsStreamAsync()); List <CollisionTableItem> closeStations = await GetFixedPTPStationsFromCollisionTable(await response.Content.ReadAsStringAsync()); regJournal.CollisionStations = closeStations.Where(x => x.Collision == true).ToList(); regJournal.CloseStations = closeStations; Dictionary <string, string> postContent = new Dictionary <string, string>() { { "_csrf-frontend", frontEndToken } }; if (regJournal.CollisionStations.Where((x) => x.Owned == true).Count() == regJournal.CollisionStations.Count && isolationConsent) //collision only with owned stations. { string declare = $"{CtuUrlConstants.DeclareUrl}/{regJournal.RegistrationId}"; response = await httpClient.PostAsync(declare, new FormUrlEncodedContent(postContent)); if (response.StatusCode != HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); } } else if (regJournal.CollisionStations.Count > 0) // collision list contains unowned stations { regJournal.ThrownException = new Exceptions.CollisionDetectedException(); return; } else // no collision ocured { string publish = $"{CtuUrlConstants.PublishUrl}/{regJournal.RegistrationId}"; response = await httpClient.PostAsync(publish, new FormUrlEncodedContent(postContent)); if (response.StatusCode != HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); } } }
/// <summary> /// if succesfull, updates draft with technical specs /// </summary> /// <param name="fpP2P">fixed p2p data</param> /// <param name="regJournal"> registration journal with information abou registration process</param> /// <returns></returns> private async Task PTPTechnicalSpec(P2PSite fpP2P, RegistrationJournal regJournal) { string techSpecUrl = $"{CtuUrlConstants.StationUrl}/{regJournal.RegistrationId}/2"; HttpResponseMessage response = await httpClient.GetAsync(techSpecUrl); if (response.StatusCode != System.Net.HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); return; } frontEndToken = await ObtainFrontEndToken(response.Content.ReadAsStreamAsync()); Dictionary <string, string> postContent = new Dictionary <string, string>() { { "_csrf-frontend", frontEndToken }, { "Station[a][updateStep]", "2" }, { "Station[a][antenna_volume]", fpP2P.StationA.Volume.ToString() }, { "Station[a][channel_width]", fpP2P.StationA.ChannelWidth.ToString() }, { "Station[a][power]", fpP2P.StationA.Power.ToString() }, { "StationFs[a][frequency]", fpP2P.StationA.Frequency.ToString() }, { "StationFs[a][ratio_signal_interference]", fpP2P.StationA.RSN.ToString() }, { "Station[a][hardware_identifier]", (fpP2P.StationA.SerialNumber == string.Empty)?"0":"1" }, { String.Format("Station[a][{0}]", (fpP2P.StationA.SerialNumber == string.Empty)?"macAddress":"serialNumber"), (fpP2P.StationA.SerialNumber == string.Empty)?fpP2P.StationA.MAC:fpP2P.StationA.SerialNumber }, { "Station[b][updateStep]", "2" }, { "Station[b][antenna_volume]", fpP2P.StationB.Volume.ToString() }, { "Station[b][channel_width]", fpP2P.StationB.ChannelWidth.ToString() }, { "Station[b][power]", fpP2P.StationB.Power.ToString() }, { "StationFs[b][frequency]", fpP2P.StationB.Frequency.ToString() }, { "StationFs[b][ratio_signal_interference]", fpP2P.StationB.RSN.ToString() }, { "Station[b][hardware_identifier]", (fpP2P.StationB.SerialNumber == string.Empty)?"0":"1" }, { String.Format("Station[b][{0}]", (fpP2P.StationB.SerialNumber == string.Empty)?"macAddress":"serialNumber"), (fpP2P.StationB.SerialNumber == string.Empty)?fpP2P.StationB.MAC:fpP2P.StationB.SerialNumber } }; response = await httpClient.PostAsync(response.RequestMessage.RequestUri, new FormUrlEncodedContent(postContent)); if (response.StatusCode != HttpStatusCode.OK) { regJournal.ThrownException = new Exceptions.WebServerException("Web ctu did not respond properly.", response.StatusCode); } }