From e9a1c2e2286c2f138a4d92a675cd2adbef88c97e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sat, 1 Jun 2019 22:58:59 +0200 Subject: [PATCH 01/17] Enhance ClientRating --- .../Models/Clients/AirTrafficControllerBuilder.cs | 2 +- .../MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs | 2 ++ .../MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs index 1608cac..69545a9 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs @@ -57,7 +57,7 @@ public static AirTrafficControllerBuilder FromModel(AirTrafficController model) .WithClientType(model.ClientType) .WithAdministrativeVersion(model.AdministrativeVersion) .WithCallsign(model.Callsign) - .WithClientRating(model.ClientRating) + .WithClientRating((int)model.ClientRating) .WithConnectionTime(model.ConnectionTime) .WithLocation(model.Location == null ? model.Location : (GPS)model.Location.Clone()) .WithName(model.Name) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs index a740a0a..ec1fd13 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs @@ -72,5 +72,7 @@ protected ClientWithRating() [DataMember] public TRating Rating { get; private set; } + + public new TRating ClientRating => (TRating)Enum.Parse(typeof(TRating), base.ClientRating.ToString()); } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs index 02ccf07..be13ef7 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs @@ -56,7 +56,7 @@ public static PilotBuilder FromModel(Pilot model) .WithClientType(model.ClientType) .WithAdministrativeVersion(model.AdministrativeVersion) .WithCallsign(model.Callsign) - .WithClientRating(model.ClientRating) + .WithClientRating((int)model.ClientRating) .WithConnectionTime(model.ConnectionTime) .WithLocation(model.Location == null ? model.Location : (GPS)model.Location.Clone()) .WithName(model.Name) From 472dad919336e6c157129abfdb9537450fd35641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sat, 1 Jun 2019 23:11:48 +0200 Subject: [PATCH 02/17] Change server string for Server type --- .../Models/ClientsATCDataModelTest.cs | 20 +++++++++---------- .../Models/ClientsFollowMeDataModelTest.cs | 20 +++++++++---------- .../Models/ClientsPilotDataModelTest.cs | 20 +++++++++---------- .../Common/Parsers/AbstractClientFactory.cs | 11 +++++++++- .../Models/Clients/AbstractClientBuilder.cs | 5 +++-- .../Models/Clients/AirTrafficController.cs | 3 ++- .../Clients/AirTrafficControllerBuilder.cs | 3 ++- .../Models/Clients/Client.cs | 11 +++++----- .../Models/Clients/ClientWithRating.cs | 3 ++- .../Models/Clients/FollowMe.cs | 3 ++- .../Models/Clients/FollowMeBuilder.cs | 3 ++- .../Models/Clients/Pilot.cs | 3 ++- .../Models/Clients/PilotBuilder.cs | 3 ++- 13 files changed, 63 insertions(+), 45 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsATCDataModelTest.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsATCDataModelTest.cs index 7e194d9..54e1a5c 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsATCDataModelTest.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsATCDataModelTest.cs @@ -30,7 +30,7 @@ public void Equals_WhenTwoSameInstancesAreCreated_ThenInstancesAreEqual() .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -66,7 +66,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -81,7 +81,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -117,7 +117,7 @@ public void GetHashCode_WhenTwoSameInstancesAreCreated_ThenInstanceHashCodesAreE .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -154,7 +154,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -169,7 +169,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -206,7 +206,7 @@ public void Equals_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstancesAreE .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -245,7 +245,7 @@ public void GetHashCode_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstance .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -285,7 +285,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesHashCodesAreEqual() .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") @@ -324,7 +324,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesAreEqual() .WithName("name") .WithProtocol("protocol") .WithRating(ATCRating.SeniorController) - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("1.2.3") .WithVID("123456") diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsFollowMeDataModelTest.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsFollowMeDataModelTest.cs index 1d33c50..a892c3d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsFollowMeDataModelTest.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsFollowMeDataModelTest.cs @@ -25,7 +25,7 @@ public void Equals_WhenTwoSameInstancesAreCreated_ThenInstancesAreEqual() .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -55,7 +55,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -65,7 +65,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithCallsign("LZKZ_FOLLOW") .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -95,7 +95,7 @@ public void GetHashCode_WhenTwoSameInstancesAreCreated_ThenInstanceHashCodesAreE .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -126,7 +126,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -137,7 +137,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -168,7 +168,7 @@ public void Equals_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstancesAreE .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -201,7 +201,7 @@ public void GetHashCode_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstance .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -235,7 +235,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesHashCodesAreEqual() .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); @@ -268,7 +268,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesAreEqual() .WithLocation(null) .WithName("name") .WithProtocol("protocol") - .WithServer("server") + .WithServer(null) .WithSoftwareName("IVAC") .WithSoftwareVersion("3.2.1.3") .WithVID("1234567"); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsPilotDataModelTest.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsPilotDataModelTest.cs index 5d14779..2d66a1d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsPilotDataModelTest.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.Test/Models/ClientsPilotDataModelTest.cs @@ -32,7 +32,7 @@ public void Equals_WhenTwoSameInstancesAreCreated_ThenInstancesAreEqual() .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -70,7 +70,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -87,7 +87,7 @@ public void Equals_WhenTwoDifferentInstancesAreCreated_ThenInstancesAreNotEqual( .WithHeading(222) .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -125,7 +125,7 @@ public void GetHashCode_WhenTwoSameInstancesAreCreated_ThenInstanceHashCodesAreE .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -164,7 +164,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -181,7 +181,7 @@ public void GetHashCode_WhenTwoDifferentInstancesAreCreated_ThenInstanceHashCode .WithHeading(222) .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -220,7 +220,7 @@ public void Equals_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstancesAreE .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -261,7 +261,7 @@ public void GetHashCode_WhenInstanceIsDeseraializeAndSerializedBack_ThenInstance .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -303,7 +303,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesHashCodesAreEqual() .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") @@ -344,7 +344,7 @@ public void Clone_WhenInstanceCloned_ThenInstancesAreEqual() .WithPlaneMTL("mtl") .WithProtocol("protocol") .WithRating(PilotRating.AirlineTransportPilot) - .WithServer("server") + .WithServer(null) .WithSoftwareName("sw name") .WithSoftwareVersion("1.2.3.4") .WithTransponderCode("7200") diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs index bcc62c2..66c2ebc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs @@ -32,6 +32,7 @@ using MalikP.IVAO.Library.Common.Parsers.DataExtractors.Client; using MalikP.IVAO.Library.Models.Clients; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Common.Parsers { @@ -69,13 +70,14 @@ protected TBuilder AssignGeneralData(TBuilder builder, string[] rowDat where TBuilder : AbstractClientBuilder { GPS location = GetLocation(rowData); + Server server = GetServer(rowData); return builder .WithCallsign(rowData[ClientIndex.All.Callsign]) .WithVID(rowData[ClientIndex.All.VID]) .WithName(rowData[ClientIndex.All.Name]) .WithLocation(location) - .WithServer(rowData[ClientIndex.All.Server]) + .WithServer(server) .WithProtocol(rowData[ClientIndex.All.Protocol]) .WithConnectionTime(_ivaoStringService.IVAO_GetDateTime(rowData[ClientIndex.All.ConnectionTime]) ?? DateTime.MinValue) .WithSoftwareName(rowData[ClientIndex.All.SoftwareName]) @@ -83,5 +85,12 @@ protected TBuilder AssignGeneralData(TBuilder builder, string[] rowDat .WithAdministrativeVersion((AdministrativeRating)_ivaoStringService.IVAO_GetInt(rowData[ClientIndex.All.AdministrativeVersion])) .WithClientRating(_ivaoStringService.IVAO_GetInt(rowData[ClientIndex.All.ClientRating])); } + + private Server GetServer(string[] rowData) + { + return ServerBuilder.Create() + .WithName(rowData[ClientIndex.All.Server]) + .Build(); + } } } \ No newline at end of file diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AbstractClientBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AbstractClientBuilder.cs index 49339d3..43f9e5f 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AbstractClientBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AbstractClientBuilder.cs @@ -29,6 +29,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -39,7 +40,7 @@ public abstract class AbstractClientBuilder protected string name; protected ClientType clientType; protected GPS location; - protected string server; + protected Server server; protected string protocol; protected DateTime connectionTime; protected string softwareName; @@ -77,7 +78,7 @@ public TBuilder WithLocation(GPS location) return GetBuilder(); } - public TBuilder WithServer(string server) + public TBuilder WithServer(Server server) { this.server = server; return GetBuilder(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs index e3150a6..f8c70dc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs @@ -31,6 +31,7 @@ using MalikP.IVAO.Library.Common.Annotation; using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -43,7 +44,7 @@ public AirTrafficController( string name, ClientType clientType, GPS location, - string server, + Server server, string protocol, DateTime connectionTime, string softwareName, diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs index 69545a9..d11e5c1 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficControllerBuilder.cs @@ -29,6 +29,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -62,7 +63,7 @@ public static AirTrafficControllerBuilder FromModel(AirTrafficController model) .WithLocation(model.Location == null ? model.Location : (GPS)model.Location.Clone()) .WithName(model.Name) .WithProtocol(model.Protocol) - .WithServer(model.Server) + .WithServer(model.Server == null ? null : (Server)model.Server.Clone()) .WithSoftwareName(model.SoftwareName) .WithSoftwareVersion(model.SoftwareVersion) .WithVID(model.VID) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs index ae3d866..8764270 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs @@ -31,6 +31,7 @@ using MalikP.IVAO.Library.Common.Annotation; using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -43,7 +44,7 @@ public Client( string name, ClientType clientType, GPS location, - string server, + Server server, string protocol, DateTime connectionTime, string softwareName, @@ -56,7 +57,7 @@ public Client( Name = name ?? string.Empty; ClientType = clientType; Location = location; - Server = server ?? string.Empty; + Server = server; Protocol = protocol ?? string.Empty; ConnectionTime = connectionTime; SoftwareName = softwareName ?? string.Empty; @@ -88,7 +89,7 @@ protected Client() public GPS Location { get; private set; } [DataMember] - public string Server { get; private set; } + public Server Server { get; private set; } [DataMember] public string Protocol { get; private set; } @@ -132,7 +133,7 @@ public override bool Equals(object obj) && string.Equals(casted.Name, Name, StringComparison.InvariantCultureIgnoreCase) && Equals(casted.ClientType, ClientType) && Equals(casted.Location, Location) - && string.Equals(casted.Server, Server, StringComparison.InvariantCultureIgnoreCase) + && Equals(casted.Server, Server) && string.Equals(casted.Protocol, Protocol, StringComparison.InvariantCultureIgnoreCase) && Equals(casted.ConnectionTime, ConnectionTime) && string.Equals(casted.SoftwareName, SoftwareName, StringComparison.InvariantCultureIgnoreCase) @@ -151,7 +152,7 @@ public override int GetHashCode() + (Name.ToUpper().GetHashCode() * 3) + (ClientType.GetHashCode() * 3) + (GetItemHashCode(Location) * 3) - + (Server.ToUpper().GetHashCode() * 3) + + (GetItemHashCode(Server) * 3) + (Protocol.ToUpper().GetHashCode() * 3) + (ConnectionTime.GetHashCode() * 3) + (SoftwareName.ToUpper().GetHashCode() * 3) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs index ec1fd13..0c3054f 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/ClientWithRating.cs @@ -30,6 +30,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -42,7 +43,7 @@ public ClientWithRating( string name, ClientType clientType, GPS location, - string server, + Server server, string protocol, DateTime connectionTime, string softwareName, diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs index 2750992..f4b6b3a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs @@ -30,6 +30,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -42,7 +43,7 @@ public FollowMe( string name, ClientType clientType, GPS location, - string server, + Server server, string protocol, DateTime connectionTime, string softwareName, diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMeBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMeBuilder.cs index b1ed461..372d3e0 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMeBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMeBuilder.cs @@ -27,6 +27,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -52,7 +53,7 @@ public static FollowMeBuilder FromModel(FollowMe model) .WithLocation(model.Location == null ? model.Location : (GPS)model.Location.Clone()) .WithName(model.Name) .WithProtocol(model.Protocol) - .WithServer(model.Server) + .WithServer(model.Server == null ? null : (Server)model.Server.Clone()) .WithSoftwareName(model.SoftwareName) .WithSoftwareVersion(model.SoftwareVersion) .WithVID(model.VID); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs index 13eb9ee..6f67d73 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs @@ -31,6 +31,7 @@ using MalikP.IVAO.Library.Common.Annotation; using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -43,7 +44,7 @@ public Pilot( string name, ClientType clientType, GPS location, - string server, + Server server, string protocol, DateTime connectionTime, string softwareName, diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs index be13ef7..617fdac 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/PilotBuilder.cs @@ -27,6 +27,7 @@ using MalikP.IVAO.Library.Common.Enums; using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; namespace MalikP.IVAO.Library.Models.Clients { @@ -61,7 +62,7 @@ public static PilotBuilder FromModel(Pilot model) .WithLocation(model.Location == null ? model.Location : (GPS)model.Location.Clone()) .WithName(model.Name) .WithProtocol(model.Protocol) - .WithServer(model.Server) + .WithServer(model.Server == null ? null : (Server)model.Server.Clone()) .WithSoftwareName(model.SoftwareName) .WithSoftwareVersion(model.SoftwareVersion) .WithVID(model.VID) From 93b880993b9d942dc34a7089c96a42633d823927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sat, 1 Jun 2019 23:23:09 +0200 Subject: [PATCH 03/17] Add ip address type --- .../Common/Parsers/ServerParser.cs | 4 ++-- .../Models/Servers/Server.cs | 17 ++++++++++++----- .../Models/Servers/ServerBuilder.cs | 13 ++++++++++--- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/ServerParser.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/ServerParser.cs index b2fa879..c9a286a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/ServerParser.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/ServerParser.cs @@ -26,7 +26,7 @@ // SOFTWARE. using System; - +using System.Net; using MalikP.IVAO.Library.Common.Indexes; using MalikP.IVAO.Library.Common.Selector; using MalikP.IVAO.Library.Models.Servers; @@ -56,7 +56,7 @@ protected override Server CreateItem(string data) return ServerBuilder.Create() .WithHostname(dataItems[ServerIndex.Hostname]) - .WithIP(dataItems[ServerIndex.IP]) + .WithIP(IPAddress.Parse(dataItems[ServerIndex.IP])) .WithLocation(dataItems[ServerIndex.Location]) .WithName(dataItems[ServerIndex.Name]) .WithConnectionsAllowed(Convert.ToBoolean(Convert.ToInt16(dataItems[ServerIndex.ConnectionsAllowed]))) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs index 1195834..c0fe9be 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs @@ -26,6 +26,7 @@ // SOFTWARE. using System; +using System.Net; using System.Runtime.Serialization; namespace MalikP.IVAO.Library.Models.Servers @@ -35,14 +36,14 @@ public sealed class Server : AbstractIvaoModel { public Server( string hostname, - string ip, + IPAddress ip, string location, string name, bool connectionsAllowed, int maximumConnections) { Hostname = hostname ?? string.Empty; - IP = ip ?? string.Empty; + IP = ip; Location = location ?? string.Empty; Name = name ?? string.Empty; ConnectionsAllowed = connectionsAllowed; @@ -56,8 +57,14 @@ private Server() [DataMember] public string Hostname { get; private set; } + public IPAddress IP { get; private set; } + [DataMember] - public string IP { get; private set; } + private string IPAddressIntenal + { + get { return IP.ToString(); } + set { IP = IPAddress.Parse(value); } + } [DataMember] public string Location { get; private set; } @@ -91,7 +98,7 @@ public override bool Equals(object obj) return base.Equals(obj) && string.Equals(casted.Hostname, Hostname, StringComparison.InvariantCultureIgnoreCase) - && string.Equals(casted.IP, IP, StringComparison.InvariantCultureIgnoreCase) + && Equals(casted.IP, IP) && Equals(casted.ConnectionsAllowed, ConnectionsAllowed) && Equals(casted.MaximumConnections, MaximumConnections) && string.Equals(casted.Name, Name, StringComparison.InvariantCultureIgnoreCase) @@ -104,7 +111,7 @@ public override int GetHashCode() { return base.GetHashCode() + (Hostname.ToUpper().GetHashCode() * 3) - + (IP.ToUpper().GetHashCode() * 3) + + (IP.GetHashCode() * 3) + (ConnectionsAllowed.GetHashCode() * 3) + (MaximumConnections.GetHashCode() * 3) + (Name.ToUpper().GetHashCode() * 3) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/ServerBuilder.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/ServerBuilder.cs index 222a672..294266f 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/ServerBuilder.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/ServerBuilder.cs @@ -25,12 +25,14 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +using System.Net; + namespace MalikP.IVAO.Library.Models.Servers { public sealed class ServerBuilder { private string _hostname; - private string _ip; + private IPAddress _ip; private string _location; private string _name; private bool _connectionsAllowed; @@ -50,7 +52,7 @@ public static ServerBuilder FromModel(Server model) return new ServerBuilder() .WithConnectionsAllowed(model.ConnectionsAllowed) .WithHostname(model.Hostname) - .WithIP(model.IP) + .WithIP(model.IP == null ? null : IPAddress.Parse(model.IP.ToString())) .WithLocation(model.Location) .WithMaximumConnections(model.MaximumConnections) .WithName(model.Name); @@ -62,12 +64,17 @@ public ServerBuilder WithHostname(string hostname) return this; } - public ServerBuilder WithIP(string ip) + public ServerBuilder WithIP(IPAddress ip) { _ip = ip; return this; } + public ServerBuilder WithIP(string ip) + { + return WithIP(IPAddress.Parse(ip)); + } + public ServerBuilder WithLocation(string location) { _location = location; From 6ba8bd9bfef5a8af5040bedbe437fb35eb66656e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sat, 1 Jun 2019 23:58:43 +0200 Subject: [PATCH 04/17] Add enhancers to enahnce simple server to enhanced server --- .../MalikP.IVAO.Library.App/Program.cs | 9 +++ .../Enhancers/AbstractServerEnhancer.cs | 51 +++++++++++++++ .../AirTrafficControllerServerEnhancer.cs | 62 ++++++++++++++++++ .../Enhancers/FollowMeServerEnhancer.cs | 62 ++++++++++++++++++ .../IAirTrafficControllerServerEnhancer.cs | 35 +++++++++++ .../Common/Enhancers/IDataEnhancer.cs | 42 +++++++++++++ .../Enhancers/IFollowMeServerEnhancer.cs | 35 +++++++++++ .../Common/Enhancers/IPilotServerEnhancer.cs | 35 +++++++++++ .../Common/Enhancers/PilotServerEnhancer.cs | 63 +++++++++++++++++++ .../Common/Parsers/AbstractClientFactory.cs | 2 +- .../Models/Servers/Server.cs | 2 +- 11 files changed, 396 insertions(+), 2 deletions(-) create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AbstractServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AirTrafficControllerServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/FollowMeServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IAirTrafficControllerServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IDataEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IFollowMeServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IPilotServerEnhancer.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/PilotServerEnhancer.cs diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 0d68495..6d4a668 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -7,6 +7,7 @@ using System.Xml; using MalikP.IVAO.Library.Common; +using MalikP.IVAO.Library.Common.Enhancers; using MalikP.IVAO.Library.Common.Parsers; using MalikP.IVAO.Library.Common.Selector; using MalikP.IVAO.Library.Data.Source; @@ -60,6 +61,14 @@ public static void Main(string[] args) List pilotDataModels = pilotClientsDataProvider.GetData().ToList(); List followMeDataModels = followMeClientsDataProvider.GetData().ToList(); + IAirTrafficControllerServerEnhancer atcServerEnhancer = new AirTrafficControllerServerEnhancer(serversDataProvider); + IPilotServerEnhancer pilotServerEnhancer = new PilotServerEnhancer(serversDataProvider); + IFollowMeServerEnhancer followMeServerEnhancer = new FollowMeServerEnhancer(serversDataProvider); + + atcDataModels = atcDataModels.Select(atcServerEnhancer.Enhance).Cast().ToList(); + pilotDataModels = pilotDataModels.Select(pilotServerEnhancer.Enhance).Cast().ToList(); + followMeDataModels = followMeDataModels.Select(followMeServerEnhancer.Enhance).Cast().ToList(); + Client item = pilotDataModels.First(); TrySerialize(item); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AbstractServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AbstractServerEnhancer.cs new file mode 100644 index 0000000..fea98a7 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AbstractServerEnhancer.cs @@ -0,0 +1,51 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: AbstractServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using MalikP.IVAO.Library.Models; +using MalikP.IVAO.Library.Models.Clients; +using MalikP.IVAO.Library.Providers; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public abstract class AbstractServerEnhancer : IDataEnhancer + where TClientModel : Client + { + protected AbstractServerEnhancer(IServersProvider serversProvider) + { + ServersProvider = serversProvider; + } + + protected IServersProvider ServersProvider { get; } + + public abstract TClientModel Enhance(TClientModel modelToEnhance); + + public IModel Enhance(IModel modelToEnhance) + { + return Enhance((TClientModel)modelToEnhance); + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AirTrafficControllerServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AirTrafficControllerServerEnhancer.cs new file mode 100644 index 0000000..c86746e --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/AirTrafficControllerServerEnhancer.cs @@ -0,0 +1,62 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: AirTrafficControllerServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using System.Linq; +using MalikP.IVAO.Library.Models.Clients; +using MalikP.IVAO.Library.Models.Servers; +using MalikP.IVAO.Library.Providers; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public class AirTrafficControllerServerEnhancer : AbstractServerEnhancer, IAirTrafficControllerServerEnhancer + { + public AirTrafficControllerServerEnhancer(IServersProvider serversProvider) + : base(serversProvider) + { + } + + public override AirTrafficController Enhance(AirTrafficController modelToEnhance) + { + if (modelToEnhance.Server == null) + { + return modelToEnhance; + } + + Server server = ServersProvider.GetData() + .FirstOrDefault(d => d.Hostname == modelToEnhance.Server.Hostname); + + if (server == null) + { + return modelToEnhance; + } + + return AirTrafficControllerBuilder.FromModel(modelToEnhance) + .WithServer((Server)server.Clone()) + .Build(); + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/FollowMeServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/FollowMeServerEnhancer.cs new file mode 100644 index 0000000..29eb298 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/FollowMeServerEnhancer.cs @@ -0,0 +1,62 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: FollowMeServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using System.Linq; +using MalikP.IVAO.Library.Models.Clients; +using MalikP.IVAO.Library.Models.Servers; +using MalikP.IVAO.Library.Providers; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public class FollowMeServerEnhancer : AbstractServerEnhancer, IFollowMeServerEnhancer + { + public FollowMeServerEnhancer(IServersProvider serversProvider) + : base(serversProvider) + { + } + + public override FollowMe Enhance(FollowMe modelToEnhance) + { + if (modelToEnhance.Server == null) + { + return modelToEnhance; + } + + Server server = ServersProvider.GetData() + .FirstOrDefault(d => d.Hostname == modelToEnhance.Server.Hostname); + + if (server == null) + { + return modelToEnhance; + } + + return FollowMeBuilder.FromModel(modelToEnhance) + .WithServer((Server)server.Clone()) + .Build(); + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IAirTrafficControllerServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IAirTrafficControllerServerEnhancer.cs new file mode 100644 index 0000000..d1f54f6 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IAirTrafficControllerServerEnhancer.cs @@ -0,0 +1,35 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: IAirTrafficControllerServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using MalikP.IVAO.Library.Models.Clients; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public interface IAirTrafficControllerServerEnhancer : IDataEnhancer + { + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IDataEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IDataEnhancer.cs new file mode 100644 index 0000000..56a4a54 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IDataEnhancer.cs @@ -0,0 +1,42 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: IDataEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using MalikP.IVAO.Library.Models; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public interface IDataEnhancer + { + IModel Enhance(IModel modelToEnhance); + } + + public interface IDataEnhancer : IDataEnhancer + where TModelToEnhance : IModel + { + TModelToEnhance Enhance(TModelToEnhance modelToEnhance); + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IFollowMeServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IFollowMeServerEnhancer.cs new file mode 100644 index 0000000..c669965 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IFollowMeServerEnhancer.cs @@ -0,0 +1,35 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: IFollowMeServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using MalikP.IVAO.Library.Models.Clients; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public interface IFollowMeServerEnhancer : IDataEnhancer + { + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IPilotServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IPilotServerEnhancer.cs new file mode 100644 index 0000000..6c493c0 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/IPilotServerEnhancer.cs @@ -0,0 +1,35 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: IPilotServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using MalikP.IVAO.Library.Models.Clients; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public interface IPilotServerEnhancer : IDataEnhancer + { + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/PilotServerEnhancer.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/PilotServerEnhancer.cs new file mode 100644 index 0000000..d2a7498 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Enhancers/PilotServerEnhancer.cs @@ -0,0 +1,63 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: PilotServerEnhancer.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +using System.Linq; + +using MalikP.IVAO.Library.Models.Clients; +using MalikP.IVAO.Library.Models.Servers; +using MalikP.IVAO.Library.Providers; + +namespace MalikP.IVAO.Library.Common.Enhancers +{ + public class PilotServerEnhancer : AbstractServerEnhancer, IPilotServerEnhancer + { + public PilotServerEnhancer(IServersProvider serversProvider) + : base(serversProvider) + { + } + + public override Pilot Enhance(Pilot modelToEnhance) + { + if (modelToEnhance.Server == null) + { + return modelToEnhance; + } + + Server server = ServersProvider.GetData() + .FirstOrDefault(d => d.Hostname == modelToEnhance.Server.Hostname); + + if (server == null) + { + return modelToEnhance; + } + + return PilotBuilder.FromModel(modelToEnhance) + .WithServer((Server)server.Clone()) + .Build(); + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs index 66c2ebc..aed2346 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Common/Parsers/AbstractClientFactory.cs @@ -89,7 +89,7 @@ protected TBuilder AssignGeneralData(TBuilder builder, string[] rowDat private Server GetServer(string[] rowData) { return ServerBuilder.Create() - .WithName(rowData[ClientIndex.All.Server]) + .WithHostname(rowData[ClientIndex.All.Server]) .Build(); } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs index c0fe9be..d73d97d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs @@ -62,7 +62,7 @@ private Server() [DataMember] private string IPAddressIntenal { - get { return IP.ToString(); } + get { return IP == null ? string.Empty : IP.ToString(); } set { IP = IPAddress.Parse(value); } } From 24525353ffa8598683702d7082a9c92bf4cffd40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:01:17 +0200 Subject: [PATCH 05/17] Version 0.8.6 --- .../MalikP.IVAO.Library/MalikP.IVAO.Library.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/MalikP.IVAO.Library.csproj b/src/MalikP. IVAO Library/MalikP.IVAO.Library/MalikP.IVAO.Library.csproj index df404fa..29d4abc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/MalikP.IVAO.Library.csproj +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/MalikP.IVAO.Library.csproj @@ -3,7 +3,7 @@ netstandard2.1;netstandard2.0;net472;net471;net47;net462;net461;net46;net452;net451;net45 MalikP.IVAO.Library - 0.8.5 + 0.8.6 Peter Malik (MalikP.) Peter Malik (MalikP.) MalikP. IVAO Library From 1dbdbf8d7463990c0969d251bea0ffed2a038fa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:13:46 +0200 Subject: [PATCH 06/17] Add known types --- src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs | 3 +++ .../MalikP.IVAO.Library/Models/Clients/Client.cs | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 6d4a668..256761a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -71,6 +71,9 @@ public static void Main(string[] args) Client item = pilotDataModels.First(); + IModelCloner modelCloner = new ModelCloner(); + Client m = modelCloner.Clone(pilotDataModels[0]); + TrySerialize(item); } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs index 8764270..d2d429a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs @@ -36,6 +36,10 @@ namespace MalikP.IVAO.Library.Models.Clients { [DataContract] + [KnownType(typeof(AirTrafficController))] + [KnownType(typeof(Pilot))] + [KnownType(typeof(FollowMe))] + [KnownType(typeof(ClientWithRating<>))] public abstract class Client : AbstractIvaoModel { public Client( From 84a85bbfbcc099821f33fe500e9ca4004d595b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:22:37 +0200 Subject: [PATCH 07/17] Add operators ==, != to models --- .../MalikP.IVAO.Library/Models/AbstractIvaoModel.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Airports/Airport.cs | 10 ++++++++++ .../Models/Clients/AirTrafficController.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Clients/Client.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Clients/FollowMe.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Clients/Pilot.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/General/GeneralData.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Other/Aerodrome.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Other/FlightPlan.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Other/GPS.cs | 10 ++++++++++ .../MalikP.IVAO.Library/Models/Servers/Server.cs | 10 ++++++++++ 11 files changed, 110 insertions(+) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs index 9ada301..b9f9bda 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs @@ -73,5 +73,15 @@ protected int GetItemHashCode(object item) return item.GetHashCode(); } } + + public static bool operator !=(AbstractIvaoModel instance1, AbstractIvaoModel instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(AbstractIvaoModel instance1, AbstractIvaoModel instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs index 7d29eff..9819ae7 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs @@ -87,5 +87,15 @@ public override object Clone() } public static AirportBuilder Builder => AirportBuilder.Create(); + + public static bool operator !=(Airport instance1, Airport instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(Airport instance1, Airport instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs index f8c70dc..25bdb5b 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs @@ -147,5 +147,15 @@ public override object Clone() } public static AirTrafficControllerBuilder Builder => AirTrafficControllerBuilder.Create(); + + public static bool operator !=(AirTrafficController instance1, AirTrafficController instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(AirTrafficController instance1, AirTrafficController instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs index d2d429a..51c2537 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs @@ -165,5 +165,15 @@ public override int GetHashCode() + (ClientRating.GetHashCode() * 3) * 17; } } + + public static bool operator !=(Client instance1, Client instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(Client instance1, Client instance2) + { + return instance1.Equals(instance2); + } } } \ No newline at end of file diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs index f4b6b3a..85b28e8 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs @@ -105,5 +105,15 @@ public override object Clone() } public static FollowMeBuilder Builder => FollowMeBuilder.Create(); + + public static bool operator !=(FollowMe instance1, FollowMe instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(FollowMe instance1, FollowMe instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs index 6f67d73..f520941 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs @@ -159,5 +159,15 @@ public override object Clone() } public static PilotBuilder Builder => PilotBuilder.Create(); + + public static bool operator !=(Pilot instance1, Pilot instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(Pilot instance1, Pilot instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs index 776f0ea..5683b27 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs @@ -119,5 +119,15 @@ public override object Clone() } public static GeneralDataBuilder Builder => GeneralDataBuilder.Create(); + + public static bool operator !=(GeneralData instance1, GeneralData instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(GeneralData instance1, GeneralData instance2) + { + return instance1.Equals(instance2); + } } } \ No newline at end of file diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs index 118c456..977c72e 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs @@ -80,5 +80,15 @@ public override int GetHashCode() return ICAO.ToUpper().GetHashCode() * 3 * 17; } } + + public static bool operator !=(Aerodrome instance1, Aerodrome instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(Aerodrome instance1, Aerodrome instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs index 2883b16..9f5111d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs @@ -211,5 +211,15 @@ public object Clone() } public static FlightPlanBuilder Builder => FlightPlanBuilder.Create(); + + public static bool operator !=(FlightPlan instance1, FlightPlan instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(FlightPlan instance1, FlightPlan instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs index 9556641..c8423d0 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs @@ -101,5 +101,15 @@ public object Clone() } public static GPSBuilder Builder => GPSBuilder.Create(); + + public static bool operator !=(GPS instance1, GPS instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(GPS instance1, GPS instance2) + { + return instance1.Equals(instance2); + } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs index d73d97d..6c6f9d6 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs @@ -126,5 +126,15 @@ public override object Clone() } public static ServerBuilder Builder => ServerBuilder.Create(); + + public static bool operator !=(Server instance1, Server instance2) + { + return !instance1.Equals(instance2); + } + + public static bool operator ==(Server instance1, Server instance2) + { + return instance1.Equals(instance2); + } } } From 050fd6dc26aeef100d6cfc010c32129f7306e507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:28:23 +0200 Subject: [PATCH 08/17] Improve operator implementation --- .../MalikP.IVAO.Library/Models/AbstractIvaoModel.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Airports/Airport.cs | 4 ++-- .../Models/Clients/AirTrafficController.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Clients/Client.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Clients/FollowMe.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Clients/Pilot.cs | 4 ++-- .../MalikP.IVAO.Library/Models/General/GeneralData.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Other/Aerodrome.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Other/FlightPlan.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Other/GPS.cs | 4 ++-- .../MalikP.IVAO.Library/Models/Servers/Server.cs | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs index b9f9bda..b76eb08 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/AbstractIvaoModel.cs @@ -76,12 +76,12 @@ protected int GetItemHashCode(object item) public static bool operator !=(AbstractIvaoModel instance1, AbstractIvaoModel instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(AbstractIvaoModel instance1, AbstractIvaoModel instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs index 9819ae7..00c07f8 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Airports/Airport.cs @@ -90,12 +90,12 @@ public override object Clone() public static bool operator !=(Airport instance1, Airport instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(Airport instance1, Airport instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs index 25bdb5b..f0c77e0 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/AirTrafficController.cs @@ -150,12 +150,12 @@ public override object Clone() public static bool operator !=(AirTrafficController instance1, AirTrafficController instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(AirTrafficController instance1, AirTrafficController instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs index 51c2537..e319188 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Client.cs @@ -168,12 +168,12 @@ public override int GetHashCode() public static bool operator !=(Client instance1, Client instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(Client instance1, Client instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } \ No newline at end of file diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs index 85b28e8..bc472dc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/FollowMe.cs @@ -108,12 +108,12 @@ public override object Clone() public static bool operator !=(FollowMe instance1, FollowMe instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(FollowMe instance1, FollowMe instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs index f520941..3837558 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Clients/Pilot.cs @@ -162,12 +162,12 @@ public override object Clone() public static bool operator !=(Pilot instance1, Pilot instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(Pilot instance1, Pilot instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs index 5683b27..cbd98e9 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/General/GeneralData.cs @@ -122,12 +122,12 @@ public override object Clone() public static bool operator !=(GeneralData instance1, GeneralData instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(GeneralData instance1, GeneralData instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } \ No newline at end of file diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs index 977c72e..3473c68 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/Aerodrome.cs @@ -83,12 +83,12 @@ public override int GetHashCode() public static bool operator !=(Aerodrome instance1, Aerodrome instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(Aerodrome instance1, Aerodrome instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs index 9f5111d..e921651 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/FlightPlan.cs @@ -214,12 +214,12 @@ public object Clone() public static bool operator !=(FlightPlan instance1, FlightPlan instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(FlightPlan instance1, FlightPlan instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs index c8423d0..ba2b21c 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Other/GPS.cs @@ -104,12 +104,12 @@ public object Clone() public static bool operator !=(GPS instance1, GPS instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(GPS instance1, GPS instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs index 6c6f9d6..582279d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Servers/Server.cs @@ -129,12 +129,12 @@ public override object Clone() public static bool operator !=(Server instance1, Server instance2) { - return !instance1.Equals(instance2); + return !Equals(instance1, instance2); } public static bool operator ==(Server instance1, Server instance2) { - return instance1.Equals(instance2); + return Equals(instance1, instance2); } } } From 96107708a0551cc25146414fb675157293bafc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:33:23 +0200 Subject: [PATCH 09/17] Remove unused and duplicated code --- .../MalikP.IVAO.Library.App/Program.cs | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 256761a..446ce6f 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -73,25 +73,6 @@ public static void Main(string[] args) IModelCloner modelCloner = new ModelCloner(); Client m = modelCloner.Clone(pilotDataModels[0]); - - TrySerialize(item); - } - - private static void TrySerialize(Client item) - { - using (MemoryStream ms = new MemoryStream()) - { - DataContractSerializer ser = new DataContractSerializer(typeof(Pilot)); - ser.WriteObject(ms, item); - - byte[] d = ms.ToArray(); - string s = Encoding.UTF8.GetString(d); - - ms.Position = 0; - - XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(ms, new XmlDictionaryReaderQuotas()); - object deserializedPerson = ser.ReadObject(reader, true); - } } private static string GetPath() From daa57c8a1a54adaa3a0c52a4c222b75eb2769293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 00:46:54 +0200 Subject: [PATCH 10/17] Add IoC Extensions --- .../MalikP. IVAO Library.sln | 8 +++- .../MalikP.IVAO.Library.App/Program.cs | 1 + .../IvaoIocExtensions.cs | 46 +++++++++++++++++++ .../MalikP.IVAO.Library.IoC.csproj | 15 ++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj diff --git a/src/MalikP. IVAO Library/MalikP. IVAO Library.sln b/src/MalikP. IVAO Library/MalikP. IVAO Library.sln index 58993c1..5a25e13 100644 --- a/src/MalikP. IVAO Library/MalikP. IVAO Library.sln +++ b/src/MalikP. IVAO Library/MalikP. IVAO Library.sln @@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library.App", " EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library", "MalikP.IVAO.Library\MalikP.IVAO.Library.csproj", "{95BCECFF-D358-4FD8-BC81-3DF6C04DC8A2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalikP.IVAO.Library.Test", "MalikP.IVAO.Library.Test\MalikP.IVAO.Library.Test.csproj", "{6939AC5E-4B9B-40B3-8044-437D0E20102F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library.Test", "MalikP.IVAO.Library.Test\MalikP.IVAO.Library.Test.csproj", "{6939AC5E-4B9B-40B3-8044-437D0E20102F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalikP.IVAO.Library.IoC", "MalikP.IVAO.Library.IoC\MalikP.IVAO.Library.IoC.csproj", "{35EADA32-399B-4DB5-BBAD-773603F127A9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -27,6 +29,10 @@ Global {6939AC5E-4B9B-40B3-8044-437D0E20102F}.Debug|Any CPU.Build.0 = Debug|Any CPU {6939AC5E-4B9B-40B3-8044-437D0E20102F}.Release|Any CPU.ActiveCfg = Release|Any CPU {6939AC5E-4B9B-40B3-8044-437D0E20102F}.Release|Any CPU.Build.0 = Release|Any CPU + {35EADA32-399B-4DB5-BBAD-773603F127A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {35EADA32-399B-4DB5-BBAD-773603F127A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35EADA32-399B-4DB5-BBAD-773603F127A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {35EADA32-399B-4DB5-BBAD-773603F127A9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 446ce6f..7d4465a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -38,6 +38,7 @@ public static void Main(string[] args) ICachedIVAOWhazzupDataSource dataSource = new CachedIVAOWhazzupDataSource(nonCachedLocalGZippedDataSource); IParserFactory parserFactory = new ParserFactory(); + IGeneralSelector generalSelector = new GeneralSelector(); IClientsSelector clientsSelector = new ClientsSelector(); IServersSelector serverSelector = new ServersSelector(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs new file mode 100644 index 0000000..a1493f8 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs @@ -0,0 +1,46 @@ +using MalikP.IVAO.Library.Common; +using MalikP.IVAO.Library.Common.Enhancers; +using MalikP.IVAO.Library.Common.Parsers; +using MalikP.IVAO.Library.Common.Selector; +using MalikP.IVAO.Library.Data.Source; +using MalikP.IVAO.Library.Providers; + +namespace MalikP.IoC +{ + public static class IvaoIocExtensions + { + public static IIoC AddIVAOServices(this IIoC ioc) + { + ioc.Register(); + + //ioc.Register(); + //ioc.Register(); + //ioc.Register(); + //ioc.Register(); + + ioc.Register(); + + ioc.Register(); + ioc.Register(); + ioc.Register(); + ioc.Register(); + + ioc.Register(); + ioc.Register(); + ioc.Register(); + ioc.Register(); + + ioc.Register(); + ioc.Register(); + ioc.Register(); + + ioc.Register(); + ioc.Register(); + ioc.Register(); + + ioc.Register(); + + return ioc; + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj new file mode 100644 index 0000000..e88a6dc --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.0 + + + + + + + + + + + From 74e603d48bac0abc330e004078ae3517ac2ed2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 01:20:28 +0200 Subject: [PATCH 11/17] Add ioc --- .../MalikP.IVAO.Library.App.csproj | 5 ++ .../MalikP.IVAO.Library.App/Program.cs | 65 +++++++++++++++++- .../MalikP.IVAO.Library.IoC/IVAOLibrary.ico | Bin 0 -> 321875 bytes .../IvaoIocExtensions.cs | 8 ++- .../MalikP.IVAO.Library.IoC.csproj | 34 +++++++-- .../IAirTrafficControllersProvider.cs | 2 +- .../Providers/IFollowMesProvider.cs | 2 +- .../Providers/IPilotsProvider.cs | 2 +- 8 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IVAOLibrary.ico diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/MalikP.IVAO.Library.App.csproj b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/MalikP.IVAO.Library.App.csproj index b00e50a..a9243d2 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/MalikP.IVAO.Library.App.csproj +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/MalikP.IVAO.Library.App.csproj @@ -6,6 +6,11 @@ + + + + + diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 7d4465a..4c38522 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -2,10 +2,9 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.Serialization; -using System.Text; -using System.Xml; +using MalikP.IoC; +using MalikP.IoC.Factories; using MalikP.IVAO.Library.Common; using MalikP.IVAO.Library.Common.Enhancers; using MalikP.IVAO.Library.Common.Parsers; @@ -27,6 +26,66 @@ internal static class Program public static void Main(string[] args) { string path = GetPath(); + + OptionIoC(path); + + OptionDirect(path); + } + + private static void OptionIoC(string path) + { + IIoC ioc = Locator.GetContainer(new AdvancedContainerFactory()); + ioc.AddIVAOServices(); + ioc.Register() + .Extend() + .WithSpecific(path); + + ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); + + ICachedIVAOWhazzupDataSource dataSource = ioc.Resolve(); + + //IIVAOWhazzupDataSource nonCachedWebDataSource = new WebIVAOWhazzupDataSource("http://api.ivao.aero/getdata/whazzup/whazzup.txt"); + //IIVAOWhazzupDataSource nonCachedWebGZippedDataSource = new WebGZippedIVAOWhazzupDataSource("http://api.ivao.aero/getdata/whazzup/whazzup.txt.gz", compression); + + //IIVAOWhazzupDataSource nonCachedLocalDataSource = new LocalIVAOWhazzupDataSource(path); + //IIVAOWhazzupDataSource nonCachedLocalGZippedDataSource = new LocalGZippedIVAOWhazzupDataSource(path, compression); + + IGeneralDataProvider generalDataProvider = ioc.Resolve(); + IClientsProvider clientsDataProvider = ioc.Resolve(); + IServersProvider serversDataProvider = ioc.Resolve(); + IAirportsProvider airportsDataProvider = ioc.Resolve(); + + IClientsProvider atcClientsDataProvider = ioc.Resolve(); + IClientsProvider pilotClientsDataProvider = ioc.Resolve(); + IClientsProvider followMeClientsDataProvider = ioc.Resolve(); + + IEnumerable providers = ioc.ResolveAll(); + + List generalDataModels = generalDataProvider.GetData().ToList(); + List clientDataModels = clientsDataProvider.GetData().ToList(); + List serversDataModels = serversDataProvider.GetData().ToList(); + List airportsDataModels = airportsDataProvider.GetData().ToList(); + + List atcDataModels = atcClientsDataProvider.GetData().ToList(); + List pilotDataModels = pilotClientsDataProvider.GetData().ToList(); + List followMeDataModels = followMeClientsDataProvider.GetData().ToList(); + + IAirTrafficControllerServerEnhancer atcServerEnhancer = ioc.Resolve(); + IPilotServerEnhancer pilotServerEnhancer = ioc.Resolve(); + IFollowMeServerEnhancer followMeServerEnhancer = ioc.Resolve(); + + atcDataModels = atcDataModels.Select(atcServerEnhancer.Enhance).Cast().ToList(); + pilotDataModels = pilotDataModels.Select(pilotServerEnhancer.Enhance).Cast().ToList(); + followMeDataModels = followMeDataModels.Select(followMeServerEnhancer.Enhance).Cast().ToList(); + + Client item = pilotDataModels.First(); + + IModelCloner modelCloner = ioc.Resolve(); + Client m = modelCloner.Clone(pilotDataModels[0]); + } + + private static void OptionDirect(string path) + { IGZipCompression compression = new GZipCompression(); IIVAOWhazzupDataSource nonCachedWebDataSource = new WebIVAOWhazzupDataSource("http://api.ivao.aero/getdata/whazzup/whazzup.txt"); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IVAOLibrary.ico b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IVAOLibrary.ico new file mode 100644 index 0000000000000000000000000000000000000000..a7ba0590c0427148da49fc2e1fddea19f9f93a31 GIT binary patch literal 321875 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
    ttIu+>eB3qZB|jE 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 + ioc.Register(); + //ioc.Register(); //ioc.Register(); //ioc.Register(); //ioc.Register(); - ioc.Register(); + //ioc.Register(); ioc.Register(); ioc.Register(); @@ -30,6 +32,10 @@ public static IIoC AddIVAOServices(this IIoC ioc) ioc.Register(); ioc.Register(); + ioc.Register(); + ioc.Register(); + ioc.Register(); + ioc.Register(); ioc.Register(); ioc.Register(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj index e88a6dc..58d251e 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj @@ -1,8 +1,27 @@ - + - - netstandard2.0 - + + netstandard2.1;netstandard2.0;net47;net462;net461;net46;net452;net451;net45 + + MalikP.IVAO.Library.IoC + 0.8.6 + Peter Malik (MalikP.) + Peter Malik (MalikP.) + MalikP. IVAO Library - IoC + Library to process IVAO data + Copyright © 2019 Peter Malik. (MalikP.) + https://github.com/peterM/IVAO-Library + https://github.com/peterM/IVAO-Library + GIT + IVAO;WHAZZUP + false + LICENSE + true + IVAOLibrary.ico + https://raw.githubusercontent.com/peterM/IVAO-Library/master/resource/IVAOLibrary64x64.png + + + @@ -12,4 +31,11 @@ + + + True + + + + diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IAirTrafficControllersProvider.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IAirTrafficControllersProvider.cs index 5216218..c6fb378 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IAirTrafficControllersProvider.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IAirTrafficControllersProvider.cs @@ -29,7 +29,7 @@ namespace MalikP.IVAO.Library.Providers { - public interface IAirTrafficControllersProvider : IProvider + public interface IAirTrafficControllersProvider : IClientsProvider, IProvider { } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IFollowMesProvider.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IFollowMesProvider.cs index 657d68b..d762a2e 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IFollowMesProvider.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IFollowMesProvider.cs @@ -29,7 +29,7 @@ namespace MalikP.IVAO.Library.Providers { - public interface IFollowMesProvider : IProvider + public interface IFollowMesProvider : IClientsProvider, IProvider { } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IPilotsProvider.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IPilotsProvider.cs index 37d3600..a682792 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IPilotsProvider.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Providers/IPilotsProvider.cs @@ -29,7 +29,7 @@ namespace MalikP.IVAO.Library.Providers { - public interface IPilotsProvider : IProvider + public interface IPilotsProvider : IClientsProvider, IProvider { } } From fb296855c23f8caeb4e462e76395ad1854ad1255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 01:26:57 +0200 Subject: [PATCH 12/17] Add target frameworks --- .../MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs | 1 - .../MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs index cc62daa..73db3bc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs @@ -2,7 +2,6 @@ using MalikP.IVAO.Library.Common.Enhancers; using MalikP.IVAO.Library.Common.Parsers; using MalikP.IVAO.Library.Common.Selector; -using MalikP.IVAO.Library.Data.Source; using MalikP.IVAO.Library.Providers; namespace MalikP.IoC diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj index 58d251e..42323cd 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/MalikP.IVAO.Library.IoC.csproj @@ -1,7 +1,7 @@  - netstandard2.1;netstandard2.0;net47;net462;net461;net46;net452;net451;net45 + netstandard2.1;netstandard2.0;net472;net471;net47;net462;net461;net46;net452;net451;net45 MalikP.IVAO.Library.IoC 0.8.6 From 4b45834e4f844a9b3583a8df3dd2e27b1235d95f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 01:41:27 +0200 Subject: [PATCH 13/17] Enhance ioc possibilieties --- .../MalikP.IVAO.Library.App/Program.cs | 6 ++-- .../IvaoIocExtensions.cs | 3 +- .../Source/CachedIVAOWhazzupDataSource.cs | 9 +++-- .../Source/ICachedIVAOWhazzupDataSource.cs | 2 +- .../Source/IIVAOWhazzupSpecificDataSource.cs | 33 +++++++++++++++++++ .../Source/ILocalIVAOWhazzupDataSource.cs | 2 +- .../Data/Source/IWebIVAOWhazzupDataSource.cs | 2 +- 7 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IIVAOWhazzupSpecificDataSource.cs diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index 4c38522..c9d08ca 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -36,11 +36,13 @@ private static void OptionIoC(string path) { IIoC ioc = Locator.GetContainer(new AdvancedContainerFactory()); ioc.AddIVAOServices(); - ioc.Register() + ioc.Register() .Extend() .WithSpecific(path); - ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); + //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); + //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); + ioc.Register(); ICachedIVAOWhazzupDataSource dataSource = ioc.Resolve(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs index 73db3bc..a70594c 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs @@ -2,6 +2,7 @@ using MalikP.IVAO.Library.Common.Enhancers; using MalikP.IVAO.Library.Common.Parsers; using MalikP.IVAO.Library.Common.Selector; +using MalikP.IVAO.Library.Data.Source; using MalikP.IVAO.Library.Providers; namespace MalikP.IoC @@ -19,7 +20,7 @@ public static IIoC AddIVAOServices(this IIoC ioc) //ioc.Register(); //ioc.Register(); - //ioc.Register(); + ioc.Register(); ioc.Register(); ioc.Register(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/CachedIVAOWhazzupDataSource.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/CachedIVAOWhazzupDataSource.cs index 7e6cee3..daa8a6f 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/CachedIVAOWhazzupDataSource.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/CachedIVAOWhazzupDataSource.cs @@ -35,9 +35,14 @@ public sealed class CachedIVAOWhazzupDataSource : AbstractIVAOWhazzupDataSource, private readonly IIVAOWhazzupDataSource _datasource; private IWhazzup _cache; - public CachedIVAOWhazzupDataSource(IIVAOWhazzupDataSource ivaoWhazzupDataSource) + public CachedIVAOWhazzupDataSource(IIVAOWhazzupSpecificDataSource specificDataSource) + : this(specificDataSource as IIVAOWhazzupDataSource) { - _datasource = ivaoWhazzupDataSource; + } + + public CachedIVAOWhazzupDataSource(IIVAOWhazzupDataSource dataSource) + { + _datasource = dataSource; } public void DeleteCache() diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ICachedIVAOWhazzupDataSource.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ICachedIVAOWhazzupDataSource.cs index a044b58..ae00453 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ICachedIVAOWhazzupDataSource.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ICachedIVAOWhazzupDataSource.cs @@ -27,7 +27,7 @@ namespace MalikP.IVAO.Library.Data.Source { - public interface ICachedIVAOWhazzupDataSource : IIVAOWhazzupDataSource + public interface ICachedIVAOWhazzupDataSource : IIVAOWhazzupSpecificDataSource { void DeleteCache(); } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IIVAOWhazzupSpecificDataSource.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IIVAOWhazzupSpecificDataSource.cs new file mode 100644 index 0000000..9559588 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IIVAOWhazzupSpecificDataSource.cs @@ -0,0 +1,33 @@ +// MIT License +// +// Copyright (c) 2019 Peter Malik. (MalikP.) +// +// File: IIVAOWhazzupSpecificDataSource.cs +// Company: MalikP. +// +// Repository: https://github.com/peterM/IVAO-Library +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +namespace MalikP.IVAO.Library.Data.Source +{ + public interface IIVAOWhazzupSpecificDataSource : IIVAOWhazzupDataSource + { + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ILocalIVAOWhazzupDataSource.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ILocalIVAOWhazzupDataSource.cs index e759967..60927cc 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ILocalIVAOWhazzupDataSource.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/ILocalIVAOWhazzupDataSource.cs @@ -27,7 +27,7 @@ namespace MalikP.IVAO.Library.Data.Source { - public interface ILocalIVAOWhazzupDataSource : IIVAOWhazzupDataSource + public interface ILocalIVAOWhazzupDataSource : IIVAOWhazzupSpecificDataSource { } } diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IWebIVAOWhazzupDataSource.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IWebIVAOWhazzupDataSource.cs index 785be2c..577ea06 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IWebIVAOWhazzupDataSource.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Data/Source/IWebIVAOWhazzupDataSource.cs @@ -27,7 +27,7 @@ namespace MalikP.IVAO.Library.Data.Source { - public interface IWebIVAOWhazzupDataSource : IIVAOWhazzupDataSource + public interface IWebIVAOWhazzupDataSource : IIVAOWhazzupSpecificDataSource { } } From ca8069bb535fbc452da5583bdfdc6cbe8867b3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 01:48:53 +0200 Subject: [PATCH 14/17] Register as singletons --- .../MalikP.IVAO.Library.App/Program.cs | 9 ++++++--- .../MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index c9d08ca..f56586b 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -35,14 +35,17 @@ public static void Main(string[] args) private static void OptionIoC(string path) { IIoC ioc = Locator.GetContainer(new AdvancedContainerFactory()); - ioc.AddIVAOServices(); + ioc.RegisterDefaultIvaoWhazzupServices(); ioc.Register() .Extend() - .WithSpecific(path); + .WithSpecific(path) + .ToSingleton(); //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); - ioc.Register(); + ioc.Register() + .Extend() + .ToSingleton(); ICachedIVAOWhazzupDataSource dataSource = ioc.Resolve(); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs index a70594c..a233407 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs @@ -9,7 +9,7 @@ namespace MalikP.IoC { public static class IvaoIocExtensions { - public static IIoC AddIVAOServices(this IIoC ioc) + public static IIoC RegisterDefaultIvaoWhazzupServices(this IIoC ioc) { ioc.Register(); From 9ded15e79978e3b9308573432787a08409987a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 02:13:52 +0200 Subject: [PATCH 15/17] Improve ioc part --- .../MalikP.IVAO.Library.App/Program.cs | 17 +++--- .../IvaoIocExtensions.cs | 53 +++++++++++++++++-- 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs index f56586b..207ed1a 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.App/Program.cs @@ -35,19 +35,14 @@ public static void Main(string[] args) private static void OptionIoC(string path) { IIoC ioc = Locator.GetContainer(new AdvancedContainerFactory()); - ioc.RegisterDefaultIvaoWhazzupServices(); - ioc.Register() - .Extend() - .WithSpecific(path) - .ToSingleton(); - //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); - //ioc.Register(d => new CachedIVAOWhazzupDataSource(d.Resolve())); - ioc.Register() - .Extend() - .ToSingleton(); + ioc.RegisterIvaoDefaultWhazzupServices(); + ioc.RegisterIvaoModelBuilders(); + ioc.RegisterIvaoCachedDataSource(); - ICachedIVAOWhazzupDataSource dataSource = ioc.Resolve(); + ioc.Register() + .Extend() + .WithSpecific(path); //IIVAOWhazzupDataSource nonCachedWebDataSource = new WebIVAOWhazzupDataSource("http://api.ivao.aero/getdata/whazzup/whazzup.txt"); //IIVAOWhazzupDataSource nonCachedWebGZippedDataSource = new WebGZippedIVAOWhazzupDataSource("http://api.ivao.aero/getdata/whazzup/whazzup.txt.gz", compression); diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs index a233407..c25f50d 100644 --- a/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library.IoC/IvaoIocExtensions.cs @@ -3,13 +3,18 @@ using MalikP.IVAO.Library.Common.Parsers; using MalikP.IVAO.Library.Common.Selector; using MalikP.IVAO.Library.Data.Source; +using MalikP.IVAO.Library.Models.Airports; +using MalikP.IVAO.Library.Models.Clients; +using MalikP.IVAO.Library.Models.General; +using MalikP.IVAO.Library.Models.Other; +using MalikP.IVAO.Library.Models.Servers; using MalikP.IVAO.Library.Providers; namespace MalikP.IoC { public static class IvaoIocExtensions { - public static IIoC RegisterDefaultIvaoWhazzupServices(this IIoC ioc) + public static IIoC RegisterIvaoDefaultWhazzupServices(this IIoC ioc) { ioc.Register(); @@ -20,8 +25,6 @@ public static IIoC RegisterDefaultIvaoWhazzupServices(this IIoC ioc) //ioc.Register(); //ioc.Register(); - ioc.Register(); - ioc.Register(); ioc.Register(); ioc.Register(); @@ -48,5 +51,49 @@ public static IIoC RegisterDefaultIvaoWhazzupServices(this IIoC ioc) return ioc; } + + /// + /// You have to register one service manually. + /// Possibilities: , , + /// , + /// + /// container + /// container + public static IIoC RegisterIvaoCachedDataSource(this IIoC ioc) + { + ioc.Register() + .Extend() + .ToSingleton(); + + ioc.Register(d => d.Resolve()); + + return ioc; + } + + public static IIoC RegisterIvaoSpecificDataSource(this IIoC ioc, TSpecific instance) + where TSpecific : IIVAOWhazzupSpecificDataSource + { + ioc.Register(instance); + + return ioc; + } + + public static IIoC RegisterIvaoModelBuilders(this IIoC ioc) + { + ioc.Register(_ => AirportBuilder.Create()); + + ioc.Register(_ => AirTrafficControllerBuilder.Create()); + ioc.Register(_ => FollowMeBuilder.Create()); + ioc.Register(_ => PilotBuilder.Create()); + + ioc.Register(_ => GeneralDataBuilder.Create()); + + ioc.Register(_ => FlightPlanBuilder.Create()); + ioc.Register(_ => GPSBuilder.Create()); + + ioc.Register(_ => ServerBuilder.Create()); + + return ioc; + } } } From 0cb048d67dffe8339b000a2fe0e254234fe7220c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 02:15:50 +0200 Subject: [PATCH 16/17] Stop building app and extensions --- src/MalikP. IVAO Library/MalikP. IVAO Library.sln | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/MalikP. IVAO Library/MalikP. IVAO Library.sln b/src/MalikP. IVAO Library/MalikP. IVAO Library.sln index 5a25e13..f6a955a 100644 --- a/src/MalikP. IVAO Library/MalikP. IVAO Library.sln +++ b/src/MalikP. IVAO Library/MalikP. IVAO Library.sln @@ -9,7 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library", "Mali EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library.Test", "MalikP.IVAO.Library.Test\MalikP.IVAO.Library.Test.csproj", "{6939AC5E-4B9B-40B3-8044-437D0E20102F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MalikP.IVAO.Library.IoC", "MalikP.IVAO.Library.IoC\MalikP.IVAO.Library.IoC.csproj", "{35EADA32-399B-4DB5-BBAD-773603F127A9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MalikP.IVAO.Library.IoC", "MalikP.IVAO.Library.IoC\MalikP.IVAO.Library.IoC.csproj", "{35EADA32-399B-4DB5-BBAD-773603F127A9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -18,9 +18,7 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {DB2048CA-9DAA-4CFF-8840-481086CEDF70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB2048CA-9DAA-4CFF-8840-481086CEDF70}.Debug|Any CPU.Build.0 = Debug|Any CPU {DB2048CA-9DAA-4CFF-8840-481086CEDF70}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB2048CA-9DAA-4CFF-8840-481086CEDF70}.Release|Any CPU.Build.0 = Release|Any CPU {95BCECFF-D358-4FD8-BC81-3DF6C04DC8A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95BCECFF-D358-4FD8-BC81-3DF6C04DC8A2}.Debug|Any CPU.Build.0 = Debug|Any CPU {95BCECFF-D358-4FD8-BC81-3DF6C04DC8A2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -30,9 +28,7 @@ Global {6939AC5E-4B9B-40B3-8044-437D0E20102F}.Release|Any CPU.ActiveCfg = Release|Any CPU {6939AC5E-4B9B-40B3-8044-437D0E20102F}.Release|Any CPU.Build.0 = Release|Any CPU {35EADA32-399B-4DB5-BBAD-773603F127A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {35EADA32-399B-4DB5-BBAD-773603F127A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {35EADA32-399B-4DB5-BBAD-773603F127A9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {35EADA32-399B-4DB5-BBAD-773603F127A9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 6976a7756f6e0aa3de51b5bdbb2aae16d00b2054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Mal=C3=ADk?= Date: Sun, 2 Jun 2019 11:22:25 +0200 Subject: [PATCH 17/17] Add status items --- .../Models/Status/AbstractStatusItem.cs | 24 +++++++++++++++++++ .../Models/Status/AtisStatusItem.cs | 17 +++++++++++++ .../Models/Status/GZippedWhazzupStatusItem.cs | 17 +++++++++++++ .../Models/Status/MetarStatusItem.cs | 17 +++++++++++++ .../Models/Status/ShortTafStatusItem.cs | 17 +++++++++++++ .../Models/Status/TafStatusItem.cs | 17 +++++++++++++ .../Models/Status/UserStatusItem.cs | 17 +++++++++++++ .../Models/Status/VoiceStatusItem.cs | 17 +++++++++++++ .../Models/Status/WhazzupStatusItem.cs | 17 +++++++++++++ 9 files changed, 160 insertions(+) create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AbstractStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AtisStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/GZippedWhazzupStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/MetarStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/ShortTafStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/TafStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/UserStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/VoiceStatusItem.cs create mode 100644 src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/WhazzupStatusItem.cs diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AbstractStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AbstractStatusItem.cs new file mode 100644 index 0000000..fd3fe75 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AbstractStatusItem.cs @@ -0,0 +1,24 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public abstract class AbstractStatusItem + { + protected AbstractStatusItem(string key, string value) + { + Key = key; + Value = value; + } + + protected AbstractStatusItem() + { + } + + [DataMember] + public string Key { get; private set; } + + [DataMember] + public string Value { get; private set; } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AtisStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AtisStatusItem.cs new file mode 100644 index 0000000..2ad995a --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/AtisStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class AtisStatusItem : AbstractStatusItem + { + private AtisStatusItem() + { + } + + public AtisStatusItem(string value) + : base("atis0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/GZippedWhazzupStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/GZippedWhazzupStatusItem.cs new file mode 100644 index 0000000..f73cd05 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/GZippedWhazzupStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class GZippedWhazzupStatusItem : AbstractStatusItem + { + private GZippedWhazzupStatusItem() + { + } + + public GZippedWhazzupStatusItem(string value) + : base("gzurl0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/MetarStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/MetarStatusItem.cs new file mode 100644 index 0000000..ca58138 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/MetarStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class MetarStatusItem : AbstractStatusItem + { + private MetarStatusItem() + { + } + + public MetarStatusItem(string value) + : base("metar0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/ShortTafStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/ShortTafStatusItem.cs new file mode 100644 index 0000000..e641832 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/ShortTafStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class ShortTafStatusItem : AbstractStatusItem + { + private ShortTafStatusItem() + { + } + + public ShortTafStatusItem(string value) + : base("shorttaf0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/TafStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/TafStatusItem.cs new file mode 100644 index 0000000..5c63e46 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/TafStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class TafStatusItem : AbstractStatusItem + { + private TafStatusItem() + { + } + + public TafStatusItem(string value) + : base("taf0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/UserStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/UserStatusItem.cs new file mode 100644 index 0000000..c8ae5ee --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/UserStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class UserStatusItem : AbstractStatusItem + { + private UserStatusItem() + { + } + + public UserStatusItem(string value) + : base("user0", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/VoiceStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/VoiceStatusItem.cs new file mode 100644 index 0000000..6115781 --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/VoiceStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class VoiceStatusItem : AbstractStatusItem + { + private VoiceStatusItem() + { + } + + public VoiceStatusItem(string value) + : base("url1", value) + { + } + } +} diff --git a/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/WhazzupStatusItem.cs b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/WhazzupStatusItem.cs new file mode 100644 index 0000000..700101b --- /dev/null +++ b/src/MalikP. IVAO Library/MalikP.IVAO.Library/Models/Status/WhazzupStatusItem.cs @@ -0,0 +1,17 @@ +using System.Runtime.Serialization; + +namespace MalikP.IVAO.Library.Models.Status +{ + [DataContract] + public sealed class WhazzupStatusItem : AbstractStatusItem + { + private WhazzupStatusItem() + { + } + + public WhazzupStatusItem(string value) + : base("url0", value) + { + } + } +}