From ce44e595ff0ef8fb4da90c740f43d831c9086ed0 Mon Sep 17 00:00:00 2001 From: pxzleo Date: Mon, 27 Feb 2017 02:02:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E5=A7=8B=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plane.Sdk3.sln | 240 ++ .../EhNetLoginMgr_Net.cs | 75 + .../PlaneGcsSdk.Contract.DtuClient_NET.csproj | 73 + .../Properties/AssemblyInfo.cs | 36 + .../BasedOnEhNetUdpDtuServiceConnection.cs | 71 + ...BasedOnEhNetUdpDtuServiceConnection_Net.cs | 33 + .../CopterEntity.cs | 11 + .../DataEncryptHelper.cs | 68 + .../EhNetLoginMgr.cs | 278 ++ ...GcsSdk.Contract.DtuClient_Shared.projitems | 18 + ...aneGcsSdk.Contract.DtuClient_Shared.shproj | 13 + .../ProcessStep.cs | 29 + .../EhNetLoginMgr_UWP.cs | 75 + .../PlaneGcsSdk.Contract.DtuClient_UWP.csproj | 141 + .../Properties/AssemblyInfo.cs | 29 + .../PlaneGcsSdk.Contract.DtuClient.rd.xml | 33 + PlaneGcsSdk.Contract.DtuClient_UWP/Readme.txt | 2 + .../project.json | 16 + .../CommandArrivalEventArgs.cs | 33 + PlaneGcsSdk.Contract.EhNetUWP/DBCSEncoding.cs | 285 ++ .../DiscoveredOneUserEventArgs.cs | 14 + .../EncodingBins/Readme.txt | 1 + .../EncodingBins/big5.bin | Bin 0 -> 262140 bytes .../EncodingBins/gb2312.bin | Bin 0 -> 262140 bytes .../ExceptionThrownEventArgs.cs | 15 + .../LoginEventArgs.cs | 13 + PlaneGcsSdk.Contract.EhNetUWP/PLNet.cs | 738 ++++ .../PlaneGcsSdk.Contract.EhNetUWP.csproj | 141 + .../Properties/AssemblyInfo.cs | 29 + .../PlaneGcsSdk.Contract.EhNetUWP.rd.xml | 33 + PlaneGcsSdk.Contract.EhNetUWP/Readme.txt | 4 + .../StartSendFileEventArgs.cs | 14 + .../UserStateChangeEventArgs.cs | 14 + PlaneGcsSdk.Contract.EhNetUWP/project.json | 16 + .../PlaneGcsSdk.Contract.csproj | 52 + .../Properties/AssemblyInfo.cs | 30 + .../Copters/DataStreamReceivedEventArgs.cs | 14 + .../Copters/DataStreamType.cs | 9 + .../Copters/ICopterActions.cs | 20 + .../PlaneGcsSdk.Contract_Private.csproj | 55 + .../Properties/AssemblyInfo.cs | 30 + .../ConnectionEstablishedEventArgs.cs | 17 + .../Communication/ExceptionThrownEventArgs.cs | 14 + .../Communication/IConnection.cs | 50 + .../CopterControllerTypes.cs | 13 + .../CopterControllers/ICopterController.cs | 12 + .../ICopterControllerManager.cs | 11 + .../CopterControllers/SpeedType.cs | 8 + .../CopterManagement/ICopterFactory.cs | 11 + .../CopterManagement/ICopterManager.cs | 64 + .../Copters/Constants.cs | 27 + .../Copters/CopterCommand.cs | 27 + .../Copters/CopterState.cs | 16 + .../Copters/FlightCommand.cs | 38 + .../Copters/GpsFixType.cs | 17 + .../Copters/HeartbeatReceivedEventArgs.cs | 14 + .../Copters/IAttitude.cs | 28 + .../Copters/ICopter.cs | 8 + .../Copters/ICopterActions.cs | 124 + .../ICopterActionsSharedByCopterManager.cs | 130 + .../Copters/ICopterCommunication.cs | 15 + .../Copters/ICopterEvents.cs | 57 + .../Copters/ICopterMissionActions.cs | 23 + .../Copters/ICopterStatus.cs | 176 + .../Copters/IFakeCopter.cs | 27 + .../Copters/IMission.cs | 53 + .../Copters/IVisibleStatus.cs | 15 + .../Copters/MessageCreatedEventArgs.cs | 9 + .../Copters/MissionItemReceivedEventArgs.cs | 17 + .../Copters/PLObservableObject.cs | 414 +++ .../Copters/PairingCompletedEventArgs.cs | 20 + .../Copters/SystemStatusReceivedEventArgs.cs | 26 + .../Copters/VisibleStatus.cs | 23 + .../Geography/GeographyUtils.cs | 301 ++ .../Geography/ILocation.cs | 13 + .../Geography/ILocation2D.cs | 15 + .../Geography/LocationExtensions.cs | 80 + .../Geography/PLLocation.cs | 56 + PlaneGcsSdk.Contract_Shared/MathExtensions.cs | 31 + .../Messaging/CopterAltitudeChangedMessage.cs | 11 + .../Messaging/CopterAttitudeChangedMessage.cs | 14 + .../Messaging/CopterConnectedMessage.cs | 11 + .../CopterHeartbeatReceivedMessage.cs | 11 + .../Messaging/CopterLocationChangedMessage.cs | 11 + .../Messaging/CopterMessageBase.cs | 14 + .../CopterPairingCompletedMessage.cs | 14 + .../Messaging/CopterPropertyChangedMessage.cs | 17 + .../Messaging/FlyToRequestAcceptedMessage.cs | 12 + .../Messaging/IPLMessenger.cs | 36 + ...LandingStateAcceptsAvatarChangedMessage.cs | 12 + .../Messaging/RequestFlyToMessage.cs | 15 + .../Messaging/RequestUpdateAttitudeMessage.cs | 27 + .../PlaneGcsSdk.Contract_Shared.projitems | 65 + .../PlaneGcsSdk.Contract_Shared.shproj | 13 + .../SynchronizationContextExtensions.cs | 32 + PlaneGcsSdk_NET46/PlaneGcsSdk_NET46.csproj | 62 + PlaneGcsSdk_NET46/Properties/AssemblyInfo.cs | 36 + .../Copters/CopterImplSharedPart.Private.cs | 13 + .../Copters/FakeCopter.Private.cs | 18 + .../Copters/PLCopter.Private.cs | 22 + .../Copters/PlaneCopter.Private.cs | 37 + .../PlaneGcsSdk_Private_NET45.csproj | 66 + .../Properties/AssemblyInfo.cs | 36 + .../PlaneGcsSdk_Private_NET46.csproj | 74 + .../Properties/AssemblyInfo.cs | 36 + .../Communication/CompositeConnection.cs | 119 + .../Communication/EmptyConnection.cs | 39 + .../ExceptionThrownEventSource.cs | 14 + .../Communication/SerialPortConnection.cs | 139 + .../Communication/TcpConnection.cs | 92 + .../Communication/TcpConnectionBase.cs | 129 + .../Communication/TcpServerConnection.cs | 27 + .../TcpServerConnectionManager.cs | 97 + .../Communication/UdpConnectionBase.cs | 115 + .../Communication/UdpConnection_NET.cs | 85 + .../UdpServerConnectionManager.NET.cs | 71 + .../UdpServerConnectionManager.cs | 46 + .../Communication/UdpServerConnection_NET.cs | 50 + .../UdpThroughDtuServiceConnection.NET.cs | 76 + .../UdpThroughDtuServiceConnection.cs | 170 + .../CopterControllers/AvatarController.cs | 90 + .../CopterControllers/CopterControllerBase.cs | 38 + .../CopterControllerManager.cs | 60 + .../CopterControllers/FlyToController.cs | 50 + .../CopterControllers/KeyboardController.cs | 132 + .../CopterManagement/CopterFactory.cs | 34 + .../CopterManagement/SingleCopterManager.cs | 265 ++ .../SingleDtuCopterManager.cs | 33 + .../CopterImplSharedPart.MotorSpeed.cs | 141 + .../Copters/CopterImplSharedPart.cs | 1151 ++++++ .../EHCopter.InternalCopterEventHandlers.cs | 286 ++ .../Copters/EHCopter.Mission.cs | 261 ++ .../Copters/EHCopter.PacketAnalysis.cs | 61 + .../Copters/EmptyCopter.Mission.cs | 28 + PlaneGcsSdk_Shared/Copters/EmptyCopter.cs | 104 + .../Copters/FakeCopter.Mission.cs | 29 + PlaneGcsSdk_Shared/Copters/FakeCopter.cs | 622 ++++ PlaneGcsSdk_Shared/Copters/FlightMode.cs | 84 + PlaneGcsSdk_Shared/Copters/Mission.cs | 151 + PlaneGcsSdk_Shared/Copters/PLCopter.cs | 295 ++ .../Copters/PlaneCopter.Events.cs | 80 + .../Copters/PlaneCopter.NestedTypes.cs | 178 + .../Copters/PlaneCopter.PacketAnalysis.cs | 377 ++ PlaneGcsSdk_Shared/Copters/PlaneCopter.cs | 1389 ++++++++ .../PlaneGcsSdk_Shared.projitems | 73 + PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.shproj | 13 + PlaneGcsSdk_Shared/Protocols/MAVLinkTypes.cs | 3121 +++++++++++++++++ PlaneGcsSdk_Shared/Protocols/MavlinkCRC.cs | 43 + PlaneGcsSdk_Shared/Protocols/MavlinkUtil.cs | 265 ++ .../Protocols/MavlinkUtil_NET4.cs | 258 ++ .../Protocols/MavlinkUtil_NET45.cs | 285 ++ .../TaskTools/Arduino/ArduinoSTKv2.cs | 428 +++ .../TaskTools/Arduino/IArduinoComms.cs | 116 + .../Attributes/DisplayTextAttribute.cs | 44 + .../TaskTools/Attributes/PrivateAttribute.cs | 35 + PlaneGcsSdk_Shared/TaskTools/HIL/Matrix3.cs | 193 + PlaneGcsSdk_Shared/TaskTools/HIL/Utils.cs | 333 ++ PlaneGcsSdk_Shared/TaskTools/HIL/Vector3.cs | 154 + .../TaskTools/Utilities/EnumTranslator.cs | 170 + .../TaskTools/Utilities/locationwp.cs | 22 + PlaneGcsSdk_Shared/TaskUtils.cs | 23 + .../Communication/BluetoothConnection.cs | 80 + .../Communication/CopterFactory.cs | 19 + .../DeviceAccessDeniedException.cs | 18 + .../Communication/SerialPortConnection.cs | 71 + .../Communication/StreamConnection.cs | 95 + .../Communication/StreamSocketConnection.cs | 22 + .../Communication/TcpConnection.cs | 36 + .../Communication/UdpConnection.cs | 80 + .../Communication/UdpServerConnection.UWP.cs | 74 + .../UdpServerConnectionManager.UWP.cs | 76 + .../UdpThroughDtuServiceConnection.UWP.cs | 166 + PlaneGcsSdk_UWP/PlaneGcsSdk_UWP.csproj | 154 + PlaneGcsSdk_UWP/Properties/AssemblyInfo.cs | 29 + .../Properties/PlaneGcsSdk_UWP.rd.xml | 33 + PlaneGcsSdk_UWP/project.json | 16 + .../Microsoft.Practices.ServiceLocation.XML | 268 ++ .../Microsoft.Practices.ServiceLocation.dll | Bin 0 -> 18112 bytes .../Microsoft.Maps.MapControl.WPF.dll | Bin 0 -> 313504 bytes .../Microsoft.Maps.MapControl.WPF.xml | 1509 ++++++++ .../lib/SL4/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 22016 bytes .../lib/SL4/GalaSoft.MvvmLight.Extras.xml | 621 ++++ .../lib/SL4/GalaSoft.MvvmLight.dll | Bin 0 -> 28160 bytes .../lib/SL4/GalaSoft.MvvmLight.xml | 1681 +++++++++ .../lib/SL4/System.Windows.Interactivity.dll | Bin 0 -> 37376 bytes .../lib/SL4/System.Windows.Interactivity.xml | 1025 ++++++ .../lib/SL5/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 22016 bytes .../lib/SL5/GalaSoft.MvvmLight.Extras.xml | 621 ++++ .../lib/SL5/GalaSoft.MvvmLight.dll | Bin 0 -> 29184 bytes .../lib/SL5/GalaSoft.MvvmLight.xml | 1790 ++++++++++ .../lib/SL5/System.Windows.Interactivity.dll | Bin 0 -> 53856 bytes .../GalaSoft.MvvmLight.Extras.XML | 460 +++ .../GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../GalaSoft.MvvmLight.Platform.XML | 942 +++++ .../GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 36352 bytes .../lib/monoandroid1/GalaSoft.MvvmLight.XML | 1703 +++++++++ .../lib/monoandroid1/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/net35/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 22016 bytes .../lib/net35/GalaSoft.MvvmLight.Extras.xml | 629 ++++ .../lib/net35/GalaSoft.MvvmLight.dll | Bin 0 -> 28672 bytes .../lib/net35/GalaSoft.MvvmLight.xml | 1678 +++++++++ .../net35/System.Windows.Interactivity.dll | Bin 0 -> 45056 bytes .../net35/System.Windows.Interactivity.xml | 1011 ++++++ .../lib/net40/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 22528 bytes .../lib/net40/GalaSoft.MvvmLight.Extras.xml | 629 ++++ .../lib/net40/GalaSoft.MvvmLight.dll | Bin 0 -> 29696 bytes .../lib/net40/GalaSoft.MvvmLight.xml | 1800 ++++++++++ .../net40/System.Windows.Interactivity.dll | Bin 0 -> 39936 bytes .../net40/System.Windows.Interactivity.xml | 1072 ++++++ .../lib/net45/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../lib/net45/GalaSoft.MvvmLight.Extras.xml | 460 +++ .../lib/net45/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 14336 bytes .../lib/net45/GalaSoft.MvvmLight.Platform.xml | 328 ++ .../lib/net45/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/net45/GalaSoft.MvvmLight.xml | 1703 +++++++++ .../net45/System.Windows.Interactivity.dll | Bin 0 -> 55904 bytes .../GalaSoft.MvvmLight.Extras.XML | 460 +++ .../GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../GalaSoft.MvvmLight.XML | 1703 +++++++++ .../GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../sl4-wp71/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 21504 bytes .../sl4-wp71/GalaSoft.MvvmLight.Extras.xml | 621 ++++ .../lib/sl4-wp71/GalaSoft.MvvmLight.dll | Bin 0 -> 28672 bytes .../lib/sl4-wp71/GalaSoft.MvvmLight.xml | 1710 +++++++++ .../Microsoft.Practices.ServiceLocation.dll | Bin 0 -> 10752 bytes .../Microsoft.Practices.ServiceLocation.xml | 263 ++ .../sl4-wp71/System.Windows.Interactivity.dll | Bin 0 -> 37888 bytes .../sl4-wp71/System.Windows.Interactivity.xml | 1025 ++++++ .../windows8/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../windows8/GalaSoft.MvvmLight.Extras.xml | 460 +++ .../windows8/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 16896 bytes .../windows8/GalaSoft.MvvmLight.Platform.pri | Bin 0 -> 1240 bytes .../windows8/GalaSoft.MvvmLight.Platform.xml | 199 ++ .../lib/windows8/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/windows8/GalaSoft.MvvmLight.xml | 1703 +++++++++ .../windows81/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../windows81/GalaSoft.MvvmLight.Extras.xml | 460 +++ .../windows81/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 16896 bytes .../windows81/GalaSoft.MvvmLight.Platform.pri | Bin 0 -> 1248 bytes .../windows81/GalaSoft.MvvmLight.Platform.xml | 199 ++ .../lib/windows81/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/windows81/GalaSoft.MvvmLight.xml | 1703 +++++++++ .../lib/wp8/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../lib/wp8/GalaSoft.MvvmLight.Extras.xml | 460 +++ .../lib/wp8/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 17408 bytes .../lib/wp8/GalaSoft.MvvmLight.Platform.xml | 406 +++ .../lib/wp8/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/wp8/GalaSoft.MvvmLight.xml | 1703 +++++++++ .../lib/wp8/System.Windows.Interactivity.dll | Bin 0 -> 53872 bytes .../lib/wp81/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../lib/wp81/GalaSoft.MvvmLight.Extras.xml | 460 +++ .../lib/wp81/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 17408 bytes .../lib/wp81/GalaSoft.MvvmLight.Platform.xml | 406 +++ .../lib/wp81/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../lib/wp81/GalaSoft.MvvmLight.xml | 1703 +++++++++ .../lib/wp81/System.Windows.Interactivity.dll | Bin 0 -> 53872 bytes .../lib/wpa81/GalaSoft.MvvmLight.Extras.XML | 460 +++ .../lib/wpa81/GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../lib/wpa81/GalaSoft.MvvmLight.Platform.XML | 199 ++ .../lib/wpa81/GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 16896 bytes .../lib/wpa81/GalaSoft.MvvmLight.Platform.pri | Bin 0 -> 1248 bytes .../lib/wpa81/GalaSoft.MvvmLight.XML | 1703 +++++++++ .../lib/wpa81/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes .../GalaSoft.MvvmLight.Extras.XML | 460 +++ .../GalaSoft.MvvmLight.Extras.dll | Bin 0 -> 17920 bytes .../GalaSoft.MvvmLight.Platform.XML | 1198 +++++++ .../GalaSoft.MvvmLight.Platform.dll | Bin 0 -> 40448 bytes .../lib/xamarin.ios10/GalaSoft.MvvmLight.XML | 1703 +++++++++ .../lib/xamarin.ios10/GalaSoft.MvvmLight.dll | Bin 0 -> 30208 bytes 269 files changed, 60566 insertions(+) create mode 100644 Plane.Sdk3.sln create mode 100644 PlaneGcsSdk.Contract.DtuClient_NET/EhNetLoginMgr_Net.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_NET/PlaneGcsSdk.Contract.DtuClient_NET.csproj create mode 100644 PlaneGcsSdk.Contract.DtuClient_NET/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection_Net.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/CopterEntity.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/DataEncryptHelper.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/EhNetLoginMgr.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.projitems create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.shproj create mode 100644 PlaneGcsSdk.Contract.DtuClient_Shared/ProcessStep.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/EhNetLoginMgr_UWP.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/PlaneGcsSdk.Contract.DtuClient_UWP.csproj create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/Properties/PlaneGcsSdk.Contract.DtuClient.rd.xml create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/Readme.txt create mode 100644 PlaneGcsSdk.Contract.DtuClient_UWP/project.json create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/CommandArrivalEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/DBCSEncoding.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/DiscoveredOneUserEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/Readme.txt create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/big5.bin create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/gb2312.bin create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/ExceptionThrownEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/LoginEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/PLNet.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/PlaneGcsSdk.Contract.EhNetUWP.csproj create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/Properties/PlaneGcsSdk.Contract.EhNetUWP.rd.xml create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/Readme.txt create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/StartSendFileEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/UserStateChangeEventArgs.cs create mode 100644 PlaneGcsSdk.Contract.EhNetUWP/project.json create mode 100644 PlaneGcsSdk.Contract/PlaneGcsSdk.Contract.csproj create mode 100644 PlaneGcsSdk.Contract/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk.Contract_Private/Copters/DataStreamReceivedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Private/Copters/DataStreamType.cs create mode 100644 PlaneGcsSdk.Contract_Private/Copters/ICopterActions.cs create mode 100644 PlaneGcsSdk.Contract_Private/PlaneGcsSdk.Contract_Private.csproj create mode 100644 PlaneGcsSdk.Contract_Private/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Communication/ConnectionEstablishedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Communication/ExceptionThrownEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Communication/IConnection.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterControllers/CopterControllerTypes.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterController.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterControllerManager.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterControllers/SpeedType.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterFactory.cs create mode 100644 PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterManager.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/Constants.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/CopterCommand.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/CopterState.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/FlightCommand.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/GpsFixType.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/HeartbeatReceivedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/IAttitude.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopter.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterActions.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterActionsSharedByCopterManager.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterCommunication.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterEvents.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterMissionActions.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/ICopterStatus.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/IFakeCopter.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/IMission.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/IVisibleStatus.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/MessageCreatedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/MissionItemReceivedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/PLObservableObject.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/PairingCompletedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/SystemStatusReceivedEventArgs.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Copters/VisibleStatus.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Geography/GeographyUtils.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Geography/ILocation.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Geography/ILocation2D.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Geography/LocationExtensions.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Geography/PLLocation.cs create mode 100644 PlaneGcsSdk.Contract_Shared/MathExtensions.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterAltitudeChangedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterAttitudeChangedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterConnectedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterHeartbeatReceivedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterLocationChangedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterMessageBase.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterPairingCompletedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/CopterPropertyChangedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/FlyToRequestAcceptedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/IPLMessenger.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/LandingStateAcceptsAvatarChangedMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/RequestFlyToMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/Messaging/RequestUpdateAttitudeMessage.cs create mode 100644 PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.projitems create mode 100644 PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.shproj create mode 100644 PlaneGcsSdk.Contract_Shared/SynchronizationContextExtensions.cs create mode 100644 PlaneGcsSdk_NET46/PlaneGcsSdk_NET46.csproj create mode 100644 PlaneGcsSdk_NET46/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk_Private_NET45/Copters/CopterImplSharedPart.Private.cs create mode 100644 PlaneGcsSdk_Private_NET45/Copters/FakeCopter.Private.cs create mode 100644 PlaneGcsSdk_Private_NET45/Copters/PLCopter.Private.cs create mode 100644 PlaneGcsSdk_Private_NET45/Copters/PlaneCopter.Private.cs create mode 100644 PlaneGcsSdk_Private_NET45/PlaneGcsSdk_Private_NET45.csproj create mode 100644 PlaneGcsSdk_Private_NET45/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk_Private_NET46/PlaneGcsSdk_Private_NET46.csproj create mode 100644 PlaneGcsSdk_Private_NET46/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk_Shared/Communication/CompositeConnection.cs create mode 100644 PlaneGcsSdk_Shared/Communication/EmptyConnection.cs create mode 100644 PlaneGcsSdk_Shared/Communication/ExceptionThrownEventSource.cs create mode 100644 PlaneGcsSdk_Shared/Communication/SerialPortConnection.cs create mode 100644 PlaneGcsSdk_Shared/Communication/TcpConnection.cs create mode 100644 PlaneGcsSdk_Shared/Communication/TcpConnectionBase.cs create mode 100644 PlaneGcsSdk_Shared/Communication/TcpServerConnection.cs create mode 100644 PlaneGcsSdk_Shared/Communication/TcpServerConnectionManager.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpConnectionBase.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpConnection_NET.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.NET.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpServerConnection_NET.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.NET.cs create mode 100644 PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.cs create mode 100644 PlaneGcsSdk_Shared/CopterControllers/AvatarController.cs create mode 100644 PlaneGcsSdk_Shared/CopterControllers/CopterControllerBase.cs create mode 100644 PlaneGcsSdk_Shared/CopterControllers/CopterControllerManager.cs create mode 100644 PlaneGcsSdk_Shared/CopterControllers/FlyToController.cs create mode 100644 PlaneGcsSdk_Shared/CopterControllers/KeyboardController.cs create mode 100644 PlaneGcsSdk_Shared/CopterManagement/CopterFactory.cs create mode 100644 PlaneGcsSdk_Shared/CopterManagement/SingleCopterManager.cs create mode 100644 PlaneGcsSdk_Shared/CopterManagement/SingleDtuCopterManager.cs create mode 100644 PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.MotorSpeed.cs create mode 100644 PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.cs create mode 100644 PlaneGcsSdk_Shared/Copters/EHCopter.InternalCopterEventHandlers.cs create mode 100644 PlaneGcsSdk_Shared/Copters/EHCopter.Mission.cs create mode 100644 PlaneGcsSdk_Shared/Copters/EHCopter.PacketAnalysis.cs create mode 100644 PlaneGcsSdk_Shared/Copters/EmptyCopter.Mission.cs create mode 100644 PlaneGcsSdk_Shared/Copters/EmptyCopter.cs create mode 100644 PlaneGcsSdk_Shared/Copters/FakeCopter.Mission.cs create mode 100644 PlaneGcsSdk_Shared/Copters/FakeCopter.cs create mode 100644 PlaneGcsSdk_Shared/Copters/FlightMode.cs create mode 100644 PlaneGcsSdk_Shared/Copters/Mission.cs create mode 100644 PlaneGcsSdk_Shared/Copters/PLCopter.cs create mode 100644 PlaneGcsSdk_Shared/Copters/PlaneCopter.Events.cs create mode 100644 PlaneGcsSdk_Shared/Copters/PlaneCopter.NestedTypes.cs create mode 100644 PlaneGcsSdk_Shared/Copters/PlaneCopter.PacketAnalysis.cs create mode 100644 PlaneGcsSdk_Shared/Copters/PlaneCopter.cs create mode 100644 PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.projitems create mode 100644 PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.shproj create mode 100644 PlaneGcsSdk_Shared/Protocols/MAVLinkTypes.cs create mode 100644 PlaneGcsSdk_Shared/Protocols/MavlinkCRC.cs create mode 100644 PlaneGcsSdk_Shared/Protocols/MavlinkUtil.cs create mode 100644 PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET4.cs create mode 100644 PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET45.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Arduino/ArduinoSTKv2.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Arduino/IArduinoComms.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Attributes/DisplayTextAttribute.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Attributes/PrivateAttribute.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/HIL/Matrix3.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/HIL/Utils.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/HIL/Vector3.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Utilities/EnumTranslator.cs create mode 100644 PlaneGcsSdk_Shared/TaskTools/Utilities/locationwp.cs create mode 100644 PlaneGcsSdk_Shared/TaskUtils.cs create mode 100644 PlaneGcsSdk_UWP/Communication/BluetoothConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/CopterFactory.cs create mode 100644 PlaneGcsSdk_UWP/Communication/DeviceAccessDeniedException.cs create mode 100644 PlaneGcsSdk_UWP/Communication/SerialPortConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/StreamConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/StreamSocketConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/TcpConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/UdpConnection.cs create mode 100644 PlaneGcsSdk_UWP/Communication/UdpServerConnection.UWP.cs create mode 100644 PlaneGcsSdk_UWP/Communication/UdpServerConnectionManager.UWP.cs create mode 100644 PlaneGcsSdk_UWP/Communication/UdpThroughDtuServiceConnection.UWP.cs create mode 100644 PlaneGcsSdk_UWP/PlaneGcsSdk_UWP.csproj create mode 100644 PlaneGcsSdk_UWP/Properties/AssemblyInfo.cs create mode 100644 PlaneGcsSdk_UWP/Properties/PlaneGcsSdk_UWP.rd.xml create mode 100644 PlaneGcsSdk_UWP/project.json create mode 100644 packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.XML create mode 100644 packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.dll create mode 100644 packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.dll create mode 100644 packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/SL5/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Platform.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Platform.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/net45/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.Extras.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/Microsoft.Practices.ServiceLocation.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/Microsoft.Practices.ServiceLocation.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/System.Windows.Interactivity.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.pri create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.pri create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp8/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Extras.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.xml create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wp81/System.Windows.Interactivity.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.pri create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Platform.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Platform.dll create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.XML create mode 100644 packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.dll diff --git a/Plane.Sdk3.sln b/Plane.Sdk3.sln new file mode 100644 index 0000000..2af1507 --- /dev/null +++ b/Plane.Sdk3.sln @@ -0,0 +1,240 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PlaneGcsSdk_Shared", "PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.shproj", "{2BE393DC-21A4-48B3-83FD-F21CBE8B038B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk_UWP", "PlaneGcsSdk_UWP\PlaneGcsSdk_UWP.csproj", "{B0226F52-8D27-4C05-8C04-536E0BCC3B99}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk_Private_NET45", "PlaneGcsSdk_Private_NET45\PlaneGcsSdk_Private_NET45.csproj", "{2CE7006F-C1DF-4A15-9E68-A63A3255FE88}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk_Private_NET46", "PlaneGcsSdk_Private_NET46\PlaneGcsSdk_Private_NET46.csproj", "{0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk_NET46", "PlaneGcsSdk_NET46\PlaneGcsSdk_NET46.csproj", "{331C28E1-5BA3-42CE-8A4A-BC468E692FED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk.Contract", "PlaneGcsSdk.Contract\PlaneGcsSdk.Contract.csproj", "{18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PlaneGcsSdk.Contract_Shared", "PlaneGcsSdk.Contract_Shared\PlaneGcsSdk.Contract_Shared.shproj", "{695733D7-99FF-4707-8C89-474E949CADCB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk.Contract_Private", "PlaneGcsSdk.Contract_Private\PlaneGcsSdk.Contract_Private.csproj", "{47141894-ECE3-48CA-8DCF-CA751BDA231E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk.Contract.EhNetUWP", "PlaneGcsSdk.Contract.EhNetUWP\PlaneGcsSdk.Contract.EhNetUWP.csproj", "{D7D21B2B-6F73-4939-B720-FE51DA1C04C0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk.Contract.DtuClient_UWP", "PlaneGcsSdk.Contract.DtuClient_UWP\PlaneGcsSdk.Contract.DtuClient_UWP.csproj", "{2079C6FC-8EBA-4BD8-A965-EC9FB473C314}" +EndProject +Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "PlaneGcsSdk.Contract.DtuClient_Shared", "PlaneGcsSdk.Contract.DtuClient_Shared\PlaneGcsSdk.Contract.DtuClient_Shared.shproj", "{83D6BB5F-1643-4B9F-B3E4-D4D08CEA2733}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlaneGcsSdk.Contract.DtuClient_NET", "PlaneGcsSdk.Contract.DtuClient_NET\PlaneGcsSdk.Contract.DtuClient_NET.csproj", "{089FA525-1773-47A5-8A0A-832AB179E2D9}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "PLClass", "..\myPLClass\ClassLibrary2\PLClass.vbproj", "{92E63872-4938-4F0C-9FD8-BDFE3388EEB3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Contract", "Contract", "{4617084D-65A3-4354-B97F-1DF9254AA183}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Implementation", "Implementation", "{CDCDFD04-CD05-4CAA-BBA4-6166A5119495}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Document", "Document", "{CD21427C-22BF-4D7C-86EF-23B1E594A7B7}" + ProjectSection(SolutionItems) = preProject + README_Private.md = README_Private.md + EndProjectSection +EndProject +Global + GlobalSection(SharedMSBuildProjectFiles) = preSolution + PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{0111eb6e-72e3-499c-a3ba-022f5bbc4caf}*SharedItemsImports = 4 + PlaneGcsSdk.Contract.DtuClient_Shared\PlaneGcsSdk.Contract.DtuClient_Shared.projitems*{089fa525-1773-47a5-8a0a-832ab179e2d9}*SharedItemsImports = 4 + PlaneGcsSdk.Contract_Shared\PlaneGcsSdk.Contract_Shared.projitems*{18ecd88e-5d74-43e8-8bc2-d28f6db13a47}*SharedItemsImports = 4 + PlaneGcsSdk.Contract.DtuClient_Shared\PlaneGcsSdk.Contract.DtuClient_Shared.projitems*{2079c6fc-8eba-4bd8-a965-ec9fb473c314}*SharedItemsImports = 4 + PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{2be393dc-21a4-48b3-83fd-f21cbe8b038b}*SharedItemsImports = 13 + PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{2ce7006f-c1df-4a15-9e68-a63a3255fe88}*SharedItemsImports = 4 + PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{331c28e1-5ba3-42ce-8a4a-bc468e692fed}*SharedItemsImports = 4 + PlaneGcsSdk.Contract_Shared\PlaneGcsSdk.Contract_Shared.projitems*{47141894-ece3-48ca-8dcf-ca751bda231e}*SharedItemsImports = 4 + PlaneGcsSdk.Contract_Shared\PlaneGcsSdk.Contract_Shared.projitems*{695733d7-99ff-4707-8c89-474e949cadcb}*SharedItemsImports = 13 + PlaneGcsSdk.Contract.DtuClient_Shared\PlaneGcsSdk.Contract.DtuClient_Shared.projitems*{83d6bb5f-1643-4b9f-b3e4-d4d08cea2733}*SharedItemsImports = 13 + PlaneGcsSdk_Shared\PlaneGcsSdk_Shared.projitems*{b0226f52-8d27-4c05-8c04-536e0bcc3b99}*SharedItemsImports = 4 + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|ARM = Debug|ARM + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|ARM = Release|ARM + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|ARM.ActiveCfg = Debug|ARM + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|ARM.Build.0 = Debug|ARM + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|x64.ActiveCfg = Debug|x64 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|x64.Build.0 = Debug|x64 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|x86.ActiveCfg = Debug|x86 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Debug|x86.Build.0 = Debug|x86 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|Any CPU.Build.0 = Release|Any CPU + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|ARM.ActiveCfg = Release|ARM + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|ARM.Build.0 = Release|ARM + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|x64.ActiveCfg = Release|x64 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|x64.Build.0 = Release|x64 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|x86.ActiveCfg = Release|x86 + {B0226F52-8D27-4C05-8C04-536E0BCC3B99}.Release|x86.Build.0 = Release|x86 + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|ARM.Build.0 = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|x64.ActiveCfg = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|x64.Build.0 = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|x86.ActiveCfg = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Debug|x86.Build.0 = Debug|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|Any CPU.Build.0 = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|ARM.ActiveCfg = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|ARM.Build.0 = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|x64.ActiveCfg = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|x64.Build.0 = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|x86.ActiveCfg = Release|Any CPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88}.Release|x86.Build.0 = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|ARM.ActiveCfg = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|ARM.Build.0 = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|x64.ActiveCfg = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|x64.Build.0 = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|x86.ActiveCfg = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Debug|x86.Build.0 = Debug|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|Any CPU.Build.0 = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|ARM.ActiveCfg = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|ARM.Build.0 = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|x64.ActiveCfg = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|x64.Build.0 = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|x86.ActiveCfg = Release|Any CPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF}.Release|x86.Build.0 = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|ARM.ActiveCfg = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|ARM.Build.0 = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|x64.ActiveCfg = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|x64.Build.0 = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|x86.ActiveCfg = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Debug|x86.Build.0 = Debug|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|Any CPU.Build.0 = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|ARM.ActiveCfg = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|ARM.Build.0 = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|x64.ActiveCfg = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|x64.Build.0 = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|x86.ActiveCfg = Release|Any CPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED}.Release|x86.Build.0 = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|ARM.ActiveCfg = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|ARM.Build.0 = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|x64.ActiveCfg = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|x64.Build.0 = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|x86.ActiveCfg = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Debug|x86.Build.0 = Debug|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|Any CPU.ActiveCfg = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|Any CPU.Build.0 = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|ARM.ActiveCfg = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|ARM.Build.0 = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|x64.ActiveCfg = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|x64.Build.0 = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|x86.ActiveCfg = Release|Any CPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47}.Release|x86.Build.0 = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|ARM.ActiveCfg = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|ARM.Build.0 = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|x64.ActiveCfg = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|x64.Build.0 = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|x86.ActiveCfg = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Debug|x86.Build.0 = Debug|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|Any CPU.Build.0 = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|ARM.ActiveCfg = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|ARM.Build.0 = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|x64.ActiveCfg = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|x64.Build.0 = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|x86.ActiveCfg = Release|Any CPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E}.Release|x86.Build.0 = Release|Any CPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|ARM.ActiveCfg = Debug|ARM + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|ARM.Build.0 = Debug|ARM + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|x64.ActiveCfg = Debug|x64 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|x64.Build.0 = Debug|x64 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|x86.ActiveCfg = Debug|x86 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Debug|x86.Build.0 = Debug|x86 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|Any CPU.Build.0 = Release|Any CPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|ARM.ActiveCfg = Release|ARM + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|ARM.Build.0 = Release|ARM + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|x64.ActiveCfg = Release|x64 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|x64.Build.0 = Release|x64 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|x86.ActiveCfg = Release|x86 + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0}.Release|x86.Build.0 = Release|x86 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|ARM.ActiveCfg = Debug|ARM + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|ARM.Build.0 = Debug|ARM + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|x64.ActiveCfg = Debug|x64 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|x64.Build.0 = Debug|x64 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|x86.ActiveCfg = Debug|x86 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Debug|x86.Build.0 = Debug|x86 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|Any CPU.Build.0 = Release|Any CPU + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|ARM.ActiveCfg = Release|ARM + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|ARM.Build.0 = Release|ARM + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|x64.ActiveCfg = Release|x64 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|x64.Build.0 = Release|x64 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|x86.ActiveCfg = Release|x86 + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314}.Release|x86.Build.0 = Release|x86 + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|ARM.ActiveCfg = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|ARM.Build.0 = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|x64.ActiveCfg = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|x64.Build.0 = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Debug|x86.Build.0 = Debug|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|Any CPU.Build.0 = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|ARM.ActiveCfg = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|ARM.Build.0 = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|x64.ActiveCfg = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|x64.Build.0 = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|x86.ActiveCfg = Release|Any CPU + {089FA525-1773-47A5-8A0A-832AB179E2D9}.Release|x86.Build.0 = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|ARM.ActiveCfg = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|ARM.Build.0 = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|x64.ActiveCfg = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|x64.Build.0 = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Debug|x86.Build.0 = Debug|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|Any CPU.Build.0 = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|ARM.ActiveCfg = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|ARM.Build.0 = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|x64.ActiveCfg = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|x64.Build.0 = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|x86.ActiveCfg = Release|Any CPU + {92E63872-4938-4F0C-9FD8-BDFE3388EEB3}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2BE393DC-21A4-48B3-83FD-F21CBE8B038B} = {CDCDFD04-CD05-4CAA-BBA4-6166A5119495} + {B0226F52-8D27-4C05-8C04-536E0BCC3B99} = {CDCDFD04-CD05-4CAA-BBA4-6166A5119495} + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88} = {CDCDFD04-CD05-4CAA-BBA4-6166A5119495} + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF} = {CDCDFD04-CD05-4CAA-BBA4-6166A5119495} + {331C28E1-5BA3-42CE-8A4A-BC468E692FED} = {CDCDFD04-CD05-4CAA-BBA4-6166A5119495} + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47} = {4617084D-65A3-4354-B97F-1DF9254AA183} + {695733D7-99FF-4707-8C89-474E949CADCB} = {4617084D-65A3-4354-B97F-1DF9254AA183} + {47141894-ECE3-48CA-8DCF-CA751BDA231E} = {4617084D-65A3-4354-B97F-1DF9254AA183} + EndGlobalSection +EndGlobal diff --git a/PlaneGcsSdk.Contract.DtuClient_NET/EhNetLoginMgr_Net.cs b/PlaneGcsSdk.Contract.DtuClient_NET/EhNetLoginMgr_Net.cs new file mode 100644 index 0000000..f70c260 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_NET/EhNetLoginMgr_Net.cs @@ -0,0 +1,75 @@ +using PLClass; +using System; +using System.ComponentModel; +using System.Threading.Tasks; + +namespace PlaneGcsSdk.Contract.DtuClient +{ + partial class EhNetLoginMgr + { + #region Fileds + private PLNet _PLNet; + private PLNet.LoginState _loginState; + #endregion + + #region Private Methods + private void InstanceEhNetObject() + { + _PLNet = new PLNet(AsyncOperationManager.CreateOperation(null)); + } + + private async Task EhNetStart(string ehNetServerIp, string username, string pwd) + { + _PLNet.Start(ehNetServerIp, username, pwd); + } + + private bool CheckIfLogined() + { + return _loginState == PLNet.LoginState.LoginOk; + } + + private void ResetLoginStatus() + { + _loginState = PLNet.LoginState.LoginNoUser; + } + + private async Task SendCommandToDtuServer(string msg) + { + _PLNet.SendCommand(DtuServerUsername, msg); + } + #endregion + + #region Event Handlers + private void _ehNet_Login(PLNet.LoginState loginState) + { + _loginState = loginState; + if (_loginState == PLNet.LoginState.LoginOk) + { + NickName = _PLNet.MyNick; + _loginEnNet.Set(); + } + } + + //private void _ehNet_ExceptionThrown(object sender, PLNet.UWP.ExceptionThrownEventArgs e) + //{ + // RaiseExceptionThrown(e.Exception); + //} + + private void _ehNet_DiscoveredOneUser(PLNet.UserProperty userProperty) + { + } + + private void _ehNet_Disconnect(PLNet e) + { + _loginState = PLNet.LoginState.LoginOtherError; + NickName = null; + } + + private void _ehNet_CommandArrival(string friendID, string msg) + { + AcceptProtocolCommand(friendID, msg); + Console.WriteLine(msg); + } + #endregion + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_NET/PlaneGcsSdk.Contract.DtuClient_NET.csproj b/PlaneGcsSdk.Contract.DtuClient_NET/PlaneGcsSdk.Contract.DtuClient_NET.csproj new file mode 100644 index 0000000..0301eda --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_NET/PlaneGcsSdk.Contract.DtuClient_NET.csproj @@ -0,0 +1,73 @@ + + + + + Debug + AnyCPU + {089FA525-1773-47A5-8A0A-832AB179E2D9} + Library + Properties + PlaneGcsSdk.Contract.DtuClient_NET + PlaneGcsSdk.Contract.DtuClient_NET + v4.5.1 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + {92e63872-4938-4f0c-9fd8-bdfe3388eeb3} + PLClass + + + {18ecd88e-5d74-43e8-8bc2-d28f6db13a47} + PlaneGcsSdk.Contract + + + {47141894-ece3-48ca-8dcf-ca751bda231e} + PlaneGcsSdk.Contract_Private + + + {2ce7006f-c1df-4a15-9e68-a63a3255fe88} + PlaneGcsSdk_Private_NET45 + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.DtuClient_NET/Properties/AssemblyInfo.cs b/PlaneGcsSdk.Contract.DtuClient_NET/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..10a7c85 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_NET/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PlaneGcsSdk.Contract.DtuClient_NET")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PlaneGcsSdk.Contract.DtuClient_NET")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("089fa525-1773-47a5-8a0a-832ab179e2d9")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs new file mode 100644 index 0000000..9954f1d --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection.cs @@ -0,0 +1,71 @@ +using Plane.Communication; +using System.Text; +using System.Threading.Tasks; + +namespace PlaneGcsSdk.Contract.DtuClient +{ + /// + /// 基于PLNet的用户登录体系的Udp连接实体类。 + /// 具体登陆流程:1,利用用户名和密码登陆PLNet,获取随机码;2,利用随机码登陆Dtu透传服务器; + /// + public partial class BasedOnEhNetUdpDtuServiceConnection : UdpThroughDtuServiceConnection + { + #region Fields + public int _randCode; + #endregion + + #region Properties + + #endregion + + /// + /// 基于PLNet的用户登录体系的Udp连接实体类。 + /// 具体登陆流程:1,利用用户名和密码登陆PLNet,获取随机码;2,利用随机码登陆Dtu透传服务器; + /// + /// + /// + /// 用户随机数 + public BasedOnEhNetUdpDtuServiceConnection(string dtuServiceIp, int dtuServicePort, int randCode) + : base(dtuServiceIp, dtuServicePort) + { + FLAG_DTU_HANDSHAKE_HEAD = "ehnetrnd"; + _randCode = randCode; + } + + protected override byte[] ConstructHandShakeDatagramToDTUService() + { + return Encoding.ASCII.GetBytes($"{FLAG_DTU_HANDSHAKE_HEAD}{_randCode}"); + } + + /// + /// 分析由DTU服务端返回的握手包 + /// + /// + /// + protected override DTUHandShakeResult AnalyzeHandShakeDatagramFromDTUService(byte[] buffer) + { + var strResult = Encoding.ASCII.GetString(buffer);//返回的格式为“ehnetrndxxxx” + if (strResult.StartsWith(FLAG_DTU_HANDSHAKE_HEAD)) + { + return DTUHandShakeResult.Successful; + } + return DTUHandShakeResult.Unknown; + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count) + { + var iRet = await base.ReadAsync(buffer, offset, count); + //解密数据 + buffer.DecryptByKey((byte)(_randCode % byte.MaxValue), offset, count); + return iRet; + } + + public override Task WriteAsync(byte[] buffer, int offset, int count) + { + //加密数据 + buffer.EncryptByKey((byte)(_randCode % byte.MaxValue), offset, count); + var iRet = base.WriteAsync(buffer, offset, count); + return iRet; + } + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection_Net.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection_Net.cs new file mode 100644 index 0000000..d86c797 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/BasedOnEhNetUdpDtuServiceConnection_Net.cs @@ -0,0 +1,33 @@ +#if !NETFX_CORE + +using System; +using System.Net; +using System.Net.Sockets; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace EHangGcsSdk.Contract.DtuClient +{ + public partial class BasedOnEhNetUdpDtuServiceConnection + { + private TcpClient _tcpClient; + + /// + /// 登陆到EhNet,获取随机码后再登陆Dtu透传服务端。 + /// + /// + public override async Task OpenAsync() + { + // + } + + public override void Close() + { + _tcpClient.Close(); + base.Close(); + } + } +} + +#endif \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/CopterEntity.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/CopterEntity.cs new file mode 100644 index 0000000..0fc1f4e --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/CopterEntity.cs @@ -0,0 +1,11 @@ +namespace PlaneGcsSdk.Contract.DtuClient +{ + /// + /// 表示飞机实体类 + /// + public class CopterEntity + { + public string ID { get; set; } + public string Name { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/DataEncryptHelper.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/DataEncryptHelper.cs new file mode 100644 index 0000000..75f35e1 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/DataEncryptHelper.cs @@ -0,0 +1,68 @@ +namespace PlaneGcsSdk.Contract.DtuClient +{ + /// + /// 进行数据透传时利用随机码对MavLink数据包进行加密和解密的辅助类。 + /// + public static class DataEncryptHelper + { + /// + /// 对数据进行加密处理。 + /// + /// + /// 密钥 + /// + /// + public static void EncryptByKey(this byte[] data, byte key, int offset = 0, int size = -1) + { + int count; + if (size == -1) + { + count = data.Length - offset; + } + else + { + count = size + offset; + } + for (var i = offset; i < count; i++) + { + //下面算法实现高低位调转 + var ch = data[i]; + ch >>= 4; + data[i] <<= 4; + data[i] |= ch; + + //根据Key进行异或处理 + //data[i] ^= key; + } + } + + /// + /// 对数据进行解密处理。 + /// + /// + /// + public static void DecryptByKey(this byte[] data, byte key, int offset = 0, int size = -1) + { + int count; + if (size == -1) + { + count = data.Length - offset; + } + else + { + count = size + offset; + } + for (var i = offset; i < count; i++) + { + //根据Key进行异或处理 + //data[i] ^= key; + + //下面算法实现高低位调转 + var ch = data[i]; + ch >>= 4; + data[i] <<= 4; + data[i] |= ch; + } + } + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/EhNetLoginMgr.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/EhNetLoginMgr.cs new file mode 100644 index 0000000..853877c --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/EhNetLoginMgr.cs @@ -0,0 +1,278 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace PlaneGcsSdk.Contract.DtuClient +{ + public partial class EhNetLoginMgr + { + #region Fields + private AutoResetEvent _loginEnNet; + private AutoResetEvent _sendRndCodeSignal; + private AutoResetEvent _sendBindCopterIDSignal; + private AutoResetEvent _sendUpdHandshakeSignal; + private AutoResetEvent _requestCopterListSignal; + private const string Protocol_SendRandCode = "J001"; //表示向服务器请求“发送随机码”的协议号 + private const string Protocol_SendRandCode_Reply = "J002"; //表示服务端返回“请求发送随机码”的应答协议号 + private const string Protocol_BindCopterID = "J003"; //表示向服务器请求“绑定飞机”的协议号 + private const string Protocol_BindCopterID_Reply = "J004"; //表示服务端返回“请求绑定飞机”的应答协议号 + private const string Protocol_RequestCopterList = "J007"; //表示向服务器请求“飞机列表”的请求协议号 + private const string Protocol_ReceivedCopterItem = "J008"; //表示服务端返回“飞机列表中的一个飞机”的推送协议号 + private const string Protocol_RecievedCopterInvailed = "J206";//表示由服务端通告“您所绑定的飞机已无效”的推送协议好 + + private string _errorCode; //请求过程由服务端返回的错误码的缓存变量 + private string _errorCodeForRequestCopterList; //专为缓存“请求飞机列表”结果的错误号变量 + private const string ErrorCode_Succeed = "0000"; //表示执行成功的错误码 + private const string ErrorCode_EndCopterList = "0003"; //表示服务端返回“飞机列表完毕”的协议号 + private CopterEntity _nextCopter; //当前请求的飞机实体 + private string _usersname; //当前登录的账号 + private const string DtuServerUsername = "10000"; // 在PLNet登陆体系里Dtu服务端的用户名 + #endregion + + #region Properties + /// + /// 在PLNet登陆体系里的用户别名 + /// + public string NickName { get; protected set; } + + /// + /// PLNet服务端的IP + /// + public string ServerIp { get; set; } + /// + /// PLNet服务端的监听端口 + /// + public int ServerPort { get; set; } + /// + /// 表示当前所处的PLNet-Dtu连接状态(比如已登录PLNet,但没有建立Dtu透传管道) + /// + public ProcessStep ProcessSetp { get; protected set; } + /// + /// 登陆后获得的随机码 + /// + public int RandCode { get; protected set; } + /// + /// 用于建立透传管道的Udp端口。 + /// + public const int DTU_USER_PORT = 5250; + #endregion + + /// + /// 当前已绑定的飞机变为无效状态的事件 + /// + public event EventHandler CopterLost; + + public EhNetLoginMgr() + { + _loginEnNet = new AutoResetEvent(false); + _sendBindCopterIDSignal = new AutoResetEvent(false); + _sendRndCodeSignal = new AutoResetEvent(false); + _sendUpdHandshakeSignal = new AutoResetEvent(false); + _requestCopterListSignal = new AutoResetEvent(false); + + InstanceEhNetObject(); + _PLNet.CommandArrival += _ehNet_CommandArrival; + _PLNet.Disconnect += _ehNet_Disconnect; + _PLNet.DiscoveredOneUser += _ehNet_DiscoveredOneUser; + //_ehNet.ExceptionThrown += _ehNet_ExceptionThrown; + _PLNet.Login += _ehNet_Login; + } + + public void Dispose() + { + _PLNet.CommandArrival -= _ehNet_CommandArrival; + _PLNet.Disconnect -= _ehNet_Disconnect; + _PLNet.DiscoveredOneUser -= _ehNet_DiscoveredOneUser; + //_ehNet.ExceptionThrown -= _ehNet_ExceptionThrown; + _PLNet.Login -= _ehNet_Login; + } + + #region Public Methods + /// + /// 登陆到PLNet网络(第三个参数决定是否在登陆成功后发起获取飞机列表的请求)。 + /// + /// + /// + /// 获得得到的飞机事件 + public async Task Login(string username, string pwd, string ehNetServerIp, + Action gotCopterCallBack = null) + { + if (CheckIfLogined()) + { + return; + } + _usersname = username; + await Task.Run(async () => + { + await EhNetStart(ehNetServerIp, username, pwd); + if (!_loginEnNet.WaitOne(TimeSpan.FromSeconds(10))) + { + throw new Exception("登陆无响应失败!"); + } + ProcessSetp = ProcessStep.EhNetLogin; + if (!string.IsNullOrEmpty(_PLNet.MyRND)) + { + int value; + int.TryParse(_PLNet.MyRND, out value); + RandCode = value; + //发送随机码到Dtu服务端 + await SendCommandToDtuServer($"{Protocol_SendRandCode};{username};{_PLNet.MyRND}"); + if (!_sendRndCodeSignal.WaitOne(TimeSpan.FromSeconds(10))) + { + throw new Exception("发送随机码超时!"); + } + else if (_errorCode != ErrorCode_Succeed) + { + throw new Exception("发送随机码失败:" + _errorCode); + } + ProcessSetp = ProcessStep.SendRandCode; + } + + if (gotCopterCallBack != null) + { + int index = 0; + while (true) + { + await SendCommandToDtuServer($"{Protocol_RequestCopterList};{username};{index}"); + if (_requestCopterListSignal.WaitOne(TimeSpan.FromSeconds(10))) + { + if (_errorCodeForRequestCopterList == ErrorCode_Succeed) + { + if (_nextCopter != null) + { + gotCopterCallBack.Invoke(_nextCopter); + } + //加1后继续请求 + index++; + } + else if (_errorCodeForRequestCopterList == ErrorCode_EndCopterList) + { + //正常结束请求 + break; + } + else + { + throw new Exception($"请求获取飞机列表错误:{_errorCode}!"); + } + } + else + { + throw new Exception("请求获取飞机列表超时!"); + } + } + } + }).ConfigureAwait(false); + } + + /// + /// 退出PLNet网络 + /// + public void Logout() + { + _PLNet.Close(); + ResetLoginStatus(); + ProcessSetp = ProcessStep.None; + } + + /// + /// 获取飞机列表 + /// + public async Task GetCopterList(Action gotCopterCallBack) + { + await Task.Run(async () => + { + int index = 0; + while (true) + { + await SendCommandToDtuServer($"{Protocol_RequestCopterList};{_usersname};{index}"); + if (_requestCopterListSignal.WaitOne(TimeSpan.FromSeconds(10))) + { + if (_errorCodeForRequestCopterList == ErrorCode_Succeed) + { + if (_nextCopter != null) + { + gotCopterCallBack.Invoke(_nextCopter); + } + //加1后继续请求 + index++; + } + else if (_errorCodeForRequestCopterList == ErrorCode_EndCopterList) + { + //正常结束请求 + break; + } + else + { + //throw new Exception($"请求获取飞机列表错误:{_errorCode}!"); + } + } + else + { + //throw new Exception("请求获取飞机列表超时!"); + } + } + }).ConfigureAwait(false); + } + + /// + /// 申请绑定飞机 + /// + public async Task AssignBindingCopter(string copterID) + { + //向Dtu服务端申请绑定飞机 + await SendCommandToDtuServer($"{Protocol_BindCopterID};{_usersname};{copterID}"); + if (!_sendBindCopterIDSignal.WaitOne(TimeSpan.FromSeconds(10))) + { + throw new Exception("申请绑定超时!"); + } + else if (_errorCode != ErrorCode_Succeed) + { + throw new Exception("申请绑定失败:" + _errorCode); + } + ProcessSetp = ProcessStep.AssignCopter; + } + #endregion + + #region Private Methods + private void AcceptProtocolCommand(string userIDFrom, string msg) + { + if (!string.IsNullOrEmpty(msg) && userIDFrom == DtuServerUsername) + { + var strList = msg.Split(';'); + if (strList.Length >= 3) + { + switch (strList[0]) + { + case Protocol_SendRandCode_Reply: + _errorCode = strList[2]; + _sendRndCodeSignal.Set(); + break; + + case Protocol_BindCopterID_Reply: + _errorCode = strList[2]; + _sendBindCopterIDSignal.Set(); + break; + + case Protocol_ReceivedCopterItem: + _errorCodeForRequestCopterList = strList[2]; + if (strList.Length >= 5) + { + _nextCopter = new CopterEntity { ID = strList[3], Name = strList[4] }; + } + else + { + _nextCopter = null; + } + _requestCopterListSignal.Set(); + break; + + case Protocol_RecievedCopterInvailed: + CopterLost?.Invoke(this, EventArgs.Empty); + break; + } + } + } + } + #endregion + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.projitems b/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.projitems new file mode 100644 index 0000000..ac72bb3 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.projitems @@ -0,0 +1,18 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 83d6bb5f-1643-4b9f-b3e4-d4d08cea2733 + + + EHangGcsSdk.Contract.DtuClient_Shared + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.shproj b/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.shproj new file mode 100644 index 0000000..10b47ec --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/PlaneGcsSdk.Contract.DtuClient_Shared.shproj @@ -0,0 +1,13 @@ + + + + 83d6bb5f-1643-4b9f-b3e4-d4d08cea2733 + 14.0 + + + + + + + + diff --git a/PlaneGcsSdk.Contract.DtuClient_Shared/ProcessStep.cs b/PlaneGcsSdk.Contract.DtuClient_Shared/ProcessStep.cs new file mode 100644 index 0000000..bfec44c --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_Shared/ProcessStep.cs @@ -0,0 +1,29 @@ +namespace PlaneGcsSdk.Contract.DtuClient +{ + /// + /// 与DTU服务端建立通信的流程枚举 + /// + public enum ProcessStep + { + /// + /// 默认值 + /// + None, + /// + /// 【第一步】已登陆PLNet服务端 + /// + EhNetLogin, + /// + /// 【第二步】已发送登陆随机码到DTU服务端 + /// + SendRandCode, + /// + /// 【第三步】已向DTU服务端绑定飞机 + /// + AssignCopter, + /// + /// 【第四步】已向DTU建立飞控透传管道 + /// + HandShakeToDTU, + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/EhNetLoginMgr_UWP.cs b/PlaneGcsSdk.Contract.DtuClient_UWP/EhNetLoginMgr_UWP.cs new file mode 100644 index 0000000..673785f --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/EhNetLoginMgr_UWP.cs @@ -0,0 +1,75 @@ +using PlaneGcsSdk.Contract.EhNetUWP; +using System; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace PlaneGcsSdk.Contract.DtuClient +{ + partial class EhNetLoginMgr + { + #region Fields + private PLNet _PLNet; + private LoginState _loginState; + #endregion + + #region Private Methods + private void InstanceEhNetObject() + { + _PLNet = new PLNet(); + } + + private async Task EhNetStart(string ehNetServerIp, string username, string pwd) + { + await _PLNet.Start(ehNetServerIp, username, pwd); + } + + private bool CheckIfLogined() + { + return _loginState == LoginState.LoginOk; + } + + private void ResetLoginStatus() + { + _loginState = LoginState.LoginNoUser; + } + + private async Task SendCommandToDtuServer(string msg) + { + await _PLNet.SendCommand(DtuServerUsername, msg); + } + #endregion + + #region Event Handlers + private void _ehNet_Login(object sender, LoginEventArgs e) + { + _loginState = e.LoginState; + if (_loginState == LoginState.LoginOk) + { + NickName = _PLNet.MyNick; + _loginEnNet.Set(); + } + } + + //private void _ehNet_ExceptionThrown(object sender, PLNet.UWP.ExceptionThrownEventArgs e) + //{ + // RaiseExceptionThrown(e.Exception); + //} + + private void _ehNet_DiscoveredOneUser(object sender, DiscoveredOneUserEventArgs e) + { + } + + private void _ehNet_Disconnect(object sender, EventArgs e) + { + _loginState = LoginState.LoginOtherError; + NickName = null; + } + + private void _ehNet_CommandArrival(object sender, CommandArrivalEventArgs e) + { + AcceptProtocolCommand(e.FriendID, e.CmdMessage); + Debug.WriteLine(e.CmdMessage); + } + #endregion + } +} diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/PlaneGcsSdk.Contract.DtuClient_UWP.csproj b/PlaneGcsSdk.Contract.DtuClient_UWP/PlaneGcsSdk.Contract.DtuClient_UWP.csproj new file mode 100644 index 0000000..1ed9bac --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/PlaneGcsSdk.Contract.DtuClient_UWP.csproj @@ -0,0 +1,141 @@ + + + + + Debug + AnyCPU + {2079C6FC-8EBA-4BD8-A965-EC9FB473C314} + Library + Properties + PlaneGcsSdk.Contract.DtuClient + PlaneGcsSdk.Contract.DtuClient + zh-CN + UAP + 10.0.10586.0 + 10.0.10240.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + + + + + + + + + + + + + + {d7d21b2b-6f73-4939-b720-fe51da1c04c0} + PlaneGcsSdk.Contract.EhNetUWP + + + {18ecd88e-5d74-43e8-8bc2-d28f6db13a47} + PlaneGcsSdk.Contract + + + {b0226f52-8d27-4c05-8c04-536e0bcc3b99} + PlaneGcsSdk_UWP + + + + + 14.0 + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/AssemblyInfo.cs b/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..05dc1fe --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PlaneGcsSdk.Contract.DtuClient")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PlaneGcsSdk.Contract.DtuClient")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/PlaneGcsSdk.Contract.DtuClient.rd.xml b/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/PlaneGcsSdk.Contract.DtuClient.rd.xml new file mode 100644 index 0000000..39cf9cd --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/Properties/PlaneGcsSdk.Contract.DtuClient.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/Readme.txt b/PlaneGcsSdk.Contract.DtuClient_UWP/Readme.txt new file mode 100644 index 0000000..2086b44 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/Readme.txt @@ -0,0 +1,2 @@ +本项目: +1,实现PLNet-Dtu的登陆逻辑的IConnection; diff --git a/PlaneGcsSdk.Contract.DtuClient_UWP/project.json b/PlaneGcsSdk.Contract.DtuClient_UWP/project.json new file mode 100644 index 0000000..c594939 --- /dev/null +++ b/PlaneGcsSdk.Contract.DtuClient_UWP/project.json @@ -0,0 +1,16 @@ +{ + "dependencies": { + "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" + }, + "frameworks": { + "uap10.0": {} + }, + "runtimes": { + "win10-arm": {}, + "win10-arm-aot": {}, + "win10-x86": {}, + "win10-x86-aot": {}, + "win10-x64": {}, + "win10-x64-aot": {} + } +} \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.EhNetUWP/CommandArrivalEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/CommandArrivalEventArgs.cs new file mode 100644 index 0000000..df3bc0f --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/CommandArrivalEventArgs.cs @@ -0,0 +1,33 @@ +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class CommandArrivalEventArgs + { + private string _friendid; + public string FriendID + { + get { return _friendid; } + set + { + if (_friendid != value) + _friendid = value; + } + } + + private string _cmdmessage; + public string CmdMessage + { + get { return _cmdmessage; } + set + { + if (_cmdmessage != value) + _cmdmessage = value; + } + } + + public CommandArrivalEventArgs(string fid,string msg) + { + FriendID = fid; + CmdMessage = msg; + } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/DBCSEncoding.cs b/PlaneGcsSdk.Contract.EhNetUWP/DBCSEncoding.cs new file mode 100644 index 0000000..fd8ba5e --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/DBCSEncoding.cs @@ -0,0 +1,285 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + /// + /// 在UWP平台下支持GB2312、Big5编码的字符编码类。 + /// + public sealed class DBCSEncoding : Encoding + { + private const char LEAD_BYTE_CHAR = '\uFFFE'; + private char[] _dbcsToUnicode = null; + private ushort[] _unicodeToDbcs = null; + private string _webName = null; + private static Dictionary> _cache = null; + + static DBCSEncoding() + { + if (!BitConverter.IsLittleEndian) + throw new PlatformNotSupportedException("Not supported big endian platform."); + + _cache = new Dictionary>(); + } + + private DBCSEncoding() { } + + /// + /// 支持GB2312和Big5编码 + /// + /// “gb2312”或“big5” + /// + public static async Task GetDBCSEncoding(string name) + { + name = name.ToLower(); + DBCSEncoding encoding = new DBCSEncoding(); + encoding._webName = name; + if (_cache.ContainsKey(name)) + { + var tuple = _cache[name]; + encoding._dbcsToUnicode = tuple.Item1; + encoding._unicodeToDbcs = tuple.Item2; + return encoding; + } + + var dbcsToUnicode = new char[0x10000]; + var unicodeToDbcs = new ushort[0x10000]; + + /* + * According to many feedbacks, add this automatic function for finding resource in revision 1.0.0.1. + * We suggest that use the old method as below if you understand how to embed the resource. + * Please make sure the *.bin file was correctly embedded if throw an exception at here. + */ + //using (Stream stream = typeof(DBCSEncoding).Assembly.GetManifestResourceStream(typeof(DBCSEncoding).Namespace + "." + name + ".bin")) + //using (Stream stream = typeof(DBCSEncoding).Assembly.GetManifestResourceStream(typeof(DBCSEncoding).Assembly.GetManifestResourceNames().Single(s => s.EndsWith("." + name + ".bin")))) + using (Stream stream = await GetInstall(name)) + using (BinaryReader reader = new BinaryReader(stream)) + { + for (int i = 0; i < 0xffff; i++) + { + ushort u = reader.ReadUInt16(); + unicodeToDbcs[i] = u; + } + for (int i = 0; i < 0xffff; i++) + { + ushort u = reader.ReadUInt16(); + dbcsToUnicode[i] = (char)u; + } + } + + _cache[name] = new Tuple(dbcsToUnicode, unicodeToDbcs); + encoding._dbcsToUnicode = dbcsToUnicode; + encoding._unicodeToDbcs = unicodeToDbcs; + return encoding; + } + + public override int GetByteCount(char[] chars, int index, int count) + { + int byteCount = 0; + ushort u; + char c; + + for (int i = 0; i < count; index++, byteCount++, i++) + { + c = chars[index]; + u = _unicodeToDbcs[c]; + if (u > 0xff) + byteCount++; + } + + return byteCount; + } + + public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) + { + int byteCount = 0; + ushort u; + char c; + + for (int i = 0; i < charCount; charIndex++, byteIndex++, byteCount++, i++) + { + c = chars[charIndex]; + u = _unicodeToDbcs[c]; + if (u == 0 && c != 0) + { + bytes[byteIndex] = 0x3f; // 0x3f == '?' + } + else if (u < 0x100) + { + bytes[byteIndex] = (byte)u; + } + else + { + bytes[byteIndex] = (byte)((u >> 8) & 0xff); + byteIndex++; + byteCount++; + bytes[byteIndex] = (byte)(u & 0xff); + } + } + + return byteCount; + } + + public override int GetCharCount(byte[] bytes, int index, int count) + { + return GetCharCount(bytes, index, count, null); + } + + public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) + { + return GetChars(bytes, byteIndex, byteCount, chars, charIndex, null); + } + + public override int GetMaxByteCount(int charCount) + { + if (charCount < 0) + throw new ArgumentOutOfRangeException("charCount"); + long count = charCount + 1; + count *= 2; + if (count > int.MaxValue) + throw new ArgumentOutOfRangeException("charCount"); + return (int)count; + + } + + public override int GetMaxCharCount(int byteCount) + { + if (byteCount < 0) + throw new ArgumentOutOfRangeException("byteCount"); + long count = byteCount + 3; + if (count > int.MaxValue) + throw new ArgumentOutOfRangeException("byteCount"); + return (int)count; + } + + public override Decoder GetDecoder() + { + return new DBCSDecoder(this); + } + + public override string WebName + { + get + { + return _webName; + } + } + + + private int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex, DBCSDecoder decoder) + { + int charCount = 0; + ushort u; + char c; + + for (int i = 0; i < byteCount; byteIndex++, charIndex++, charCount++, i++) + { + u = 0; + if (decoder != null && decoder.pendingByte != 0) + { + u = decoder.pendingByte; + decoder.pendingByte = 0; + } + + u = (ushort)(u << 8 | bytes[byteIndex]); + c = _dbcsToUnicode[u]; + if (c == LEAD_BYTE_CHAR) + { + if (i < byteCount - 1) + { + byteIndex++; + i++; + u = (ushort)(u << 8 | bytes[byteIndex]); + c = _dbcsToUnicode[u]; + } + else if (decoder == null) + { + c = '\0'; + } + else + { + decoder.pendingByte = bytes[byteIndex]; + return charCount; + } + } + if (c == 0 && u != 0) + chars[charIndex] = '?'; + else + chars[charIndex] = c; + } + + return charCount; + } + + private int GetCharCount(byte[] bytes, int index, int count, DBCSDecoder decoder) + { + int charCount = 0; + ushort u; + char c; + + for (int i = 0; i < count; index++, charCount++, i++) + { + u = 0; + if (decoder != null && decoder.pendingByte != 0) + { + u = decoder.pendingByte; + decoder.pendingByte = 0; + } + + u = (ushort)(u << 8 | bytes[index]); + c = _dbcsToUnicode[u]; + if (c == LEAD_BYTE_CHAR) + { + if (i < count - 1) + { + index++; + i++; + } + else if (decoder != null) + { + decoder.pendingByte = bytes[index]; + return charCount; + } + } + } + + return charCount; + } + + private async static Task GetInstall(string name) + { + //此处只是简单的获取到gb2312.bin文件 + //name = "gb2312"; + var folderInstall = Windows.ApplicationModel.Package.Current.InstalledLocation;//获取安装包的位置 + var folder = await folderInstall.GetFolderAsync("EncodingBins"); + var file = await folder.GetFileAsync(name + ".bin");  //获取gb2312.bin + Stream stream = await file.OpenStreamForReadAsync(); //获取文件流 + return stream; + } + + private sealed class DBCSDecoder : Decoder + { + private DBCSEncoding _encoding = null; + + public DBCSDecoder(DBCSEncoding encoding) + { + _encoding = encoding; + } + + public override int GetCharCount(byte[] bytes, int index, int count) + { + return _encoding.GetCharCount(bytes, index, count, this); + } + + public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) + { + return _encoding.GetChars(bytes, byteIndex, byteCount, chars, charIndex, this); + } + + public byte pendingByte; + } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/DiscoveredOneUserEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/DiscoveredOneUserEventArgs.cs new file mode 100644 index 0000000..5631012 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/DiscoveredOneUserEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class DiscoveredOneUserEventArgs : EventArgs + { + public DiscoveredOneUserEventArgs(UserProperty userpro) + { + userproperty = userpro; + } + + public UserProperty userproperty { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/Readme.txt b/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/Readme.txt new file mode 100644 index 0000000..40d3945 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/Readme.txt @@ -0,0 +1 @@ +Gb2312和Big5编码的库,请确保此文件夹及文件存在于运行根目录中; \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/big5.bin b/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/big5.bin new file mode 100644 index 0000000000000000000000000000000000000000..46b24c6ec2644bc0f334edf4229a801a48d1fcda GIT binary patch literal 262140 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

3!jD0!Nc%*_yQb&Ihcn9ScD~5h80+aFTx}6 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 z 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 literal 0 HcmV?d00001 diff --git a/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/gb2312.bin b/PlaneGcsSdk.Contract.EhNetUWP/EncodingBins/gb2312.bin new file mode 100644 index 0000000000000000000000000000000000000000..6ac4aab6403b181c5e160556e6f6b4db6670a233 GIT binary patch literal 262140 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πv7qEOJX+X=0gM;kpy6 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 O|Cew7U;pnuf&T-|ugVz! literal 0 HcmV?d00001 diff --git a/PlaneGcsSdk.Contract.EhNetUWP/ExceptionThrownEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/ExceptionThrownEventArgs.cs new file mode 100644 index 0000000..149ac57 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/ExceptionThrownEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class ExceptionThrownEventArgs : EventArgs + { + public ExceptionThrownEventArgs(Exception ex) + { + Exception = ex; + } + + public Exception Exception { get; set; } + } + +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/LoginEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/LoginEventArgs.cs new file mode 100644 index 0000000..ef5d145 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/LoginEventArgs.cs @@ -0,0 +1,13 @@ +using System; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class LoginEventArgs : EventArgs + { + public LoginEventArgs(LoginState loginstate) + { + LoginState = loginstate; + } + public LoginState LoginState { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/PLNet.cs b/PlaneGcsSdk.Contract.EhNetUWP/PLNet.cs new file mode 100644 index 0000000..23ca8f3 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/PLNet.cs @@ -0,0 +1,738 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Windows.Networking.Sockets; +using System.IO; +using Windows.Storage.Streams; +using Windows.Networking; +using System.Runtime.InteropServices.WindowsRuntime; +using Windows.Security.Cryptography.Core; +using Windows.Security.Cryptography; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class PLNet + { + #region Properties + public StreamOBJ MyStreamObj; + ///

+ /// 连接的IP + /// + public string ServerIP { get; protected set; } + /// + /// 连接的端口 + /// + public int TCPPort { get; protected set; } + public bool IsClosing { get; protected set; } + public bool IsOpen { get; protected set; } + /// + /// 真实名 + /// + public string MyNick { get; protected set; } + /// + /// 获取登录随机码 + /// + public string MyRND { get { return sMyTempRnd; } } + /// + /// 发送文件列表 + /// + public List SendFileList { get; protected set; } + /// + /// 接收文件列表 + /// + public List RevFileList { get; protected set; } + /// + /// 用户列表 + /// + public List FriendList { get; protected set; } + /// + /// 发送流列表 + /// + public List SendStreamList { get; protected set; } + public List RevStreamList { get; protected set; } + #endregion + + #region Fields + string sMyTempRnd; //登录随机数 + bool LoginFlag = false; //登录状态 + string sMyID; //登录用户名 + string sMyPassword; //登录密码 + + string sMyIP; //用户IP + Encoding _enconding; + int iStreamID = -1; + int iFileID = 0; + + protected StreamSocket _socket; //连接对象 + protected IInputStream _inputStream; + protected Stream _outputStream; + protected bool _canFlush = true; + protected const uint READ_BUFFER_SIZE = 2047; + #endregion + + #region Events + public event EventHandler Login; + public event EventHandler DiscoveredOneUser; + public event EventHandler RefreshFriendListCompleted; + public event EventHandler UserStateChange; + public event EventHandler Disconnect; + public event EventHandler CommandArrival; + public event EventHandler ExceptionThrown; + public event EventHandler StartSendFile; + #endregion + + public PLNet() + { + FriendList = new List(); + SendFileList = new List(); + RevFileList = new List(); + SendStreamList = new List(); + RevStreamList = new List(); + } + + #region Public Methods + /// + /// 建立连接 + /// + /// + /// + /// + /// + /// + public async Task Start(string sServerIP, string sUsername, string sPassword, string md5Password = null) + { + Close(); + IsClosing = false; + + if (_enconding == null) + { + _enconding = await DBCSEncoding.GetDBCSEncoding("GB2312"); + } + + sMyID = sUsername; + if (md5Password == null) + sMyPassword = GetStrMd5Hash(sMyID + sPassword); + else + sMyPassword = md5Password; + + ServerIP = sServerIP; //登录用户的IP地址 + TCPPort = 52510; //登录用户的端口 + + _socket = new StreamSocket(); //创建连接对象 + await _socket.ConnectAsync(new HostName(ServerIP), TCPPort.ToString()).AsTask().ConfigureAwait(false); //执行连接操作 + + IsOpen = true; + _inputStream = _socket.InputStream; + _outputStream = _socket.OutputStream.AsStreamForWrite(); + await Task.Run(() => TCPClientThread()); + } + + /// + /// 关闭连接 + /// + public void Close() + { + IsClosing = true; + IsOpen = false; + _inputStream?.Dispose(); + _outputStream?.Dispose(); + _socket?.Dispose(); + if (SendFileList != null) + SendFileList.Clear(); + if (RevFileList != null) + RevFileList.Clear(); + Disconnect?.Invoke(this, EventArgs.Empty); //触发事件Disconnect + } + + /// + /// 发送命令 + /// + /// + /// + /// + public async Task SendCommand(string friendIDs, string msg) + { + string commandtext = "*" + friendIDs + "|" + msg; + await SendCmd(commandtext); + } + + /// + /// 发送数据流,给多个用户同时发送数据 + /// + /// + /// + /// + public async Task SendStream(string friendIDs, byte[] myData) + { + string[] myFriends = friendIDs.Split(','); + for (int i = 0; i < myFriends.Length; i++) + { + iStreamID += 1; + MyStreamObj = new StreamOBJ(); + MyStreamObj.StreamID = iStreamID; + MyStreamObj.StreamData = myData; + MyStreamObj.RevUserID = myFriends[i]; + SendStreamList.Add(MyStreamObj); + string streamtext = "*" + myFriends[i] + "|SB|" + MyStreamObj.StreamID.ToString() + "|" + MyStreamObj.StreamData.Length.ToString(); + await SendCmd(streamtext); + } + } + + /// + /// 发送普通文件 + /// + /// + /// + /// + public async Task SendFileCommon(string friendID, string[] sFilenames) + { + string filetype = "F"; + await SendFileCommon(friendID, sFilenames, filetype); + } + + /// + /// 发送图片文件 + /// + /// + /// + /// + public async Task SendPicture(string friendID, string[] sFilenames) + { + string filetype = "P"; + await SendFileCommon(friendID, sFilenames, filetype); + } + + /// + /// 发送视频文件 + /// + /// + /// + /// + public async Task SendVideo(string friendID, string[] sFilenames) + { + string filetype = "V"; + await SendFileCommon(friendID, sFilenames, filetype); + } + + /// + /// 发送文件公共函数 + /// + /// + /// + /// + /// + public async Task SendFileCommon(string friendID, string[] sFilenames, string filetype) + { + for (int i = 0; i < sFilenames.Length; i++) + { + FileOBJ tmpFileObj = new FileOBJ(); + tmpFileObj.FileID = iFileID; + iFileID += 1; + FileInfo MyFileInfo = new FileInfo(sFilenames[i]); + tmpFileObj.Filename = MyFileInfo.Name; + tmpFileObj.FilePath = MyFileInfo.DirectoryName; + tmpFileObj.FileLength = MyFileInfo.Length; + tmpFileObj.FileModDate = filetype + MyFileInfo.LastWriteTime.ToString(); //filetype表示发送文件的类型 + tmpFileObj.RevUserID = friendID; + tmpFileObj.State = FileState.WaitConfim; + tmpFileObj.tmpFileStream = new FileStream(sFilenames[i], FileMode.Open, FileAccess.Read); + SendFileList.Add(tmpFileObj); + StartSendFile?.Invoke(this, new StartSendFileEventArgs(SendFileList.Count - 1)); + string filetext = "FB" + friendID + "|" + tmpFileObj.FileID.ToString() + "|" + tmpFileObj.Filename + "|" + tmpFileObj.FileLength.ToString() + "|" + tmpFileObj.FileModDate; + await SendCmd(filetext); + } + } + + /// + /// 发送数据公共函数 + /// + /// + /// + /// + public async Task SendCmd(string cmdStr, byte[] addBytes = null) + { + byte[] tmpSendbytes = null; + tmpSendbytes = _enconding.GetBytes(cmdStr); + int nret; + int strLen = LenB(cmdStr); + if (addBytes == null) + { + tmpSendbytes = BitConverter.GetBytes((ushort)strLen); + Array.Resize(ref tmpSendbytes, strLen + 2); + nret = _enconding.GetBytes(cmdStr, 0, cmdStr.Length, tmpSendbytes, 2); + } + else + { + byte[] tmpBytes; + long allLenth = strLen + addBytes.Length; + tmpBytes = BitConverter.GetBytes(allLenth); + Array.Resize(ref tmpBytes, strLen + 2); + nret = _enconding.GetBytes(cmdStr, 0, cmdStr.Length, tmpBytes, 2); + tmpSendbytes = AddByte(tmpBytes, addBytes); + } + try + { + if (tmpSendbytes != null) + { + await _outputStream.WriteAsync(tmpSendbytes, 0, tmpSendbytes.Length).ConfigureAwait(false); + if (_canFlush) + { + await _outputStream.FlushAsync().ConfigureAwait(false); + } + } + } + catch (Exception ex) + { + _canFlush = false; + Close(); + ExceptionThrown?.Invoke(this, new ExceptionThrownEventArgs(ex)); + } + } + #endregion + + #region Private Methods + /// + /// 启动一个接收数据的线程 + /// + private async void TCPClientThread() + { + uint i; //接收到的数据的长度 + byte[] byteBuffer = null; //暂存接收到的数据 + int comLength; + bool ReadFlag = false; + bool nRet; + byte[] Tmpbyte; + + IBuffer tempbuf = new Windows.Storage.Streams.Buffer(READ_BUFFER_SIZE); //建立一个buffer + await _inputStream.ReadAsync(tempbuf, READ_BUFFER_SIZE, InputStreamOptions.Partial); + i = tempbuf.Length; + byteBuffer = new byte[i]; + tempbuf.CopyTo(byteBuffer); //将数据输出 + + while (i != 0) + { + if (byteBuffer.Length > 3) + { + comLength = BitConverter.ToUInt16(byteBuffer, 0); + if (LoginFlag == false && comLength > 70) + { + #region + if (byteBuffer.Length >= 2) + { + byte[] firstchar = new byte[1]; + firstchar[0] = byteBuffer[1]; + if (_enconding.GetString(firstchar) != "L") + i = 0; + } + else + { + ReadFlag = true; + } + #endregion + } + else + { + #region + if (byteBuffer.Length >= comLength + 1) + { + Tmpbyte = MidByte(byteBuffer, 3, comLength); //截取字节 + if (Tmpbyte.Length < 4) + nRet = false; + nRet = await ProcessData(Tmpbyte); + if (nRet == true) + { + byteBuffer = RightByte(byteBuffer, byteBuffer.Length - comLength - 2); //截取字节 + if (byteBuffer.Length <= 0) + ReadFlag = true; + } + else + { + return; + } + } + else + { + ReadFlag = true; + } + #endregion + } + } + else + { + ReadFlag = true; + } + if (ReadFlag == true) + { + #region + ReadFlag = false; + try + { + tempbuf = new Windows.Storage.Streams.Buffer(READ_BUFFER_SIZE); //建立一个buffer + await _inputStream.ReadAsync(tempbuf, READ_BUFFER_SIZE, InputStreamOptions.Partial); + i = tempbuf.Length; + byte[] addbyte = new byte[i]; + tempbuf.CopyTo(addbyte); + byteBuffer = AddByte(byteBuffer, addbyte); + } + catch(Exception ex) + { + i = 0; + } + #endregion + } + } + } + + /// + /// 处理接收到的数据 + /// + /// + /// + private async Task ProcessData(byte[] tmpbyte) + { + string recestr = _enconding.GetString(tmpbyte); //这里本应是GBK编码 + UserProperty tmpUserinfo = new UserProperty(); + int tmpIndex; + + switch (recestr[0]) + { + case 'R': + sMyTempRnd = recestr.Substring(1); + await SendCmd("L" + sMyID + "|" + GetStrMd5Hash(sMyPassword + sMyTempRnd)); + sMyTempRnd = sMyTempRnd.Substring(0, sMyTempRnd.Length - 1); + break; + case 'U': //收到用户信息 + string sUserinfo = recestr.Substring(1); + switch (sUserinfo[0]) + { + #region + case 'A': //用户列表 + #region + sUserinfo = sUserinfo.Substring(1); + tmpUserinfo.UserID = Fin(1, sUserinfo, "|"); + tmpUserinfo.UserNick = Fin(2, sUserinfo, "|"); + tmpUserinfo.UserIndex = FriendList.Count; + tmpUserinfo.UserMessage = new List(); + FriendList.Add(tmpUserinfo); + DiscoveredOneUser?.Invoke(this, new DiscoveredOneUserEventArgs(tmpUserinfo)); + #endregion + break; + case 'O': //用户上线 + #region + sUserinfo = sUserinfo.Substring(1); + tmpIndex = GetUserIndexByID(Fin(1, sUserinfo, "|")); + if (tmpIndex >= 0) + { + tmpUserinfo = FriendList[tmpIndex]; //修改用户在线状态 + tmpUserinfo.UserOnline = true; + FriendList[tmpIndex] = tmpUserinfo; + UserStateChange?.Invoke(this, new UserStateChangeEventArgs(tmpUserinfo)); + } + #endregion + break; + case 'F': //用户下线 + #region + sUserinfo = sUserinfo.Substring(1); + string tmpFriendID = Fin(1, sUserinfo, "|"); + tmpIndex = GetUserIndexByID(tmpFriendID); + if (tmpIndex >= 0) + { + tmpUserinfo = FriendList[tmpIndex]; + tmpUserinfo.UserOnline = false; + FriendList[tmpIndex] = tmpUserinfo; + //处理发送文件残留 + for (int i = 0; i < SendFileList.Count; i--) + { + if (SendFileList[i].RevUserID == tmpFriendID) + { + SendFileList[i].tmpFileStream.Dispose(); + SendFileList.RemoveAt(i); + } + } + for (int j = 0; j < RevFileList.Count; j--) + { + if (RevFileList[j].RevUserID == tmpFriendID) + { + RevFileList[j].tmpFileStream.Dispose(); + RevFileList.RemoveAt(j); + } + } + UserStateChange?.Invoke(this, new UserStateChangeEventArgs(tmpUserinfo)); + } + #endregion + break; + case 'D': + break; + case 'C': //被别人添加为好友时会收到 + break; + case 'E': + RefreshFriendListCompleted?.Invoke(this, EventArgs.Empty); + break; + default: + break; + #endregion + } + break; + case 'L': //登陆 + recestr = recestr.Substring(1); + switch (recestr[0]) + { + #region + case 'P': + Login?.Invoke(this, new LoginEventArgs(LoginState.LoginPwdError)); + break; + case 'O': + LoginFlag = true; + MyNick = recestr.Substring(1).Split('|')[0]; + Login?.Invoke(this, new LoginEventArgs(LoginState.LoginOk)); + await SendCmd("UG"); + break; + case 'U': + Login?.Invoke(this, new LoginEventArgs(LoginState.LoginNoUser)); + break; + case 'E': + Login?.Invoke(this, new LoginEventArgs(LoginState.LoginOtherError)); + break; + default: + break; + #endregion + } + break; + case '*': //收到命令,格式为: *+FriendID+|+Msg + string tmpStr = recestr.Substring(1); + string tmpstr2 = Fin(2, tmpStr, "|"); + switch (tmpstr2[0]) + { + #region + case 'S': + break; + default: + string friendid = Fin(1, tmpStr, "|"); + string msgcontent = tmpStr.Substring(tmpStr.IndexOf("|") + 1); + CommandArrival?.Invoke(this, new CommandArrivalEventArgs(friendid, msgcontent)); + break; + #endregion + } + break; + default: + break; + } + return true; + } + + private int LenB(string str) + { + return _enconding.GetBytes(str).Count(); + } + + /// + /// 获取一个字节数组中的某些字节,从start个字节开始,获取length个字节,第几个是从1开始的 + /// + /// + /// + /// + /// + private byte[] MidByte(byte[] tbyte, int start, int length) + { + byte[] tmpMidByte = new byte[length]; + //for (int i = 0; i < length; i++) + //{ + // tmpMidByte[i] = tbyte[i + start - 1]; + //} + for (int i = start - 1; i <= length - 1 + start - 1; i++) + { + tmpMidByte[i - (start - 1)] = tbyte[i]; + } + return tmpMidByte; + } + + /// + /// 获取某个字节数组的后面的字节,获取length个字节 + /// + /// + /// + /// + private byte[] RightByte(byte[] tbyte, int length) + { + byte[] temRightByte = new byte[length]; + temRightByte = MidByte(tbyte, tbyte.Length - length + 1, length); + return temRightByte; + } + + /// + /// 获取某个字节数组的前面的字节,获取length个字节 + /// + /// + /// + /// + private byte[] LeftByte(byte[] tbyte, int length) + { + byte[] temLeftByte = new byte[length]; + temLeftByte = MidByte(tbyte, 1, length); + return temLeftByte; + } + + /// + /// 拼接两个字节,将addbyte加在srcbyte后面 + /// + /// + /// + /// + private byte[] AddByte(byte[] srcbyte, byte[] addbyte) + { + byte[] resultbyte = new byte[srcbyte.Length + addbyte.Length]; + for (int i = 0; i < srcbyte.Length; i++) + { + resultbyte[i] = srcbyte[i]; + } + for (int j = 0; j < addbyte.Length; j++) + { + resultbyte[j + srcbyte.Length] = addbyte[j]; + } + return resultbyte; + } + + /// + /// 根据ID获取列表中序号 + /// + /// + /// + protected int GetUserIndexByID(string tmpUserID) + { + for (int i = 0; i < FriendList.Count; i++) + { + if (FriendList.ElementAt(i).UserID == tmpUserID) + return i; + } + return -1; + } + + /// + /// 分割字符串,第Xnum个字符,字符串为SrcStr,分割特征为SpStr + /// + /// + /// + /// + /// + private string Fin(int xnum, string srcStr, string spStr) + { + string[] tmpStr; + char[] FF = new char[1]; + FF[0] = spStr[0]; + tmpStr = srcStr.Split(FF); + if ((xnum > 0) && (xnum <= tmpStr.Length)) + return tmpStr[xnum - 1]; + else + return ""; + } + + /// + /// 计算字符串的MD5哈希值,输入为字符串strtohash,输出为字符串strHash + /// + /// + /// + private string GetStrMd5Hash(string strtohash) + { + + byte[] tmpbyte = _enconding.GetBytes(strtohash); + + IBuffer buffMsg = CryptographicBuffer.CreateFromByteArray(tmpbyte); + + HashAlgorithmProvider objAlgProv = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithmNames.Md5); + + IBuffer tmpbuffer = objAlgProv.HashData(buffMsg); + + uint i = tmpbuffer.Length; + byte[] mybyte = new byte[i]; + tmpbuffer.CopyTo(mybyte); + + CryptographicBuffer.CopyToByteArray(tmpbuffer, out mybyte); + + StringBuilder sBuilder = new StringBuilder(); + for (int k = 0; k < mybyte.Length; k++) + { + sBuilder.Append(mybyte[k].ToString("x2")); + } + + string strHash = sBuilder.ToString(); + + return strHash; + } + + #endregion + } + #region Nested Type + /// + /// 用户信息结构体 + /// + public struct UserProperty + { + public string UserID; + public string UserNick; + public string UserIP; + public int UserIndex; + public bool UserOnline; + public List UserMessage; + } + + /// + /// 文件状态 + /// + public enum FileState + { + WaitConfim, + StartSend, //开始发送,等待确认 + Sending, //正在发送中 + reSend, //断点续传中 + SendError, //发送错误 + Completed, //发送完成 + LoginOtherError, //其他错 + StartReveice, //开始接收,等待数据 + Receiving, //接收中 + ReReceiving, //断点续传中 + ReceiveError + } + + /// + /// 登录状态 + /// + public enum LoginState + { + LoginPwdError, //密码错 + LoginOk, //登陆成功 + LoginNoUser, //用户不存在 + LoginOtherError, //其他错 + } + + /// + /// 文件结构体 + /// + public struct FileOBJ + { + public string Filename; + public string FilePath; + public long FileLength; + public string FileModDate; + public int FileID; + public string SendUserID; + public string RevUserID; + public FileStream tmpFileStream; + public FileState State; + } + + /// + /// 数据流结构体 + /// + public struct StreamOBJ + { + public byte[] StreamData; + public ulong CurrPos; + public int StreamID; + public ulong Length; + public string SendUserID; + public string RevUserID; + } + #endregion +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/PlaneGcsSdk.Contract.EhNetUWP.csproj b/PlaneGcsSdk.Contract.EhNetUWP/PlaneGcsSdk.Contract.EhNetUWP.csproj new file mode 100644 index 0000000..e5d5cfe --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/PlaneGcsSdk.Contract.EhNetUWP.csproj @@ -0,0 +1,141 @@ + + + + + Debug + AnyCPU + {D7D21B2B-6F73-4939-B720-FE51DA1C04C0} + Library + Properties + PlaneGcsSdk.Contract.EhNetUWP + PlaneGcsSdk.Contract.EhNetUWP + zh-CN + UAP + 10.0.10586.0 + 10.0.10240.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + + + + + PreserveNewest + + + PreserveNewest + + + + + + + + + + + + + + + + + + + + 14.0 + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.EhNetUWP/Properties/AssemblyInfo.cs b/PlaneGcsSdk.Contract.EhNetUWP/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..24ad66f --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PlaneGcsSdk.Contract.EhNetUWP")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("PlaneGcsSdk.Contract.EhNetUWP")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/PlaneGcsSdk.Contract.EhNetUWP/Properties/PlaneGcsSdk.Contract.EhNetUWP.rd.xml b/PlaneGcsSdk.Contract.EhNetUWP/Properties/PlaneGcsSdk.Contract.EhNetUWP.rd.xml new file mode 100644 index 0000000..f49f91c --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/Properties/PlaneGcsSdk.Contract.EhNetUWP.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/PlaneGcsSdk.Contract.EhNetUWP/Readme.txt b/PlaneGcsSdk.Contract.EhNetUWP/Readme.txt new file mode 100644 index 0000000..01a35e0 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/Readme.txt @@ -0,0 +1,4 @@ +本项目: +1,实现了数据按字节加密的类; +2,实现了GBK/GB2312/Big5编解码; +3,移植了PLNet(.Net)模块; diff --git a/PlaneGcsSdk.Contract.EhNetUWP/StartSendFileEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/StartSendFileEventArgs.cs new file mode 100644 index 0000000..c93b69d --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/StartSendFileEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class StartSendFileEventArgs : EventArgs + { + public StartSendFileEventArgs(int streamindex) + { + StreamIndex = streamindex; + } + + public int StreamIndex { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/UserStateChangeEventArgs.cs b/PlaneGcsSdk.Contract.EhNetUWP/UserStateChangeEventArgs.cs new file mode 100644 index 0000000..260bd37 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/UserStateChangeEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace PlaneGcsSdk.Contract.EhNetUWP +{ + public class UserStateChangeEventArgs : EventArgs + { + public UserStateChangeEventArgs(UserProperty friendinfo) + { + FriendInfo = friendinfo; + } + + public UserProperty FriendInfo { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract.EhNetUWP/project.json b/PlaneGcsSdk.Contract.EhNetUWP/project.json new file mode 100644 index 0000000..c594939 --- /dev/null +++ b/PlaneGcsSdk.Contract.EhNetUWP/project.json @@ -0,0 +1,16 @@ +{ + "dependencies": { + "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" + }, + "frameworks": { + "uap10.0": {} + }, + "runtimes": { + "win10-arm": {}, + "win10-arm-aot": {}, + "win10-x86": {}, + "win10-x86-aot": {}, + "win10-x64": {}, + "win10-x64-aot": {} + } +} \ No newline at end of file diff --git a/PlaneGcsSdk.Contract/PlaneGcsSdk.Contract.csproj b/PlaneGcsSdk.Contract/PlaneGcsSdk.Contract.csproj new file mode 100644 index 0000000..0de9e3d --- /dev/null +++ b/PlaneGcsSdk.Contract/PlaneGcsSdk.Contract.csproj @@ -0,0 +1,52 @@ + + + + + 11.0 + Debug + AnyCPU + {18ECD88E-5D74-43E8-8BC2-D28F6DB13A47} + Library + Properties + Plane + PlaneGcsSdk.Contract + en-US + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Profile111 + v4.5 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;PORTABLE;NETFX_CORE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;PORTABLE;NETFX_CORE + prompt + 4 + bin\Release\PlaneGcsSdk.Contract.xml + + + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract/Properties/AssemblyInfo.cs b/PlaneGcsSdk.Contract/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9635489 --- /dev/null +++ b/PlaneGcsSdk.Contract/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PlaneGcsSdk.Contract")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk.Contract")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk.Contract_Private/Copters/DataStreamReceivedEventArgs.cs b/PlaneGcsSdk.Contract_Private/Copters/DataStreamReceivedEventArgs.cs new file mode 100644 index 0000000..af39e21 --- /dev/null +++ b/PlaneGcsSdk.Contract_Private/Copters/DataStreamReceivedEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Plane.Copters +{ + public class DataStreamReceivedEventArgs : EventArgs + { + public DataStreamReceivedEventArgs(DataStreamType dataStreamType) + { + DataStreamType = dataStreamType; + } + + public DataStreamType DataStreamType { get; private set; } + } +} diff --git a/PlaneGcsSdk.Contract_Private/Copters/DataStreamType.cs b/PlaneGcsSdk.Contract_Private/Copters/DataStreamType.cs new file mode 100644 index 0000000..f7b3047 --- /dev/null +++ b/PlaneGcsSdk.Contract_Private/Copters/DataStreamType.cs @@ -0,0 +1,9 @@ +namespace Plane.Copters +{ + public enum DataStreamType : byte + { + SYS_STATUS = 1, // MAVLINK_MSG_ID_SYS_STATUS, + GPS_RAW_INT = 24, // MAVLINK_MSG_ID_GPS_RAW_INT, + RC_CHANNELS_RAW = 35 // MAVLINK_MSG_ID_RC_CHANNELS_RAW + } +} diff --git a/PlaneGcsSdk.Contract_Private/Copters/ICopterActions.cs b/PlaneGcsSdk.Contract_Private/Copters/ICopterActions.cs new file mode 100644 index 0000000..82368de --- /dev/null +++ b/PlaneGcsSdk.Contract_Private/Copters/ICopterActions.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public partial interface ICopterActions + { + /// + /// 开始画圈。 + /// + /// 表示此命令异步发送操作的 实例。 + Task CircleAsync(); + + /// + /// // 林俊清, 20160122, 不明确。目测是发送重启命令,在刷固件之前用到。 + /// + /// + /// 表示此命令异步发送操作的 实例。 + Task RebootAsync(bool bootloaderMode = false); + } +} diff --git a/PlaneGcsSdk.Contract_Private/PlaneGcsSdk.Contract_Private.csproj b/PlaneGcsSdk.Contract_Private/PlaneGcsSdk.Contract_Private.csproj new file mode 100644 index 0000000..0583db7 --- /dev/null +++ b/PlaneGcsSdk.Contract_Private/PlaneGcsSdk.Contract_Private.csproj @@ -0,0 +1,55 @@ + + + + + 11.0 + Debug + AnyCPU + {47141894-ECE3-48CA-8DCF-CA751BDA231E} + Library + Properties + Plane + PlaneGcsSdk.Contract_Private + en-US + 512 + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Profile111 + v4.5 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;PORTABLE;NETFX_CORE;PRIVATE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;PORTABLE;NETFX_CORE;PRIVATE + prompt + 4 + bin\Release\PlaneGcsSdk.Contract_Private.xml + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract_Private/Properties/AssemblyInfo.cs b/PlaneGcsSdk.Contract_Private/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5e9af04 --- /dev/null +++ b/PlaneGcsSdk.Contract_Private/Properties/AssemblyInfo.cs @@ -0,0 +1,30 @@ +using System.Resources; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PlaneGcsSdk.Contract_Private")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk.Contract_Private")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk.Contract_Shared/Communication/ConnectionEstablishedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Communication/ConnectionEstablishedEventArgs.cs new file mode 100644 index 0000000..a14f92e --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Communication/ConnectionEstablishedEventArgs.cs @@ -0,0 +1,17 @@ +using System; + +namespace Plane.Communication +{ + public class ConnectionEstablishedEventArgs : EventArgs + { + public ConnectionEstablishedEventArgs(IConnection connection, string remoteAddress) + { + this.Connection = connection; + RemoteAddress = remoteAddress; + } + + public IConnection Connection { get; private set; } + + public string RemoteAddress { get; private set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Communication/ExceptionThrownEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Communication/ExceptionThrownEventArgs.cs new file mode 100644 index 0000000..2ecd32a --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Communication/ExceptionThrownEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Plane.Communication +{ + public class ExceptionThrownEventArgs : EventArgs + { + public ExceptionThrownEventArgs(Exception ex) + { + Exception = ex; + } + + public Exception Exception { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Communication/IConnection.cs b/PlaneGcsSdk.Contract_Shared/Communication/IConnection.cs new file mode 100644 index 0000000..0b66a78 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Communication/IConnection.cs @@ -0,0 +1,50 @@ +using System; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 定义与远程主机通信的方法。 + /// + public interface IConnection + { + /// + /// 在不宜抛出的异常发生时引发的事件。 + /// + event EventHandler ExceptionThrown; + + /// + /// 获取一个值,指示通信是否已开启。 + /// + bool IsOpen { get; } + + /// + /// 关闭通信。 + /// + void Close(); + + /// + /// 开启通信。 + /// + /// 表示此异步操作的 实例。 + Task OpenAsync(); + + /// + /// 异步读取数据。顺利完成时将正好读取 个字节。 + /// + /// 存放数据的缓冲区。 + /// 起始下标。 + /// 要读取的字节数。 + /// 包含成功读取的字节数的 实例。此数目在操作顺利完成时保证与 等,否则为 0。 + Task ReadAsync(byte[] buffer, int offset, int count); + + /// + /// 异步写入数据。会抛异常。 + /// + /// 存放数据的缓冲区。 + /// 起始下标。 + /// 要写入的字节数。 + /// 表示此异步操作的 实例。 + Task WriteAsync(byte[] buffer, int offset, int count); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterControllers/CopterControllerTypes.cs b/PlaneGcsSdk.Contract_Shared/CopterControllers/CopterControllerTypes.cs new file mode 100644 index 0000000..2ec36fb --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterControllers/CopterControllerTypes.cs @@ -0,0 +1,13 @@ +using System; + +namespace Plane.CopterControllers +{ + [Flags] + public enum CopterControllerTypes : byte + { + AvatarController = 0x1, + MicroController = 0x2, + KeyboardController = 0x4, + FlyToController = 0x8 + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterController.cs b/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterController.cs new file mode 100644 index 0000000..3b56341 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterController.cs @@ -0,0 +1,12 @@ +namespace Plane.CopterControllers +{ + public interface ICopterController + { + /// + /// 获取或设置一个值,指示是否激活此控制器。 + /// + bool IsEnabled { get; set; } + + CopterControllerTypes Type { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterControllerManager.cs b/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterControllerManager.cs new file mode 100644 index 0000000..1462452 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterControllers/ICopterControllerManager.cs @@ -0,0 +1,11 @@ +namespace Plane.CopterControllers +{ + public interface ICopterControllerManager + { + bool IsControllingRollPitchUsingAvatar { get; } + + void EnableCopterControllers(CopterControllerTypes controllerTypes); + + bool IsControllerEnabled(CopterControllerTypes controllerType); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterControllers/SpeedType.cs b/PlaneGcsSdk.Contract_Shared/CopterControllers/SpeedType.cs new file mode 100644 index 0000000..c04bdc3 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterControllers/SpeedType.cs @@ -0,0 +1,8 @@ +namespace Plane.CopterControllers +{ + public enum SpeedType + { + SpeedSlow, + SpeedFast + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterFactory.cs b/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterFactory.cs new file mode 100644 index 0000000..9556339 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterFactory.cs @@ -0,0 +1,11 @@ +using Plane.Copters; + +namespace Plane.CopterManagement +{ + public interface ICopterFactory + { + ICopter CreateBluetoothCopter(string hostName, string name = "GHOSTDRONE"); + + IFakeCopter CreateFakeCopter(string id = "FakeCopter", string name = "Linjq's Drone"); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterManager.cs b/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterManager.cs new file mode 100644 index 0000000..ce6774b --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/CopterManagement/ICopterManager.cs @@ -0,0 +1,64 @@ +using Plane.Communication; +using Plane.Copters; +using System.Collections.ObjectModel; +using System.Threading.Tasks; + +namespace Plane.CopterManagement +{ + public interface ICopterManager : ICopterActionsSharedByCopterManager + { + /// + /// 获取 实例的动态集合。 + /// + ObservableCollection AllCopters { get; } + + /// + /// 获取单个 实例。用 代替 null,使用时不必判断是否为 null。 + /// + ICopter Copter { get; } + + /// + /// 获取一个值,指示是否正在搜寻飞行器。 + /// + bool IsSearching { get; } + + /// + /// 获取被选中的 实例的动态集合。 + /// + ObservableCollection SelectedCopters { get; } + + /// + /// 添加或更新 实例。 + /// + /// 飞行器的唯一 ID。 + /// 飞行器的名字。 + /// 用于通信的 实例。 + /// + Task AddOrUpdateCopterAsync(string id, string name, IConnection connection); + + /// + /// 检查飞行器的状态,判断是否允许 FlyTo,若允许,飞往指定位置。 + /// + /// 目的地纬度。 + /// 目的地经度。 + /// 若允许并执行了 FlyTo,返回 true;否则返回 false。 + Task CheckStatusAndFlyToAsync(double lat, double lng); + + /// + /// 连接一个新的 实例。 + /// + /// 要连接的 实例。 + /// 表示此异步操作的 实例。 + Task ConnectAsync(ICopter copter); + + /// + /// 开始搜索并连接飞行器。 + /// + void StartSearching(); + + /// + /// 停止搜索飞行器。 + /// + void StopSearching(); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/Constants.cs b/PlaneGcsSdk.Contract_Shared/Copters/Constants.cs new file mode 100644 index 0000000..c5957b3 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/Constants.cs @@ -0,0 +1,27 @@ +namespace Plane.Copters +{ + public static class Constants + { + /// + /// 最高加速度,单位为 m/s2。 + /// + public const float MAX_ACCEL = 10f; + + public const ushort MAX_CHANNEL = 1900, + MIN_CHANNEL = 1100, + MAX_CHANNEL_DELTA = 370, + HOVER_CHANNEL = 1500, + MAX_HOVER_CHANNEL = MAX_CHANNEL - MAX_CHANNEL_DELTA, + MIN_HOVER_CHANNEL = MIN_CHANNEL + MAX_CHANNEL_DELTA; + + /// + /// 飞行过程中的最大倾斜角度。 + /// + public const float MAX_TILT_IN_FLIGHT = 45; + + /// + /// 最高速度,单位为 m/s。 + /// + public const float MAX_VEL = 5f; + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/CopterCommand.cs b/PlaneGcsSdk.Contract_Shared/Copters/CopterCommand.cs new file mode 100644 index 0000000..139c518 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/CopterCommand.cs @@ -0,0 +1,27 @@ +namespace Plane.Copters +{ + public enum CopterCommand + { + StartMovingForward, + StartMovingBack, + StartMovingLeft, + StartMovingRight, + StartMovingUp, + StartMovingDown, + StartRotatingAnticlockwise, + StartRotatingClockwise, + StopMovingForward, + StopMovingBack, + StopMovingLeft, + StopMovingRight, + StopMovingUp, + StopMovingDown, + StopRotatingAnticlockwise, + StopRotatingClockwise, + Unlock, + Lock, + TakeOff, + ReturnToLaunch, + Land + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/CopterState.cs b/PlaneGcsSdk.Contract_Shared/Copters/CopterState.cs new file mode 100644 index 0000000..71e68a0 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/CopterState.cs @@ -0,0 +1,16 @@ +namespace Plane.Copters +{ + public enum CopterState + { + Locked, + Initialized, + TakingOff, + FloatMode, + HoverMode, + CommandMode, + Circling, + Following, + Returning, + Landing + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/FlightCommand.cs b/PlaneGcsSdk.Contract_Shared/Copters/FlightCommand.cs new file mode 100644 index 0000000..52f1bf0 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/FlightCommand.cs @@ -0,0 +1,38 @@ +namespace Plane.Copters +{ + /// + /// 在自动飞行任务中使用的命令枚举,指定飞行器应执行的动作。 + /// + public enum FlightCommand : ushort + { + /// + /// 命令飞行器飞往指定位置。 + /// + Waypoint = 16, + + /// + /// 命令飞行器在指定位置盘旋指定圈数。 + /// + LoiterTurns = 18, + + /// + /// 命令飞行器在指定位置盘旋指定时间。 + /// + LoiterTime = 19, + + /// + /// 命令飞行器返航。 + /// + ReturnToLaunch = 20, + + /// + /// 命令飞行器降落。 + /// + Land = 21, + + /// + /// 命令飞行器起飞。 + /// + TakeOff = 22 + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/GpsFixType.cs b/PlaneGcsSdk.Contract_Shared/Copters/GpsFixType.cs new file mode 100644 index 0000000..364c16c --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/GpsFixType.cs @@ -0,0 +1,17 @@ +namespace Plane.Copters +{ + public enum GpsFixType : byte + { + NoFix = 0, + Fix2D = 2, + Fix3D = 3 + } + + public static class ByteExtensions + { + public static GpsFixType ToGpsFixType(this byte value) + { + return value == 1 ? GpsFixType.NoFix : (GpsFixType)value; + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/HeartbeatReceivedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Copters/HeartbeatReceivedEventArgs.cs new file mode 100644 index 0000000..280641d --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/HeartbeatReceivedEventArgs.cs @@ -0,0 +1,14 @@ +using System; + +namespace Plane.Copters +{ + public class HeartbeatReceivedEventArgs : EventArgs + { + public HeartbeatReceivedEventArgs(ulong count) + { + Count = count; + } + + public ulong Count { get; private set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/IAttitude.cs b/PlaneGcsSdk.Contract_Shared/Copters/IAttitude.cs new file mode 100644 index 0000000..2b7f359 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/IAttitude.cs @@ -0,0 +1,28 @@ +namespace Plane.Copters +{ + /// + /// 定义用于获取三维空间中飞行器姿态的属性。 + /// + public interface IAttitude + { + /// + /// 获取机头方向,其范围为 [0, 360)。 + /// + short Heading { get; } + + /// + /// 获取俯仰角度,其范围为 (-180, 180],正常飞行中的范围为 [-45, 45]。 + /// + float Pitch { get; } + + /// + /// 获取横滚角度,其范围为 (-180, 180],正常飞行中的范围为 [-45, 45]。 + /// + float Roll { get; } + + /// + /// 获取偏航角度,其范围为 (-180, 180]。 + /// + float Yaw { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopter.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopter.cs new file mode 100644 index 0000000..c701378 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopter.cs @@ -0,0 +1,8 @@ +using System.ComponentModel; + +namespace Plane.Copters +{ + public partial interface ICopter : ICopterStatus, ICopterEvents, ICopterActions, ICopterCommunication, INotifyPropertyChanged + { + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterActions.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterActions.cs new file mode 100644 index 0000000..97a3360 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterActions.cs @@ -0,0 +1,124 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + /// + /// 定义用于操纵飞行器的属性和方法。 + /// + public partial interface ICopterActions : ICopterActionsSharedByCopterManager, ICopterMissionActions + { + /// + /// 获取或设置目标通道 1。 + /// + ushort? DesiredChannel1 { get; set; } + + /// + /// 获取或设置目标通道 2。 + /// + ushort? DesiredChannel2 { get; set; } + + /// + /// 获取或设置目标通道 3。 + /// + ushort? DesiredChannel3 { get; set; } + + /// + /// 获取或设置目标通道 4。 + /// + ushort? DesiredChannel4 { get; set; } + + /// + /// 获取或设置目标通道 5。 + /// + ushort? DesiredChannel5 { get; set; } + + /// + /// 获取或设置目标通道 6。 + /// + ushort? DesiredChannel6 { get; set; } + + /// + /// 获取或设置目标通道 7。 + /// + ushort? DesiredChannel7 { get; set; } + + /// + /// 获取或设置目标通道 8。 + /// + ushort? DesiredChannel8 { get; set; } + + /// + /// 获取或设置目标偏航。 + /// + float? DesiredYaw { get; set; } + + /// + /// 获取一个值,指示飞行器是否正处于紧急悬停状态。 + /// + bool IsEmergencyHoverActive { get; } + + /// + /// 开启与飞行器之间的连接。 + /// + /// 表示此异步操作的 实例。 + Task ConnectAsync(); + + /// + /// 跟随。 + /// + /// 目标。 + /// 设为 true 进保持偏航角度差,设为 false 时将保持两者在空间中的相对位置。 + /// 是否保持机头面对目标。 + void Follow(IVisibleStatus target, bool keepYawDifference = false, bool keepFacingTarget = true, bool keep3DRelativeLocations = false); + + /// + /// 向飞行器请求数据。 + /// + /// 表示此命令异步发送操作的 实例。 + Task GetCopterDataAsync(); + + /// + /// 获取参数的值。 + /// + /// 参数名。 + /// 超时时间,单位为毫秒。 + /// 表示参数获取异步操作的 ,其结果即为参数的值。 + /// 操作超时。 + Task GetParamAsync(string paramName, int millisecondsTimeout = Timeout.Infinite); + + /// + /// 把所有通道设置为目标值。 + /// + /// 表示此命令异步发送操作的 实例。 + Task SetChannelsAsync(); + + /// + /// 用各个目标值属性设置通道和偏航。 + /// + /// 表示此命令异步发送操作的 实例。 + Task SetMobileControlAsync(); + + /// + /// 设置参数,返回的 实例在确认设置成功后完成。 + /// + /// 参数名。 + /// 值。 + /// 超时时间,单位为毫秒。 + /// 表示异步设置参数操作的 实例。 + /// 操作超时。 + Task SetParamAsync(string paramName, float value, int millisecondsTimeout = Timeout.Infinite); + + /// + /// 开始对频。 + /// + /// 表示此命令异步发送操作的 实例。 + Task StartPairingAsync(); + + /// + /// 停止对频。 + /// + /// 表示此命令异步发送操作的 实例。 + Task StopPairingAsync(); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterActionsSharedByCopterManager.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterActionsSharedByCopterManager.cs new file mode 100644 index 0000000..d4b774e --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterActionsSharedByCopterManager.cs @@ -0,0 +1,130 @@ +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public interface ICopterActionsSharedByCopterManager + { + /// + /// 断开与飞行器之间的连接。 + /// + /// 表示此异步操作的 实例。 + Task DisconnectAsync(); + + /// + /// 切换到 并向各个控制通道发中间值。飞行器可能受风等外力影响而在水平方向上飘动。 + /// + /// 表示此命令异步发送操作的 实例。 + Task FloatAsync(); + + /// + /// 使飞行器飞往水平面上指定的点。 + /// + /// 纬度。 + /// 经度。 + /// 表示此命令异步发送操作的 实例。 + Task FlyToAsync(double lat, double lng); + + /// + /// 使飞行器飞往指定的点。 + /// + /// 纬度。 + /// 经度。 + /// 相对于解锁点的高度。 + /// 表示此命令异步发送操作的 实例。 + Task FlyToAsync(double lat, double lng, float alt); + + /// + /// 切换到 并悬停。此操作需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 表示此命令异步发送操作的 实例。 + Task HoverAsync(); + + Task GuidAsync(); + /// + /// 降落。此操作需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 表示此命令异步发送操作的 实例。 + Task LandAsync(); + + /// + /// 锁定飞行器(停止电机转动)。在调用之前务必判断高度及让软件使用者确认! + /// + Task LockAsync(); + + /// + /// 返航。此操作需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 表示此命令异步发送操作的 实例。 + Task ReturnToLaunchAsync(); + + /// + /// 用指定的值设置通道。 + /// + /// 通道 1 的目标值。 + /// 通道 2 的目标值。 + /// 通道 3 的目标值。 + /// 通道 4 的目标值。 + /// 通道 5 的目标值。 + /// 通道 6 的目标值。 + /// 通道 7 的目标值。 + /// 通道 8 的目标值。 + /// 表示此命令异步发送操作的 实例。 + Task SetChannelsAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null); + + /// + /// 用指定的值设置通道和偏航。 + /// + /// 通道 1 的目标值。 + /// 通道 2 的目标值。 + /// 通道 3 的目标值。 + /// 通道 4 的目标值。目前此参数无效(20160119)。 + /// 通道 5 的目标值。 + /// 通道 6 的目标值。 + /// 通道 7 的目标值。 + /// 通道 8 的目标值。 + /// 偏航的目标值 + /// 表示此命令异步发送操作的 实例。 + Task SetMobileControlAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null, float? yaw = null); + + /// + /// 进入紧急悬停状态。此状态需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 表示此命令异步发送操作的 实例。 + Task StartEmergencyHoverAsync(); + + /// + /// 开始根据各个目标属性(如 )控制飞行器。 + /// + /// 发送控制命令的时间间距,若为 null,将由 SDK 决定。 + void StartMobileControl(int? millisecondsInterval = null); + + /// + /// 停止紧急悬停。 + /// + void StopEmergencyHover(); + + /// + /// 停止根据各个目标属性(如 )控制飞行器。 + /// + void StopMobileControl(); + + /// + /// 自动起飞到预定高度。此操作需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 表示此命令异步发送操作的 实例。 + Task TakeOffAsync(); + + /// + /// 自动解锁并起飞到指定高度。此操作需要使用 GPS 定位,卫星数不足导致定位不准时非常危险。 + /// + /// 目标高度。 + /// 表示此命令异步发送操作的 实例。 + Task TakeOffAsync(float alt); + + /// + /// 解锁飞行器。螺旋桨将开始转动,但飞行器不会起飞。 + /// + /// 表示此命令异步发送操作的 实例。 + Task UnlockAsync(); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterCommunication.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterCommunication.cs new file mode 100644 index 0000000..fd416d6 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterCommunication.cs @@ -0,0 +1,15 @@ +using Plane.Communication; + +namespace Plane.Copters +{ + /// + /// 定义与通信相关的属性。 + /// + public interface ICopterCommunication + { + /// + /// 获取或设置用于与飞行器通信的 实例。 + /// + IConnection Connection { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterEvents.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterEvents.cs new file mode 100644 index 0000000..adc6159 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterEvents.cs @@ -0,0 +1,57 @@ +using System; + +namespace Plane.Copters +{ + /// + /// 定义飞行器代理对象的事件。 + /// + public partial interface ICopterEvents + { + /// + /// 在高度变化时发生。 + /// + event EventHandler AltitudeChanged; + + /// + /// 在姿态变化时发生。 + /// + event EventHandler AttitudeChanged; + +#if PRIVATE + /// + /// 在收到数据流时发生。 + /// + event EventHandler DataStreamReceived; +#endif + + /// + /// 在收到心跳时发生。 + /// + event EventHandler HeartbeatReceived; + + /// + /// 在位置变化时发生。 + /// + event EventHandler LocationChanged; + + /// + /// 在收到自动飞行任务详情时发生。 + /// + event EventHandler MissionItemReceived; + + /// + /// 在对频完成(成功或失败)时发生。 + /// + event EventHandler PairingCompleted; + + /// + /// 在收到传感器数据时发生。 + /// + event EventHandler SensorDataReceived; + + /// + /// 在收到系统状态信息时发生。 + /// + event EventHandler SystemStatusReceived; + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterMissionActions.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterMissionActions.cs new file mode 100644 index 0000000..03154f8 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterMissionActions.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public interface ICopterMissionActions + { + /// + /// 查询任务序列。 + /// + /// 超时时间。 + /// 飞行器返回的任务序列。 + Task> RequestMissionListAsync(int millisecondsTimeout = 10000); + + /// + /// 写入任务序列。 + /// + /// 任务序列。 + /// 超时时间。 + /// 若写入成功,返回 true;否则返回 false。 + Task WriteMissionListAsync(IEnumerable missions, int millisecondsTimeout = 10000); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/ICopterStatus.cs b/PlaneGcsSdk.Contract_Shared/Copters/ICopterStatus.cs new file mode 100644 index 0000000..e7a9a77 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/ICopterStatus.cs @@ -0,0 +1,176 @@ +using Plane.Geography; +using System; + +namespace Plane.Copters +{ + /// + /// 定义用于获取飞行器状态的属性。 + /// + public partial interface ICopterStatus : IVisibleStatus + { + /// + /// 获取当前空速,单位为 m/s。 + /// + float AirSpeed { get; } + + /// + /// 获取剩余电量百分比,其范围为 [0, 100]。 + /// + byte BatteryPer { get; } + + /// + /// 获取通道 1 的值。该值在飞控中用于改变飞行器横滚姿态,从而控制其左右方向的移动。有效范围为 [1100, 1900]。小于 1500 时使飞行器向左倾斜,大于 1500 时使飞行器向右倾斜。 + /// + ushort Channel1 { get; } + + /// + /// 获取通道 2 的值。该值在飞控中用于改变飞行器俯仰姿态,从而控制其前后方向的移动。有效范围为 [1100, 1900]。小于 1500 时使飞行器向前倾斜,大于 1500 时使飞行器向后倾斜。 + /// + ushort Channel2 { get; } + + /// + /// 获取通道 3 的值。该值在飞控中用于改变飞行器油门,从而控制其上下方向的移动。有效范围为 [1100, 1900]。在能够定高的模式(如 ALT_HOLD、LOITER)下,小于 1500 时使飞行器下降,大于 1500 时使飞行器上升。 + /// + ushort Channel3 { get; } + + /// + /// 获取通道 4 的值。该值在飞控中用于使飞行器改变机头方向。有效范围为 [1100, 1900]。小于 1500 时使飞行器逆时针旋转,大于 1500 时使飞行器顺时针旋转。 + /// + ushort Channel4 { get; } + + /// + /// 获取通道 5 的值。其作用未定义。 + /// + ushort Channel5 { get; } + + /// + /// 获取通道 6 的值。该值在飞控中用于控制相机正对的方向。有效范围为 [1100, 1900]。小于 1500 时使相机逆时针旋转,大于 1500 时使相机顺时针旋转。 + /// + ushort Channel6 { get; } + + /// + /// 获取通道 7 的值。该值在飞控中用于控制相机俯仰姿态。有效范围为 [1100, 1900]。小于 1500 时使相机向后旋转,大于 1500 时使相机向前旋转。 + /// + ushort Channel7 { get; } + + /// + /// 获取通道 8 的值。其作用未定义。 + /// + ushort Channel8 { get; } + + /// + /// 获取海拔。 + /// + float Elevation { get; } + + /// + /// 获取固件版本。 + /// + int? FirmwareVersion { get; } + + /// + /// 获取固件版本的文本形式。 + /// + string FirmwareVersionText { get; } + + /// + /// 获取在三维空间中的飞行距离。 + /// + double FlightDistance { get; } + + /// + /// 获取在水平面上的飞行距离。 + /// + double FlightDistance2D { get; } + + /// + /// 获取飞行时间。 + /// + TimeSpan FlightTimeSpan { get; } + + /// + /// 获取 GPS 锁定状态。 + /// + GpsFixType GpsFixType { get; } + + /// + /// 获取 GPS HDOP(horizontal dilution of position),单位为米。 + /// + float GpsHdop { get; } + + /// + /// 获取当前地速,单位为 m/s。 + /// + float GroundSpeed { get; } + + /// + /// 获取一个值,指示是否切过 GPS 模式。 + /// + bool HasSwitchedToGpsMode { get; } + + /// + /// 获取收到心跳的总数。 + /// + ulong HeartbeatCount { get; } + + /// + /// 获取飞行器的标识。 + /// + string Id { get; } + + /// + /// 获取一个值,指示是否确定飞行器与地面站正常连接。在实现中,一般根据对心跳包的接收情况判断。 + /// + bool IsAbsolutelyConnected { get; } + + /// + /// 获取一个值,指示是否正在检查飞行器与地面站的连接以确定通信正常。在实现中,一般在建立连接后设为 true,在收到飞行器发回的数据后设为 false。 + /// + bool IsCheckingConnection { get; set; } + + /// + /// 获取一个值,指示飞行器与地面站之间的连接是否正常。 + /// + bool IsConnected { get; } + + /// + /// 获取一个值,指示当前的 GPS 定位是否足够精确。 + /// + bool IsGpsAccurate { get; } + + /// + /// 获取一个值,指示飞行器是否已解锁。 + /// + bool IsUnlocked { get; } + + /// + /// 获取任务总数。 + /// + ushort? MissionCount { get; } + + /// + /// 获取飞行器的 GPS 卫星数。 + /// + byte SatCount { get; } + + /// + /// 获取当前所处状态。 + /// + CopterState State { get; } + + /// + /// 获取飞控发回的消息,如起飞失败原因。 + /// + string StatusText { get; } + + /// + /// 获取起飞点。 + /// + ILocation TakeOffPoint { get; } + + /// + /// 获取当前电池电压,单位为伏特。 + /// + float Voltage { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/IFakeCopter.cs b/PlaneGcsSdk.Contract_Shared/Copters/IFakeCopter.cs new file mode 100644 index 0000000..10a04cf --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/IFakeCopter.cs @@ -0,0 +1,27 @@ +using System; + +namespace Plane.Copters +{ + /// + /// 包含 的所有功能,并提供用于模拟和调试的额外方法。 + /// + public interface IFakeCopter : ICopter + { + void SetProperties( + string id = null, //"Junqing's Drone", + double? latitude = null, //23.14973333, + double? longitude = null, //113.40974166, + float? altitude = null, //0, + string name = null, //"林俊清的飞行器", + byte? batteryPer = null, //10, + short? heading = null, //33, + bool? isConnected = null, //true, + float? pitch = null, //-70, + float? roll = null, //28, + byte? satCount = null, //6, + float? groundSpeed = null, //3.333, + double? flightDistance = null, //100.388, + double? flightDistance2D = null, // 100.88, + TimeSpan? flightTimeSpan = null); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/IMission.cs b/PlaneGcsSdk.Contract_Shared/Copters/IMission.cs new file mode 100644 index 0000000..2145fe9 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/IMission.cs @@ -0,0 +1,53 @@ +namespace Plane.Copters +{ + /// + /// 定义自动飞行任务的属性。 + /// + public interface IMission + { + /// + /// 获取或设置相对于起飞点的高度。 + /// + float Altitude { get; set; } + + /// + /// 获取或设置飞行命令。 + /// + FlightCommand Command { get; set; } + + /// + /// 获取或设置纬度。 + /// + double Latitude { get; set; } + + /// + /// 获取或设置经度。 + /// + double Longitude { get; set; } + + /// + /// 获取或设置参数 1。通常用来指定判断为到达的最大半径,单位为米。 + /// + float Param1 { get; set; } + + /// + /// 获取或设置参数 2。通常用来指定停留时间,单位为毫秒。 + /// + float Param2 { get; set; } + + /// + /// 获取或设置参数 3。通常用来指定盘旋半径,单位为米,正数表示顺时针,负数表示逆时针。 + /// + float Param3 { get; set; } + + /// + /// 获取或设置参数 4。通常用来指定机头方向,单位为角度,北方为 0,东方为 90,范围为 [0, 360)。 + /// + float Param4 { get; set; } + + /// + /// 获取或设置序号。 + /// + ushort Sequence { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/IVisibleStatus.cs b/PlaneGcsSdk.Contract_Shared/Copters/IVisibleStatus.cs new file mode 100644 index 0000000..379184a --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/IVisibleStatus.cs @@ -0,0 +1,15 @@ +using Plane.Geography; + +namespace Plane.Copters +{ + /// + /// 定义物体可见的状态。 + /// + public interface IVisibleStatus : ILocation, IAttitude + { + /// + /// 获取名称。 + /// + string Name { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/MessageCreatedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Copters/MessageCreatedEventArgs.cs new file mode 100644 index 0000000..2be53bf --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/MessageCreatedEventArgs.cs @@ -0,0 +1,9 @@ +using System; + +namespace Plane.Copters +{ + public class MessageCreatedEventArgs : EventArgs + { + public string Message { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/MissionItemReceivedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Copters/MissionItemReceivedEventArgs.cs new file mode 100644 index 0000000..20b92b7 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/MissionItemReceivedEventArgs.cs @@ -0,0 +1,17 @@ +using System; + +namespace Plane.Copters +{ + public class MissionItemReceivedEventArgs : EventArgs + { + public MissionItemReceivedEventArgs(IMission mission) + { + Mission = mission; + } + + /// + /// 获取任务详情。 + /// + public IMission Mission { get; private set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/PLObservableObject.cs b/PlaneGcsSdk.Contract_Shared/Copters/PLObservableObject.cs new file mode 100644 index 0000000..0e28773 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/PLObservableObject.cs @@ -0,0 +1,414 @@ +#define CMNATTR + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Linq.Expressions; + +// ReSharper disable RedundantUsingDirective +using System.Linq; +using System.Threading; +// ReSharper restore RedundantUsingDirective + +#if CMNATTR +using System.Runtime.CompilerServices; +#endif + +namespace Plane.Copters +{ + /// + /// A base class for objects of which the properties must be observable (based on MvvmLight's ObservableObject). + /// + //// [ClassInfo(typeof(ViewModelBase))] + public class PLObservableObject : INotifyPropertyChanged /*, INotifyPropertyChanging*/ + { + /// + /// 与 UI 线程关联的 实例。 + /// + protected SynchronizationContext _uiSyncContext; + + /// + /// 创建 的实例。 + /// + /// + public PLObservableObject(SynchronizationContext uiSyncContext) + { + _uiSyncContext = uiSyncContext; + } + + /// + /// Occurs after a property value changes. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Provides access to the PropertyChanged event handler to derived classes. + /// + protected PropertyChangedEventHandler PropertyChangedHandler + { + get + { + return PropertyChanged; + } + } + +#if !PORTABLE && !SL4 && !WINDOWS_UWP + /// + /// Occurs before a property value changes. + /// + public event PropertyChangingEventHandler PropertyChanging; + + /// + /// Provides access to the PropertyChanging event handler to derived classes. + /// + protected PropertyChangingEventHandler PropertyChangingHandler + { + get + { + return PropertyChanging; + } + } +#endif + + /// + /// Verifies that a property name exists in this ViewModel. This method + /// can be called before the property is used, for instance before + /// calling RaisePropertyChanged. It avoids errors when a property name + /// is changed but some places are missed. + /// + /// This method is only active in DEBUG mode. + /// The name of the property that will be + /// checked. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public void VerifyPropertyName(string propertyName) + { + var myType = GetType(); + +#if NETFX_CORE + if (!string.IsNullOrEmpty(propertyName) + && myType.GetRuntimeProperty(propertyName) == null) + { + throw new ArgumentException("Property not found", propertyName); + } +#else + if (!string.IsNullOrEmpty(propertyName) + && myType.GetProperty(propertyName) == null) + { +#if !SILVERLIGHT + var descriptor = this as ICustomTypeDescriptor; + + if (descriptor != null) + { + if (descriptor.GetProperties() + .Cast() + .Any(property => property.Name == propertyName)) + { + return; + } + } +#endif + + throw new ArgumentException("Property not found", propertyName); + } +#endif + } + +#if !PORTABLE && !SL4 && !WINDOWS_UWP +#if CMNATTR + /// + /// Raises the PropertyChanging event if needed. + /// + /// If the propertyName parameter + /// does not correspond to an existing property on the current class, an + /// exception is thrown in DEBUG configuration only. + /// (optional) The name of the property that + /// changed. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + protected virtual void RaisePropertyChanging( + [CallerMemberName] string propertyName = null) +#else + /// + /// Raises the PropertyChanging event if needed. + /// + /// If the propertyName parameter + /// does not correspond to an existing property on the current class, an + /// exception is thrown in DEBUG configuration only. + /// The name of the property that + /// changed. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + protected virtual void RaisePropertyChanging( + string propertyName) +#endif + { + VerifyPropertyName(propertyName); + + var handler = PropertyChanging; + if (handler != null) + { + handler(this, new PropertyChangingEventArgs(propertyName)); + } + } +#endif + +#if CMNATTR + /// + /// Raises the PropertyChanged event if needed. + /// + /// If the propertyName parameter + /// does not correspond to an existing property on the current class, an + /// exception is thrown in DEBUG configuration only. + /// (optional) The name of the property that + /// changed. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + protected virtual void RaisePropertyChanged( + [CallerMemberName] string propertyName = null) +#else + /// + /// Raises the PropertyChanged event if needed. + /// + /// If the propertyName parameter + /// does not correspond to an existing property on the current class, an + /// exception is thrown in DEBUG configuration only. + /// The name of the property that + /// changed. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + protected virtual void RaisePropertyChanged( + string propertyName) +#endif + { + VerifyPropertyName(propertyName); + + var handler = PropertyChanged; + if (handler != null) + { +#if NETFX_CORE + var e = new PropertyChangedEventArgs(propertyName); + if (SynchronizationContext.Current == _uiSyncContext) handler(this, e); + else _uiSyncContext.Post(() => handler(this, e)); +#else + handler(this, new PropertyChangedEventArgs(propertyName)); +#endif + } + } + +#if !PORTABLE && !SL4 && !WINDOWS_UWP + /// + /// Raises the PropertyChanging event if needed. + /// + /// The type of the property that + /// changes. + /// An expression identifying the property + /// that changes. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + [SuppressMessage( + "Microsoft.Design", + "CA1006:GenericMethodsShouldProvideTypeParameter", + Justification = "This syntax is more convenient than other alternatives.")] + protected virtual void RaisePropertyChanging(Expression> propertyExpression) + { + var handler = PropertyChanging; + if (handler != null) + { + var propertyName = GetPropertyName(propertyExpression); + handler(this, new PropertyChangingEventArgs(propertyName)); + } + } +#endif + + /// + /// Raises the PropertyChanged event if needed. + /// + /// The type of the property that + /// changed. + /// An expression identifying the property + /// that changed. + [SuppressMessage( + "Microsoft.Design", + "CA1030:UseEventsWhereAppropriate", + Justification = "This cannot be an event")] + [SuppressMessage( + "Microsoft.Design", + "CA1006:GenericMethodsShouldProvideTypeParameter", + Justification = "This syntax is more convenient than other alternatives.")] + protected virtual void RaisePropertyChanged(Expression> propertyExpression) + { + var handler = PropertyChanged; + if (handler != null) + { + var propertyName = GetPropertyName(propertyExpression); +#if NETFX_CORE + var e = new PropertyChangedEventArgs(propertyName); + if (SynchronizationContext.Current == _uiSyncContext) handler(this, e); + else _uiSyncContext.Post(() => handler(this, e)); +#else + handler(this, new PropertyChangedEventArgs(propertyName)); +#endif + } + } + + /// + /// Extracts the name of a property from an expression. + /// + /// The type of the property. + /// An expression returning the property's name. + /// The name of the property returned by the expression. + /// If the expression is null. + /// If the expression does not represent a property. + [SuppressMessage( + "Microsoft.Design", + "CA1011:ConsiderPassingBaseTypesAsParameters", + Justification = "This syntax is more convenient than the alternatives."), + SuppressMessage( + "Microsoft.Design", + "CA1006:DoNotNestGenericTypesInMemberSignatures", + Justification = "This syntax is more convenient than the alternatives.")] + protected static string GetPropertyName(Expression> propertyExpression) + { + if (propertyExpression == null) + { + throw new ArgumentNullException("propertyExpression"); + } + + var body = propertyExpression.Body as MemberExpression; + + if (body == null) + { + throw new ArgumentException("Invalid argument", "propertyExpression"); + } + + var property = body.Member as PropertyInfo; + + if (property == null) + { + throw new ArgumentException("Argument is not a property", "propertyExpression"); + } + + return property.Name; + } + + /// + /// Assigns a new value to the property. Then, raises the + /// PropertyChanged event if needed. + /// + /// The type of the property that + /// changed. + /// An expression identifying the property + /// that changed. + /// The field storing the property's value. + /// The property's value after the change + /// occurred. + /// True if the PropertyChanged event has been raised, + /// false otherwise. The event is not raised if the old + /// value is equal to the new value. + [SuppressMessage( + "Microsoft.Design", + "CA1006:DoNotNestGenericTypesInMemberSignatures", + Justification = "This syntax is more convenient than the alternatives."), + SuppressMessage( + "Microsoft.Design", + "CA1045:DoNotPassTypesByReference", + MessageId = "1#", + Justification = "This syntax is more convenient than the alternatives.")] + protected bool Set( + Expression> propertyExpression, + ref T field, + T newValue) + { + if (EqualityComparer.Default.Equals(field, newValue)) + { + return false; + } + +#if !PORTABLE && !SL4 && !WINDOWS_UWP + RaisePropertyChanging(propertyExpression); +#endif + field = newValue; + RaisePropertyChanged(propertyExpression); + return true; + } + + /// + /// Assigns a new value to the property. Then, raises the + /// PropertyChanged event if needed. + /// + /// The type of the property that + /// changed. + /// The name of the property that + /// changed. + /// The field storing the property's value. + /// The property's value after the change + /// occurred. + /// True if the PropertyChanged event has been raised, + /// false otherwise. The event is not raised if the old + /// value is equal to the new value. + [SuppressMessage( + "Microsoft.Design", + "CA1045:DoNotPassTypesByReference", + MessageId = "1#", + Justification = "This syntax is more convenient than the alternatives.")] + protected bool Set( + string propertyName, + ref T field, + T newValue) + { + if (EqualityComparer.Default.Equals(field, newValue)) + { + return false; + } + +#if !PORTABLE && !SL4 && !WINDOWS_UWP + RaisePropertyChanging(propertyName); +#endif + field = newValue; + + // ReSharper disable ExplicitCallerInfoArgument + RaisePropertyChanged(propertyName); + // ReSharper restore ExplicitCallerInfoArgument + + return true; + } + +#if CMNATTR + /// + /// Assigns a new value to the property. Then, raises the + /// PropertyChanged event if needed. + /// + /// The type of the property that + /// changed. + /// The field storing the property's value. + /// The property's value after the change + /// occurred. + /// (optional) The name of the property that + /// changed. + /// True if the PropertyChanged event has been raised, + /// false otherwise. The event is not raised if the old + /// value is equal to the new value. + protected bool Set( + ref T field, + T newValue, + [CallerMemberName] string propertyName = null) + { + return Set(propertyName, ref field, newValue); + } +#endif + } +} \ No newline at end of file diff --git a/PlaneGcsSdk.Contract_Shared/Copters/PairingCompletedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Copters/PairingCompletedEventArgs.cs new file mode 100644 index 0000000..590a1c4 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/PairingCompletedEventArgs.cs @@ -0,0 +1,20 @@ +using System; + +namespace Plane.Copters +{ + public class PairingCompletedEventArgs : EventArgs + { + public PairingCompletedEventArgs(bool isSuccessful, int rxId, int txId) + { + IsSuccessful = isSuccessful; + RxID = rxId; + TxID = txId; + } + + public bool IsSuccessful { get; set; } + + public int RxID { get; set; } + + public int TxID { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/SystemStatusReceivedEventArgs.cs b/PlaneGcsSdk.Contract_Shared/Copters/SystemStatusReceivedEventArgs.cs new file mode 100644 index 0000000..6a0d1f2 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/SystemStatusReceivedEventArgs.cs @@ -0,0 +1,26 @@ +using System; + +namespace Plane.Copters +{ + public class SystemStatusReceivedEventArgs : EventArgs + { + public SystemStatusReceivedEventArgs(bool gpsBadHealth, bool gyroBadHealth, bool accelBadHealth, bool compassBadHealth, bool barometerBadHealth) + { + GpsBadHealth = gpsBadHealth; + GyroBadHealth = gyroBadHealth; + AccelBadHealth = accelBadHealth; + CompassBadHealth = compassBadHealth; + BarometerBadHealth = barometerBadHealth; + } + + public bool AccelBadHealth { get; private set; } + + public bool BarometerBadHealth { get; private set; } + + public bool CompassBadHealth { get; private set; } + + public bool GpsBadHealth { get; private set; } + + public bool GyroBadHealth { get; private set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Copters/VisibleStatus.cs b/PlaneGcsSdk.Contract_Shared/Copters/VisibleStatus.cs new file mode 100644 index 0000000..ea576ca --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Copters/VisibleStatus.cs @@ -0,0 +1,23 @@ +using Plane.Geography; + +namespace Plane.Copters +{ + public class VisibleStatus : IVisibleStatus + { + public float Altitude { get; set; } + + public short Heading => (short)Yaw.NormalizeDirection(); + + public double Latitude { get; set; } + + public double Longitude { get; set; } + + public string Name { get; set; } + + public float Pitch { get; set; } + + public float Roll { get; set; } + + public float Yaw { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Geography/GeographyUtils.cs b/PlaneGcsSdk.Contract_Shared/Geography/GeographyUtils.cs new file mode 100644 index 0000000..7088b02 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Geography/GeographyUtils.cs @@ -0,0 +1,301 @@ +using System; + +namespace Plane.Geography +{ + /// + /// 提供地理相关计算的方法。 + /// + public static class GeographyUtils + { + /// + /// 米数转换为纬度跨度时需要乘的常数。 + /// + public const double METERS_TO_LAT_SPAN = 1 / (GLOBE_CIRCUMFERENCE / 360); + + /// + /// 角度转换为弧度时需要乘的常数。 + /// + private const double DEG_TO_RAD = Math.PI / 180; + + /// + /// 地球的半径。 + /// + private const double EARTH_RADIUS = 6371000; + + /// + /// 当前星球的周长。 + /// + private const double GLOBE_CIRCUMFERENCE = GLOBE_RADIUS * 2 * Math.PI; + + /// + /// 当前星球的半径。 + /// + private const double GLOBE_RADIUS = EARTH_RADIUS; + + /// + /// 计算从 (lat1, lng1) 到 (lat2, lng2) 的方向,单位为弧度。 + /// + /// 第一个点的纬度。 + /// 第一个点的经度。 + /// 第二个点的纬度。 + /// 第二个点的经度。 + /// 点 1 到点 2 的方向。 + public static double CalcDirection2D(double lat1, double lng1, double lat2, double lng2) + { + return Math.Atan2((lng2 - lng1) / CalcMetersToLngSpan(lat1), (lat2 - lat1) / METERS_TO_LAT_SPAN).NormalizeDirectionRad(); + } + + /// + /// 计算空间中两点间的距离,单位为米。 + /// + /// 点 1。 + /// 点 2。 + /// 空间中两点间的距离,单位为米。 + public static double CalcDistance(ILocation l1, ILocation l2) + { + return CalcDistance(l1.Latitude, l1.Longitude, l1.Altitude, l2.Latitude, l2.Longitude, l2.Altitude); + } + + /// + /// 计算空间中两点之间的距离,单位为米。 + /// + /// 纬度 1。 + /// 经度 1。 + /// 高度 1。 + /// 纬度 2。 + /// 经度 2。 + /// 高度 2。 + /// 空间中两点之间的距离,单位为米。 + public static double CalcDistance(double lat1, double lng1, double alt1, double lat2, double lng2, double alt2) + { + // generally used geo measurement function + // var R = 6378.137; // Radius of earth in KM + + var dLat = (lat2 - lat1) * Math.PI / 180; + var dLon = (lng2 - lng1) * Math.PI / 180; + var a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + + Math.Cos(lat1 * Math.PI / 180) * Math.Cos(lat2 * Math.PI / 180) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2); + var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a)); + var d = GLOBE_RADIUS * c; + return Math.Sqrt(Math.Pow((alt2 - alt1), 2) + Math.Pow(d, 2)); + } + + /// + /// 计算二维平面上两个位置之间的距离,单位为米。 + /// + /// 位置 1。 + /// 位置 2。 + /// 空间中两点间的距离。 + public static double CalcDistance2D(ILocation2D l1, ILocation2D l2) + => CalcDistance2D(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude); + + /// + /// 计算二维平面上两个位置之间的距离,单位为米。 + /// + /// 纬度 1。 + /// 经度 1。 + /// 纬度 2。 + /// 经度 2。 + /// 计算二维平面上两个位置之间的距离,单位为米。 + public static double CalcDistance2D(double lat1, double lng1, double lat2, double lng2) + => CalcDistance(lat1, lng1, 0, lat2, lng2, 0); + + /// + /// 计算在水平面上从指定点往指定方向移动指定距离后所在的点。 + /// + /// 出发点的纬度。 + /// 出发点的经度。 + /// 移动方向,单位为角度。 + /// 移动距离。 + /// 从指定点往指定方向移动指定距离后所在的点。 + public static Tuple CalcLatLngSomeMetersAway2D(double lat1, double lng1, float directionDegrees, float distance) + { + var direction = directionDegrees.DegToRad(); + return Tuple.Create( + lat1 + distance * Math.Cos(direction) * METERS_TO_LAT_SPAN, + lng1 + distance * Math.Sin(direction) * CalcMetersToLngSpan(lat1) + ); + } + + /// + /// 计算在水平面上从指定点往指定方向移动指定距离后所在的点。 + /// + /// 出发点。 + /// 移动方向,单位为角度。 + /// 移动距离。 + /// 从指定点往指定方向移动指定距离后所在的点。 + public static ILocation2D CalcLatLngSomeMetersAway2D(ILocation2D loc1, float directionDegrees, float distance) + { + var direction = directionDegrees.DegToRad(); + return new PLLocation( + loc1.Latitude + distance * Math.Cos(direction) * METERS_TO_LAT_SPAN, + loc1.Longitude + distance * Math.Sin(direction) * CalcMetersToLngSpan(loc1.Latitude), + 0 + ); + } + + /// + /// 计算在指定纬度上,米数转换为经度跨度时需要乘的值。 + /// + /// 纬度。 + /// 在指定纬度上,米数转换为经度跨度时需要乘的值。 + public static double CalcMetersToLngSpan(double latitude) + { + return METERS_TO_LAT_SPAN / Math.Cos(latitude * DEG_TO_RAD); + } + + /// + /// 检测同一水平面上(忽略高度)的两条线段是否相交。 + /// + /// 线段 A 端点 1。 + /// 线段 A 端点 2。 + /// 线段 B 端点 1。 + /// 线段 B 端点 2。 + /// 若相交,返回 true;否则返回 false。 + public static bool CheckCrossing2D(ILocation2D l1, ILocation2D l2, ILocation2D l3, ILocation2D l4) + => CheckCrossing2D(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude, l3.Latitude, l3.Longitude, l4.Latitude, l4.Longitude); + + /// + /// 检测同一水平面上的两条线段是否相交。 + /// + /// 线段 A 端点 1 的纬度。 + /// 线段 A 端点 1 的经度。 + /// 线段 A 端点 2 的纬度。 + /// 线段 A 端点 2 的经度。 + /// 线段 B 端点 1 的纬度。 + /// 线段 B 端点 1 的经度。 + /// 线段 B 端点 2 的纬度。 + /// 线段 B 端点 2 的经度。 + /// 若相交,返回 true;否则返回 false。 + public static bool CheckCrossing2D(double latA1, double lngA1, double latA2, double lngA2, + double latB1, double lngB1, double latB2, double lngB2) + { + // 线段 A(x1, y1) - B(x2, y2), 所在直线 L1 方程为 F(x, y) = 0; + // 线段 C(x3, y3) - D(x4, y4), 所在直线 L2 方程为 G(x, y) = 0; + // 思路: + // (即问题的充要条件) + // (点 A 与点 B 在直线 L2 两侧) AND (点 C 与点 D 在直线 L1 两侧); + // 方法: + // 如果点 P(Xp, Yp) 不在直线 a * x + b * y + c = 0 上, 则 a* Xp + b * Yp + c <> 0; + // 如果用两个点的坐标代入同一直线方程 a * x + b * y + c 计算出的值异号, 则两点在直线两侧; + // 解法: + // (G(x1, y1) * G(x2, y2) < 0) AND (F(x3, y3) * F(x4, y4) < 0) + + // 斜截式 y = kx + b + // 即 kx - y + b = 0 + + var k1 = (latA2 - latA1) / (lngA2 - lngA1); + var b1 = latA1 - k1 * lngA1; + + var k2 = (latB2 - latB1) / (lngB2 - lngB1); + var b2 = latB1 - k2 * lngB1; + + return k2 * lngA1 - latA1 + b2 > 0 != k2 * lngA2 - latA2 + b2 > 0 && + k1 * lngB1 - latB1 + b1 > 0 != k1 * lngB2 - latB2 + b1 > 0; + } + + /// + /// 把角度转换为弧度。 + /// + /// 角度值。 + /// 弧度值。 + public static double DegToRad(this float value) + { + return value * DEG_TO_RAD; + } + + /// + /// 把角度转换为弧度。 + /// + /// 角度值。 + /// 弧度值。 + public static double DegToRad(this double value) + { + return value * DEG_TO_RAD; + } + + /// + /// 把角度转换为弧度。 + /// + /// 角度值。 + /// 弧度值。 + public static double DegToRad(this short value) + { + return value * DEG_TO_RAD; + } + + /// + /// 把指示方向的角度数限制在 [0, 360)。 + /// + /// 指示方向的角度数。 + /// 等价的在标准范围内的角度。 + public static float NormalizeDirection(this float value) + { + while (value < 0) + { + value += 360; + } + while (value >= 360) + { + value -= 360; + } + return value; + } + + /// + /// 把指示方向的角度值限制在 [0, 360)。 + /// + /// 指示方向的角度值。 + /// 等价的在标准范围内的角度。 + public static double NormalizeDirection(this double value) + { + while (value < 0) + { + value += 360; + } + while (value >= 360) + { + value -= 360; + } + return value; + } + + /// + /// 把指示方向的弧度值限制在 [0, 2PI)。 + /// + /// 指示方向的弧度值。 + /// 等价的在标准范围内的弧度。 + public static double NormalizeDirectionRad(this double value) + { + while (value < 0) + { + value += Math.PI * 2; + } + while (value >= Math.PI * 2) + { + value -= Math.PI * 2; + } + return value; + } + + /// + /// 把弧度转换为角度。 + /// + /// 弧度值。 + /// 角度值。 + public static double RadToDeg(this float value) + { + return value / DEG_TO_RAD; + } + + /// + /// 把弧度转换为角度。 + /// + /// 弧度值。 + /// 角度值。 + public static double RadToDeg(this double value) + { + return value / DEG_TO_RAD; + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Geography/ILocation.cs b/PlaneGcsSdk.Contract_Shared/Geography/ILocation.cs new file mode 100644 index 0000000..92b66bf --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Geography/ILocation.cs @@ -0,0 +1,13 @@ +namespace Plane.Geography +{ + /// + /// 定义可用于确定一个固定的星球上的空间中的一个点的属性。 + /// + public interface ILocation : ILocation2D + { + /// + /// 获取相对高度。 + /// + float Altitude { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Geography/ILocation2D.cs b/PlaneGcsSdk.Contract_Shared/Geography/ILocation2D.cs new file mode 100644 index 0000000..636f6af --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Geography/ILocation2D.cs @@ -0,0 +1,15 @@ +namespace Plane.Geography +{ + public interface ILocation2D + { + /// + /// 获取纬度。 + /// + double Latitude { get; } + + /// + /// 获取经度。 + /// + double Longitude { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Geography/LocationExtensions.cs b/PlaneGcsSdk.Contract_Shared/Geography/LocationExtensions.cs new file mode 100644 index 0000000..eb01e28 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Geography/LocationExtensions.cs @@ -0,0 +1,80 @@ +namespace Plane.Geography +{ + public static class LocationExtensions + { + /// + /// 计算在二维平面上从 的方向,单位为弧度。 + /// + /// 出发点。 + /// 目标点。 + /// 点 1 到点 2 的方向。 + public static double CalcDirection2D(this ILocation2D l1, ILocation2D l2) + => GeographyUtils.CalcDirection2D(l1.Latitude, l1.Longitude, l2.Latitude, l2.Longitude); + + /// + /// 计算在二维平面上从 到 (, ) 的方向,单位为弧度。 + /// + /// 出发点。 + /// 目标点的纬度。 + /// 目标点的经度。 + /// 点 1 到点 2 的方向。 + public static double CalcDirection2D(this ILocation2D l1, double lat2, double lng2) + => GeographyUtils.CalcDirection2D(l1.Latitude, l1.Longitude, lat2, lng2); + + /// + /// 计算空间中两点间的距离,单位为米。 + /// + /// 点 1。 + /// 点 2。 + /// 空间中两点间的距离。 + public static double CalcDistance(this ILocation l1, ILocation l2) + => GeographyUtils.CalcDistance(l1, l2); + + /// + /// 计算空间中两点间的距离,单位为米。 + /// + /// 点 1。 + /// 点 2 的纬度。 + /// 点 2 的经度。 + /// 点 2 的高度。 + /// 空间中两点间的距离。 + public static double CalcDistance(this ILocation l1, double lat2, double lng2, double alt2) + => GeographyUtils.CalcDistance(l1.Latitude, l1.Longitude, l1.Altitude, lat2, lng2, alt2); + + /// + /// 计算二维平面上两个位置之间的距离,单位为米。 + /// + /// 位置 1。 + /// 位置 2。 + /// 平面上两点间的距离。 + public static double CalcDistance2D(this ILocation2D l1, ILocation2D l2) + => GeographyUtils.CalcDistance2D(l1, l2); + + + /// + /// 计算二维平面上两个位置之间的距离,单位为米。 + /// + /// 点 2 的纬度。 + /// 点 2 的经度。 + /// 平面上两点间的距离。 + public static double CalcDistance2D(this ILocation2D l1, double lat2, double lng2) + => GeographyUtils.CalcDistance2D(l1.Latitude, l1.Longitude, lat2, lng2); + /// + /// 计算在水平面上从指定点往指定方向移动指定距离后所在的点。 + /// + /// 出发点。 + /// 移动方向,单位为角度。 + /// 移动距离。 + /// 从指定点往指定方向移动指定距离后所在的点。 + public static ILocation2D CalcLatLngSomeMetersAway2D(this ILocation2D loc1, float directionDegrees, float distance) + => GeographyUtils.CalcLatLngSomeMetersAway2D(loc1, directionDegrees, distance); + + /// + /// 判断一个 实例是否被认为是空值。 + /// + /// 实例。 + /// 若给定的位置被认为是空值,返回 true;否则返回 false。 + public static bool IsNullOrEmpty(this ILocation loc) + => loc == null || (loc.Latitude == 0 && loc.Longitude == 0 && loc.Altitude == 0); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Geography/PLLocation.cs b/PlaneGcsSdk.Contract_Shared/Geography/PLLocation.cs new file mode 100644 index 0000000..7c74a2c --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Geography/PLLocation.cs @@ -0,0 +1,56 @@ +using System.Diagnostics; + +namespace Plane.Geography +{ + [DebuggerDisplay("lat: {Latitude}, lng: {Longitude}, alt: {Altitude}")] + public class PLLocation : ILocation + { + public PLLocation() + { + } + + public PLLocation(ILocation locToCopy) + : this(locToCopy.Latitude, locToCopy.Longitude, locToCopy.Altitude) + { + } + + public PLLocation(double lat, double lng, float alt) + { + Latitude = lat; + Longitude = lng; + Altitude = alt; + } + + public float Altitude { get; set; } + + public double Latitude { get; set; } + + public double Longitude { get; set; } + + public PLLocation AddAltitude(float altToAdd) + { + Altitude += altToAdd; + return this; + } + + public PLLocation AddLatitude(double latToAdd) + { + Latitude += latToAdd; + return this; + } + + public PLLocation AddLatLngAlt(double latToAdd, double lngToAdd, float altToAdd) + { + Latitude += latToAdd; + Longitude += lngToAdd; + Altitude += altToAdd; + return this; + } + + public PLLocation AddLongitude(double lngToAdd) + { + Longitude += lngToAdd; + return this; + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/MathExtensions.cs b/PlaneGcsSdk.Contract_Shared/MathExtensions.cs new file mode 100644 index 0000000..e1b537a --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/MathExtensions.cs @@ -0,0 +1,31 @@ +using System; + +namespace Plane +{ + public static class MathExtensions + { + public static bool IsInRange(this T value, T min, T max) where T : struct, IComparable + { + if (min.CompareTo(max) > 0) + { + throw new ArgumentException($"The {nameof(min)} argument ({min}) must be less than or equal to the {nameof(max)} argument ({max})."); + } + return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0; + } + + public static T Limit(this T value, T? min = null, T? max = null) where T : struct, IComparable + { + if (min.HasValue && max.HasValue && min.Value.CompareTo(max.Value) > 0) + { + throw new ArgumentException($"The {nameof(min)} argument ({min}) must be less than or equal to the {nameof(max)} argument ({max})."); + } + if (!min.HasValue && !max.HasValue) + { + throw new ArgumentException($"The {nameof(min)} argument and the {nameof(max)} argument are both missing."); + } + if (min.HasValue && value.CompareTo(min.Value) < 0) return min.Value; + if (max.HasValue && value.CompareTo(max.Value) > 0) return max.Value; + return value; + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterAltitudeChangedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterAltitudeChangedMessage.cs new file mode 100644 index 0000000..80e7faf --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterAltitudeChangedMessage.cs @@ -0,0 +1,11 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterAltitudeChangedMessage : CopterMessageBase + { + public CopterAltitudeChangedMessage(ICopter copter) : base(copter) + { + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterAttitudeChangedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterAttitudeChangedMessage.cs new file mode 100644 index 0000000..c857f2b --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterAttitudeChangedMessage.cs @@ -0,0 +1,14 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + /// + /// 在飞行器姿态变化时发出的消息。 + /// + public class CopterAttitudeChangedMessage : CopterMessageBase + { + public CopterAttitudeChangedMessage(ICopter copter) : base(copter) + { + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterConnectedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterConnectedMessage.cs new file mode 100644 index 0000000..0d9e7bb --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterConnectedMessage.cs @@ -0,0 +1,11 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterConnectedMessage : CopterMessageBase + { + public CopterConnectedMessage(ICopter copter) : base(copter) + { + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterHeartbeatReceivedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterHeartbeatReceivedMessage.cs new file mode 100644 index 0000000..41687a0 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterHeartbeatReceivedMessage.cs @@ -0,0 +1,11 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterHeartbeatReceivedMessage : CopterMessageBase + { + public CopterHeartbeatReceivedMessage(ICopter copter) : base(copter) + { + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterLocationChangedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterLocationChangedMessage.cs new file mode 100644 index 0000000..0f9db02 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterLocationChangedMessage.cs @@ -0,0 +1,11 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterLocationChangedMessage : CopterMessageBase + { + public CopterLocationChangedMessage(ICopter copter) : base(copter) + { + } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterMessageBase.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterMessageBase.cs new file mode 100644 index 0000000..c652d7c --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterMessageBase.cs @@ -0,0 +1,14 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterMessageBase + { + public CopterMessageBase(ICopter copter) + { + Copter = copter; + } + + public ICopter Copter { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterPairingCompletedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterPairingCompletedMessage.cs new file mode 100644 index 0000000..0bf317f --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterPairingCompletedMessage.cs @@ -0,0 +1,14 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + public class CopterPairingCompletedMessage : CopterMessageBase + { + public CopterPairingCompletedMessage(ICopter copter, bool isSuccessful) : base(copter) + { + this.IsSuccessful = isSuccessful; + } + + public bool IsSuccessful { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/CopterPropertyChangedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/CopterPropertyChangedMessage.cs new file mode 100644 index 0000000..0f75981 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/CopterPropertyChangedMessage.cs @@ -0,0 +1,17 @@ +using Plane.Copters; + +namespace Plane.Messaging +{ + /// + /// 通过注册 来监视未关联到特定 Message 的属性。 + /// + public class CopterPropertyChangedMessage : CopterMessageBase + { + public CopterPropertyChangedMessage(ICopter copter, string propertyName) : base(copter) + { + PropertyName = propertyName; + } + + public string PropertyName { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/FlyToRequestAcceptedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/FlyToRequestAcceptedMessage.cs new file mode 100644 index 0000000..474e06c --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/FlyToRequestAcceptedMessage.cs @@ -0,0 +1,12 @@ +namespace Plane.Messaging +{ + public class FlyToRequestAcceptedMessage + { + public FlyToRequestAcceptedMessage(RequestFlyToMessage request) + { + this.Request = request; + } + + public RequestFlyToMessage Request { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/IPLMessenger.cs b/PlaneGcsSdk.Contract_Shared/Messaging/IPLMessenger.cs new file mode 100644 index 0000000..f381672 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/IPLMessenger.cs @@ -0,0 +1,36 @@ +using System; + +namespace Plane.Messaging +{ + public interface IPLMessenger + { + /// + /// Registers a recipient for a type of message TMessage. The action + /// parameter will be executed when a corresponding message is sent. + /// Registering a recipient does not create a hard reference to it, + /// so if this recipient is deleted, no memory leak is caused. + /// + /// The type of message that the recipient registers + /// for. + /// The recipient that will receive the messages. + /// The action that will be executed when a message + /// of type TMessage is sent. + void Register(object recipient, Action action); + + /// + /// Sends a message to registered recipients. The message will + /// reach all recipients that registered for this message type + /// using one of the Register methods. + /// + /// The type of message that will be sent. + /// The message to send to registered recipients. + void Send(TMessage message); + + /// + /// Unregisters a messager recipient completely. After this method + /// is executed, the recipient will not receive any messages anymore. + /// + /// The recipient that must be unregistered. + void Unregister(object recipient); + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/LandingStateAcceptsAvatarChangedMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/LandingStateAcceptsAvatarChangedMessage.cs new file mode 100644 index 0000000..b5f18bd --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/LandingStateAcceptsAvatarChangedMessage.cs @@ -0,0 +1,12 @@ +namespace Plane.Messaging +{ + public class LandingStateAcceptsAvatarChangedMessage + { + public LandingStateAcceptsAvatarChangedMessage(bool landingStateAcceptsAvatar) + { + LandingStateAcceptsAvatar = landingStateAcceptsAvatar; + } + + public bool LandingStateAcceptsAvatar { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/RequestFlyToMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/RequestFlyToMessage.cs new file mode 100644 index 0000000..1f35929 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/RequestFlyToMessage.cs @@ -0,0 +1,15 @@ +namespace Plane.Messaging +{ + public class RequestFlyToMessage + { + public RequestFlyToMessage(double lat, double lng) + { + Latitude = lat; + Longitude = lng; + } + + public double Latitude { get; set; } + + public double Longitude { get; set; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/Messaging/RequestUpdateAttitudeMessage.cs b/PlaneGcsSdk.Contract_Shared/Messaging/RequestUpdateAttitudeMessage.cs new file mode 100644 index 0000000..0ff6d48 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/Messaging/RequestUpdateAttitudeMessage.cs @@ -0,0 +1,27 @@ +namespace Plane.Messaging +{ + public class RequestUpdateAttitudeMessage + { + public RequestUpdateAttitudeMessage(float rollDegrees, float pitchDegrees, float? yawDegrees) + { + this.RollDegrees = rollDegrees; + this.PitchDegrees = pitchDegrees; + this.YawDegrees = yawDegrees; + } + + /// + /// 获取绕 X 轴的旋转(以度为单位)。 + /// + public float PitchDegrees { get; } + + /// + /// 获取绕 Y 轴的旋转(以度为单位)。 + /// + public float RollDegrees { get; } + + /// + /// 获取绕 Z 轴的旋转(以度为单位,正北 0,正东 90,范围为 [0, 360))。 + /// + public float? YawDegrees { get; } + } +} diff --git a/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.projitems b/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.projitems new file mode 100644 index 0000000..90ba7c6 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.projitems @@ -0,0 +1,65 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 695733d7-99ff-4707-8c89-474e949cadcb + + + Plane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.shproj b/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.shproj new file mode 100644 index 0000000..81f04de --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/PlaneGcsSdk.Contract_Shared.shproj @@ -0,0 +1,13 @@ + + + + 695733d7-99ff-4707-8c89-474e949cadcb + 14.0 + + + + + + + + diff --git a/PlaneGcsSdk.Contract_Shared/SynchronizationContextExtensions.cs b/PlaneGcsSdk.Contract_Shared/SynchronizationContextExtensions.cs new file mode 100644 index 0000000..02330f9 --- /dev/null +++ b/PlaneGcsSdk.Contract_Shared/SynchronizationContextExtensions.cs @@ -0,0 +1,32 @@ +using System; +using System.Threading; + +namespace Plane +{ + public static class SynchronizationContextExtensions + { + public static void Post(this SynchronizationContext syncContext, Action action) + { + if (SynchronizationContext.Current == syncContext) + { + action(); + } + else + { + syncContext.Post(state => action(), null); + } + } + + public static void Send(this SynchronizationContext syncContext, Action action) + { + if (SynchronizationContext.Current == syncContext) + { + action(); + } + else + { + syncContext.Send(state => action(), null); + } + } + } +} diff --git a/PlaneGcsSdk_NET46/PlaneGcsSdk_NET46.csproj b/PlaneGcsSdk_NET46/PlaneGcsSdk_NET46.csproj new file mode 100644 index 0000000..ff752d5 --- /dev/null +++ b/PlaneGcsSdk_NET46/PlaneGcsSdk_NET46.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {331C28E1-5BA3-42CE-8A4A-BC468E692FED} + Library + Properties + Plane + PlaneGcsSdk_NET46 + v4.6 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\PlaneGcsSdk_NET46.xml + + + + + + + + + + + + + + + + + + {18ecd88e-5d74-43e8-8bc2-d28f6db13a47} + PlaneGcsSdk.Contract + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk_NET46/Properties/AssemblyInfo.cs b/PlaneGcsSdk_NET46/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3b7c736 --- /dev/null +++ b/PlaneGcsSdk_NET46/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PlaneGcsSdk_NET46")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk_NET46")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("331c28e1-5ba3-42ce-8a4a-bc468e692fed")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk_Private_NET45/Copters/CopterImplSharedPart.Private.cs b/PlaneGcsSdk_Private_NET45/Copters/CopterImplSharedPart.Private.cs new file mode 100644 index 0000000..ae4d55b --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/Copters/CopterImplSharedPart.Private.cs @@ -0,0 +1,13 @@ +using System; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public abstract partial class CopterImplSharedPart : PLObservableObject + { + public Task CircleAsync() + { + return SetModeAsync(FlightMode.CIRCLE); + } + } +} diff --git a/PlaneGcsSdk_Private_NET45/Copters/FakeCopter.Private.cs b/PlaneGcsSdk_Private_NET45/Copters/FakeCopter.Private.cs new file mode 100644 index 0000000..d4c889a --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/Copters/FakeCopter.Private.cs @@ -0,0 +1,18 @@ +using System; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public partial class FakeCopter + { + /// + /// // 林俊清, 20160122, 不明确。目测是发送重启命令,在刷固件之前用到。 + /// + /// + /// 表示此命令异步发送操作的 实例。 + public Task RebootAsync(bool bootloaderMode = false) + { + throw new NotImplementedException(); + } + } +} diff --git a/PlaneGcsSdk_Private_NET45/Copters/PLCopter.Private.cs b/PlaneGcsSdk_Private_NET45/Copters/PLCopter.Private.cs new file mode 100644 index 0000000..a806238 --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/Copters/PLCopter.Private.cs @@ -0,0 +1,22 @@ +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public partial class PLCopter + { + /// + /// 暴露内部的 实例。 + /// + public PlaneCopter InternalCopter { get { return _internalCopter; } } + + /// + /// // 林俊清, 20160122, 不明确。目测是发送重启命令,在刷固件之前用到。 + /// + /// + /// 表示此命令异步发送操作的 实例。 + public Task RebootAsync(bool bootloaderMode = false) + { + return _internalCopter.RebootAsync(bootloaderMode); + } + } +} diff --git a/PlaneGcsSdk_Private_NET45/Copters/PlaneCopter.Private.cs b/PlaneGcsSdk_Private_NET45/Copters/PlaneCopter.Private.cs new file mode 100644 index 0000000..33c6231 --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/Copters/PlaneCopter.Private.cs @@ -0,0 +1,37 @@ +using Plane.Protocols; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + partial class PlaneCopter + { + /// + /// // 林俊清, 20160122, 不明确。目测是发送重启命令,在刷固件之前用到。 + /// + /// + /// 表示此命令异步发送操作的 实例。 + public async Task RebootAsync(bool bootloaderMode = false) + { + int param1 = 1; + if (bootloaderMode) + { + param1 = 3; + } + + if (MAV.sysid != 0 && MAV.compid != 0) + { + await DoCommandAsync(MAVLink.MAV_CMD.PREFLIGHT_REBOOT_SHUTDOWN, param1, 0, 0, 0, 0, 0, 0).ConfigureAwait(false); + await DoCommandAsync(MAVLink.MAV_CMD.PREFLIGHT_REBOOT_SHUTDOWN, 1, 0, 0, 0, 0, 0, 0).ConfigureAwait(false); + } + else + { + + for (byte a = byte.MinValue; a < byte.MaxValue; a++) + { + MAV.sysid = a; + await DoCommandAsync(MAVLink.MAV_CMD.PREFLIGHT_REBOOT_SHUTDOWN, param1, 0, 0, 0, 0, 0, 0).ConfigureAwait(false); + } + } + } + } +} diff --git a/PlaneGcsSdk_Private_NET45/PlaneGcsSdk_Private_NET45.csproj b/PlaneGcsSdk_Private_NET45/PlaneGcsSdk_Private_NET45.csproj new file mode 100644 index 0000000..654aa36 --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/PlaneGcsSdk_Private_NET45.csproj @@ -0,0 +1,66 @@ + + + + + Debug + AnyCPU + {2CE7006F-C1DF-4A15-9E68-A63A3255FE88} + Library + Properties + Plane + PlaneGcsSdk_Private_NET45 + v4.5 + 512 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;NET45;PRIVATE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;NET45;PRIVATE + prompt + 4 + bin\Release\PlaneGcsSdk_Private_NET45.xml + + + + + + + + + + + + + + + + + + + + + + {47141894-ece3-48ca-8dcf-ca751bda231e} + PlaneGcsSdk.Contract_Private + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk_Private_NET45/Properties/AssemblyInfo.cs b/PlaneGcsSdk_Private_NET45/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..07aff31 --- /dev/null +++ b/PlaneGcsSdk_Private_NET45/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PlaneGcsSdk_Private_NET45")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk_Private_NET45")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("2ce7006f-c1df-4a15-9e68-a63a3255fe88")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk_Private_NET46/PlaneGcsSdk_Private_NET46.csproj b/PlaneGcsSdk_Private_NET46/PlaneGcsSdk_Private_NET46.csproj new file mode 100644 index 0000000..4625ca5 --- /dev/null +++ b/PlaneGcsSdk_Private_NET46/PlaneGcsSdk_Private_NET46.csproj @@ -0,0 +1,74 @@ + + + + + Debug + AnyCPU + {0111EB6E-72E3-499C-A3BA-022F5BBC4CAF} + Library + Properties + Plane + PlaneGcsSdk_Private_NET46 + v4.6 + 512 + + + true + full + false + bin\Debug\ + TRACE;DEBUG;PRIVATE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE;PRIVATE + prompt + 4 + bin\Release\PlaneGcsSdk_Private_NET46.xml + + + + + + + + + + + + + + + Copters\CopterImplSharedPart.Private.cs + + + Copters\PlaneCopter.Private.cs + + + Copters\EHCopter.Private.cs + + + Copters\FakeCopter.Private.cs + + + + + + {47141894-ece3-48ca-8dcf-ca751bda231e} + PlaneGcsSdk.Contract_Private + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk_Private_NET46/Properties/AssemblyInfo.cs b/PlaneGcsSdk_Private_NET46/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8142018 --- /dev/null +++ b/PlaneGcsSdk_Private_NET46/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("PlaneGcsSdk_Private_NET46")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk_Private_NET46")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +//将 ComVisible 设置为 false 将使此程序集中的类型 +//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("0111eb6e-72e3-499c-a3ba-022f5bbc4caf")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: : +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/PlaneGcsSdk_Shared/Communication/CompositeConnection.cs b/PlaneGcsSdk_Shared/Communication/CompositeConnection.cs new file mode 100644 index 0000000..09363bb --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/CompositeConnection.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 组合多个潜在的连接。 + /// + public class CompositeConnection : IConnection + { + private List _candidateConnections; + + public CompositeConnection(params IConnection[] candidateConnections) + { + _candidateConnections = new List(candidateConnections); + } + + public event EventHandler ExceptionThrown; + + public bool IsOpen + { + get + { + return _candidateConnections.Any(c => c.IsOpen); + } + } + + public void Close() + { + foreach (var connection in _candidateConnections) + { + connection.Close(); + } + } + + public async Task OpenAsync() + { + bool anyOk = false; + var message = new StringBuilder(); + for (int i = _candidateConnections.Count - 1; i >= 0; i--) + { + try + { + await _candidateConnections[i].OpenAsync(); + if (!anyOk) anyOk = true; + } + catch (Exception ex) + { + Debug.WriteLine(ex); + message.AppendLine(ex.Message); + //_candidateConnections.RemoveAt(i); + } + } + if (!anyOk) + { + throw new Exception(message.ToString()); + } + } + + public async Task ReadAsync(byte[] buffer, int offset, int count) + { + int result; + for (int i = 0; i < _candidateConnections.Count; i++) + { + if (_candidateConnections[i].IsOpen) + { + try + { + result = await _candidateConnections[i].ReadAsync(buffer, offset, count); + if (result != 0) + { + //if (i != 0) + //{ + // var tmp = _candidateConnections[i]; + // _candidateConnections[i] = _candidateConnections[0]; + // _candidateConnections[0] = tmp; + //} + //for (int j = _candidateConnections.Count - 1; j > 0; j--) + //{ + // _candidateConnections[j].Close(); + // _candidateConnections.RemoveAt(j); + //} + return result; + } + } + catch (Exception ex) + { + Debug.WriteLine(ex); + ExceptionThrown?.Invoke(this, new ExceptionThrownEventArgs(ex)); + } + } + } + return 0; + } + + public async Task WriteAsync(byte[] buffer, int offset, int count) + { + for (int i = 0; i < _candidateConnections.Count; i++) + { + if (_candidateConnections[i].IsOpen) + { + try + { + await _candidateConnections[i].WriteAsync(buffer, offset, count); + } + catch (Exception ex) + { + Debug.WriteLine(ex); + ExceptionThrown?.Invoke(this, new ExceptionThrownEventArgs(ex)); + } + } + } + } + } +} diff --git a/PlaneGcsSdk_Shared/Communication/EmptyConnection.cs b/PlaneGcsSdk_Shared/Communication/EmptyConnection.cs new file mode 100644 index 0000000..632969b --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/EmptyConnection.cs @@ -0,0 +1,39 @@ +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 的空白实现。 + /// + public class EmptyConnection : ExceptionThrownEventSource, IConnection + { + private EmptyConnection() + { + } + + public static EmptyConnection Instance { get; } = new EmptyConnection(); + + public bool IsOpen { get; private set; } + + public void Close() + { + IsOpen = false; + } + + public Task OpenAsync() + { + IsOpen = true; + return TaskUtils.CompletedTask; + } + + public Task ReadAsync(byte[] buffer, int offset, int count) + { + return Task.FromResult(count); + } + + public Task WriteAsync(byte[] buffer, int offset, int count) + { + return TaskUtils.CompletedTask; + } + } +} diff --git a/PlaneGcsSdk_Shared/Communication/ExceptionThrownEventSource.cs b/PlaneGcsSdk_Shared/Communication/ExceptionThrownEventSource.cs new file mode 100644 index 0000000..e801cab --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/ExceptionThrownEventSource.cs @@ -0,0 +1,14 @@ +using System; + +namespace Plane.Communication +{ + public abstract class ExceptionThrownEventSource + { + public event EventHandler ExceptionThrown; + + protected void RaiseExceptionThrown(Exception ex) + { + ExceptionThrown?.Invoke(this, new ExceptionThrownEventArgs(ex)); + } + } +} diff --git a/PlaneGcsSdk_Shared/Communication/SerialPortConnection.cs b/PlaneGcsSdk_Shared/Communication/SerialPortConnection.cs new file mode 100644 index 0000000..43494a9 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/SerialPortConnection.cs @@ -0,0 +1,139 @@ +#if !NETFX_CORE + +using System; +using System.IO.Ports; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 提供通过串行端口通信的能力。 + /// + public class SerialPortConnection : ExceptionThrownEventSource, IConnection + { + private bool _internalIsOpen; + + private SerialPort _port; + + public SerialPortConnection(string portName, int baudRate = 115200) + { + _port = new SerialPort(portName, baudRate) + { + PortName = portName, + DataBits = 8, + StopBits = StopBits.One, + Parity = Parity.None, + BaudRate = baudRate, + DtrEnable = false, + RtsEnable = false, + ReadBufferSize = 40 * 1024, + ReadTimeout = 2000 + }; + } + + public int Available { get { return _port.BytesToRead; } } + + public bool IsOpen { get { return _internalIsOpen && _port.IsOpen; } } + + public string PortName { get { return _port.PortName; } } + + public void Close() + { + _internalIsOpen = false; + try + { + _port.Close(); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + } + } + + public void Open() + { + _port.Open(); + _internalIsOpen = true; + } + + public Task OpenAsync() + { + Open(); + return TaskUtils.CompletedTask; + } + + public int Read(byte[] buffer, int offset, int count) + { + while (Available < count) + { + if (!IsOpen) + { + return 0; + } + Thread.Sleep(5); + } + try + { + return _port.Read(buffer, offset, count); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + return 0; + } + } + + public virtual async Task ReadAsync(byte[] buffer, int offset, int count) + { + while (Available < count) + { + if (!IsOpen) + { + return 0; + } + await TaskUtils.Delay(5).ConfigureAwait(false); + } + try + { + return _port.Read(buffer, offset, count); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + return 0; + } + } + + public void Write(byte[] buffer, int offset, int count) + { + try + { + _port.Write(buffer, offset, count); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + } + + public Task WriteAsync(byte[] buffer, int offset, int count) + { + try + { + _port.Write(buffer, offset, count); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + return TaskUtils.CompletedTask; + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/TcpConnection.cs b/PlaneGcsSdk_Shared/Communication/TcpConnection.cs new file mode 100644 index 0000000..1879629 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/TcpConnection.cs @@ -0,0 +1,92 @@ +#if !NETFX_CORE + +using System; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 提供作为 TCP 客户端通信的能力。 + /// + public class TcpConnection : TcpConnectionBase + { + private string _remoteHostname; + + private int _remotePort; + + public TcpConnection(string remoteHostname, int remotePort = 5250) + { + _remoteHostname = remoteHostname; + _remotePort = remotePort; + _client = new TcpClient + { + ReceiveBufferSize = 40 * 1024, + ReceiveTimeout = 1200 + }; + } + + public void Open() + { + if (!IsOpen) + { + try + { + _client.Connect(_remoteHostname, _remotePort); + } + catch (SocketException) + { + CreateClientAndConnect(); + } + catch (ObjectDisposedException) + { + CreateClientAndConnect(); + } + _isBroken = false; + } + _stream = _client.GetStream(); + } + + public override async Task OpenAsync() + { + if (!IsOpen) + { + try + { + await _client.ConnectAsync(_remoteHostname, _remotePort).ConfigureAwait(false); + } + catch (SocketException) + { + await CreateClientAndConnectAsync(); + } + catch (ObjectDisposedException) + { + await CreateClientAndConnectAsync(); + } + _isBroken = false; + } + _stream = _client.GetStream(); + } + + private void CreateClientAndConnect() + { + _client = new TcpClient(_remoteHostname, _remotePort) + { + ReceiveBufferSize = 40 * 1024, + ReceiveTimeout = 1200 + }; + } + + private async Task CreateClientAndConnectAsync() + { + _client = new TcpClient + { + ReceiveBufferSize = 40 * 1024, + ReceiveTimeout = 1200 + }; + await _client.ConnectAsync(_remoteHostname, _remotePort).ConfigureAwait(false); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/TcpConnectionBase.cs b/PlaneGcsSdk_Shared/Communication/TcpConnectionBase.cs new file mode 100644 index 0000000..b64e23b --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/TcpConnectionBase.cs @@ -0,0 +1,129 @@ +#if !NETFX_CORE + +using System; +using System.IO; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 提供 TCP 通信的部分实现。 + /// + public abstract class TcpConnectionBase : ExceptionThrownEventSource, IConnection + { + protected TcpClient _client; + + protected bool _isBroken; + + protected Stream _stream; + + public int Available + { + get + { + try + { + return _client.Available; + } + catch (ObjectDisposedException ex) + { + RaiseExceptionThrown(ex); + return 0; + } + } + } + + public bool IsOpen + { + get + { + try + { + return !_isBroken && _client.Connected; + } + catch (ObjectDisposedException) + { + return false; + } + } + } + + public void Close() + { + _stream.Close(); + _client.Close(); + } + + public abstract Task OpenAsync(); + + public int Read(byte[] buffer, int offset, int count) + { + try + { + return _stream.Read(buffer, offset, count); + } + catch (ArgumentOutOfRangeException ex) + { + RaiseExceptionThrown(ex); + return 0; + } + catch (Exception ex) // 常见的是 IOException。 + { + _isBroken = true; + RaiseExceptionThrown(ex); + return 0; + } + } + + public async Task ReadAsync(byte[] buffer, int offset, int count) + { + try + { + while (Available < count) + { + await Task.Delay(5).ConfigureAwait(false); + } + return await _stream.ReadAsync(buffer, offset, count); + } + catch (Exception ex) + { + _isBroken = true; + RaiseExceptionThrown(ex); + return 0; + } + } + + public void Write(byte[] buffer, int offset, int count) + { + try + { + _stream.Write(buffer, offset, count); + } + catch (ArgumentOutOfRangeException ex) + { + RaiseExceptionThrown(ex); + } + catch (Exception ex) + { + _isBroken = true; + RaiseExceptionThrown(ex); + } + } + + public async Task WriteAsync(byte[] buffer, int offset, int count) + { + try + { + await _stream.WriteAsync(buffer, offset, count); + } + catch (Exception ex) + { + _isBroken = true; + RaiseExceptionThrown(ex); + } + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/TcpServerConnection.cs b/PlaneGcsSdk_Shared/Communication/TcpServerConnection.cs new file mode 100644 index 0000000..a14e285 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/TcpServerConnection.cs @@ -0,0 +1,27 @@ +#if !NETFX_CORE + +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 提供作为 TCP 服务器通信的能力。 + /// + public class TcpServerConnection : TcpConnectionBase + { + public TcpServerConnection(TcpClient acceptedTcpClient) + { + _client = acceptedTcpClient; + _stream = _client.GetStream(); + } + + public override Task OpenAsync() + { + // Do nothing. + return TaskUtils.CompletedTask; + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/TcpServerConnectionManager.cs b/PlaneGcsSdk_Shared/Communication/TcpServerConnectionManager.cs new file mode 100644 index 0000000..e392cc8 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/TcpServerConnectionManager.cs @@ -0,0 +1,97 @@ +#if !NETFX_CORE + +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 监听远程主机的 TCP 连接请求并创建 实例与它通信。 + /// + public class TcpServerConnectionManager : ExceptionThrownEventSource, IDisposable + { + private const int TCP_LOCAL_PORT = 5250; + + private static TcpServerConnectionManager _Instance = new TcpServerConnectionManager(); + + private bool _disposed; + + private bool _isListening; + + // TODO: 林俊清, 20150909, 从配置文件中获取要监听的 IP 地址和端口号。 + private TcpListener _listener; + + private bool _shouldListen; + + private TcpServerConnectionManager() + { + } + + public event EventHandler ConnectionEstablished; + + public static TcpServerConnectionManager Instance { get { return _Instance; } } + + public void Dispose() + { + if (_disposed) + { + return; + } + StopListening(); + _disposed = true; + } + + public bool StartListening() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(TcpServerConnectionManager)); + } + if (_shouldListen && _isListening) return true; + var address = Dns.GetHostAddresses(Dns.GetHostName()).FirstOrDefault(addr => addr.AddressFamily == AddressFamily.InterNetwork && addr.GetAddressBytes()[0] == 192); + if (address == null) return false; + _listener = new TcpListener(address, TCP_LOCAL_PORT); + _listener.Start(); + _shouldListen = true; + Task.Factory.StartNew(async () => + { + while (_isListening) + { + await Task.Delay(5); + } + _isListening = true; + while (_shouldListen) + { + try + { + var tcpClient = await _listener.AcceptTcpClientAsync(); + if (_shouldListen) + { + ConnectionEstablished?.Invoke( + this, + new ConnectionEstablishedEventArgs(new TcpServerConnection(tcpClient), (tcpClient.Client.RemoteEndPoint as IPEndPoint).Address.ToString()) + ); + } + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + } + } + _isListening = false; + }); + return true; + } + + public void StopListening() + { + _shouldListen = false; + _listener?.Stop(); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/UdpConnectionBase.cs b/PlaneGcsSdk_Shared/Communication/UdpConnectionBase.cs new file mode 100644 index 0000000..4d3442e --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpConnectionBase.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Concurrent; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// 提供采用 UDP 协议通信的能力。 + /// + public abstract class UdpConnectionBase : ExceptionThrownEventSource, IConnection + { + private byte[] _currentByteArray; + + private int _currentIndex; + + private ConcurrentQueue _inputQueue = new ConcurrentQueue(); + + public bool IsOpen { get; protected set; } + + public abstract void Close(); + + public abstract Task OpenAsync(); + + public async Task ReadAsync(byte[] buffer, int offset, int size) + { + if (!IsOpen) + { + return 0; + } + try + { + var indexLessThan = offset + size; + for (int i = offset; i < indexLessThan; i++, _currentIndex++) + { + while (_currentByteArray == null || _currentIndex >= _currentByteArray.Length) + { + while (_inputQueue.Count <= 0) + { + if (!IsOpen) + { + return 0; + } + await Task.Delay(5).ConfigureAwait(false); + } + while (!_inputQueue.TryDequeue(out _currentByteArray)) + { + if (!IsOpen) + { + return 0; + } + await Task.Delay(5).ConfigureAwait(false); + } + _currentIndex = 0; + } + buffer[i] = _currentByteArray[_currentIndex]; + } + return size; + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + return 0; + } + } + + public async Task WriteAsync(byte[] buffer, int offset, int count) + { + if (IsOpen) + { + try + { + if (offset == 0) + { + await SendAsync(buffer, count); + } + else + { + var data = new byte[count]; + for (int i = 0, j = offset; i < count; i++, j++) + { + data[i] = buffer[j]; + } + await SendAsync(data, count); + } + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + } + } + } + +#if DEBUG && LOG_PACKETS + private System.Text.StringBuilder _log = new System.Text.StringBuilder(); +#endif + + internal void EnqueueDatagram(byte[] datagram) + { + if (datagram != null && IsOpen) + { +#if DEBUG && LOG_PACKETS + _log.AppendLine("------------"); + for (int i = 0; i < datagram.Length; i++) + { + _log.Append(datagram[i]).Append(" "); + } + _log.AppendLine(); +#endif + _inputQueue.Enqueue(datagram); + } + } + + protected abstract Task SendAsync(byte[] datagram, int bytes); + } +} diff --git a/PlaneGcsSdk_Shared/Communication/UdpConnection_NET.cs b/PlaneGcsSdk_Shared/Communication/UdpConnection_NET.cs new file mode 100644 index 0000000..67a6330 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpConnection_NET.cs @@ -0,0 +1,85 @@ +#if !NETFX_CORE + +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + public class UdpConnection : UdpConnectionBase + { + private UdpClient _client; + private bool _isReceiving; + private object _receiveLock = new object(); + private string _remoteHostName; + private int _remotePort; + private bool _shouldReceive; + + public UdpConnection(string remoteHostName, int remotePort = 5250) + { + _remoteHostName = remoteHostName; + _remotePort = remotePort; + } + + public override void Close() + { + if (IsOpen) + { + IsOpen = false; + _shouldReceive = false; + _client?.Close(); + } + } + + public override Task OpenAsync() + { + if (!IsOpen) + { + IsOpen = true; + _client = new UdpClient(_remoteHostName, _remotePort); + StartReceiving(); + } + return TaskUtils.CompletedTask; + } + + protected override Task SendAsync(byte[] datagram, int bytes) + { + return _client.SendAsync(datagram, bytes); + } + + private void StartReceiving() + { + if (_shouldReceive && _isReceiving) + { + return; + } + _shouldReceive = true; + Task.Factory.StartNew(() => + { + lock (_receiveLock) + { + _isReceiving = true; + IPEndPoint ep = null; + while (_shouldReceive) + { + try + { + var data = _client.Receive(ref ep); + EnqueueDatagram(data); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + Thread.Sleep(500); + } + } + _isReceiving = false; + } + }, TaskCreationOptions.LongRunning); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.NET.cs b/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.NET.cs new file mode 100644 index 0000000..bd21cda --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.NET.cs @@ -0,0 +1,71 @@ +#if !NETFX_CORE + +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + public partial class UdpServerConnectionManager + { + private UdpClient _client = new UdpClient(5250); + + private object _receiveLock = new object(); + + public void StartReceiving() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(UdpServerConnectionManager)); + } + if (_shouldReceive && _isReceiving) + { + return; + } + _shouldReceive = true; + Task.Factory.StartNew(() => + { + lock (_receiveLock) + { + _isReceiving = true; + IPEndPoint ep = null; + while (_shouldReceive) + { + try + { + var data = _client.Receive(ref ep); + var remoteAddress = ep.Address.ToString(); + if (!_connections.ContainsKey(remoteAddress)) + { + var connection = new UdpServerConnection(ep, _client.SendAsync); + _connections.Add(remoteAddress, connection); + RaiseConnectionEstablished(connection, remoteAddress); + } + _connections[remoteAddress].EnqueueDatagram(data); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + Thread.Sleep(500); + } + } + _isReceiving = false; + } + }, TaskCreationOptions.LongRunning); + } + + public void StopReceiving() + { + _shouldReceive = false; + } + + private void DisposeCore() + { + _client.Close(); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.cs b/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.cs new file mode 100644 index 0000000..a6f4cef --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpServerConnectionManager.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; + +namespace Plane.Communication +{ + /// + /// 接收远程主机的 UDP 数据报并创建 实例与其通信。 + /// + public partial class UdpServerConnectionManager : ExceptionThrownEventSource, IDisposable + { + private static UdpServerConnectionManager _Instance = new UdpServerConnectionManager(); + + private Dictionary _connections = new Dictionary(); + + private bool _disposed; + + private bool _isReceiving; + + private bool _shouldReceive; + + public event EventHandler ConnectionEstablished; + + public static UdpServerConnectionManager Instance { get { return _Instance; } } + + public void ClearConnections() + { + _connections.Clear(); + } + + public void Dispose() + { + if (_disposed) + { + return; + } + StopReceiving(); + DisposeCore(); + _disposed = true; + } + + private void RaiseConnectionEstablished(IConnection connection, string remoteAddress) + { + ConnectionEstablished?.Invoke(this, new ConnectionEstablishedEventArgs(connection, remoteAddress)); + } + } +} diff --git a/PlaneGcsSdk_Shared/Communication/UdpServerConnection_NET.cs b/PlaneGcsSdk_Shared/Communication/UdpServerConnection_NET.cs new file mode 100644 index 0000000..b142799 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpServerConnection_NET.cs @@ -0,0 +1,50 @@ +#if !NETFX_CORE + +using System; +using System.Net; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + internal class UdpServerConnection : UdpConnectionBase + { + private IPEndPoint _remoteEP; + + private Func> _sendFunc; + + /// + /// 初始化 的实例,并指定远程终结点和发送数据所使用的方法。 + /// + public UdpServerConnection(IPEndPoint remoteEP, Func> sendFunc) + { + _remoteEP = remoteEP; + _sendFunc = sendFunc; + } + + public override void Close() + { + IsOpen = false; + } + + public override Task OpenAsync() + { + IsOpen = true; + return TaskUtils.CompletedTask; + } + + protected override async Task SendAsync(byte[] datagram, int bytes) + { + try + { + await _sendFunc(datagram, bytes, _remoteEP).ConfigureAwait(false); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.NET.cs b/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.NET.cs new file mode 100644 index 0000000..6dc8d0c --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.NET.cs @@ -0,0 +1,76 @@ +#if !NETFX_CORE + +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + public partial class UdpThroughDtuServiceConnection + { + private UdpClient _client; + + /// + /// 初始化 的实例,并指定远程终结点和发送数据所使用的方法。 + /// + public UdpThroughDtuServiceConnection(string ip, int port) + { + DtuServiceIP = ip; + DtuServicePort = port; + _client = new UdpClient(); + } + + /// + /// 登陆到Dtu服务端。 + /// 登陆方式极其简单,只需发送一个数据包(内含希望连接到的飞机ID) + /// + /// + public virtual async Task OpenAsync() + { + if (!string.IsNullOrEmpty(CopterIDToBind)) + { + _client.Connect(IPAddress.Parse(DtuServiceIP), DtuServicePort); + var bytes = ConstructHandShakeDatagramToDTUService(); + await _client.SendAsync(bytes, bytes.Length); + + //等待服务端的应答,获取是否连接成功飞机的结果 + var result = await _client.ReceiveAsync(); + var ret = AnalyzeHandShakeDatagramFromDTUService(result.Buffer); + if (ret == DTUHandShakeResult.Successful) + { + IsOpen = true; + } + else if (ret == DTUHandShakeResult.Occupied) + { + throw new Exception("飞机已被占用!"); + } + else if (ret == DTUHandShakeResult.NotExisted) + { + throw new Exception("飞机不存在!"); + } + } + } + + public virtual void Close() + { + IsOpen = false; + _client.Close(); + } + + private async Task SendAsync(byte[] datagram, int bytes) + { + try + { + await _client.SendAsync(datagram, bytes).ConfigureAwait(false); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + } + } +} + +#endif \ No newline at end of file diff --git a/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.cs b/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.cs new file mode 100644 index 0000000..d7097a4 --- /dev/null +++ b/PlaneGcsSdk_Shared/Communication/UdpThroughDtuServiceConnection.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Concurrent; +using System.Text; +using System.Threading.Tasks; + +namespace Plane.Communication +{ + /// + /// (通过DTU服务端的Udp透传管道)与飞机进行通信的连接器。 + /// + public partial class UdpThroughDtuServiceConnection : ExceptionThrownEventSource, IConnection + { + #region Fields + private byte[] _currentByteArray; + private int _currentIndex; +#if LOG_PACKETS + private System.Text.StringBuilder _log = new System.Text.StringBuilder(); +#endif + private ConcurrentQueue _inputQueue = new ConcurrentQueue(); + /// + /// 表示向DTU服务端飞控透传通道握手的协议头 + /// + protected string FLAG_DTU_HANDSHAKE_HEAD = "*#$"; + /// + /// 表示向DTU服务端的Udp飞控透传管道建立申请的结果状态 + /// + protected enum DTUHandShakeResult + { + Unknown = 0, + Successful = 1, + NotExisted, + Occupied, + } + #endregion + + #region Properties + /// + /// 希望连接到哪台飞机 + /// + public string CopterIDToBind { get; set; } + + public bool IsOpen { get; private set; } + + /// + /// 获取即将或正在与服务端连接的服务端IP + /// + public string DtuServiceIP { get; set; } + + /// + /// 获取即将或正在与服务端连接的服务端端口 + /// + public int DtuServicePort { get; set; } + #endregion + + public virtual async Task ReadAsync(byte[] buffer, int offset, int size) + { + if (!IsOpen) + { + return 0; + } + try + { + var indexLessThan = offset + size; + for (int i = offset; i < indexLessThan; i++, _currentIndex++) + { + while (_currentByteArray == null || _currentIndex >= _currentByteArray.Length) + { + while (_inputQueue.Count <= 0) + { + if (!IsOpen) + { + return 0; + } + await Task.Delay(5).ConfigureAwait(false); + } + while (!_inputQueue.TryDequeue(out _currentByteArray)) + { + if (!IsOpen) + { + return 0; + } + await Task.Delay(5).ConfigureAwait(false); + } + _currentIndex = 0; + } + buffer[i] = _currentByteArray[_currentIndex]; + } + return size; + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + return 0; + } + } + + public virtual async Task WriteAsync(byte[] buffer, int offset, int count) + { + if (IsOpen) + { + try + { + if (offset == 0) + { + await SendAsync(buffer, count); + } + else + { + var data = new byte[count]; + for (int i = 0, j = offset; i < count; i++, j++) + { + data[i] = buffer[j]; + } + await SendAsync(data, count); + } + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + } + } + + internal void EnqueueDatagram(byte[] datagram) + { + if (datagram != null && IsOpen) + { +#if LOG_PACKETS + _log.AppendLine("------------"); + for (int i = 0; i < datagram.Length; i++) + { + _log.Append(datagram[i]).Append(" "); + } + _log.AppendLine(); +#endif + _inputQueue.Enqueue(datagram); + } + } + + /// + /// 构建用于发向DTU服务端的握手包 + /// + /// + protected virtual byte[] ConstructHandShakeDatagramToDTUService() + { + var str = string.Format("{0}{1}", FLAG_DTU_HANDSHAKE_HEAD, CopterIDToBind??string.Empty); + return Encoding.ASCII.GetBytes(str); + } + + /// + /// 分析由DTU服务端返回的我握手包 + /// + /// + /// + protected virtual DTUHandShakeResult AnalyzeHandShakeDatagramFromDTUService(byte[] buffer) + { + var strResult = Encoding.ASCII.GetString(buffer);//返回的格式为“*#$xxxx|0” + if (strResult.StartsWith(FLAG_DTU_HANDSHAKE_HEAD)) + { + var strList = strResult.Substring(FLAG_DTU_HANDSHAKE_HEAD.Length).Split('|'); + var copterID = strList[0]; + int iValue; + int.TryParse(strList[1], out iValue); + return (DTUHandShakeResult)iValue; + } + return DTUHandShakeResult.Unknown; + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterControllers/AvatarController.cs b/PlaneGcsSdk_Shared/CopterControllers/AvatarController.cs new file mode 100644 index 0000000..716c8b9 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterControllers/AvatarController.cs @@ -0,0 +1,90 @@ +using Plane.CopterManagement; +using Plane.Copters; +using Plane.Messaging; +using System.Collections.Generic; + +namespace Plane.CopterControllers +{ + /// + /// 通过倾斜、旋转设备对飞行器进行控制的控制器。 + /// + public class AvatarController : CopterControllerBase + { + /// + /// 允许最大的偏角范围的绝对值(例如飞行器左倾斜多少度为有效值,超出此值则取此值) + /// + private const int MAX_ANGLE_OFFSET = 45; + + private static readonly HashSet _acceptingMobileControlStates = new HashSet { CopterState.Locked, CopterState.HoverMode, CopterState.FloatMode, CopterState.CommandMode, CopterState.Returning, CopterState.Following }; + + public AvatarController(IPLMessenger messenger, ICopterManager copterManager) : base(messenger, copterManager) + { + messenger.Register(this, m => + { + if (m.LandingStateAcceptsAvatar) _acceptingMobileControlStates.Add(CopterState.Landing); + else _acceptingMobileControlStates.Remove(CopterState.Landing); + }); + } + + public override bool IsEnabled + { + get + { + return base.IsEnabled; + } + set + { + if (base.IsEnabled != value) + { + base.IsEnabled = value; + if (value) + { + _messenger.Register(this, OnRequestUpdateAttitude); + } + else + { + _messenger.Unregister(this); + } + } + } + } + + public SpeedType Speed { get; set; } + + public override CopterControllerTypes Type + { + get + { + return CopterControllerTypes.AvatarController; + } + } + + private void OnRequestUpdateAttitude(RequestUpdateAttitudeMessage m) + { + if (_copterManager.Copter != null && _acceptingMobileControlStates.Contains(_copterManager.Copter.State)) + { + // TODO: 林俊清, 20151109, 整理并使用 Plane.Copters.Constants 类中的常量。 + + ushort maxChannelOffset = (ushort)(Speed == SpeedType.SpeedFast ? 400 : 200); + + if (m.RollDegrees.IsInRange(-5, 5)) + { + _copterManager.Copter.DesiredChannel1 = RollMedianValue; + } + else + { + _copterManager.Copter.DesiredChannel1 = (ushort)(m.RollDegrees.Limit(-MAX_ANGLE_OFFSET, MAX_ANGLE_OFFSET) * maxChannelOffset / MAX_ANGLE_OFFSET + RollMedianValue); + } + if (m.PitchDegrees.IsInRange(-5, 5)) + { + _copterManager.Copter.DesiredChannel2 = PitchMedianValue; + } + else + { + _copterManager.Copter.DesiredChannel2 = (ushort)(m.PitchDegrees.Limit(-MAX_ANGLE_OFFSET, MAX_ANGLE_OFFSET) * maxChannelOffset / MAX_ANGLE_OFFSET + PitchMedianValue); + } + _copterManager.Copter.DesiredYaw = m.YawDegrees; + } + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterControllers/CopterControllerBase.cs b/PlaneGcsSdk_Shared/CopterControllers/CopterControllerBase.cs new file mode 100644 index 0000000..d272ce9 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterControllers/CopterControllerBase.cs @@ -0,0 +1,38 @@ +using Plane.CopterManagement; +using Plane.Messaging; + +namespace Plane.CopterControllers +{ + /// + /// 利用特定方式控制飞行器的控制器的基类。子类应该通过响应事件/消息来控制飞行器,而不是提供 public 方法。 + /// + public abstract class CopterControllerBase + { + /// + /// 表示左右转弯的中间值(即通道2的值,通道2的取值范围为1100~1900),小于中间值为向前,大于中间值为向后。 + /// + protected const ushort PitchMedianValue = 1500; + + /// + /// 表示左右转弯的中间值(即通道1的值,通道1的取值范围为1100~1900),小于中间值为转左,大于中间值为转右。 + /// + protected const ushort RollMedianValue = 1500; + + protected ICopterManager _copterManager; + + protected IPLMessenger _messenger; + + protected CopterControllerBase(IPLMessenger messenger, ICopterManager copterManager) + { + _messenger = messenger; + _copterManager = copterManager; + } + + /// + /// 获取或设置一个值,指示是否激活此控制器。 + /// + public virtual bool IsEnabled { get; set; } + + public abstract CopterControllerTypes Type { get; } + } +} diff --git a/PlaneGcsSdk_Shared/CopterControllers/CopterControllerManager.cs b/PlaneGcsSdk_Shared/CopterControllers/CopterControllerManager.cs new file mode 100644 index 0000000..5b07f73 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterControllers/CopterControllerManager.cs @@ -0,0 +1,60 @@ +using Plane.CopterManagement; +using Plane.Copters; +using Plane.Messaging; +using System.Collections.Generic; +using System.Linq; + +namespace Plane.CopterControllers +{ + /// + /// 集中管理所有控制器。 + /// + public class CopterControllerManager : ICopterControllerManager + { + private CopterControllerBase[] _allControllers; + + private AvatarController _avatarController; + + private ICopterManager _copterManager; + + private FlyToController _flyToController; + + private KeyboardController _keyboardController; + + //private MicroController _microController; + + private HashSet _statesControllingRollPitch = new HashSet { CopterState.HoverMode, CopterState.FloatMode }; + + public CopterControllerManager(IPLMessenger messenger, ICopterManager copterManager, FlyToController flyToController, AvatarController avatarController, KeyboardController keyboardController) //, MicroController microController, ) + { + _copterManager = copterManager; + _flyToController = flyToController; + _avatarController = avatarController; + //_microController = microController; + _keyboardController = keyboardController; + _allControllers = new CopterControllerBase[] { _flyToController, _avatarController, _keyboardController }; + + messenger.Register(this, m => + { + if (m.LandingStateAcceptsAvatar) _statesControllingRollPitch.Add(CopterState.Landing); + else _statesControllingRollPitch.Remove(CopterState.Landing); + }); + } + + public bool IsControllingRollPitchUsingAvatar => _avatarController.IsEnabled && _statesControllingRollPitch.Contains(_copterManager.Copter.State) && !_copterManager.Copter.IsEmergencyHoverActive; + + public void EnableCopterControllers(CopterControllerTypes controllerTypes) + { + foreach (var controller in _allControllers) + { + controller.IsEnabled = controllerTypes.HasFlag(controller.Type); + } + } + + public bool IsControllerEnabled(CopterControllerTypes controllerType) + { + var controller = _allControllers.FirstOrDefault(c => c.Type == controllerType); + return controller?.IsEnabled ?? false; + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterControllers/FlyToController.cs b/PlaneGcsSdk_Shared/CopterControllers/FlyToController.cs new file mode 100644 index 0000000..45ca423 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterControllers/FlyToController.cs @@ -0,0 +1,50 @@ +using Plane.CopterManagement; +using Plane.Messaging; + +namespace Plane.CopterControllers +{ + public class FlyToController : CopterControllerBase + { + public FlyToController(IPLMessenger messenger, ICopterManager copterManager) : base(messenger, copterManager) + { + } + + public override bool IsEnabled + { + get + { + return base.IsEnabled; + } + + set + { + base.IsEnabled = value; + if (value) + { + _messenger.Register(this, OnRequestFlyTo); + } + else + { + _messenger.Unregister(this); + } + } + } + + public override CopterControllerTypes Type + { + get + { + return CopterControllerTypes.FlyToController; + } + } + + private async void OnRequestFlyTo(RequestFlyToMessage m) + { + var accepted = await _copterManager.CheckStatusAndFlyToAsync(m.Latitude, m.Longitude); + if (accepted) + { + _messenger.Send(new FlyToRequestAcceptedMessage(m)); + } + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterControllers/KeyboardController.cs b/PlaneGcsSdk_Shared/CopterControllers/KeyboardController.cs new file mode 100644 index 0000000..d309d19 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterControllers/KeyboardController.cs @@ -0,0 +1,132 @@ +using Plane.CopterManagement; +using Plane.Geography; +using Plane.Messaging; + +#if NETFX_CORE + +using Key = Windows.System.VirtualKey; + +#else + +using System.Windows.Input; + +#endif + +namespace Plane.CopterControllers +{ + /// + /// 利用键盘控制飞行器。 + /// + public class KeyboardController : CopterControllerBase + { + private const ushort ADDED_VALUE = 400; + private const ushort MED_VALUE = 1500; + + public KeyboardController(IPLMessenger messenger, ICopterManager copterManager) : base(messenger, copterManager) + { + } + + public override bool IsEnabled + { + get + { + return base.IsEnabled; + } + set + { + if (base.IsEnabled != value) + { + base.IsEnabled = value; + if (value) + { + // TODO: 林俊清, 20160303, 修复 KeyboardController。 + //_messenger.Register(this, OnKeyDown); + //_messenger.Register(this, OnKeyUp); + } + else + { + _messenger.Unregister(this); + } + } + } + } + + public override CopterControllerTypes Type + { + get + { + return CopterControllerTypes.KeyboardController; + } + } + + //public async void OnKeyDown(KeyDownMessage m) + //{ + // if (IsEnabled) + // { + // switch (m.Key) + // { + // case Key.A: + // await _copterManager.SetMobileControlAsync(ch1: MED_VALUE - ADDED_VALUE); + // break; + + // case Key.D: + // await _copterManager.SetMobileControlAsync(ch1: MED_VALUE + ADDED_VALUE); + // break; + + // case Key.W: + // await _copterManager.SetMobileControlAsync(ch2: MED_VALUE - ADDED_VALUE); + // break; + + // case Key.S: + // await _copterManager.SetMobileControlAsync(ch2: MED_VALUE + ADDED_VALUE); + // break; + + // case Key.K: + // await _copterManager.SetMobileControlAsync(ch3: MED_VALUE - ADDED_VALUE); + // break; + + // case Key.I: + // await _copterManager.SetMobileControlAsync(ch3: MED_VALUE + ADDED_VALUE); + // break; + + // case Key.J: + // await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw - 10).NormalizeDirection()); + // break; + + // case Key.L: + // await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw + 10).NormalizeDirection()); + // break; + // } + // } + //} + + //public async void OnKeyUp(KeyUpMessage m) + //{ + // if (IsEnabled) + // { + // switch (m.Key) + // { + // case Key.A: + // case Key.D: + // await _copterManager.SetMobileControlAsync(ch1: MED_VALUE); + // break; + + // case Key.W: + // case Key.S: + // await _copterManager.SetMobileControlAsync(ch2: MED_VALUE); + // break; + + // case Key.K: + // case Key.I: + // await _copterManager.SetMobileControlAsync(ch3: MED_VALUE); + // break; + + // case Key.J: + // case Key.L: + // await _copterManager.SetMobileControlAsync(yaw: (_copterManager.Copter.Yaw).NormalizeDirection()); + // break; + // } + // } + //} + } +} diff --git a/PlaneGcsSdk_Shared/CopterManagement/CopterFactory.cs b/PlaneGcsSdk_Shared/CopterManagement/CopterFactory.cs new file mode 100644 index 0000000..8dc5d85 --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterManagement/CopterFactory.cs @@ -0,0 +1,34 @@ +using Plane.Copters; +using System; +using System.Threading; + +namespace Plane.CopterManagement +{ + public partial class CopterFactory : ICopterFactory + { + private SynchronizationContext _uiSyncContext; + + public CopterFactory(SynchronizationContext uiSyncContext) + { + _uiSyncContext = uiSyncContext; + } + +#if !NETFX_CORE + + public ICopter CreateBluetoothCopter(string hostName, string name = "GHOSTDRONE") + { + throw new NotImplementedException(); + } + +#endif + + public IFakeCopter CreateFakeCopter(string id = "FakeCopter", string name = "Linjq's Drone") + { + return new FakeCopter + { + Id = id, + Name = name + }; + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterManagement/SingleCopterManager.cs b/PlaneGcsSdk_Shared/CopterManagement/SingleCopterManager.cs new file mode 100644 index 0000000..bb22edd --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterManagement/SingleCopterManager.cs @@ -0,0 +1,265 @@ +using Plane.Communication; +using Plane.Copters; +using Plane.Messaging; +using System; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.CopterManagement +{ + public class SingleCopterManager : PLObservableObject, ICopterManager + { + private ICopter _Copter = EmptyCopter.Instance; + private bool _IsSearching; + private IPLMessenger _messenger; + private UdpServerConnectionManager _udpServerConnectionManager = UdpServerConnectionManager.Instance; + + public SingleCopterManager(IPLMessenger messenger, SynchronizationContext uiSyncContext) : base(uiSyncContext) + { + _messenger = messenger; + } + + public ObservableCollection AllCopters { get { throw new NotSupportedException(); } } + + /// + /// 获取或设置单个 实例。用 代替了 null,使用时不必判断是否为 null。 + /// + public ICopter Copter + { + get { return _Copter; } + set { Set(nameof(Copter), ref _Copter, value ?? EmptyCopter.Instance); } + } + + public bool IsSearching + { + get { return _IsSearching; } + private set { Set(nameof(IsSearching), ref _IsSearching, value); } + } + + public ObservableCollection SelectedCopters { get { throw new NotSupportedException(); } } + + public async Task AddOrUpdateCopterAsync(string id, string name, IConnection connection) + { + var copter = CreateCopter(id, name, connection); + await ConnectAsync(copter); + } + + public async Task CheckStatusAndFlyToAsync(double lat, double lng) + { + var copter = this.Copter; + if (copter == null) return false; + + switch (copter.State) + { + case CopterState.TakingOff: + case CopterState.HoverMode: + case CopterState.CommandMode: + case CopterState.Returning: + case CopterState.Landing: + await copter.FlyToAsync(lat, lng).ConfigureAwait(false); + return true; + + case CopterState.Locked: + case CopterState.Initialized: + case CopterState.FloatMode: + default: + return false; + } + } + + public async Task ConnectAsync(ICopter copter) + { + await DisconnectAsync(this.Copter); + RegisterCopterEventHandlers(copter); + await copter.ConnectAsync(); + copter.StartMobileControl(); + this.Copter = copter; + _uiSyncContext.Post(() => + _messenger.Send(new CopterConnectedMessage(copter))); + } + + public async Task DisconnectAsync(ICopter copter) + { + copter.StopMobileControl(); + await copter.DisconnectAsync().ConfigureAwait(false); + UnregisterCopterEventHandlers(copter); + } + + public async Task DisconnectAsync() + { + await DisconnectAsync(this.Copter); + _udpServerConnectionManager.StopReceiving(); + _udpServerConnectionManager.ClearConnections(); + } + + public Task FloatAsync() + { + return Copter.FloatAsync(); + } + + public Task FlyToAsync(double lat, double lng) + { + return Copter.FlyToAsync(lat, lng); + } + + public Task FlyToAsync(double lat, double lng, float alt) + { + return Copter.FlyToAsync(lat, lng, alt); + } + + public Task HoverAsync() + { + return Copter.HoverAsync(); + } + public Task GuidAsync() + { + return Copter.GuidAsync(); + } + + public Task LandAsync() + { + return Copter.LandAsync(); + } + + public Task LockAsync() + { + return Copter.LockAsync(); + } + + public Task ReturnToLaunchAsync() + { + return Copter.ReturnToLaunchAsync(); + } + + public Task SetChannelsAsync(ushort? ch1 = default(ushort?), ushort? ch2 = default(ushort?), ushort? ch3 = default(ushort?), ushort? ch4 = default(ushort?), ushort? ch5 = default(ushort?), ushort? ch6 = default(ushort?), ushort? ch7 = default(ushort?), ushort? ch8 = default(ushort?)) + { + return Copter.SetChannelsAsync(ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8); + } + + public Task SetMobileControlAsync(ushort? ch1 = default(ushort?), ushort? ch2 = default(ushort?), ushort? ch3 = default(ushort?), ushort? ch4 = default(ushort?), ushort? ch5 = default(ushort?), ushort? ch6 = default(ushort?), ushort? ch7 = default(ushort?), ushort? ch8 = default(ushort?), float? yaw = default(float?)) + { + return Copter.SetMobileControlAsync(ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, yaw); + } + + public Task StartEmergencyHoverAsync() + { + return Copter.StartEmergencyHoverAsync(); + } + + public void StartMobileControl(int? millisecondsInterval = default(int?)) + { + Copter.StartMobileControl(millisecondsInterval); + } + + public virtual void StartSearching() + { + if (!IsSearching) + { + _udpServerConnectionManager.ConnectionEstablished += OnConnectionEstablished; + _udpServerConnectionManager.StartReceiving(); + IsSearching = true; + } + } + + public void StopEmergencyHover() + { + Copter.StopEmergencyHover(); + } + + public void StopMobileControl() + { + Copter.StopMobileControl(); + } + + public void StopSearching() + { + if (IsSearching) + { + _udpServerConnectionManager.ConnectionEstablished -= OnConnectionEstablished; + IsSearching = false; + } + } + + public Task TakeOffAsync() + { + return Copter.TakeOffAsync(); + } + + public Task TakeOffAsync(float alt) + { + return Copter.TakeOffAsync(alt); + } + + public Task UnlockAsync() + { + return Copter.UnlockAsync(); + } + + protected virtual ICopter CreateCopter(string id, string name, IConnection connection) + { + return new PLCopter(connection, _uiSyncContext) + { + Id = id, + Name = name + }; + } + + protected virtual void RegisterCopterEventHandlers(ICopter copter) + { + copter.HeartbeatReceived += Copter_HeartbeatReceived; + copter.LocationChanged += Copter_LocationChanged; + copter.PropertyChanged += Copter_PropertyChanged; + copter.AltitudeChanged += Copter_AltitudeChanged; + copter.AttitudeChanged += Copter_AttitudeChanged; + copter.PairingCompleted += Copter_PairingCompleted; + } + + protected virtual void UnregisterCopterEventHandlers(ICopter copter) + { + copter.HeartbeatReceived -= Copter_HeartbeatReceived; + copter.LocationChanged -= Copter_LocationChanged; + copter.PropertyChanged -= Copter_PropertyChanged; + copter.AltitudeChanged -= Copter_AltitudeChanged; + copter.AttitudeChanged -= Copter_AttitudeChanged; + copter.PairingCompleted -= Copter_PairingCompleted; + } + + private void Copter_AltitudeChanged(object sender, EventArgs e) + { + _messenger.Send(new CopterAltitudeChangedMessage(sender as ICopter)); + } + + private void Copter_AttitudeChanged(object sender, EventArgs e) + { + _messenger.Send(new CopterAttitudeChangedMessage(sender as ICopter)); + } + + private void Copter_HeartbeatReceived(object sender, HeartbeatReceivedEventArgs e) + { + _messenger.Send(new CopterHeartbeatReceivedMessage(sender as ICopter)); + } + + private void Copter_LocationChanged(object sender, EventArgs e) + { + _messenger.Send(new CopterLocationChangedMessage(sender as ICopter)); + } + + private void Copter_PairingCompleted(object sender, PairingCompletedEventArgs e) + { + _messenger.Send(new CopterPairingCompletedMessage(sender as ICopter, e.IsSuccessful)); + } + + private void Copter_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + _messenger.Send(new CopterPropertyChangedMessage(sender as ICopter, e.PropertyName)); + } + + private async void OnConnectionEstablished(object sender, ConnectionEstablishedEventArgs e) + { + var ip = e.RemoteAddress; + await AddOrUpdateCopterAsync(ip, ip.Substring(ip.LastIndexOfAny(new[] { '.', ':' }) + 1), e.Connection); + } + } +} diff --git a/PlaneGcsSdk_Shared/CopterManagement/SingleDtuCopterManager.cs b/PlaneGcsSdk_Shared/CopterManagement/SingleDtuCopterManager.cs new file mode 100644 index 0000000..631a2bb --- /dev/null +++ b/PlaneGcsSdk_Shared/CopterManagement/SingleDtuCopterManager.cs @@ -0,0 +1,33 @@ +using Plane.Communication; +using Plane.Messaging; +using System.Net; +using System.Threading; + +namespace Plane.CopterManagement +{ + public class SingleDtuCopterManager : SingleCopterManager + { + public SingleDtuCopterManager(IPLMessenger messenger, SynchronizationContext uiSyncContext) : base(messenger, uiSyncContext) + { + } + + /// + /// 对于作为连接客户端,不存在任何搜索的逻辑,一切由服务端决定。 + /// + public override void StartSearching() + { +// var ip = "139.217.128.128"; +// var port = 5250; +// var copterID = "40002"; +//#if !NETFX_CORE +// var ipEnd = new IPEndPoint(IPAddress.Parse(ip), port); + +// var udpConnection = new UdpThroughDtuServiceConnection(ipEnd) { CopterIDToBind = copterID }; +//#else +// var udpConnection = new UdpThroughDtuServiceConnection(ip, port) { CopterIDToBind = copterID }; +//#endif + +// await AddOrUpdateCopterAsync(ip, ip.Substring(ip.LastIndexOfAny(new[] { '.', ':' }) + 1), udpConnection); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.MotorSpeed.cs b/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.MotorSpeed.cs new file mode 100644 index 0000000..d60a379 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.MotorSpeed.cs @@ -0,0 +1,141 @@ +using System; + +namespace Plane.Copters +{ + partial class CopterImplSharedPart + { + internal uint TimebootMs + { + get { return _TimebootMs; } + set + { + _TimebootMs = value; + AnalizeTimeBootMs(_TimebootMs); + } + } + + private float _moto1SpeedPercent; + + /// + /// 1号马达转速百分比(0~1.0) + /// + public float Motor1SpeedPercent + { + get { return _moto1SpeedPercent; } + set { Set(nameof(Motor1SpeedPercent), ref _moto1SpeedPercent, value); } + } + + private float _moto2SpeedPercent; + + /// + /// 2号马达转速百分比(0~1.0) + /// + public float Motor2SpeedPercent + { + get { return _moto2SpeedPercent; } + set { Set(nameof(Motor2SpeedPercent), ref _moto2SpeedPercent, value); } + } + + private float _moto3SpeedPercent; + + /// + /// 3号马达转速百分比(0~1.0) + /// + public float Motor3SpeedPercent + { + get { return _moto3SpeedPercent; } + set { Set(nameof(Motor3SpeedPercent), ref _moto3SpeedPercent, value); } + } + + private float _moto4SpeedPercent; + + /// + /// 4号马达转速百分比(0~1.0) + /// + public float Motor4SpeedPercent + { + get { return _moto4SpeedPercent; } + set { Set(nameof(Motor4SpeedPercent), ref _moto4SpeedPercent, value); } + } + + private float _moto5SpeedPercent; + + /// + /// 5号马达转速百分比(0~1.0) + /// + public float Motor5SpeedPercent + { + get { return _moto5SpeedPercent; } + set { Set(nameof(Motor5SpeedPercent), ref _moto5SpeedPercent, value); } + } + + private float _moto6SpeedPercent; + + /// + /// 6号马达转速百分比(0~1.0) + /// + public float Motor6SpeedPercent + { + get { return _moto6SpeedPercent; } + set { Set(nameof(Motor6SpeedPercent), ref _moto6SpeedPercent, value); } + } + + private float _moto7SpeedPercent; + + /// + /// 7号马达转速百分比(0~1.0) + /// + public float Motor7SpeedPercent + { + get { return _moto7SpeedPercent; } + set { Set(nameof(Motor7SpeedPercent), ref _moto7SpeedPercent, value); } + } + + private float _moto8SpeedPercent; + + /// + /// 8号马达转速百分比(0~1.0) + /// + public float Motor8SpeedPercent + { + get { return _moto8SpeedPercent; } + set { Set(nameof(Motor8SpeedPercent), ref _moto8SpeedPercent, value); } + } + + + /// + /// 将16进制映射为0~1.0的数值。 + /// 其中,0转为0,1~15映射为1~100。 + /// + /// + /// + private float Converter1_15to1_100(int value) + { + if (value == 0f) + { + return 0; + } + else if (value == 1f) + { + return 0.01f; + } + else + { + return (value - 1) / 14f + 0.01f; + } + } + + private void AnalizeTimeBootMs(uint value) + { + var str = value.ToString("x8");//转成8位的16进制字符,共8个ASCII字符,每个字符对应一个马达转速(16进制) + Motor1SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 1, 1), 16)); + Motor2SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 2, 1), 16)); + Motor3SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 3, 1), 16)); + Motor4SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 4, 1), 16)); + Motor5SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 5, 1), 16)); + Motor6SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 6, 1), 16)); + Motor7SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 7, 1), 16)); + Motor8SpeedPercent = Converter1_15to1_100(Convert.ToInt32(str.Substring(str.Length - 8, 1), 16)); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.cs b/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.cs new file mode 100644 index 0000000..51ee631 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/CopterImplSharedPart.cs @@ -0,0 +1,1151 @@ +using Plane.Geography; +using System; +using System.ComponentModel; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public abstract partial class CopterImplSharedPart : PLObservableObject, ILocation + { + protected CopterState? _forcedState; + + protected bool _isMobileControlActive; + + protected float? _lastChangedAlt; + + protected ILocation _lastChangedLocation; + + protected DateTime _lastRaiseAltitudeChangedTime; + + protected DateTime _lastRaiseLocationChangedTime; + + protected bool _shouldFollow; + + protected DateTime? _takeOffTime; + + /// + /// 更新 的时间间隔。 + /// + private static readonly TimeSpan _intervalToUpdateFlightTimeSpan = TimeSpan.FromSeconds(0.5); + + private float _followAltDifference; + + private float _followDistance; + + private bool _followKeepFacingTarget; + + private bool _followKeep3DRelativeLocations; + + private bool _followKeepYawDifference; + + private ILocation _followLastDestination; + + private IVisibleStatus _followTarget; + + private float _followSelfDirectionFromTarget; + + private float _followTargetOriginalYaw; + + private float? _followYaw; + + private DateTime _lastUpdateStatusTextTime; + + private int _mobileControlIntervalMilli = 50; + + #region Backing Fields + + private float _AirSpeed; + + private float _Altitude; + + private byte _BatteryPer = 100; + + private ushort _Channel1; + + private ushort _Channel2; + + private ushort _Channel3; + + private ushort _Channel4; + + private ushort _Channel5; + + private ushort _Channel6; + + private ushort _Channel7; + + private ushort _Channel8; + + private ushort? _DesiredChannel1; + + private ushort? _DesiredChannel2; + + private ushort? _DesiredChannel3; + + private ushort? _DesiredChannel4; + + private ushort? _DesiredChannel5; + + private ushort? _DesiredChannel6; + + private ushort? _DesiredChannel7; + + private ushort? _DesiredChannel8; + + private float? _DesiredYaw; + + private float _Elevation; + + private int? _FirmwareVersion; + + private string _FirmwareVersionText; + + private double _FlightDistance; + + private double _FlightDistance2D; + + private TimeSpan _FlightTime; + + private GpsFixType _GpsFixType; + + private float _GpsHdop; + + private float _GroundSpeed; + + private bool _HasSwitchedToGpsMode; + + private short _Heading; + + private ulong _HeartbeatCount; + + private bool _IsAbsolutelyConnected; + + private bool _IsCheckingConnection; + + private bool _IsConnected; + + private bool _IsEmergencyHoverActive; + + private bool _IsGpsAccurate; + + private bool _IsPairing; + + private bool _IsUnlocked; + + private double _Latitude; + + private double _Longitude; + + private FlightMode _Mode; + + private float _Pitch; + + private float _Roll; + + private byte _SatCount; + + private CopterState _State; + + private string _StatusText; + + private ILocation _TakeOffPoint; + + private uint _TimebootMs; + + private float _Voltage; + + private float _Yaw; + + #endregion Backing Fields + + public CopterImplSharedPart(SynchronizationContext uiSyncContext) : base(uiSyncContext) + { + PropertyChanged += CopterImplSharedPart_PropertyChanged; + Task.Run(async () => + { + while (true) + { + UpdateFlightTimeSpanIfNeeded(); + await Task.Delay(_intervalToUpdateFlightTimeSpan).ConfigureAwait(false); + } + }); + Task.Run(async () => + { + while (true) + { + if (!_isMobileControlActive) + { + await EnsureChannelsSetAsync(); + } + if (_lastUpdateStatusTextTime.AddSeconds(2) <= DateTime.Now) + { + StatusText = null; + } + await Task.Delay(50); + } + }); + Task.Run(async () => + { + var lastHeartbeatCount = HeartbeatCount; + while (true) + { + if (!IsConnected || lastHeartbeatCount == HeartbeatCount) + { + // 如果 !IsConnected(连接通道断开),肯定失联了; + // 或者,过了一段时间,心跳数没变化,认为飞行器失联。 + IsAbsolutelyConnected = false; + + // 此处等待的时间较短,目的是在飞行器重新连上时快速知晓。 + await Task.Delay(500).ConfigureAwait(false); + } + else + { + // 过了一段时间,心跳数变化了,确认飞行器连接正常。 + IsAbsolutelyConnected = true; + + // 记录此时的心跳数。 + lastHeartbeatCount = HeartbeatCount; + + // 此处等待的时间较长,目的是提高失联判断的可信程度。 + await Task.Delay(5000).ConfigureAwait(false); + } + } + }); + } + + public event EventHandler AltitudeChanged; + + public event EventHandler AttitudeChanged; + +#if PRIVATE + public event EventHandler DataStreamReceived; +#endif + + public event EventHandler HeartbeatReceived; + + public event EventHandler LocationChanged; + + public event EventHandler MissionItemReceived; + + public event EventHandler PairingCompleted; + + public event EventHandler SensorDataReceived; + + public event EventHandler SystemStatusReceived; + + protected enum PDataStreamType + { + SYS_STATUS = 1, // MAVLINK_MSG_ID_SYS_STATUS, + GPS_RAW_INT = 24, // MAVLINK_MSG_ID_GPS_RAW_INT, + RC_CHANNELS_RAW = 35 // MAVLINK_MSG_ID_RC_CHANNELS_RAW + } + + public float AirSpeed + { + get { return _AirSpeed; } + protected set { Set(nameof(AirSpeed), ref _AirSpeed, value); } + } + + public float Altitude + { + get { return _Altitude; } + protected set { Set(nameof(Altitude), ref _Altitude, value); } + } + + public byte BatteryPer + { + get { return _BatteryPer; } + protected set { Set(nameof(BatteryPer), ref _BatteryPer, value); } + } + + public ushort Channel1 + { + get { return _Channel1; } + protected set { Set(nameof(Channel1), ref _Channel1, value); } + } + + public ushort Channel2 + { + get { return _Channel2; } + protected set { Set(nameof(Channel2), ref _Channel2, value); } + } + + public ushort Channel3 + { + get { return _Channel3; } + protected set { Set(nameof(Channel3), ref _Channel3, value); } + } + + public ushort Channel4 + { + get { return _Channel4; } + protected set { Set(nameof(Channel4), ref _Channel4, value); } + } + + public ushort Channel5 + { + get { return _Channel5; } + protected set { Set(nameof(Channel5), ref _Channel5, value); } + } + + public ushort Channel6 + { + get { return _Channel6; } + protected set { Set(nameof(Channel6), ref _Channel6, value); } + } + + public ushort Channel7 + { + get { return _Channel7; } + protected set { Set(nameof(Channel7), ref _Channel7, value); } + } + + public ushort Channel8 + { + get { return _Channel8; } + protected set { Set(nameof(Channel8), ref _Channel8, value); } + } + + public ushort? DesiredChannel1 + { + get { return _DesiredChannel1; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel1), ref _DesiredChannel1, value); } } + } + + public ushort? DesiredChannel2 + { + get { return _DesiredChannel2; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel2), ref _DesiredChannel2, value); } } + } + + public ushort? DesiredChannel3 + { + get { return _DesiredChannel3; } + set + { + // 林俊清, 20160317, 紧急悬停时可调节高度。 + //if (!IsEmergencyHoverActive) + //{ + if (Set(nameof(DesiredChannel3), ref _DesiredChannel3, value)) + { + if (State == CopterState.Initialized) SetStateAccordingToMode(Mode); + } + //} + } + } + + public ushort? DesiredChannel4 + { + get { return _DesiredChannel4; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel4), ref _DesiredChannel4, value); } } + } + + public ushort? DesiredChannel5 + { + get { return _DesiredChannel5; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel5), ref _DesiredChannel5, value); } } + } + + public ushort? DesiredChannel6 + { + get { return _DesiredChannel6; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel6), ref _DesiredChannel6, value); } } + } + + public ushort? DesiredChannel7 + { + get { return _DesiredChannel7; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel7), ref _DesiredChannel7, value); } } + } + + public ushort? DesiredChannel8 + { + get { return _DesiredChannel8; } + set { if (!IsEmergencyHoverActive) { Set(nameof(DesiredChannel8), ref _DesiredChannel8, value); } } + } + + public float? DesiredYaw + { + get { return _DesiredYaw; } + set { if (!IsEmergencyHoverActive && !(State == CopterState.Following && _followKeepFacingTarget)) { Set(nameof(DesiredYaw), ref _DesiredYaw, value); } } + } + + public float Elevation + { + get { return _Elevation; } + protected set { Set(nameof(Elevation), ref _Elevation, value); } + } + + /// + /// 获取固件版本。 + /// + public int? FirmwareVersion + { + get { return _FirmwareVersion; } + protected set + { + if (Set(nameof(FirmwareVersion), ref _FirmwareVersion, value)) + { + if (value == null) + { + FirmwareVersionText = null; + } + else + { + int major, minor, build; + int temp; +#if NETFX_CORE + major = value.Value / 0x1000; + temp = value.Value % 0x1000; + minor = temp / 0x100; + build = temp % 0x100; +#else + major = Math.DivRem(value.Value, 0x1000, out temp); + minor = Math.DivRem(temp, 0x100, out build); +#endif + FirmwareVersionText = $"{major}.{minor}.{build}"; + } + } + } + } + + /// + /// 获取固件版本的文本形式。 + /// + public string FirmwareVersionText + { + get { return _FirmwareVersionText; } + protected set { Set(nameof(FirmwareVersionText), ref _FirmwareVersionText, value); } + } + + public double FlightDistance + { + get { return _FlightDistance; } + protected set { Set(nameof(FlightDistance), ref _FlightDistance, value); } + } + + public double FlightDistance2D + { + get { return _FlightDistance2D; } + protected set { Set(nameof(FlightDistance2D), ref _FlightDistance2D, value); } + } + + public TimeSpan FlightTimeSpan + { + get { return _FlightTime; } + protected set { Set(nameof(FlightTimeSpan), ref _FlightTime, value); } + } + + /// + /// 获取 GPS 锁定状态。 + /// + public GpsFixType GpsFixType + { + get { return _GpsFixType; } + protected set { Set(nameof(GpsFixType), ref _GpsFixType, value); } + } + + /// + /// 获取 GPS HDOP(horizontal dilution of position),单位为米。 + /// + public float GpsHdop + { + get { return _GpsHdop; } + protected set { Set(nameof(GpsHdop), ref _GpsHdop, value); } + } + + public float GroundSpeed + { + get { return _GroundSpeed; } + protected set { Set(nameof(GroundSpeed), ref _GroundSpeed, value); } + } + + public bool HasSwitchedToGpsMode + { + get { return _HasSwitchedToGpsMode; } + protected set { Set(nameof(HasSwitchedToGpsMode), ref _HasSwitchedToGpsMode, value); } + } + + public short Heading + { + get { return _Heading; } + protected set { Set(nameof(Heading), ref _Heading, value); } + } + + public ulong HeartbeatCount + { + get { return _HeartbeatCount; } + protected set { Set(nameof(HeartbeatCount), ref _HeartbeatCount, value); } + } + + /// + /// 获取一个值,指示是否确定飞行器与地面站正常连接。在实现中,一般根据对心跳包的接收情况判断。 + /// + public bool IsAbsolutelyConnected + { + get { return _IsAbsolutelyConnected; } + protected set { Set(nameof(IsAbsolutelyConnected), ref _IsAbsolutelyConnected, value); } + } + + /// + /// 获取或设置一个值,指示是否正在检查飞行器与地面站的连接以确定通信正常。在实现中,一般在建立连接后设为 true,在收到飞行器发回的数据后设为 false。 + /// + public bool IsCheckingConnection + { + get { return _IsCheckingConnection; } + set { Set(nameof(IsCheckingConnection), ref _IsCheckingConnection, value); } + } + + public bool IsConnected + { + get { return _IsConnected; } + protected set { Set(nameof(IsConnected), ref _IsConnected, value); } + } + + public bool IsEmergencyHoverActive + { + get { return _IsEmergencyHoverActive; } + protected set { Set(nameof(IsEmergencyHoverActive), ref _IsEmergencyHoverActive, value); } + } + + /// + /// 获取一个值,指示当前的 GPS 定位是否足够精确。 + /// + public bool IsGpsAccurate + { + get { return _IsGpsAccurate; } + protected set { Set(nameof(IsGpsAccurate), ref _IsGpsAccurate, value); } + } + + public bool IsPairing + { + get { return _IsPairing; } + protected set { Set(nameof(IsPairing), ref _IsPairing, value); } + } + + public bool IsUnlocked + { + get { return _IsUnlocked; } + protected set + { + if (Set(nameof(IsUnlocked), ref _IsUnlocked, value)) + { + if (value) + { + State = CopterState.Initialized; + } + else + { + State = CopterState.Locked; + } + } + } + } + + public double Latitude + { + get { return _Latitude; } + protected set { Set(nameof(Latitude), ref _Latitude, value); } + } + + public double Longitude + { + get { return _Longitude; } + protected set { Set(nameof(Longitude), ref _Longitude, value); } + } + + /// + /// 获取任务总数。 + /// + public ushort? MissionCount { get; protected set; } + + public string Name { get; set; } + + public float Pitch + { + get { return _Pitch; } + protected set { Set(nameof(Pitch), ref _Pitch, value); } + } + + public float Roll + { + get { return _Roll; } + protected set { Set(nameof(Roll), ref _Roll, value); } + } + + public byte SatCount + { + get { return _SatCount; } + protected set { Set(nameof(SatCount), ref _SatCount, value); } + } + + public CopterState State + { + get { return _State; } + protected set { Set(nameof(State), ref _State, _forcedState ?? value); } + } + + public string StatusText + { + get { return _StatusText; } + protected set + { + if (Set(nameof(StatusText), ref _StatusText, value)) + { + _lastUpdateStatusTextTime = DateTime.Now; + } + } + } + + public ILocation TakeOffPoint + { + get { return _TakeOffPoint; } + protected set { Set(nameof(TakeOffPoint), ref _TakeOffPoint, value); } + } + + public float Voltage + { + get { return _Voltage; } + protected set { Set(nameof(Voltage), ref _Voltage, value); } + } + + public float Yaw + { + get { return _Yaw; } + protected set { Set(nameof(Yaw), ref _Yaw, value); } + } + +#if PRIVATE + public +#else + internal +#endif + FlightMode Mode + { + get { return _Mode; } + set + { + // 林俊清, 20160325, Mode 属性改成 internal 了,如果仍然用 Set 或者 RaisePropertyChanged 方法,会抛异常("Property not found")。现决定不引发 PropertyChanged 事件了。 + var changed = _Mode != value; + if (changed) _Mode = value; + + // 如果在已解锁状态下满足某些条件,就根据模式设置 State。 + if (IsUnlocked) + { + var shouldSetState = false; + if (changed) + { + if (State == CopterState.Following) + { + if (value != FlightMode.GUIDED) + { + // 跟随时切换到其他模式,停止跟随并且设置 State。 + _shouldFollow = false; + shouldSetState = true; + } + } + else + { + // 非跟随时模式变化了,设置 State。 + shouldSetState = true; + } + } + if (shouldSetState) SetStateAccordingToMode(value, defaultState: CopterState.Initialized); + } + } + } + + public async Task FloatAsync() + { + if (await SetModeAsync(FlightMode.ALT_HOLD).ConfigureAwait(false)) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1500, + ch4: 1500 + ).ConfigureAwait(false); + } + } + + /// + /// 使飞行器飞往水平面上指定的点。 + /// + /// 纬度。 + /// 经度。 + /// 表示此命令异步发送操作的 实例。 + public Task FlyToAsync(double lat, double lng) + { + return FlyToAsync(lat, lng, Altitude); + } + + public Task FlyToAsync(double lat, double lng, float alt) + { + _shouldFollow = false; + //State = CopterState.CommandMode; + return FlyToCoreAsync(lat, lng, alt); + } + + public void Follow(IVisibleStatus target, bool keepYawDifference = false, bool keepFacingTarget = true, bool keep3DRelativeLocations = false) + { + // 林俊清, 20160409, 在目前的实现中,跟随状态使用 GUIDED 模式。 + + if (!IsConnected || !IsUnlocked || this == target || IsEmergencyHoverActive) return; + + _followTarget = target; + _followAltDifference = Altitude - target.Altitude; + _followDistance = (float)target.CalcDistance2D(this); + _followKeepYawDifference = keepYawDifference; + _followKeepFacingTarget = keepFacingTarget; + _followKeep3DRelativeLocations = keep3DRelativeLocations; + _followSelfDirectionFromTarget = (float)target.CalcDirection2D(this).RadToDeg(); + _followTargetOriginalYaw = target.Yaw.NormalizeDirection(); + + if (State == CopterState.Following) return; + + Task.Run(async () => + { + State = CopterState.Following; + _shouldFollow = true; + while (IsConnected && _shouldFollow) + { + // 计算飞行器应当处于什么位置,并调用 FlyTo 使其飞往彼处。 + + var destination2D = _followTarget.CalcLatLngSomeMetersAway2D(_followKeepYawDifference ? (_followSelfDirectionFromTarget - _followTargetOriginalYaw + _followTarget.Yaw.NormalizeDirection()).NormalizeDirection() : _followSelfDirectionFromTarget, _followDistance); + var destinationAlt = _followKeep3DRelativeLocations ? _followTarget.Altitude + _followAltDifference : Altitude; + var destination = new PLLocation(destination2D.Latitude, destination2D.Longitude, destinationAlt); + if (_followLastDestination == null || _followLastDestination.CalcDistance(destination) >= 1.5) + { + await FlyToCoreAsync(destination2D.Latitude, destination2D.Longitude, destinationAlt).ConfigureAwait(false); + _followLastDestination = destination; + } + + // 如果需要保持面对目标,计算并使用偏航和云台俯仰的期望值。 + + if (_followKeepFacingTarget) + { + var yaw = (float)this.CalcDirection2D(_followTarget).RadToDeg(); + SetFieldAndRaisePropertyChanged(ref _DesiredYaw, yaw, nameof(DesiredYaw)); + + var distance2DFromTargetToCopter = _followTarget.CalcDistance2D(this); + var altDifferenceFromTargetToCopter = Altitude - _followTarget.Altitude; + // 正前方值为 0,向下取正值,向上取负值。 + var gimbalPitchRad = Math.Atan2(altDifferenceFromTargetToCopter, distance2DFromTargetToCopter); + // 正前方值为 1500,向下 80° 值为 1900。 + var ch7 = (ushort)((1900 - 1500) * gimbalPitchRad / 80F.DegToRad() + 1500); + SetFieldAndRaisePropertyChanged(ref _DesiredChannel7, ch7, nameof(DesiredChannel7)); + } + + await Task.Delay(50).ConfigureAwait(false); + } + if (!IsConnected) _shouldFollow = false; + }); + } + + public async Task HoverAsync() + { + if (await SetModeAsync(FlightMode.LOITER).ConfigureAwait(false)) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1500, + ch4: 1500 + ).ConfigureAwait(false); + } + } + public async Task GuidAsync() + { + if (await SetModeAsync(FlightMode.GUIDED).ConfigureAwait(false)) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1500, + ch4: 1500 + ).ConfigureAwait(false); + } + } + + public async Task LandAsync() + { + await SetModeAsync(FlightMode.LAND).ConfigureAwait(false); + await SetChannelsAsync(ch1: 1500, ch2: 1500).ConfigureAwait(false); + } + + public async Task ReturnToLaunchAsync() + { + await SetModeAsync(FlightMode.RTL).ConfigureAwait(false); + await SetChannelsAsync(ch1: 1500, ch2: 1500).ConfigureAwait(false); + } + + public async Task SetChannelsAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null) + { + SetTargets(ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8); + + await SetChannelsAsync().ConfigureAwait(false); + } + + public abstract Task SetChannelsAsync(); + + public async Task SetMobileControlAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null, float? yaw = null) // 林俊清, 20150912, 将来如有需要再补上 TargetAlt, float? alt = null) + { + SetTargets(ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, yaw); + + await SetMobileControlAsync().ConfigureAwait(false); + } + + public abstract Task SetMobileControlAsync(); + + public async Task StartEmergencyHoverAsync() + { + _shouldFollow = false; + State = CopterState.HoverMode; + IsEmergencyHoverActive = true; + + // 林俊清, 20151028, 先 IsEmergencyHoverActive = true 再设置目标通道是为了防止别的线程正好在 IsEmergencyHoverActive == false 时设置通道。 + // 林俊清, 20151019, 在紧急悬停状态,外部设置 DesiredChannel[1-4] 无效,只能如此设置。 + SetFieldAndRaisePropertyChanged(ref _DesiredChannel1, 1500, nameof(DesiredChannel1)); + SetFieldAndRaisePropertyChanged(ref _DesiredChannel2, 1500, nameof(DesiredChannel2)); + SetFieldAndRaisePropertyChanged(ref _DesiredChannel3, 1500, nameof(DesiredChannel3)); + SetFieldAndRaisePropertyChanged(ref _DesiredChannel4, 1500, nameof(DesiredChannel4)); + + await SetMobileControlAsync().ConfigureAwait(false); + + switch (Mode) + { + // 林俊清, 20151019, 波子说一律切 LOITER。 + //case FlightMode.ALT_HOLD: + // break; + //case FlightMode.LOITER: + // break; + //case FlightMode.STABILIZE: + // await SetModeCoreAsync(FlightMode.ALT_HOLD).ConfigureAwait(false); + // break; + //case FlightMode.AUTO: + //case FlightMode.GUIDED: + //case FlightMode.RTL: + //case FlightMode.CIRCLE: + //case FlightMode.LAND: + default: + await SetModeCoreAsync(FlightMode.LOITER).ConfigureAwait(false); + break; + } + } + + public async void StartMobileControl(int? millisecondsInterval = null) + { + if (millisecondsInterval != null) _mobileControlIntervalMilli = millisecondsInterval.Value; + if (!_isMobileControlActive) + { + _isMobileControlActive = true; + while (_isMobileControlActive) + { + if (State == CopterState.Following) + { + await SetMobileControlAsync(ch1: 1500, ch2: 1500).ConfigureAwait(false); + } + else { + switch (Mode) + { + case FlightMode.STABILIZE: + case FlightMode.ALT_HOLD: + case FlightMode.LOITER: + await SetMobileControlAsync().ConfigureAwait(false); + break; + + case FlightMode.GUIDED: + case FlightMode.RTL: + await SetMobileControlAsync(ch1: 1500, ch2: 1500, ch3: 1500).ConfigureAwait(false); + break; + + case FlightMode.LAND: + await SetMobileControlAsync(ch3: 1500); + break; + + default: + await SetMobileControlAsync(ch1: 1500, ch2: 1500, yaw: Yaw).ConfigureAwait(false); + break; + } + } + await Task.Delay(_mobileControlIntervalMilli).ConfigureAwait(false); + } + } + } + + public void StopEmergencyHover() + { + IsEmergencyHoverActive = false; + } + + public void StopMobileControl() + { + _isMobileControlActive = false; + } + + public async Task TakeOffAsync() + { + if (await SetModeAsync(FlightMode.AUTO).ConfigureAwait(false)) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1500, + ch4: 1500 + ).ConfigureAwait(false); + } + } + + /// + /// 切换飞行模式,返回的 实例在确认切换成功或超时后完成。 + /// + /// 飞行模式。 + /// 超时时间,单位为毫秒。 + /// 表示切换模式操作的 实例。若切换模式成功,异步操作的结果为 true;否则为 false。 +#if PRIVATE + public +#else + internal +#endif + async Task SetModeAsync(FlightMode mode, int millisecondsTimeout = 5000) + { + if (_shouldFollow && mode != FlightMode.GUIDED) _shouldFollow = false; + // 林俊清, 20160317, 紧急悬停时可返航或降落。 + if (mode == FlightMode.RTL || mode == FlightMode.LAND) + { + StopEmergencyHover(); + } + if (!IsEmergencyHoverActive) + { + return await SetModeCoreAsync(mode, millisecondsTimeout).ConfigureAwait(false); + } + return false; + } + + /// + /// 无论在不在紧急悬停状态下都可用的切换模式方法。 + /// + /// 模式。 + /// 超时。 + /// 成功与否。 + internal abstract Task SetModeCoreAsync(FlightMode mode, int millisecondsTimeout = 5000); + + protected async Task EnsureChannelsSetAsync() + { + if ( + (DesiredChannel1 != null && Channel1 != DesiredChannel1) || + (DesiredChannel2 != null && Channel2 != DesiredChannel2) || + (DesiredChannel3 != null && Channel3 != DesiredChannel3) || + (DesiredChannel4 != null && Channel4 != DesiredChannel4) || + (DesiredChannel5 != null && Channel5 != DesiredChannel5) || + (DesiredChannel6 != null && Channel6 != DesiredChannel6) || + (DesiredChannel7 != null && Channel7 != DesiredChannel7) || + (DesiredChannel8 != null && Channel8 != DesiredChannel8) + ) // Any channel not set. + { + await SetChannelsAsync().ConfigureAwait(false); + } + } + + /// + /// 不主动设置 State,仅发送飞往某点命令。 + /// + /// 纬度。 + /// 经度。 + /// 高度。 + /// 表示此异步发送操作的 实例。 + protected abstract Task FlyToCoreAsync(double lat, double lng, float alt); + + protected void RaiseAltitudeChanged() => AltitudeChanged?.Invoke(this, EventArgs.Empty); + + protected void RaiseAltitudeChangedIfNeeded() + { + if (_lastChangedAlt == null || Math.Abs(Altitude - _lastChangedAlt.Value) >= 0.5 || DateTime.Now.AddMilliseconds(-500) >= _lastRaiseAltitudeChangedTime) + { + RaiseAltitudeChanged(); + _lastChangedAlt = Altitude; + _lastRaiseAltitudeChangedTime = DateTime.Now; + } + } + + protected void RaiseAttitudeChanged() => AttitudeChanged?.Invoke(this, EventArgs.Empty); + + protected void RaiseDataStreamReceived(PDataStreamType dataStreamType) + { +#if PRIVATE + DataStreamReceived?.Invoke(this, new DataStreamReceivedEventArgs((DataStreamType)dataStreamType)); +#endif + } + + protected void RaiseHeartbeatReceived(HeartbeatReceivedEventArgs e) + { + HeartbeatReceived?.Invoke(this, e); + } + + protected void RaiseLocationChanged() => LocationChanged?.Invoke(this, EventArgs.Empty); + + protected void RaiseLocationChangedIfNeeded() + { + if (_lastChangedLocation == null || this.CalcDistance(_lastChangedLocation) >= 0.5 || DateTime.Now.AddMilliseconds(-500) >= _lastRaiseLocationChangedTime) + { + RaiseLocationChanged(); + _lastChangedLocation = new PLLocation(this); + _lastRaiseLocationChangedTime = DateTime.Now; + } + } + + protected void RaiseMissionItemReceived(MissionItemReceivedEventArgs e) + { + MissionItemReceived?.Invoke(this, e); + } + + protected void RaisePairingCompleted(PairingCompletedEventArgs e) + { + var handler = PairingCompleted; + if (handler == null) return; + if (SynchronizationContext.Current == _uiSyncContext) + { + handler(this, e); + } + else + { + _uiSyncContext.Post(() => handler(this, e)); + } + } + + protected void RaiseSensorDataReceived(EventArgs e) + { + SensorDataReceived?.Invoke(this, e); + } + + protected void RaiseSysStatusReceived(SystemStatusReceivedEventArgs e) + { + SystemStatusReceived?.Invoke(this, e); + } + + protected void SetTargets(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null, float? yaw = null) + { + if (ch1 != null) DesiredChannel1 = ch1; + if (ch2 != null) DesiredChannel2 = ch2; + if (ch3 != null) DesiredChannel3 = ch3; + if (ch4 != null) DesiredChannel4 = ch4; + if (ch5 != null) DesiredChannel5 = ch5; + if (ch6 != null) DesiredChannel6 = ch6; + if (ch7 != null) DesiredChannel7 = ch7; + if (ch8 != null) DesiredChannel8 = ch8; + if (yaw != null) DesiredYaw = yaw; + } + + protected virtual void UpdateFlightDataIfNeeded() + { + if (!TakeOffPoint.IsNullOrEmpty()) + { + FlightDistance = TakeOffPoint.CalcDistance(this); + } + } + + protected void UpdateFlightTimeSpanIfNeeded() + { + if (_takeOffTime != null && IsUnlocked) + { + var flightTimeSpan = DateTime.Now - _takeOffTime.Value; + if (flightTimeSpan - FlightTimeSpan >= _intervalToUpdateFlightTimeSpan) + { + FlightTimeSpan = flightTimeSpan; + } + } + } + + private void CopterImplSharedPart_PropertyChanged(object sender, PropertyChangedEventArgs e) + { + switch (e.PropertyName) + { + case nameof(IsConnected): + if (!IsConnected) + { + IsCheckingConnection = false; + IsAbsolutelyConnected = false; + } + break; + + case nameof(IsUnlocked): + if (IsUnlocked) + { + // 林俊清, 20151029, 在解锁时重置起飞点、起飞时间、飞行距离、飞行时间、速度。 + TakeOffPoint = new PLLocation { Latitude = Latitude, Longitude = Longitude, Altitude = Altitude }; + _takeOffTime = DateTime.Now; + FlightDistance = 0; + FlightDistance2D = 0; + FlightTimeSpan = TimeSpan.FromSeconds(0); + AirSpeed = 0; + GroundSpeed = 0; + } + else + { + if (IsEmergencyHoverActive) StopEmergencyHover(); + } + break; + + default: + break; + } + } + + private void SetFieldAndRaisePropertyChanged(ref ushort? field, ushort value, string propertyName) + { + if (field != value) + { + field = value; + RaisePropertyChanged(propertyName); + } + } + + private void SetFieldAndRaisePropertyChanged(ref float? field, float value, string propertyName) + { + if (field != value) + { + field = value; + RaisePropertyChanged(propertyName); + } + } + + private void SetStateAccordingToMode(FlightMode value, CopterState? defaultState = null) + { + switch (value) + { + case FlightMode.ALT_HOLD: + State = CopterState.FloatMode; + break; + + case FlightMode.AUTO: + State = CopterState.TakingOff; + break; + + case FlightMode.CIRCLE: + State = CopterState.Circling; + break; + + case FlightMode.GUIDED: + State = CopterState.CommandMode; + break; + + case FlightMode.LOITER: + State = CopterState.HoverMode; + break; + + case FlightMode.RTL: + State = CopterState.Returning; + break; + + case FlightMode.LAND: + State = CopterState.Landing; + break; + + default: + if (defaultState != null) State = defaultState.Value; + break; + } + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/EHCopter.InternalCopterEventHandlers.cs b/PlaneGcsSdk_Shared/Copters/EHCopter.InternalCopterEventHandlers.cs new file mode 100644 index 0000000..001fcc1 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/EHCopter.InternalCopterEventHandlers.cs @@ -0,0 +1,286 @@ +using System; +using static Plane.Protocols.MAVLink; + +namespace Plane.Copters +{ + public partial class PLCopter : CopterImplSharedPart + { + private bool _fetchingFirmwareVersion; + + private void _internalCopter_ConnectionBroken(object sender, EventArgs e) + { + IsConnected = _internalCopter.IsConnected; + } + + private void _internalCopter_GetLogDataEvent(string log) + { + StatusText = log; + } + + private void _internalCopter_ReceiveDataStreamEvent(object sender, byte StreamType) + { + switch (StreamType) + { + case MAVLINK_MSG_ID_GPS_RAW_INT: + { + Latitude = _internalCopter.lat; + Longitude = _internalCopter.lng; + SatCount = _internalCopter.satcount; + GpsFixType = _internalCopter.gpsstatus.ToGpsFixType(); + GpsHdop = _internalCopter.gpshdop; + Elevation = _internalCopter.gpsalt; + + if (IsGpsAccurate) + { + UpdateFlightDataIfNeeded(); + RaiseLocationChangedIfNeeded(); + } + + RaiseDataStreamReceived(PDataStreamType.GPS_RAW_INT); + + break; + } + case MAVLINK_MSG_ID_ATTITUDE: + { + Roll = _internalCopter.roll; + Pitch = _internalCopter.pitch; + Yaw = _internalCopter.yaw; + TimebootMs = _internalCopter.timebootms; + RaiseAttitudeChanged(); + + break; + } + case MAVLINK_MSG_ID_RC_CHANNELS_RAW: + { + Channel1 = _internalCopter.ch1in; + Channel2 = _internalCopter.ch2in; + Channel3 = _internalCopter.ch3in; + Channel4 = _internalCopter.ch4in; + Channel5 = _internalCopter.ch5in; + Channel6 = _internalCopter.ch6in; + Channel7 = _internalCopter.ch7in; + Channel8 = _internalCopter.ch8in; + + RaiseDataStreamReceived(PDataStreamType.RC_CHANNELS_RAW); + + break; + } + case MAVLINK_MSG_ID_VFR_HUD: + { + Heading = _internalCopter.heading; + Altitude = _internalCopter.alt; + AirSpeed = _internalCopter.airspeed; + GroundSpeed = _internalCopter.groundspeed; + + RaiseAltitudeChangedIfNeeded(); + + break; + } + } + } + + private async void _internalCopter_ReceiveHeartBearEvent(object sender, uint iError, ulong iCount) + { + IsUnlocked = _internalCopter.armed; + Mode = (FlightMode)_internalCopter.mode; + // 林俊清, 20160311, 亿航将闲置的 apname 用作已经切过 GPS 模式的标志。 + HasSwitchedToGpsMode = (byte)_internalCopter.apname != 0; + ++HeartbeatCount; + + IsCheckingConnection = false; + /* + if (FirmwareVersion == null && !_fetchingFirmwareVersion) + { + try + { + _fetchingFirmwareVersion = true; + FirmwareVersion = (int)await GetParamAsync("FIRMWARE_VERSION", 5000); + } + catch (TimeoutException) + { + // 吞掉。 + } + finally + { + _fetchingFirmwareVersion = false; + } + } + */ + RaiseHeartbeatReceived(new HeartbeatReceivedEventArgs(iCount)); + } + + private void _internalCopter_ReceiveSensorEvent(object sender) + { + RaiseSensorDataReceived(EventArgs.Empty); + } + + private void _internalCopter_ReceiveSysStatusEvent(object sender, byte StreamType, bool GPSBadHealth, bool GyroBadHealth, bool AccelBadHealth, bool CompassBadHealth, bool BarometerBadHealth, bool canTakeOff) + { + Voltage = _internalCopter.battery_voltage / 1000; + + if (_internalCopter.battery_remaining == 255) // 剩余电量未知,需要计算。 + { + CalcBatteryPer(); + } + else + { + BatteryPer = _internalCopter.battery_remaining; + } + + const int MIN_VERSION_WITH_CAN_TAKE_OFF_FIELD = 12308; + const int MIN_VERSION_OF_GENERATION2 = 0x3000; + if (FirmwareVersion != null) + { + if (FirmwareVersion.Value >= MIN_VERSION_WITH_CAN_TAKE_OFF_FIELD) + { + // 飞控提供了 canTakeOff。 + IsGpsAccurate = canTakeOff; + } + else if (FirmwareVersion.Value >= MIN_VERSION_OF_GENERATION2) + { + // 2.0 飞行器,飞控未提供 canTakeOff。 + IsGpsAccurate = SatCount >= 12; + } + else + { + // 1.0 飞行器,飞控不提供 canTakeOff。 + IsGpsAccurate = SatCount >= 6; + } + } + else + IsGpsAccurate = SatCount >= 8; + + FlightDistance2D = _internalCopter.FlightDistance2D; + + RaiseSysStatusReceived(new SystemStatusReceivedEventArgs(GPSBadHealth, GyroBadHealth, AccelBadHealth, CompassBadHealth, BarometerBadHealth)); + } + + private void _internalCopter_PacketHandled(object sender, PlaneCopter.PacketReceivedEventArgs e) + { + switch (e.Packet[5]) + { + case MAVLINK_MSG_ID_MISSION_COUNT: + MissionCount = _internalCopter.WpCount; + break; + + default: + break; + } + } + + private void _internalCopter_UnhandledPacketReceived(object sender, PlaneCopter.PacketReceivedEventArgs e) + { + switch (e.Packet[5]) + { + case MAVLINK_MSG_ID_MISSION_ACK: + AnalyzeMissionAckPacket(e.Packet); + break; + + case MAVLINK_MSG_ID_MISSION_COUNT: + AnalyzeMissionCountPacket(e.Packet); + break; + + case MAVLINK_MSG_ID_MISSION_ITEM: + AnalyzeMissionItemPacket(e.Packet); + break; + + case MAVLINK_MSG_ID_MISSION_REQUEST: + AnalyzeMissionRequestPacket(e.Packet); + break; + + case MAVLINK_MSG_ID_SET_PAIR: + AnalyzeSetPairPacket(e.Packet); + break; + + default: + break; + } + } + +#if PRIVATE + protected virtual void RegisterInternalCopterEventHandlers() +#else + + private void RegisterInternalCopterEventHandlers() +#endif + { + _internalCopter.GetLogDataEvent += _internalCopter_GetLogDataEvent; + _internalCopter.ReceiveDataStreamEvent += _internalCopter_ReceiveDataStreamEvent; + _internalCopter.ReceiveHeartBearEvent += _internalCopter_ReceiveHeartBearEvent; + _internalCopter.ReceiveSensorEvent += _internalCopter_ReceiveSensorEvent; + _internalCopter.ReceiveSysStatusEvent += _internalCopter_ReceiveSysStatusEvent; + _internalCopter.ConnectionBroken += _internalCopter_ConnectionBroken; + _internalCopter.PacketHandled += _internalCopter_PacketHandled; + _internalCopter.UnhandledPacketReceived += _internalCopter_UnhandledPacketReceived; + } + + #region 计算剩余电量 + + private int bPerTimes; + private int outBatteryPer; + private int[] tPerTimes = new int[20]; + private int v_num; + + /// + /// 计算电量并在条件满足时更新 属性。 + /// + private void CalcBatteryPer() + { + float volmax = 0f; + float volmin = 0f; + if (Voltage > 5 && Voltage < 9) + { + volmax = 8.2f; + volmin = 7f; + } + else if (Voltage >= 9 + && Voltage < 13.6) + { + volmax = 11.6f; + volmin = 10.2f; + } + else if (Voltage >= 13.6 + && Voltage < 17.2) + { + volmax = 16.3f; + volmin = 14.2f; + } + else if (Voltage >= 17.2 + && Voltage < 26.2) + { + volmax = 24.8f; + volmin = 21.2f; + } + + int batteryPer = (int)Math.Round((Voltage - volmin) * 100 / (volmax - volmin)); + + if (batteryPer == -1 || volmax == 0 || volmin == 0) + return; + + if (bPerTimes < 20) + { + tPerTimes[bPerTimes] = batteryPer; + bPerTimes += 1; + } + else + { + tPerTimes[v_num] = batteryPer; + v_num++; + if (v_num == 20) + v_num = 0; + } + for (int i = 0; i < bPerTimes; i++) + { + outBatteryPer += tPerTimes[i]; + } + + outBatteryPer = outBatteryPer / bPerTimes; + if (outBatteryPer < BatteryPer && bPerTimes > 18) + { + BatteryPer = (byte)outBatteryPer; + } + } + + #endregion 计算剩余电量 + } +} diff --git a/PlaneGcsSdk_Shared/Copters/EHCopter.Mission.cs b/PlaneGcsSdk_Shared/Copters/EHCopter.Mission.cs new file mode 100644 index 0000000..b16d5d1 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/EHCopter.Mission.cs @@ -0,0 +1,261 @@ +// 读写任务序列的标准流程: http://qgroundcontrol.org/mavlink/waypoint_protocol + +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using static Plane.Protocols.MAVLink; + +namespace Plane.Copters +{ + public partial class PLCopter + { + private static readonly IMission PRE_TAKE_OFF_MISSION = new Mission + { + Command = FlightCommand.Waypoint, + Sequence = 0 + }; + + private static readonly IMission TAKE_OFF_MISSION = new Mission + { + Command = FlightCommand.TakeOff, + Altitude = 10, + Sequence = 1 + }; + + /// + /// 飞行器正在请求的任务序号。 + /// + private ushort? _copterRequestingMissionSeq; + + /// + /// 指示是否正在查询任务序列。 + /// + private bool _isRequestingMissionList; + + /// + /// 指示是否正在写入任务序列。 + /// + private bool _isWritingMissionList; + + /// + /// 向飞行器查询得到的任务序列。 + /// + private List _missionList; + + /// + /// 用于判断查询任务序列操作超时的秒表。 + /// + private Stopwatch _requestMissionListStopwatch; + + /// + /// 写任务操作的结果。 + /// + private MAV_MISSION_RESULT? _writeMissionListResult; + + /// + /// 用于判断写入任务序列操作超时的秒表。 + /// + private Stopwatch _writeMissionListStopwatch; + + /// + /// 查询任务序列。若上一个操作未完成,本次结果为 null。 + /// + /// 超时时间。 + /// 飞行器返回的任务序列。若上一个操作未完成,本次结果为 null;若超时,结果为不完整的序列(_mission.Count 小于 MissionCount);若顺利完成,结果为完整的任务序列。 + public async Task> RequestMissionListAsync(int millisecondsTimeout = 10000) + { + if (_isRequestingMissionList) return null; + _isRequestingMissionList = true; + + MissionCount = null; + + if (_missionList == null) _missionList = new List(); + else _missionList.Clear(); + + if (_requestMissionListStopwatch == null) _requestMissionListStopwatch = Stopwatch.StartNew(); + else _requestMissionListStopwatch.Restart(); + + // 查询任务总数。 + await _internalCopter.GetWPsAsync().ConfigureAwait(false); + + // 异步等待 mavlink_mission_count_t 消息(收到后会赋值给 MissionCount)。 + while (MissionCount == null) + { + if (_requestMissionListStopwatch.ElapsedMilliseconds >= millisecondsTimeout) + { + // 超时。 + return EndRequestingMissionList(); + } + await Task.Delay(50).ConfigureAwait(false); + } + + for (ushort i = 0; i < MissionCount; i++) + { + // 查询 i 号任务。 + await _internalCopter.GetWPAsync(i).ConfigureAwait(false); + + // 异步等待 mavlink_mission_item_t 消息(收到后会把 Mission 对象放到 _missions 列表的合适位置)。 + while (_missionList.Count <= i) + { + if (_requestMissionListStopwatch.ElapsedMilliseconds >= millisecondsTimeout) + { + // 超时。 + return EndRequestingMissionList(); + } + await Task.Delay(50).ConfigureAwait(false); + } + } + + // 成功接收了全部任务,发送 Ack。 + await SendMissionAckAsync(); + + // 清理各字段并返回任务序列。 + return EndRequestingMissionList(); + } + + /// + /// 写入任务序列。 + /// + /// 任务序列。 + /// 超时时间,单位为毫秒。 + /// 若确定写入成功,返回 true;否则(上一个写任务操作未完成,或者飞控返回失败消息,或者超时)返回 false。 + public async Task WriteMissionListAsync(IEnumerable missions, int millisecondsTimeout = 10000) + { + if (_isWritingMissionList) return false; + + _isWritingMissionList = true; + _writeMissionListResult = null; + _copterRequestingMissionSeq = null; + + if (_writeMissionListStopwatch == null) _writeMissionListStopwatch = Stopwatch.StartNew(); + else _writeMissionListStopwatch.Restart(); + + // 写任务总数。 + await WriteMissionCountAsync((ushort)(missions.Count() + 2)).ConfigureAwait(false); + + // 任务序号。 + ushort seq = 0; + + // 等待飞控请求 seq 号任务。 + if (!await AwaitMissionRequestAsync(seq, millisecondsTimeout).ConfigureAwait(false)) + { + // 超时。 + return EndWritingMissions(); + } + + // 写起飞前准备任务。 + await WriteMissionAsync(PRE_TAKE_OFF_MISSION).ConfigureAwait(false); + + seq++; + + // 等待飞控请求 seq 号任务。 + if (!await AwaitMissionRequestAsync(seq, millisecondsTimeout).ConfigureAwait(false)) + { + // 超时。 + return EndWritingMissions(); + } + + // 写起飞任务。 + await WriteMissionAsync(TAKE_OFF_MISSION).ConfigureAwait(false); + + foreach (var mission in missions) + { + // 等待飞控请求 seq 号任务。 + if (!await AwaitMissionRequestAsync(++seq, millisecondsTimeout).ConfigureAwait(false)) + { + // 超时。 + return EndWritingMissions(); + } + mission.Sequence = seq; + await WriteMissionAsync(mission).ConfigureAwait(false); + } + + // 等待飞控返回 Ack。 + while (_writeMissionListResult == null && _writeMissionListStopwatch.ElapsedMilliseconds < millisecondsTimeout) + { + await Task.Delay(50).ConfigureAwait(false); + } + + return EndWritingMissions(); + } + + /// + /// 异步等待飞行器向地面站请求 seq 号任务。 + /// + /// 任务序号。 + /// 超时时间。 + /// 若未超时并成功收到请求,返回 true;否则返回 false。 + private async Task AwaitMissionRequestAsync(ushort seq, int millisecondsTimeout) + { + while (_copterRequestingMissionSeq != seq) + { + if (_writeMissionListStopwatch.ElapsedMilliseconds >= millisecondsTimeout) + { + return true; + } + await Task.Delay(50).ConfigureAwait(false); + } + return true; + } + + private IEnumerable EndRequestingMissionList() + { + _requestMissionListStopwatch.Stop(); + _isRequestingMissionList = false; + return _missionList; + } + + private bool EndWritingMissions() + { + _writeMissionListStopwatch.Stop(); + _isWritingMissionList = false; + return _writeMissionListResult == MAV_MISSION_RESULT.MAV_MISSION_ACCEPTED; + } + + private async Task SendMissionAckAsync() + { + var ack = new mavlink_mission_ack_t + { + target_component = _internalCopter.compid, + target_system = _internalCopter.sysid, + type = (byte)MAV_MISSION_RESULT.MAV_MISSION_ACCEPTED + }; + await _internalCopter.GeneratePacketAsync(MAVLINK_MSG_ID_MISSION_ACK, ack).ConfigureAwait(false); + } + + private Task WriteMissionAsync(IMission mission) + { + var frame = mission.Command == FlightCommand.Waypoint && mission.Sequence == 0 ? MAV_FRAME.GLOBAL : MAV_FRAME.GLOBAL_RELATIVE_ALT; + + var req = new mavlink_mission_item_t(); + + req.target_system = _internalCopter.sysid; + req.target_component = _internalCopter.compid; + + req.command = (byte)mission.Command; + + req.current = 0; + req.autocontinue = 1; + + req.frame = (byte)frame; + req.x = (float)mission.Latitude; + req.y = (float)mission.Longitude; + req.z = mission.Altitude; + + req.param1 = mission.Param1; + req.param2 = mission.Param2; + req.param3 = mission.Param3; + req.param4 = mission.Param4; + + req.seq = mission.Sequence; + + return _internalCopter.GeneratePacketAsync(MAVLINK_MSG_ID_MISSION_ITEM, req); + } + + private Task WriteMissionCountAsync(ushort count) + { + return _internalCopter.SetWPTotalAsync(count); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/EHCopter.PacketAnalysis.cs b/PlaneGcsSdk_Shared/Copters/EHCopter.PacketAnalysis.cs new file mode 100644 index 0000000..2ebbbf0 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/EHCopter.PacketAnalysis.cs @@ -0,0 +1,61 @@ +using Plane.Protocols; +using System.Collections.Generic; +using static Plane.Protocols.MAVLink; + +namespace Plane.Copters +{ + public partial class PLCopter + { + private void AnalyzeMissionAckPacket(byte[] buffer) + { + var packet = buffer.ByteArrayToStructure(6); + _writeMissionListResult = (MAV_MISSION_RESULT)packet.type; + } + + private void AnalyzeMissionCountPacket(byte[] buffer) + { + var packet = buffer.ByteArrayToStructure(6); + MissionCount = packet.count; + } + + private void AnalyzeMissionItemPacket(byte[] buffer) + { + var packet = buffer.ByteArrayToStructure(6); + var mission = new Mission + { + Altitude = packet.z, + Command = (FlightCommand)packet.command, + Latitude = packet.x, + Longitude = packet.y, + Param1 = packet.param1, + Param2 = packet.param2, + Param3 = packet.param3, + Param4 = packet.param4, + Sequence = packet.seq + }; + if (_missionList == null) + { + if (mission.Sequence == 0) + { + _missionList = new List { mission }; + } + } + else if (_missionList.Count > mission.Sequence) _missionList[mission.Sequence] = mission; + else if (_missionList.Count == mission.Sequence) _missionList.Add(mission); + RaiseMissionItemReceived(new MissionItemReceivedEventArgs(mission)); + } + + private void AnalyzeMissionRequestPacket(byte[] buffer) + { + var packet = buffer.ByteArrayToStructure(6); + _copterRequestingMissionSeq = packet.seq; + } + + private void AnalyzeSetPairPacket(byte[] buffer) + { + IsPairing = false; + var packet = buffer.ByteArrayToStructure(6); + RaisePairingCompleted(new PairingCompletedEventArgs(packet.pair == 1, packet.RxID, packet.TxID)); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/EmptyCopter.Mission.cs b/PlaneGcsSdk_Shared/Copters/EmptyCopter.Mission.cs new file mode 100644 index 0000000..d3371fa --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/EmptyCopter.Mission.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public partial class EmptyCopter : CopterImplSharedPart, ICopter + { + /// + /// 查询任务序列。若上一个操作未完成,本次结果为 null。 + /// + /// 超时时间。 + /// 飞行器返回的任务序列。若上一个操作未完成,本次结果为 null;若超时,结果为不完整的序列(_mission.Count 小于 MissionCount);若顺利完成,结果为完整的任务序列。 + public Task> RequestMissionListAsync(int millisecondsTimeout = 10000) + { + return Task.FromResult(new Mission[0] as IEnumerable); + } + + /// + /// 写入任务序列。 + /// + /// 任务序列。 + /// 若写入成功,返回 true;否则返回 false。 + public Task WriteMissionListAsync(IEnumerable missions, int millisecondsTimeout = 10000) + { + return Task.FromResult(true); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/EmptyCopter.cs b/PlaneGcsSdk_Shared/Copters/EmptyCopter.cs new file mode 100644 index 0000000..240cade --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/EmptyCopter.cs @@ -0,0 +1,104 @@ +using Plane.Communication; +using System.Threading; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + /// + /// 的空白实现。 + /// + public partial class EmptyCopter : CopterImplSharedPart, ICopter + { + private EmptyCopter(SynchronizationContext uiSyncContext) : base(uiSyncContext) + { + } + + public static EmptyCopter Instance { get; } = new EmptyCopter(SynchronizationContext.Current); + + public IConnection Connection { get; set; } = EmptyConnection.Instance; + + public string Id { get; } = "EmptyCopter"; + + public Task ConnectAsync() + { + return TaskUtils.CompletedTask; + } + + public Task DisconnectAsync() + { + return TaskUtils.CompletedTask; + } + + public Task GetCopterDataAsync() + { + return TaskUtils.CompletedTask; + } + + public Task GetParamAsync(string paramName, int millisecondsTimeout = -1) + { + return Task.FromResult(0f); + } + + public Task LockAsync() + { + return TaskUtils.CompletedTask; + } + + public override Task SetChannelsAsync() + { + return TaskUtils.CompletedTask; + } + + public override Task SetMobileControlAsync() + { + return TaskUtils.CompletedTask; + } + + public Task SetParamAsync(string paramName, float value, int millisecondsTimeout = -1) + { + return TaskUtils.CompletedTask; + } + + public Task StartPairingAsync() + { + return TaskUtils.CompletedTask; + } + + public Task StopPairingAsync() + { + return TaskUtils.CompletedTask; + } + + public Task TakeOffAsync(float alt) + { + return TaskUtils.CompletedTask; + } + + public Task UnlockAsync() + { + return TaskUtils.CompletedTask; + } + + internal override Task SetModeCoreAsync(FlightMode mode, int millisecondsTimeout = 5000) + { + return Task.FromResult(true); + } + + protected override Task FlyToCoreAsync(double lat, double lng, float alt) + { + return TaskUtils.CompletedTask; + } + } + +#if PRIVATE + + public partial class EmptyCopter : CopterImplSharedPart, ICopter + { + public Task RebootAsync(bool bootloaderMode = false) + { + return TaskUtils.CompletedTask; + } + } + +#endif +} diff --git a/PlaneGcsSdk_Shared/Copters/FakeCopter.Mission.cs b/PlaneGcsSdk_Shared/Copters/FakeCopter.Mission.cs new file mode 100644 index 0000000..ee3cc45 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/FakeCopter.Mission.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Plane.Copters +{ + public partial class FakeCopter + { + /// + /// 查询任务序列。若上一个操作未完成,本次结果为 null。 + /// + /// 超时时间。 + /// 飞行器返回的任务序列。若上一个操作未完成,本次结果为 null;若超时,结果为不完整的序列(_mission.Count 小于 MissionCount);若顺利完成,结果为完整的任务序列。 + public Task> RequestMissionListAsync(int millisecondsTimeout = 10000) + { + throw new NotImplementedException(); + } + + /// + /// 写入任务序列。 + /// + /// 任务序列。 + /// 若写入成功,返回 true;否则返回 false。 + public Task WriteMissionListAsync(IEnumerable missions, int millisecondsTimeout = 10000) + { + throw new NotImplementedException(); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/FakeCopter.cs b/PlaneGcsSdk_Shared/Copters/FakeCopter.cs new file mode 100644 index 0000000..2114922 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/FakeCopter.cs @@ -0,0 +1,622 @@ +using Plane.Communication; +using Plane.Geography; +using System; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using static Plane.Copters.Constants; + +namespace Plane.Copters +{ + /// + /// 虚拟的 实现。 + /// + [DebuggerDisplay("Name={Name}")] + public partial class FakeCopter : CopterImplSharedPart, IFakeCopter + { + /// + /// 心跳间隔,单位为毫秒。 + /// + private const int HEARTBEAT_INTERVAL = 200; + + /// + /// 在一个更新间隔中的最大移动距离。 + /// + private const float MAX_MOVE_IN_INTERVAL = MAX_VEL * UPDATE_INTERVAL / 1000; + + /// + /// 高速模式下,在一个更新间隔中的最大移动距离。 + /// + private const float MAX_MOVE_IN_INTERVAL_FAST = MAX_MOVE_IN_INTERVAL * 4; + + /// + /// 更新虚拟飞行器状态的时间间隔,单位为毫秒。 + /// + private const int UPDATE_INTERVAL = 100; + + /// + /// 对飞行器的模拟是否正在运行。 + /// + private bool _isRunning = false; + + /// + /// 上次计算速度时的位置。 + /// + private ILocation _lastCalcSpeedPoint; + + /// + /// 上次计算速度的时间。 + /// + private DateTime _lastCalcSpeedTime; + + /// + /// 高速模式下,按比例缩放过的在一个更新间隔中的最大移动距离。 + /// + private float _scaledFastMaxMoveInInterval = MAX_MOVE_IN_INTERVAL_FAST; + + /// + /// 按比例缩放过的在一个更新间隔中的最大移动距离。 + /// + private float _scaledMaxMoveInInterval = MAX_MOVE_IN_INTERVAL; + + /// + /// 速度缩放比例。 + /// + private float _speedScale = 1; + + /// + /// 自动起飞的目标高度。 + /// + private int _takeOffTargetAltitude; + + /// + /// FlyTo 的目标高度。 + /// + private float _targetAlt; + + /// + /// FlyTo 的目标纬度。 + /// + private double _targetLat; + + /// + /// FlyTo 的目标经度。 + /// + private double _targetLng; + + /// + /// 使用 创建 实例。 + /// + public FakeCopter() : this(SynchronizationContext.Current) + { + } + + /// + /// 创建 实例。 + /// + /// UI 线程的同步上下文。 + /// 自动起飞时的目标高度。 + /// 速度缩放比例。 + public FakeCopter(SynchronizationContext uiSyncContext, int takeOffTargetAltitude = 10, float speedScale = 1, IConnection connection = null) + : base(uiSyncContext) + { + Latitude = 23.155382266268134; + Longitude = 113.45038586296141; + + Elevation = 20; + this.PropertyChanged += (sender, e) => + { + switch (e.PropertyName) + { + case nameof(Altitude): + Elevation = Altitude + 20; + break; + + case nameof(IsUnlocked): + if (IsUnlocked) + { + // 林俊清, 20151029, 在解锁时上次计算速度点、上次计算速度时刻。 + _lastCalcSpeedPoint = new PLLocation { Latitude = Latitude, Longitude = Longitude, Altitude = Altitude }; + _lastCalcSpeedTime = DateTime.Now; + } + break; + } + }; + + _takeOffTargetAltitude = takeOffTargetAltitude; + + _speedScale = speedScale; + _scaledMaxMoveInInterval = MAX_MOVE_IN_INTERVAL * _speedScale; + _scaledFastMaxMoveInInterval = MAX_MOVE_IN_INTERVAL_FAST * _speedScale; + + this.Connection = connection ?? EmptyConnection.Instance; + + // 持续计算并更新虚拟飞行器的状态。 + Task.Run(async () => + { + while (true) + { + if (_isRunning) + { + Update(); + } + await TaskUtils.Delay(UPDATE_INTERVAL).ConfigureAwait(false); + } + }); + + // 持续假装收到飞行器发来的心跳。 + Task.Run(async () => + { + while (true) + { + if (_isRunning) + { + ++HeartbeatCount; + + IsCheckingConnection = false; + + if (HeartbeatCount >= 10) + { + // 收到若干个心跳之后,设置一下 GPS 相关属性。 + GpsFixType = GpsFixType.Fix3D; + GpsHdop = 1; + IsGpsAccurate = true; + HasSwitchedToGpsMode = true; + } + + _uiSyncContext.Post(() => RaiseHeartbeatReceived(new HeartbeatReceivedEventArgs(HeartbeatCount))); + } + await TaskUtils.Delay(HEARTBEAT_INTERVAL).ConfigureAwait(false); + } + }); + } + + public IConnection Connection { get; set; } + + public string Id { get; set; } + + private int ReturnToLaunchAltitude { get { return _takeOffTargetAltitude; } } + + public Task ConnectAsync() + { + IsConnected = true; + _isRunning = true; + IsCheckingConnection = true; + return TaskUtils.CompletedTask; + } + + public Task DisconnectAsync() + { + IsConnected = false; + _isRunning = false; + IsCheckingConnection = false; + return TaskUtils.CompletedTask; + } + + protected override Task FlyToCoreAsync(double lat, double lng, float alt) + { + if (!IsEmergencyHoverActive) + { + _targetLat = lat; + _targetLng = lng; + _targetAlt = alt; + Mode = FlightMode.GUIDED; + } + return TaskUtils.CompletedTask; + } + + public Task GetCopterDataAsync() + { + return TaskUtils.CompletedTask; + } + + public Task GetParamAsync(string paramName, int millisecondsTimeout = Timeout.Infinite) + { + // TODO: 林俊清, 20150806, 实现仿真的 GetParamAsync。 + return Task.FromResult(0f); + } + + public Task LockAsync() + { + if (IsUnlocked) + { + IsUnlocked = false; + } + return TaskUtils.CompletedTask; + } + + public override Task SetChannelsAsync() + { + Channel1 = DesiredChannel1 ?? Channel1; + Channel2 = DesiredChannel2 ?? Channel2; + Channel3 = DesiredChannel3 ?? Channel3; + Channel4 = DesiredChannel4 ?? Channel4; + Channel5 = DesiredChannel5 ?? Channel5; + Channel6 = DesiredChannel6 ?? Channel6; + Channel7 = DesiredChannel7 ?? Channel7; + Channel8 = DesiredChannel8 ?? Channel8; + return TaskUtils.CompletedTask; + } + + public override Task SetMobileControlAsync() + { + Channel1 = DesiredChannel1 ?? Channel1; + Channel2 = DesiredChannel2 ?? Channel2; + Channel3 = DesiredChannel3 ?? Channel3; + Channel4 = DesiredChannel4 ?? Channel4; + Channel5 = DesiredChannel5 ?? Channel5; + Channel6 = DesiredChannel6 ?? Channel6; + Channel7 = DesiredChannel7 ?? Channel7; + Channel8 = DesiredChannel8 ?? Channel8; + Yaw = DesiredYaw ?? Yaw; + Heading = (short)Yaw; + return TaskUtils.CompletedTask; + } + + public Task SetParamAsync(string paramName, float value, int millisecondsTimeout = Timeout.Infinite) + { + // TODO: 林俊清, 20150807, 实现仿真的 SetParamAsync。 + return TaskUtils.CompletedTask; + } + + public void SetProperties( + string id = null, //"Junqing's Drone", + double? latitude = null, //23.14973333, + double? longitude = null, //113.40974166, + float? altitude = null, //0, + string name = null, //"林俊清的飞行器", + byte? batteryPer = null, //10, + short? heading = null, //33, + bool? isConnected = null, //true, + float? pitch = null, //-70, + float? roll = null, //28, + byte? satCount = null, //6, + float? airSpeed = null, //3.333, + double? flightDistance = null, //100.388, + double? flightDistance2D = null, // 100.88, + TimeSpan? flightTimeSpan = null) + { + if (id != null) Id = id; + if (name != null) Name = name; + if (latitude != null) Latitude = latitude.Value; + if (longitude != null) Longitude = longitude.Value; + if (altitude != null) Altitude = altitude.Value; + if (batteryPer != null) BatteryPer = batteryPer.Value; + if (heading != null) Heading = heading.Value; + if (isConnected != null) IsConnected = isConnected.Value; + if (pitch != null) Pitch = pitch.Value; + if (roll != null) Roll = roll.Value; + if (satCount != null) SatCount = satCount.Value; + if (airSpeed != null) AirSpeed = airSpeed.Value; + if (flightDistance != null) FlightDistance = flightDistance.Value; + if (flightDistance2D != null) FlightDistance2D = flightDistance2D.Value; + if (flightTimeSpan != null) FlightTimeSpan = flightTimeSpan.Value; + } + + public Task StartPairingAsync() + { + RaisePairingCompleted(new PairingCompletedEventArgs(true, 0, 0)); + return TaskUtils.CompletedTask; + } + + public Task StopPairingAsync() + { + return TaskUtils.CompletedTask; + } + + public async Task TakeOffAsync(float alt) + { + await UnlockAsync().ConfigureAwait(false); + _takeOffTargetAltitude = (int)alt; + await TakeOffAsync().ConfigureAwait(false); + } + + public async Task UnlockAsync() + { + if (!IsUnlocked) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1100, + ch4: 1500 + ).ConfigureAwait(false); + if (await SetModeAsync(FlightMode.ALT_HOLD).ConfigureAwait(false)) + { + IsUnlocked = true; + } + } + } + + /// + /// 无论在不在紧急悬停状态下都可用的切换模式方法。 + /// + /// 模式。 + /// 超时。 + /// 成功与否。 + internal override Task SetModeCoreAsync(FlightMode mode, int millisecondsTimeout = 5000) + { + Mode = mode; + return Task.FromResult(true); + } + + protected override void UpdateFlightDataIfNeeded() + { + if (!TakeOffPoint.IsNullOrEmpty()) + { + FlightDistance = TakeOffPoint.CalcDistance(this); + FlightDistance2D = TakeOffPoint.CalcDistance2D(this); + } + if (FlightTimeSpan.TotalSeconds > 0) + { + if (_lastCalcSpeedPoint.IsNullOrEmpty()) + { + if (!this.IsNullOrEmpty()) + { + _lastCalcSpeedPoint = new PLLocation(this); + _lastCalcSpeedTime = DateTime.Now; + } + } + else + { + var movedDistance = _lastCalcSpeedPoint.CalcDistance(this); + var movedTime = DateTime.Now - _lastCalcSpeedTime; + if (movedDistance >= 3 || movedTime.TotalSeconds >= 3) + { + var airSpeed = movedDistance / movedTime.TotalSeconds; + if (airSpeed < 100) // 林俊清, 20151023, 速度过大时不正常,经纬度可能有错误。 + { + AirSpeed = (float)airSpeed; + } + GroundSpeed = AirSpeed; + _lastCalcSpeedPoint = new PLLocation(this); + _lastCalcSpeedTime = DateTime.Now; + } + } + } + } + + private void MoveToPointImmediately(double lat, double lng, float alt) + { + Latitude = lat; + Longitude = lng; + Altitude = alt; + Roll = 0; + Pitch = 0; + } + + private bool ReachedDestination(double destLat, double destLng, float destAlt) => this.CalcDistance(destLat, destLng, destAlt) < 0.1; + + /// + /// 计算并更新虚拟飞行器状态。 + /// + private void Update() + { + if (IsUnlocked) + { + // 飞行器接触地面(只判断 Altitude <= 0)后,如果处于 LAND 模式或者保持 Channel3 < MIN_HOVER_CHANNEL,在一段时间后自动锁定。 + if ((Mode == FlightMode.LAND || Channel3 < MIN_HOVER_CHANNEL) && Altitude <= 0) + { + Task.Run(async () => + { + for (int i = 0; i < 4000 / 20; i++) + { + await TaskUtils.Delay(20).ConfigureAwait(false); + if ((Mode != FlightMode.LAND && Channel3 >= MIN_HOVER_CHANNEL) || !IsUnlocked) + { + return; + } + } + IsUnlocked = false; + }); + } + else + { + switch (Mode) + { + case FlightMode.ACRO: + break; + + case FlightMode.AUTO: + // 暂时只管起飞。以最大速度上升,直到达到目标高度。 + if (Altitude < _takeOffTargetAltitude) + { + Altitude += _scaledMaxMoveInInterval; + } + else + { + Mode = FlightMode.LOITER; + } + break; + + case FlightMode.GUIDED: + // 林俊清, 20160317, 指点时也能体感控制若干通道。 + UpdateWithChannels(); + UpdateWithDestination(_targetLat, _targetLng, _targetAlt); + break; + + case FlightMode.STABILIZE: + case FlightMode.ALT_HOLD: + case FlightMode.LOITER: + UpdateWithChannels(); + break; + + case FlightMode.RTL: + if (Altitude < ReturnToLaunchAltitude && !ReachedDestination(Latitude, Longitude, ReturnToLaunchAltitude)) + { + UpdateWithDestination(Latitude, Longitude, ReturnToLaunchAltitude); + } + else if (Altitude > ReturnToLaunchAltitude && !ReachedDestination(TakeOffPoint.Latitude, TakeOffPoint.Longitude, Altitude)) + { + UpdateWithDestination(TakeOffPoint.Latitude, TakeOffPoint.Longitude, Altitude); + } + else + { + UpdateWithDestination(TakeOffPoint.Latitude, TakeOffPoint.Longitude, ReturnToLaunchAltitude); + } + break; + + case FlightMode.CIRCLE: + break; + + case FlightMode.POSITION: + break; + + case FlightMode.LAND: + // 林俊清, 20160317, 降落时也能体感控制若干通道。 + UpdateWithChannels(); + // 以最大速度降落,直到高度为 0。 + if (Altitude > 0) + { + if (Altitude > _scaledMaxMoveInInterval) + { + Altitude -= _scaledMaxMoveInInterval; + } + else + { + Altitude = 0; + } + Roll = 0; + Pitch = 0; + } + break; + + case FlightMode.OF_LOITER: + break; + + case FlightMode.TOY: + break; + + default: + break; + } + UpdateFlightDataIfNeeded(); + } + } + else + { + // TODO: 林俊清, 20151228, 模拟空中锁定。 + // 锁定时直接把速度设为 0。 + AirSpeed = 0; + } + _uiSyncContext.Post(() => + { + RaiseLocationChangedIfNeeded(); + RaiseAltitudeChangedIfNeeded(); + + RaiseDataStreamReceived(PDataStreamType.GPS_RAW_INT); + RaiseAttitudeChanged(); + }); + } + + /// + /// 根据各个通道值来更新位置、姿态等状态。 + /// + private void UpdateWithChannels() + { + var maxMove = Mode == FlightMode.LOITER ? _scaledMaxMoveInInterval : _scaledFastMaxMoveInInterval; + var ch3Delta = Channel3 > MAX_HOVER_CHANNEL ? Channel3 - MAX_HOVER_CHANNEL : Channel3 < MIN_HOVER_CHANNEL ? Channel3 - MIN_HOVER_CHANNEL : 0; + if (ch3Delta != 0) + { + // 更新相对高度。 + Altitude = Math.Max(0, Altitude + maxMove * ch3Delta / MAX_CHANNEL_DELTA); + } + + var yawRad = Yaw.DegToRad(); + var metersToLocalLng = GeographyUtils.CalcMetersToLngSpan(Latitude); + + var ch1Delta = Channel1 > MAX_HOVER_CHANNEL ? Channel1 - MAX_HOVER_CHANNEL : Channel1 < MIN_HOVER_CHANNEL ? Channel1 - MIN_HOVER_CHANNEL : 0; + var xDistance = maxMove * ch1Delta / MAX_CHANNEL_DELTA; + if (ch1Delta != 0) + { + // 更新横滚方向的纬度和经度。 + Latitude -= xDistance * Math.Sin(yawRad) * GeographyUtils.METERS_TO_LAT_SPAN; + Longitude += xDistance * Math.Cos(yawRad) * metersToLocalLng; + // 更新横滚姿态。 + Roll = MAX_TILT_IN_FLIGHT * ch1Delta / MAX_CHANNEL_DELTA; + } + else + { + Roll = 0; + } + + var ch2Delta = Channel2 > MAX_HOVER_CHANNEL ? Channel2 - MAX_HOVER_CHANNEL : Channel2 < MIN_HOVER_CHANNEL ? Channel2 - MIN_HOVER_CHANNEL : 0; + var yDistance = maxMove * ch2Delta / MAX_CHANNEL_DELTA; + if (ch2Delta != 0) + { + // 更新俯仰方向的纬度和经度。 + Latitude -= yDistance * Math.Cos(yawRad) * GeographyUtils.METERS_TO_LAT_SPAN; + Longitude -= yDistance * Math.Sin(yawRad) * metersToLocalLng; + // 更新俯仰姿态。 + Pitch = MAX_TILT_IN_FLIGHT * ch2Delta / MAX_CHANNEL_DELTA; + } + else + { + Pitch = 0; + } + } + + /// + /// 根据目的地来更新位置、姿态等状态。 + /// + private void UpdateWithDestination(ILocation loc) + { + UpdateWithDestination(loc.Latitude, loc.Longitude, loc.Altitude); + } + + /// + /// 根据目的地来更新位置、姿态等状态。 + /// + private void UpdateWithDestination(double lat, double lng, float alt) + { + // 与目标点之间的距离。 + var distance = this.CalcDistance(lat, lng, alt); + + // 距离已经很近,直接移动到目标点。 + if (distance < _scaledMaxMoveInInterval) + { + MoveToPointImmediately(lat, lng, alt); + return; + } + + // 在空间中的移动距离。 + var move = _scaledMaxMoveInInterval; + + // 竖直方向的移动距离。 + var altDelta = (float)(move * (alt - Altitude) / distance); + // 更新高度。 + Altitude += altDelta; + + // 目标点相对于当前位置的方向。 + var direction = this.CalcDirection2D(lat, lng); + + // 更新姿态。 + if (Mode == FlightMode.RTL) + { + // 林俊清, 20160126, 目前飞行器只在返航时会旋转机头,面对飞行方向。 + Yaw = (float)direction.RadToDeg(); + Heading = (short)Yaw; + Roll = 0; + Pitch = MAX_TILT_IN_FLIGHT; + } + else + { + var directionDelta = direction - Heading.DegToRad(); + Roll = MAX_TILT_IN_FLIGHT * (float)Math.Sin(directionDelta); + Pitch = MAX_TILT_IN_FLIGHT * (float)Math.Cos(directionDelta); + } + + // 水平面上的移动距离。 + var moveInHorizontalPlane = Math.Sqrt(move * move - altDelta * altDelta); + if (double.IsNaN(moveInHorizontalPlane)) + { + MoveToPointImmediately(lat, lng, alt); + return; + } + // 更新纬度。 + Longitude += moveInHorizontalPlane * Math.Sin(direction) * GeographyUtils.CalcMetersToLngSpan(Latitude); + // 更新经度。 + Latitude += moveInHorizontalPlane * Math.Cos(direction) * GeographyUtils.METERS_TO_LAT_SPAN; + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/FlightMode.cs b/PlaneGcsSdk_Shared/Copters/FlightMode.cs new file mode 100644 index 0000000..467819c --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/FlightMode.cs @@ -0,0 +1,84 @@ +using System; + +namespace Plane.Copters +{ +#if PRIVATE + public +#else + internal +#endif + enum FlightMode + { + // 林俊清,20150608:不可将以下枚举项重命名。 + + STABILIZE = 0, // hold level position + + ACRO = 1, // rate control // 林俊清, 20160205, 特技模式:http://copter.ardupilot.cn/wiki/acro-mode/ + + ALT_HOLD = 2, // AUTO control + + AUTO = 3, // AUTO control + + GUIDED = 4, // AUTO control + + LOITER = 5, // Hold a single location + + RTL = 6, // AUTO control + + CIRCLE = 7, + + POSITION = 8, // 林俊清, 20160205, 位置模式:http://copter.ardupilot.cn/wiki/POSITION-mode/ + + LAND = 9, // AUTO control + + OF_LOITER = 10, // 林俊清, 20160205, 光流悬停模式:http://copter.ardupilot.cn/wiki/loiter-mode/ 底部。 + + TOY = 11 + } + + internal static class FightModeExtensions + { + public static string GetModeString(this FlightMode flightMode) + { + switch (flightMode) + { + case FlightMode.ALT_HOLD: + return "ALT HOLD"; + + case FlightMode.POSITION: + return "POS HOLD"; + + default: + return Enum.GetName(typeof(FlightMode), flightMode); + } + } + + public static bool NeedGps(this FlightMode flightMode) + { + switch (flightMode) + { + case FlightMode.AUTO: + case FlightMode.GUIDED: + case FlightMode.LOITER: + case FlightMode.RTL: + case FlightMode.CIRCLE: + case FlightMode.LAND: + case FlightMode.POSITION: + default: + return true; + + case FlightMode.STABILIZE: + case FlightMode.ACRO: + case FlightMode.ALT_HOLD: + case FlightMode.OF_LOITER: + case FlightMode.TOY: + return false; + } + } + + internal static PlaneCopter.ac2modes ToAC2Mode(this FlightMode flightMode) + { + return (PlaneCopter.ac2modes)flightMode; + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/Mission.cs b/PlaneGcsSdk_Shared/Copters/Mission.cs new file mode 100644 index 0000000..f9fc282 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/Mission.cs @@ -0,0 +1,151 @@ +using Plane.Geography; +using System.ComponentModel; +using System.Threading; + +namespace Plane.Copters +{ + /// + /// 存储自动飞行任务的参数。 + /// + public class Mission : PLObservableObject, IMission + { + #region Backing Fields + + private float _Altitude; + private FlightCommand _Command; + private double _Latitude; + private double _Longitude; + private float _Param1; + private float _Param3; + private float _Param4; + private ushort _Sequence; + + #endregion Backing Fields + + /// + /// 创建 的实例。 + /// + /// 与 UI 线程关联的 实例,用于 UWP 项目中在 UI 线程引发 事件。 + public Mission(SynchronizationContext uiSyncContext = null) + : base(uiSyncContext ?? SynchronizationContext.Current) + { } + + /// + /// 获取或设置相对于起飞点的高度。 + /// + public float Altitude + { + get { return _Altitude; } + set { Set(nameof(Altitude), ref _Altitude, value); } + } + + /// + /// 获取或设置飞行命令。 + /// + public FlightCommand Command + { + get { return _Command; } + set { Set(nameof(Command), ref _Command, value); } + } + + /// + /// 获取或设置纬度。 + /// + public double Latitude + { + get { return _Latitude; } + set { Set(nameof(Latitude), ref _Latitude, value); } + } + + /// + /// 获取或设置经度。 + /// + public double Longitude + { + get { return _Longitude; } + set { Set(nameof(Longitude), ref _Longitude, value); } + } + + /// + /// 获取或设置参数 1。通常用来指定判断为到达的最大半径,单位为米。 + /// + public float Param1 + { + get { return _Param1; } + set { Set(nameof(Param1), ref _Param1, value); } + } + + /// + /// 获取或设置参数 2。通常用来指定停留时间,单位为毫秒。 + /// + public virtual float Param2 { get; set; } + + /// + /// 获取或设置参数 3。通常用来指定盘旋半径,单位为米,正数表示顺时针,负数表示逆时针。 + /// + public float Param3 + { + get { return _Param3; } + set { Set(nameof(Param3), ref _Param3, value); } + } + + /// + /// 获取或设置参数 4。通常用来指定机头方向,单位为角度,北方为 0,东方为 90,范围为 [0, 360)。 + /// + public float Param4 + { + get { return _Param4; } + set { Set(nameof(Param4), ref _Param4, value); } + } + + /// + /// 获取或设置序号。 + /// + public ushort Sequence + { + get { return _Sequence; } + set { Set(nameof(Sequence), ref _Sequence, value); } + } + + /// + /// 创建降落任务。 + /// + /// 降落任务。 + public static IMission CreateLandMission() => new Mission + { + Command = FlightCommand.Land + }; + + /// + /// 创建返航任务。 + /// + /// 返航任务。 + public static IMission CreateReturnToLaunchMission() => new Mission + { + Command = FlightCommand.ReturnToLaunch + }; + + /// + /// 创建航点任务。 + /// + /// 航点目的地。 + /// 航点任务。 + public static IMission CreateWaypointMission(ILocation loc) => + CreateWaypointMission(loc.Latitude, loc.Longitude, loc.Altitude); + + /// + /// 创建航点任务。 + /// + /// 目的地纬度。 + /// 目的地经度。 + /// 目的地相巴拉圭高度。 + /// 航点任务。 + public static IMission CreateWaypointMission(double lat, double lng, float alt) => new Mission + { + Command = FlightCommand.Waypoint, + Latitude = lat, + Longitude = lng, + Altitude = alt + }; + } +} diff --git a/PlaneGcsSdk_Shared/Copters/PLCopter.cs b/PlaneGcsSdk_Shared/Copters/PLCopter.cs new file mode 100644 index 0000000..0122be3 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/PLCopter.cs @@ -0,0 +1,295 @@ +using Plane.Communication; +using Plane.Protocols; +using System; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; +using TaskTools.Utilities; + +namespace Plane.Copters +{ + [DebuggerDisplay("Name={Name}")] + public partial class PLCopter : CopterImplSharedPart, ICopter + { + private double _FlightDistance2D; + + private PlaneCopter _internalCopter; + + private int _setModeCount = 0; + + private int _takeOffCount; + +#if PRIVATE + public PLCopter(IConnection connection, SynchronizationContext uiSyncContext, bool autoSendHeartbeat = true, bool autoRequestData = true) : base(uiSyncContext) + { + _internalCopter = new PlaneCopter(connection, uiSyncContext, autoSendHeartbeat, autoRequestData); +#else + public PLCopter(IConnection connection, SynchronizationContext uiSyncContext) : base(uiSyncContext) + { + _internalCopter = new PlaneCopter(connection, uiSyncContext); +#endif + RegisterInternalCopterEventHandlers(); + } + + public IConnection Connection + { + get { return _internalCopter.Connection; } + set { _internalCopter.Connection = value; } + } + + /// + /// 飞控发回的在二维平面上的飞行距离(隐藏了基类计算的同名属性)。 + /// + public new double FlightDistance2D + { + get { return _FlightDistance2D; } + protected set { Set(nameof(FlightDistance2D), ref _FlightDistance2D, value); } + } + + public string Id { get { return _internalCopter.Id; } set { _internalCopter.Id = value; } } + + public virtual async Task ConnectAsync() + { + await _internalCopter.ConnectAsync().ConfigureAwait(false); + IsConnected = _internalCopter.IsConnected; + IsCheckingConnection = true; + } + + public virtual async Task DisconnectAsync() + { + if (_isMobileControlActive) StopMobileControl(); + await _internalCopter.DisconnectAsync(); + IsConnected = _internalCopter.IsConnected; + IsCheckingConnection = false; + } + + public async Task GetCopterDataAsync() + { + await _internalCopter.GetCopterDataAsync(); + } + + public async Task GetParamAsync(string paramName, int millisecondsTimeout = Timeout.Infinite) + { + return await _internalCopter.GetParamAsync(paramName, millisecondsTimeout).ConfigureAwait(false); + } + + /// + /// 锁定飞行器。在调用之前务必判断高度及让使用者确认! + /// + public async Task LockAsync() + { + if (IsUnlocked) + { + await _internalCopter.DoARMAsync(false).ConfigureAwait(false); + } + } + + public override async Task SetChannelsAsync() + { + await _internalCopter.SetChannelsAsync( + DesiredChannel1, + DesiredChannel2, + DesiredChannel3, + DesiredChannel4, + DesiredChannel5, + DesiredChannel6, + DesiredChannel7, + DesiredChannel8 + ).ConfigureAwait(false); + } + + public override async Task SetMobileControlAsync() + { + await _internalCopter.SetMobileControlAsync( + DesiredChannel1, + DesiredChannel2, + DesiredChannel3, + DesiredChannel4, + DesiredChannel5, + DesiredChannel6, + DesiredChannel7, + DesiredChannel8, + DesiredYaw + ).ConfigureAwait(false); + } + + public async Task SetParamAsync(string paramName, float paramValue, int millisecondsTimeout = Timeout.Infinite) + { + var stopwatch = Stopwatch.StartNew(); + while (true) + { + for (int ii = 0; ii < 5; ii++) + { + await _internalCopter.SetParam2Async(paramName, paramValue).ConfigureAwait(false); + await Task.Delay(5).ConfigureAwait(false); + } + + int i = 0; + try + { + //for (; i < 5 && await _internalCopter.GetParamAsync(paramName, millisecondsTimeout-4000) != paramValue; i++) + //{ + // await Task.Delay(5).ConfigureAwait(false); + //} + + if (await _internalCopter.GetParamAsync(paramName, 1000) == paramValue) + { + i = 1; + } + } + catch (TimeoutException) + { + stopwatch.Stop(); + throw; + } + if (i == 1) + { + stopwatch.Stop(); + break; + } + else if (millisecondsTimeout != Timeout.Infinite && stopwatch.ElapsedMilliseconds >= millisecondsTimeout) + { + stopwatch.Stop(); + throw new TimeoutException("The SetParamAsync operation has timed out."); + } + } + } + + public async Task StartPairingAsync() + { + if (IsPairing) return; + IsPairing = true; + var packet = new MAVLink.mavlink_set_pair_t + { + pair = 1 + }; + await _internalCopter.GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_SET_PAIR, packet).ConfigureAwait(false); + } + + public async Task StopPairingAsync() + { + if (!IsPairing) return; + IsPairing = false; + var packet = new MAVLink.mavlink_set_pair_t + { + pair = 0 + }; + await _internalCopter.GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_SET_PAIR, packet).ConfigureAwait(false); + } + + public async Task TakeOffAsync(float alt) + { + var currentTakeOffCount = ++_takeOffCount; + // 林俊清, 20160312, 从固件版本 3.1.1(0x3101)开始支持直接解锁起飞命令。 + if (FirmwareVersion >= 0x3101) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1500, + ch4: 1500 + ).ConfigureAwait(false); + _forcedState = CopterState.TakingOff; + State = CopterState.TakingOff; + await _internalCopter.DoCommandAsync(MAVLink.MAV_CMD.TAKEOFF, 0, 0, 0, 0, 0, 0, alt).ConfigureAwait(false); + var temp = Task.Run(async () => + { + var startTime = DateTime.Now; + var secondsTimeout = alt / 0.7; + while (currentTakeOffCount == _takeOffCount) + { + if (alt - Altitude < 0.2 || startTime.AddSeconds(secondsTimeout) <= DateTime.Now) + { + _forcedState = null; + await HoverAsync().ConfigureAwait(false); + break; + } + await Task.Delay(50).ConfigureAwait(false); + } + }); + } + else + { + await UnlockAsync().ConfigureAwait(false); + // 循环检查是否已解锁,若已解锁则起飞。最多检查 4 次,每次检查之前等待 500 毫秒。 + for (int i = 0; currentTakeOffCount == _takeOffCount && i < 4; i++) + { + await Task.Delay(500).ConfigureAwait(false); + if (IsUnlocked) + { + await TakeOffAsync().ConfigureAwait(false); + return; + } + } + } + } + + public async Task UnlockAsync() + { + if (!IsUnlocked) + { + await SetChannelsAsync( + ch1: 1500, + ch2: 1500, + ch3: 1100, + ch4: 1500 + ).ConfigureAwait(false); + if (await SetModeAsync(FlightMode.ALT_HOLD).ConfigureAwait(false)) + { + await _internalCopter.DoARMAsync(true).ConfigureAwait(false); + } + } + } + + /// + /// 无论在不在紧急悬停状态下都可用的切换模式方法。 + /// + /// 模式。 + /// 超时。 + /// 成功与否。 + internal override async Task SetModeCoreAsync(FlightMode mode, int millisecondsTimeout = 5000) + { + var currentSetModeCount = ++_setModeCount; + Stopwatch stopwatch = null; + bool noTimeout = millisecondsTimeout == Timeout.Infinite; + if (!noTimeout) + { + stopwatch = Stopwatch.StartNew(); + } + await _internalCopter.SetModeAsync(mode.ToAC2Mode()).ConfigureAwait(false); + int i = 1; + bool anotherSetModeActionCalled = false; + while ((noTimeout || stopwatch.ElapsedMilliseconds < millisecondsTimeout) + && Mode != mode) + { + if (currentSetModeCount != _setModeCount) + { + anotherSetModeActionCalled = true; + break; + } + if (i % 8 == 0) await _internalCopter.SetModeAsync(mode.ToAC2Mode()).ConfigureAwait(false); + await Task.Delay(30).ConfigureAwait(false); + i++; + } + if (stopwatch != null && stopwatch.IsRunning) + { + stopwatch.Stop(); + } + return !anotherSetModeActionCalled && Mode == mode; + } + + protected override async Task FlyToCoreAsync(double lat, double lng, float alt) + { + if (!IsEmergencyHoverActive) + { + await _internalCopter.SetGuidedModeWPAsync(new Locationwp + { + alt = alt, + id = (byte)MAVLink.MAV_CMD.WAYPOINT, + lat = lat, + lng = lng + }).ConfigureAwait(false); + } + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/PlaneCopter.Events.cs b/PlaneGcsSdk_Shared/Copters/PlaneCopter.Events.cs new file mode 100644 index 0000000..ebfc0a4 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/PlaneCopter.Events.cs @@ -0,0 +1,80 @@ +using Plane.Protocols; +using System; + +namespace Plane.Copters +{ + partial class PlaneCopter + { + public delegate void ErrorDataEventHandle(uint itimes, ulong iDataCount, byte sCommand); + + public delegate void GetLogData(string log); + + public delegate void MissionResultHandle(MAVLink.MAV_MISSION_RESULT missionresult); + + public delegate void MyEvent(object sender, String ParamID, int ParamIndex, int ParamCount); + + public delegate void MyEventHandler(object sender, uint iError, ulong iCount); + + public delegate void MyRevEvent(object sender, byte StreamType); + + public delegate void MyRevScaleImu2Event(object sender); + + public delegate void MyRevSensorEvent(object sender); + + public delegate void MyRevSysEvent(object sender, byte StreamType, bool GPSBadHealth, bool GyroBadHealth, bool AccelBadHealth, bool CompassBadHealth, bool BarometerBadHealth, bool canTakeOff); + + public event EventHandler ConnectionBroken; + + public event ErrorDataEventHandle ErrorDataEvent; + + public event GetLogData GetLogDataEvent; + + public event EventHandler MessageCreated; + + /// + /// 在数据包被解析后引发。 + /// + public event EventHandler PacketHandled; + + /// + /// 在接收到数据包但未解析后引发。 + /// + public event EventHandler PacketReceived; + + public event MyRevEvent ReceiveDataStreamEvent; + + public event MyEventHandler ReceiveHeartBearEvent; + + public event MyEvent ReceiveParamEvent; + + public event MyRevSensorEvent ReceiveScaleImu2Event; + + public event MyRevSensorEvent ReceiveSensorEvent; + + public event MyRevSysEvent ReceiveSysStatusEvent; + + /// + /// 在尝试解析数据包但未找到对应的解析方法时引发。 + /// + public event EventHandler UnhandledPacketReceived; + + private void RaiseReceiveDataStreamEventOnUIThread(byte messageId) + { + var handler = ReceiveDataStreamEvent; + if (handler != null) + { + RunOnUIThread(() => handler(this, messageId)); + } + } + + public class PacketReceivedEventArgs : EventArgs + { + public PacketReceivedEventArgs(byte[] packet) + { + this.Packet = packet; + } + + public byte[] Packet { get; set; } + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/PlaneCopter.NestedTypes.cs b/PlaneGcsSdk_Shared/Copters/PlaneCopter.NestedTypes.cs new file mode 100644 index 0000000..c16e447 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/PlaneCopter.NestedTypes.cs @@ -0,0 +1,178 @@ +using Plane.Protocols; +using System.Collections; +using System.Collections.Generic; +using TaskTools.Attributes; + +namespace Plane.Copters +{ + partial class PlaneCopter + { + public class Mavlink_Sensors + { + BitArray bitArray = new BitArray(32); + + public Mavlink_Sensors() + { + } + + public Mavlink_Sensors(uint p) + { + bitArray = new BitArray(new int[] { (int)p }); + } + + public bool gyro { get { return bitArray[0]; } set { bitArray[0] = value; } } + public bool accelerometer { get { return bitArray[1]; } set { bitArray[1] = value; } } + public bool compass { get { return bitArray[2]; } set { bitArray[2] = value; } } + public bool barometer { get { return bitArray[3]; } set { bitArray[3] = value; } } + public bool differential_pressure { get { return bitArray[4]; } set { bitArray[4] = value; } } + public bool gps { get { return bitArray[5]; } set { bitArray[5] = value; } } + public bool optical_flow { get { return bitArray[6]; } set { bitArray[6] = value; } } + public bool unused_7 { get { return bitArray[7]; } set { bitArray[7] = value; } } + public bool CanTakeOff { get { return bitArray[8]; } set { bitArray[8] = value; } } + public bool unused_9 { get { return bitArray[9]; } set { bitArray[9] = value; } } + public bool rate_control { get { return bitArray[10]; } set { bitArray[10] = value; } } + public bool attitude_stabilization { get { return bitArray[11]; } set { bitArray[11] = value; } } + public bool yaw_position { get { return bitArray[12]; } set { bitArray[12] = value; } } + public bool altitude_control { get { return bitArray[13]; } set { bitArray[13] = value; } } + public bool xy_position_control { get { return bitArray[14]; } set { bitArray[14] = value; } } + public bool motor_control { get { return bitArray[15]; } set { bitArray[15] = value; } } + public bool rc_receiver { get { return bitArray[16]; } set { bitArray[16] = value; } } + + public int Value + { + get + { + int[] array = new int[1]; + ((ICollection)bitArray).CopyTo(array, 0); + return array[0]; + } + // 林俊清,20150703:BitArray 的构造函数的参数是数组长度,这里根本不对啊。 + //set + //{ + // bitArray = new BitArray(value); + //} + } + } + + public class MAVState + { + public MAVState() + { + sysid = 0; + compid = 0; + param = new Dictionary(); + packets = new byte[0x100][]; + packetseencount = new int[0x100]; + aptype = 0; + apname = 0; + recvpacketcount = 0; + } + + /// + /// the static global state of the currently connected MAV + /// + //public CurrentState cs = new CurrentState(); + /// + /// mavlink remote sysid + /// + public byte sysid { get; set; } + /// + /// mavlink remove compid + /// + public byte compid { get; set; } + /// + /// storage for whole paramater list + /// + public Dictionary param { get; set; } + /// + /// storage of a previous packet recevied of a specific type + /// + public byte[][] packets { get; set; } + public int[] packetseencount { get; set; } + /// + /// mavlink ap type + /// + public MAVLink.MAV_TYPE aptype { get; set; } + public MAVLink.MAV_AUTOPILOT apname { get; set; } + /// + /// used as a snapshot of what is loaded on the ap atm. - derived from the stream + /// + public Dictionary wps = new Dictionary(); + + public Dictionary rallypoints = new Dictionary(); + + public Dictionary fencepoints = new Dictionary(); + + /// + /// Store the guided mode wp location + /// + public MAVLink.mavlink_mission_item_t GuidedMode = new MAVLink.mavlink_mission_item_t(); + + internal int recvpacketcount = 0; + } + + public enum sensoroffsetsenum + { + gyro = 0, + accelerometer = 1, + magnetometer = 2, + barometer = 3, + optical_flow = 4, + second_magnetometer = 5 + } + + public enum ac2modes + { + [DisplayText("STABILIZE")] + STABILIZE = 0, // hold level position + [DisplayText("ACRO")] + ACRO = 1, // rate control + [DisplayText("ALT HOLD")] + ALT_HOLD = 2, // AUTO control + [DisplayText("AUTO")] + AUTO = 3, // AUTO control + [DisplayText("GUIDED")] + GUIDED = 4, // AUTO control + [DisplayText("LOITER")] + LOITER = 5, // Hold a single location + [DisplayText("RTL")] + RTL = 6, // AUTO control + [DisplayText("CIRCLE")] + CIRCLE = 7, + [DisplayText("POS HOLD")] + POSITION = 8, + [DisplayText("LAND")] + LAND = 9, // AUTO control + OF_LOITER = 10, + [DisplayText("TOY")] + TOY = 11 + } + + public enum ac2modes_cn + { + [DisplayText("增稳模式")] + STABILIZE = 0, // hold level position + [DisplayText("ACRO")] + ACRO = 1, // rate control + [DisplayText("定高模式")] + ALT_HOLD = 2, // AUTO control + [DisplayText("自动航线")] + AUTO = 3, // AUTO control + [DisplayText("指令模式")] + GUIDED = 4, // AUTO control + [DisplayText("定点定高")] + LOITER = 5, // Hold a single location + [DisplayText("返航模式")] + RTL = 6, // AUTO control + [DisplayText("盘旋模式")] + CIRCLE = 7, + [DisplayText("位置保持")] + POSITION = 8, + [DisplayText("降落")] + LAND = 9, // AUTO control + OF_LOITER = 10, + [DisplayText("玩具")] + TOY = 11 + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/PlaneCopter.PacketAnalysis.cs b/PlaneGcsSdk_Shared/Copters/PlaneCopter.PacketAnalysis.cs new file mode 100644 index 0000000..af7b983 --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/PlaneCopter.PacketAnalysis.cs @@ -0,0 +1,377 @@ +//#define LOG_PACKETS + +using Plane.Protocols; +using System; +using System.Diagnostics; +using System.Text; +using System.Threading.Tasks; +using TaskTools.Utilities; + +#if LOG_PACKETS + +using System.Diagnostics; + +#endif + +namespace Plane.Copters +{ + partial class PlaneCopter + { + private void AnalyzeAttitudePacket(byte[] buffer) + { + var att = buffer.ByteArrayToStructure(6); + roll = att.roll * rad2deg; + pitch = att.pitch * rad2deg; + yaw = att.yaw * rad2deg; + timebootms = att.time_boot_ms; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeGlobalPositionIntPacket(byte[] buffer) + { + var loc = buffer.ByteArrayToStructure(6); + useLocation = true; + if (loc.lat == 0 && loc.lon == 0) + { + useLocation = false; + } + else + { + gpsalt = loc.alt / 1000.0f; + lat = loc.lat / 10000000.0; + lng = loc.lon / 10000000.0; + } + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + +#if LOG_GPS_RAW_INT + private Stopwatch _lastGpsRawIntPacketTime = new Stopwatch(); + private TimeSpan _lastGpsRawIntPacketTimeSpan; +#endif + + private void AnalyzeGpsRawIntPacket(byte[] buffer) + { +#if LOG_GPS_RAW_INT + if (!_lastGpsRawIntPacketTime.IsRunning) + { + _lastGpsRawIntPacketTime.Start(); + } + else + { + var elapsed = _lastGpsRawIntPacketTime.Elapsed; + Debug.WriteLine(elapsed - _lastGpsRawIntPacketTimeSpan, "----------------------------GpsRawInt"); + _lastGpsRawIntPacketTimeSpan = elapsed; + } +#endif + var gps = buffer.ByteArrayToStructure(6); + long mylat = BitConverter.ToInt32(buffer, 14); + long mylong = BitConverter.ToInt32(buffer, 18); + //if (!useLocation) + //{ + lat = gps.lat * 1.0e-7; + lng = gps.lon * 1.0e-7; + //} + gpsalt = gps.alt * 1.0e-7f; // using vfr as includes baro calc + gpsstatus = gps.fix_type; //0-1: no fix, 2: 2D fix, 3: 3D fix + gpshdop = (float)Math.Round(gps.eph / 100.0, 2); + satcount = gps.satellites_visible; + groundspeed = gps.vel * 1.0e-2f; + groundcourse = gps.cog * 1.0e-2f; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + +#if LOG_PACKETS + private DateTime _lastHeartbeatTime = DateTime.MinValue; +#endif + + private void AnalyzeHeartbeatPacket(byte[] buffer) + { +#if LOG_PACKETS + var now = DateTime.Now; + if (_lastHeartbeatTime != DateTime.MinValue) + { + Debug.WriteLine(now - _lastHeartbeatTime, "心跳间隔"); + } + _lastHeartbeatTime = now; +#endif + DataTimeOut = 0; + var hb = buffer.ByteArrayToStructure(6); + mavlinkversion = hb.mavlink_version; + aptype = (MAVLink.MAV_TYPE)hb.type; + apname = (MAVLink.MAV_AUTOPILOT)hb.autopilot; + sysid = buffer[3]; + compid = buffer[4]; + recvpacketcount = buffer[2]; + armed = (hb.base_mode & (byte)MAVLink.MAV_MODE_FLAG.SAFETY_ARMED) == (byte)MAVLink.MAV_MODE_FLAG.SAFETY_ARMED; + failsafe = hb.system_status == (byte)MAVLink.MAV_STATE.CRITICAL; + mode = hb.custom_mode; + + var handler = ReceiveHeartBearEvent; + if (handler != null) + { + RunOnUIThread(() => + { + handler(this, iErrorData, iDataCount); + }); + } + + if (_autoRequestData && mavlinkversion == 3 && SendReq == false) + { + SendReq = true; + Task.Run(GetCopterDataAsync); + } + } + + private void AnalyzeMemInfoPacket(byte[] buffer) + { + var mem = buffer.ByteArrayToStructure(6); + freemem = mem.freemem; + brklevel = mem.brkval; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeMissionCurrentPacket(byte[] buffer) + { + var wpcur = buffer.ByteArrayToStructure(6); + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeNavControllerOutputPacket(byte[] buffer) + { + var nav = buffer.ByteArrayToStructure(6); + nav_roll = nav.nav_roll; + nav_pitch = nav.nav_pitch; + nav_bearing = nav.nav_bearing; + target_bearing = nav.target_bearing; + wp_dist = nav.wp_dist; + alt_error = nav.alt_error; + aspd_error = nav.aspd_error / 100.0f; + xtrack_error = nav.xtrack_error; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeParamValuePacket(byte[] buffer) + { + var par = buffer.ByteArrayToStructure(6); + param_total = (par.param_count); + string paramID = Encoding.ASCII.GetString(par.param_id); + int pos = paramID.IndexOf('\0'); + if (pos != -1) + { + paramID = paramID.Substring(0, pos); + } + try + { + param[paramID] = (par.param_value); + param_types[paramID] = (MAVLink.MAV_PARAM_TYPE)par.param_type; + } + catch (IndexOutOfRangeException ex) + { + Debug.WriteLine(ex); + } + + var handler = ReceiveParamEvent; + if (handler != null) + { + RunOnUIThread(() => + { + handler(this, paramID, par.param_index, par.param_count); + }); + } + } + + private void AnalyzeRadioPacket(byte[] buffer) + { + var radio = buffer.ByteArrayToStructure(6); + //Debug.Print("fix:" + radio.fixedp + " noise:" + radio.noise + " remnoise:" + radio.remnoise + " remrssi:" + radio.remrssi + " rssi:" + radio.rssi + " rxerr:" + radio.rxerrors + " txbuf:" + radio.txbuf); + remrssi = radio.remrssi; + rssi = radio.rssi; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeRawImuPacket(byte[] buffer) + { + var imu = buffer.ByteArrayToStructure(6); + + gx = imu.xgyro; + gy = imu.ygyro; + gz = imu.zgyro; + + ax = imu.xacc; + ay = imu.yacc; + az = imu.zacc; + + mx = imu.xmag; + my = imu.ymag; + mz = imu.zmag; + + var handler = ReceiveSensorEvent; + if (handler != null) + { + RunOnUIThread(() => + { + handler(this); + }); + } + } + + private void AnalyzeRCChannelsRawPacket(byte[] buffer) + { + var rcin = buffer.ByteArrayToStructure(6); + + ch1in = rcin.chan1_raw; + ch2in = rcin.chan2_raw; + ch3in = rcin.chan3_raw; + ch4in = rcin.chan4_raw; + ch5in = rcin.chan5_raw; + ch6in = rcin.chan6_raw; + ch7in = rcin.chan7_raw; + ch8in = rcin.chan8_raw; + if (bInitChannel == false) + { + bInitChannel = true; + } + + //percent + rxrssi = (float)((rcin.rssi / 255.0) * 100.0); + + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + + private void AnalyzeScaledImu2Packet(byte[] buffer) + { + var imu2 = buffer.ByteArrayToStructure(6); + gx2 = imu2.xgyro; + gy2 = imu2.ygyro; + gz2 = imu2.zgyro; + + ax2 = imu2.xacc; + ay2 = imu2.yacc; + az2 = imu2.zacc; + + mx2 = imu2.xmag; + my2 = imu2.ymag; + mz2 = imu2.zmag; + + var handler = ReceiveScaleImu2Event; + if (handler != null) + { + RunOnUIThread(() => handler(this)); + } + } + + private void AnalyzeSensorOffsetsPacket(byte[] buffer) + { + var sensofs = buffer.ByteArrayToStructure(6); + + mag_ofs_x = sensofs.mag_ofs_x; + mag_ofs_y = sensofs.mag_ofs_y; + mag_ofs_z = sensofs.mag_ofs_z; + mag_declination = sensofs.mag_declination; + + raw_press = sensofs.raw_press; + raw_temp = sensofs.raw_temp; + + gyro_cal_x = sensofs.gyro_cal_x; + gyro_cal_y = sensofs.gyro_cal_y; + gyro_cal_z = sensofs.gyro_cal_z; + + accel_cal_x = sensofs.accel_cal_x; + accel_cal_y = sensofs.accel_cal_y; + accel_cal_z = sensofs.accel_cal_z; + + var handler = ReceiveSensorEvent; + if (handler != null) + { + RunOnUIThread(() => + { + handler(this); + }); + } + } + + private void AnalyzeStatusTextPacket(byte[] buffer) + { + var stext = buffer.ByteArrayToStructure(6); + var length = Array.IndexOf(stext.text, 0); + var log = Encoding.ASCII.GetString(stext.text, 0, length); + var handler = GetLogDataEvent; + if (handler != null) + { + RunOnUIThread(() => handler(log)); + } + } + + private void AnalyzeSysStatusPacket(byte[] buffer) + { + var sysstatus = buffer.ByteArrayToStructure(6); + battery_voltage = sysstatus.voltage_battery; + battery_remaining = sysstatus.battery_remaining; + current_battery = sysstatus.current_battery / 100.0f; + + var sensors_enabled = new Mavlink_Sensors(sysstatus.onboard_control_sensors_enabled); + var sensors_health = new Mavlink_Sensors(sysstatus.onboard_control_sensors_health); + + if (sensors_health.gps != sensors_enabled.gps) + { + bGPSBadHealth = true; + } + else + { + bGPSBadHealth = false; + } + if (sensors_health.gyro != sensors_enabled.gyro) + { + bGyroBadHealth = true; + } + else + { + bGyroBadHealth = false; + } + if (sensors_health.accelerometer != sensors_enabled.accelerometer) + { + bAccel = true; + } + else + { + bAccel = false; + } + if (sensors_health.compass != sensors_enabled.compass) + { + bCompass = true; + } + else + { + bCompass = false; + } + if (sensors_health.barometer != sensors_enabled.barometer) + { + bBarometer = true; + } + else + { + bBarometer = false; + } + FlightDistance2D = sysstatus.errors_count2; + var handler = ReceiveSysStatusEvent; + if (handler != null) + { + RunOnUIThread(() => + { + handler(this, buffer[5], bGPSBadHealth, bGyroBadHealth, bAccel, bCompass, bBarometer, sensors_health.CanTakeOff); + }); + } + } + + private void AnalyzeVfrHudPacket(byte[] buffer) + { + var vfr = buffer.ByteArrayToStructure(6); + groundspeed = vfr.groundspeed; + airspeed = vfr.airspeed; + altorigin = vfr.alt; // this might include baro + ch3percent = vfr.throttle; + heading = vfr.heading; + RaiseReceiveDataStreamEventOnUIThread(buffer[5]); + } + } +} diff --git a/PlaneGcsSdk_Shared/Copters/PlaneCopter.cs b/PlaneGcsSdk_Shared/Copters/PlaneCopter.cs new file mode 100644 index 0000000..67b5e7a --- /dev/null +++ b/PlaneGcsSdk_Shared/Copters/PlaneCopter.cs @@ -0,0 +1,1389 @@ +// #define LOG_SEQUENCE_NUMBER +//#define LOG_PACKETS + +using Plane.Protocols; +using Plane.Communication; +using TaskTools.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Diagnostics; +using System.IO; +using System.Threading.Tasks; + +namespace Plane.Copters +{ +#if PRIVATE + public +#else + internal +#endif + partial class PlaneCopter + { + uint iErrorData; + ulong iDataCount; + + public bool IsConnected { get { return Connection.IsOpen; } } + + public string Id { get; set; } + + public byte mavlinkversion { get; set; } + public MAVLink.MAV_TYPE aptype { get; set; } + public MAVLink.MAV_AUTOPILOT apname { get; set; } + private bool CommOK = true; + public byte sysid { get; set; } + public byte compid { get; set; } + public byte recvpacketcount { get; set; } + public bool armed { get; set; } + public bool failsafe { get; set; } + + public uint mode { get; set; } + + public float battery_voltage { get; set; } + public byte battery_remaining { get; set; } + public float current_battery { get; set; } + public float freemem { get; set; } + public float brklevel { get; set; } + + public bool useLocation { get; set; } + public float gpsalt { get; set; } + public byte gpsstatus { get; set; } + public float gpshdop { get; set; } + public byte satcount { get; set; } + public float groundspeed { get; set; } + public float groundcourse { get; set; } + public double lat { get; set; } + public double lng { get; set; } + public float nav_roll { get; set; } + public float nav_pitch { get; set; } + public short nav_bearing { get; set; } + public short target_bearing { get; set; } + public float wp_dist { get; set; } + public float alt_error { get; set; } + public float aspd_error { get; set; } + public float xtrack_error { get; set; } + public float roll { get; set; } + public float pitch { get; set; } + public float yaw { get; set; } + public short heading { get; set; } + public float airspeed { get; set; } + public float alt { get { return altorigin - altoffset; } } + public float altoffset = 0; + public float altorigin { get; private set; } = 0; + public float ch3percent { get; set; } + + public ushort ch1in { get; set; } + public ushort ch2in { get; set; } + public ushort ch3in { get; set; } + public ushort ch4in { get; set; } + public ushort ch5in { get; set; } + public ushort ch6in { get; set; } + public ushort ch7in { get; set; } + public ushort ch8in { get; set; } + public float rxrssi { get; set; } + + public byte remrssi { get; set; } + + public uint timebootms { get; set; } + + private int DataTimeOut = 0; + + public Dictionary param = new Dictionary(); + public Dictionary param_types = new Dictionary(); + + public IConnection Connection { get; set; } + + public ushort FlightDistance2D { get; private set; } + + private SynchronizationContext _uiSyncContext; + private bool _autoSendHeartbeat = true; + private bool _autoRequestData = true; + + public PlaneCopter(IConnection connection, SynchronizationContext uiSyncContext, bool autoSendHeartbeat = true, bool autoRequestData = true) + { + this.Connection = connection; + _uiSyncContext = uiSyncContext; + _autoSendHeartbeat = autoSendHeartbeat; + _autoRequestData = autoRequestData; + } + + public async Task ConnectAsync() + { + //sysid = 2; + SendReq = false; + CommOK = true; + await Connection.OpenAsync().ConfigureAwait(false); + StartCommunication(); + } + + public async Task DisconnectAsync() + { +#if DEBUG && !NETFX_CORE && LOG_SEQUENCE_NUMBER + File.AppendAllText($"SequenceNumbers_{Id}.log", _sequenceLog.ToString()); +#endif + await StopDatastreamAsync(MAVLink.MAV_DATA_STREAM.ALL, 0); + CommOK = false; + Connection.Close(); + } + + public async Task GetCopterDataAsync() + { + await RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS, 10).ConfigureAwait(false); //1电池电压、电流、电量,152-内存、62-导航控制输出、24-GPS数据、42-航点数据 + await RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM.EXTRA1, 5).ConfigureAwait(false); // 请求 飞行姿态 roll、pitch、yaw、rollspeed、pitchspeed、yawspeed--- 30 + await RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM.EXTRA2, 10).ConfigureAwait(false); // 请求vfr airspeed(空速)、groundspeed(地速)、alt(高度)、climb(爬升率)、heading(头朝向)、throttle(实际油门) ---74 + await RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM.RC_CHANNELS, 1).ConfigureAwait(false); // 请求 通道数据 + await RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM.RAW_SENSORS, ratesensors).ConfigureAwait(false); // 请求 传感器原始值 + + // Disable ATTITUDE_CONTROLLER_OUTPUT, POSITION_CONTROLLER_OUTPUT, NAV_CONTROLLER_OUTPUT. | + await StopGetDatastreamAsync(MAVLink.MAV_DATA_STREAM.RAW_CONTROLLER, 0).ConfigureAwait(false); + // Disable LOCAL_POSITION, GLOBAL_POSITION/GLOBAL_POSITION_INT messages. | + await StopGetDatastreamAsync(MAVLink.MAV_DATA_STREAM.POSITION, 0).ConfigureAwait(false); + // Disable EXTRA3 (Dependent on the autopilot |) + await StopGetDatastreamAsync(MAVLink.MAV_DATA_STREAM.EXTRA3, 0).ConfigureAwait(false); + // Disable Plane Stream + await StopGetDatastreamAsync(MAVLink.MAV_DATA_STREAM.GHOST_STREAM, 0).ConfigureAwait(false); + } + + private async void StartCommunication() + { + try + { + var writingTask = _autoSendHeartbeat ? StartSendingHeartbeatsAsync() : TaskUtils.CompletedTask; + var readingTask = StartReadingPacketsAsync(); + await Task.WhenAll(writingTask, readingTask).ConfigureAwait(false); + } + catch (Exception ex) + { + RaiseMessageCreated(ex.ToString()); + } + } + +#if DEBUG && LOG_PACKETS + + private Stopwatch _sendHeartbeatStopwatch = new Stopwatch(); + private TimeSpan _sendHeartbeatTimeSpan; + +#endif + + public async Task StartSendingHeartbeatsAsync() + { + await Task.Run(async () => + { + while (CommOK) + { + if (!IsConnected) + { + break; + } + // if (heatbeatSend.Second != DateTime.Now.Second) + if (heatbeatSend.AddMilliseconds(200) <= DateTime.Now) + { + var htb = new MAVLink.mavlink_heartbeat_t() + { + type = (byte)MAVLink.MAV_TYPE.GCS, + autopilot = (byte)MAVLink.MAV_AUTOPILOT.GENERIC, + mavlink_version = 3, + }; + await SendPacketAsync(htb).ConfigureAwait(false); +#if DEBUG && LOG_PACKETS + if (!_sendHeartbeatStopwatch.IsRunning) + { + _sendHeartbeatStopwatch.Start(); + } + else + { + var elapsed = _sendHeartbeatStopwatch.Elapsed; + Debug.WriteLine(elapsed - _sendHeartbeatTimeSpan, "--------------------------发送心跳间隔"); + _sendHeartbeatTimeSpan = elapsed; + } +#endif + heatbeatSend = DateTime.Now; + DataTimeOut += 1; + if (DataTimeOut > 3) + { + bInitChannel = false; + SendReq = false; + } + } + else + { + await Task.Delay(100).ConfigureAwait(false); + } + } + }).ConfigureAwait(false); + } + + private async Task StartReadingPacketsAsync() + { + await Task.Run(async () => + { + while (CommOK) + { + if (!IsConnected) + { + RaiseEventOnUIThread(ConnectionBroken); + break; + } + + var packet = await ReadPacketAsync().ConfigureAwait(false); + if (packet != null) + { + PacketReceived?.Invoke(this, new PacketReceivedEventArgs(packet)); + var handled = true; + switch (packet[5]) + { + case MAVLink.MAVLINK_MSG_ID_HEARTBEAT: //0 + AnalyzeHeartbeatPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_RADIO: + AnalyzeRadioPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_PARAM_VALUE: //22 + AnalyzeParamValuePacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_SYS_STATUS: //1 + AnalyzeSysStatusPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_MEMINFO: //152 + AnalyzeMemInfoPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_MISSION_CURRENT: //42 + AnalyzeMissionCurrentPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_GPS_RAW_INT: //24 + AnalyzeGpsRawIntPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT: //33 + AnalyzeGlobalPositionIntPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT: //62 + AnalyzeNavControllerOutputPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_ATTITUDE: //30 + AnalyzeAttitudePacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_VFR_HUD: //74 + AnalyzeVfrHudPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW: //35 + AnalyzeRCChannelsRawPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_RAW_IMU: + AnalyzeRawImuPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_SCALED_IMU2: + AnalyzeScaledImu2Packet(packet); + break; + case MAVLink.MAVLINK_MSG_ID_SENSOR_OFFSETS: + AnalyzeSensorOffsetsPacket(packet); + break; + case MAVLink.MAVLINK_MSG_ID_STATUSTEXT: + AnalyzeStatusTextPacket(packet); + break; + default: + handled = false; + UnhandledPacketReceived?.Invoke(this, new PacketReceivedEventArgs(packet)); + break; + } + if (handled) + { + PacketHandled?.Invoke(this, new PacketReceivedEventArgs(packet)); + } + } + } + }).ConfigureAwait(false); + } + + public async Task GetParamsListAsync() + { + MAVLink.mavlink_param_request_list_t req = new MAVLink.mavlink_param_request_list_t(); + req.target_system = sysid; + req.target_component = compid; + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_PARAM_REQUEST_LIST, req); + } + + public static List> getModesList() + { + var flightModes = EnumTranslator.Translate(); + return flightModes.ToList(); + } + + // 林俊清, 20151029, 由于只在 myComm 循环中读取数据包,因此去掉了锁。 + //volatile object readlock = new object(); + +#if DEBUG && LOG_PACKETS + private StringBuilder _log = new StringBuilder(); + private Stopwatch _positionStopwatch = new Stopwatch(); + private TimeSpan _lastPositionTimeSpan; +#endif + +#if DEBUG && LOG_SEQUENCE_NUMBER + private StringBuilder _sequenceLog = new StringBuilder("-----------------------\n"); +#endif + + private byte[] _readBuffer = new byte[263]; + + /// + /// 异步读取数据包。// 林俊清, 20151029, 去掉了锁,不要在除读数据包循环之外的地方调用此方法。 + /// + /// 表示此异步操作的 实例,其结果为读取到的数据包。 + private async Task ReadPacketAsync() + { + if (!Connection.IsOpen) + { + return null; + } + + int length = 0; + + try + { + if (await Connection.ReadAsync(_readBuffer, 0, 1) == 0) + { + return null; + } + if (_readBuffer[0] == MAVLink.MAVLINK_STX) + { + if (await Connection.ReadAsync(_readBuffer, 1, 5) == 0) + { + return null; + } +#if DEBUG && LOG_SEQUENCE_NUMBER + // _sequenceLog.Append(DateTime.Now.ToString("HHmmss.fff")).Append('\t').Append(string.Format("{0,3}", _readBuffer[2].ToString())).Append('\t').Append(string.Format("{0,3}", _readBuffer[5].ToString())); + _sequenceLog.Append(DateTime.Now.ToString()).Append('\t').Append(string.Format("{0,3}", _readBuffer[2].ToString())).Append('\t').Append(string.Format("{0,3}", _readBuffer[5].ToString())); +#endif + // packet length + length = 6 + _readBuffer[1] + 2; // header + data + checksum + if (await Connection.ReadAsync(_readBuffer, 6, length - 6) == 0) + { + return null; + } + } + else + { +#if DEBUG && LOG_PACKETS + _log.AppendLine("---------------"); + _log.AppendLine("unexpected head: " + _readBuffer[0]); +#endif + + return null; + } + } + catch + { + return null; + } + + uint crcvalue = BitConverter.ToUInt16(_readBuffer, length - 2); + +#if DEBUG && LOG_PACKETS + _log.AppendLine("---------------"); + for (int i = 0; i < 6; i++) + { + _log.Append(_readBuffer[i]).Append(" "); + } + _log.AppendLine(); + for (int i = 6; i < length - 2; i++) + { + _log.Append(_readBuffer[i]).Append(" "); + } + _log.AppendLine(); + for (int i = length - 2; i < length; i++) + { + _log.Append(_readBuffer[i]).Append(" "); + } + _log.AppendLine(); +#endif + byte messageType = _readBuffer[5]; + +#if DEBUG && LOG_PACKETS + if (messageType == 33) + { + if (_positionStopwatch.IsRunning) + { + var elapsed = _positionStopwatch.Elapsed; + Debug.WriteLine((elapsed - _lastPositionTimeSpan).TotalMilliseconds, "-----------------------------------------------position packet"); + _lastPositionTimeSpan = elapsed; + } + else + { + _positionStopwatch.Start(); + } + } +#endif + + ushort checksum = MavlinkCRC.crc_calculate(_readBuffer, length - 2); + checksum = MavlinkCRC.crc_accumulate(MAVLink.MAVLINK_MESSAGE_CRCS[messageType], checksum); + iDataCount += 1; + +#if DEBUG && LOG_SEQUENCE_NUMBER + _sequenceLog.Append('\t').Append(crcvalue == checksum).AppendLine(); +#endif + + if (crcvalue == checksum) + { + return _readBuffer; + } + else + { +#if DEBUG && LOG_PACKETS + _log.AppendLine("crc not passed"); +#endif + + iErrorData += 1; + var handler = ErrorDataEvent; + if (handler != null) + { + RunOnUIThread(() => handler(iErrorData, iDataCount, _readBuffer[5])); + } + return null; + } + } + + public MAVState MAV = new MAVState(); + + /// + /// Used to extract mission from log file - both sent or received + /// + /// packet + void getWPsfromstream(ref byte[] buffer) + { + if (buffer[5] == (byte)MAVLink.MAVLINK_MSG_ID_MISSION_COUNT) + { + // clear old + MAV.wps.Clear(); + } + + if (buffer[5] == (byte)MAVLink.MAVLINK_MSG_ID_MISSION_ITEM) + { + MAVLink.mavlink_mission_item_t wp = buffer.ByteArrayToStructure(6); + + if (wp.current == 2) + { + // guide mode wp + MAV.GuidedMode = wp; + } + else + { + MAV.wps[wp.seq] = wp; + } + + //Console.WriteLine("WP # {7} cmd {8} p1 {0} p2 {1} p3 {2} p4 {3} x {4} y {5} z {6}", wp.param1, wp.param2, wp.param3, wp.param4, wp.x, wp.y, wp.z, wp.seq, wp.command); + } + + if (buffer[5] == (byte)MAVLink.MAVLINK_MSG_ID_RALLY_POINT) + { + MAVLink.mavlink_rally_point_t rallypt = buffer.ByteArrayToStructure(6); + + MAV.rallypoints[rallypt.idx] = rallypt; + + //Console.WriteLine("RP # {0} {1} {2} {3} {4}", rallypt.idx, rallypt.lat, rallypt.lng, rallypt.alt, rallypt.break_alt); + } + + if (buffer[5] == (byte)MAVLink.MAVLINK_MSG_ID_FENCE_POINT) + { + MAVLink.mavlink_fence_point_t fencept = buffer.ByteArrayToStructure(6); + + MAV.fencepoints[fencept.idx] = fencept; + } + } + + + /// + /// used for outbound packet sending + /// + public int packetcount = 0; + private bool SendReq; +#pragma warning disable CS0414 // The field is assigned but its value is never used + private bool giveComport; +#pragma warning restore CS0414 // The field is assigned but its value is never used + + public async Task GeneratePacketAsync(byte messageType, TMavlinkPacket indata) + { + byte[] data; + + if (mavlinkversion == 3) + { + data = MavlinkUtil.StructureToByteArray(indata); + } + else + { + data = MavlinkUtil.StructureToByteArrayBigEndian(indata); + } + + //Console.WriteLine(DateTime.Now + " PC Doing req "+ messageType + " " + this.BytesToRead); + byte[] packet = new byte[data.Length + 6 + 2]; + + if (mavlinkversion == 3 || mavlinkversion == 0) + { + packet[0] = MAVLink.MAVLINK_STX; + } + else if (mavlinkversion == 2) + { + packet[0] = (byte)'U'; + } + packet[1] = (byte)(data.Length); + packet[2] = (byte)packetcount; + //packet[2] = 35; + packetcount++; + + packet[3] = 255; // this is always 255 - MYGCS + + packet[4] = (byte)MAVLink.MAV_COMPONENT.MAV_COMP_ID_MISSIONPLANNER; + + packet[5] = messageType; + + int i = 6; + foreach (byte b in data) + { + packet[i] = b; + i++; + } + + ushort checksum = MavlinkCRC.crc_calculate(packet, packet[1] + 6); + + if (mavlinkversion == 3 || mavlinkversion == 0) + { + checksum = MavlinkCRC.crc_accumulate(MAVLink.MAVLINK_MESSAGE_CRCS[messageType], checksum); + } + + byte ck_a = (byte)(checksum & 0xFF); ///< High byte + byte ck_b = (byte)(checksum >> 8); ///< Low byte + + packet[i] = ck_a; + i += 1; + packet[i] = ck_b; + i += 1; + + if (IsConnected) + { + try + { + await Connection.WriteAsync(packet, 0, i); + } + catch + { + // 林俊清, 20151031, 异常已通过 IConnection.ExceptionThrown 事件传到外部,此处吞掉就行了。 + } + } + } + + public async Task DoARMAsync(bool armit) + { + return await DoCommandAsync(MAVLink.MAV_CMD.COMPONENT_ARM_DISARM, armit ? 1 : 0, 0, 0, 0, 0, 0, 0); + } + + public async Task DoMotorTestAsync(int motor, MAVLink.MOTOR_TEST_THROTTLE_TYPE thr_type, int throttle, int timeout) + { + return await DoCommandAsync(MAVLink.MAV_CMD.DO_MOTOR_TEST, (float)motor, (float)(byte)thr_type, (float)throttle, (float)timeout, 0, 0, 0); + } + + public async Task DoTakeoffAsync() + { + /// Takeoff from ground / hand |Minimum pitch (if airspeed sensor present), desired pitch without sensor| Empty| Empty| Yaw angle (if magnetometer present), ignored without magnetometer| Latitude| Longitude| Altitude| + return await DoCommandAsync(MAVLink.MAV_CMD.TAKEOFF, 0, 0, 0, -1, 0, 0, 15); + } + + public async Task DoCommandAsync(MAVLink.MAV_CMD actionid, float p1, float p2, float p3, float p4, float p5, float p6, float p7) + { + giveComport = true; + //byte[] buffer; + + MAVLink.mavlink_command_long_t req = new MAVLink.mavlink_command_long_t(); + + req.target_system = sysid; + req.target_component = compid; + + if (actionid == MAVLink.MAV_CMD.COMPONENT_ARM_DISARM) + { + req.target_component = (byte)MAVLink.MAV_COMPONENT.MAV_COMP_ID_SYSTEM_CONTROL; + } + + req.command = (ushort)actionid; + + req.param1 = p1; + req.param2 = p2; + req.param3 = p3; + req.param4 = p4; + req.param5 = p5; + req.param6 = p6; + req.param7 = p7; + + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_COMMAND_LONG, req); + return true; + + //DateTime start = DateTime.Now; + //int retrys = 3; + + //int timeout = 2000; + + ////// imu calib take a little while + //if (actionid == MAVLink.MAV_CMD.PREFLIGHT_CALIBRATION && p5 == 1) + //{ + // // this is for advanced accel offsets, and blocks execution + // return true; + //} + //else if (actionid == MAVLink.MAV_CMD.PREFLIGHT_CALIBRATION) + //{ + // retrys = 1; + // timeout = 25000; + //} + //else if (actionid == MAVLink.MAV_CMD.PREFLIGHT_REBOOT_SHUTDOWN) + //{ + // await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_COMMAND_LONG, req); + // giveComport = false; + // return true; + //} + //else if (actionid == MAVLink.MAV_CMD.COMPONENT_ARM_DISARM) + //{ + // // 10 seconds as may need an imu calib + // timeout = 10000; + //} + + //while (true) + //{ + // if (!(start.AddMilliseconds(timeout) > DateTime.Now)) + // { + // if (retrys > 0) + // { + // //log.Info("doAction Retry " + retrys); + // await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_COMMAND_LONG, req); + // start = DateTime.Now; + // retrys--; + // continue; + // } + // giveComport = false; + // throw new Exception("Timeout on read - doAction"); + // } + + // buffer = readPacket(); + // if (buffer.Length > 5) + // { + // if (buffer[5] == MAVLink.MAVLINK_MSG_ID_COMMAND_ACK) + // { + // var ack = buffer.ByteArrayToStructure(6); + // if (ack.result == (byte)MAVLink.MAV_RESULT.ACCEPTED) + // { + // giveComport = false; + // return true; + // } + // else + // { + // giveComport = false; + // return false; + // } + // } + // } + //} + } + + public async Task SetGuidedModeWPAsync(Locationwp gotohere) + { + //if (gotohere.alt == 0 || gotohere.lat == 0 || gotohere.lng == 0) + // return; + + //giveComport = true; + + //try + //{ + //gotohere.id = (byte)MAVLink.MAV_CMD.WAYPOINT; + await SetWPAsync(gotohere, 0, MAVLink.MAV_FRAME.GLOBAL_RELATIVE_ALT, (byte)2); + //} + //catch { } + + //giveComport = false; + } + + public async Task SetNewWPAltAsync(Locationwp gotohere) + { + //givecomport = true; + + //try + //{ + gotohere.id = (byte)MAVLink.MAV_CMD.WAYPOINT; + + //MAVLink.MAV_MISSION_RESULT ans = + await SetWPAsync(gotohere, 0, MAVLink.MAV_FRAME.GLOBAL_RELATIVE_ALT, (byte)3); + + // if (ans != mavlink.mav_mission_result.mav_mission_accepted) + // throw new exception("alt change failed"); + //} + //catch { givecomport = false; /*log.error(ex);*/ throw; } + + //givecomport = false; + } + + public async Task SetWPAsync(Locationwp loc, ushort index, MAVLink.MAV_FRAME frame, byte current = 0) + { + giveComport = true; + MAVLink.mavlink_mission_item_t req = new MAVLink.mavlink_mission_item_t(); + + req.target_system = sysid; + req.target_component = compid; // MAVLINK_MSG_ID_MISSION_ITEM + + req.command = loc.id; + + + req.current = current; + + req.frame = (byte)frame; + + req.x = (float)(loc.lat); + req.y = (float)(loc.lng); + req.z = (float)(loc.alt); + + req.param1 = loc.p1; + req.param2 = loc.p2; + req.param3 = loc.p3; + req.param4 = loc.p4; + + req.seq = index; + + //log.InfoFormat("setWP {6} frame {0} cmd {1} p1 {2} x {3} y {4} z {5}", req.frame, req.command, req.param1, req.x, req.y, req.z, index); + + // request + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_MISSION_ITEM, req); + } + + public async Task SetChannelsAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null) + { + MAVLink.mavlink_rc_channels_override_t rc = new MAVLink.mavlink_rc_channels_override_t(); + rc.target_component = compid; + rc.target_system = sysid; + rc.chan1_raw = ch1 ?? ch1in; + rc.chan2_raw = ch2 ?? ch2in; + rc.chan3_raw = ch3 ?? ch3in; + rc.chan4_raw = ch4 ?? ch4in; + rc.chan5_raw = ch5 ?? ch5in; + rc.chan6_raw = ch6 ?? ch6in; + rc.chan7_raw = ch7 ?? ch7in; + rc.chan8_raw = ch8 ?? ch8in; + await SendPacketAsync(rc); + } + + public async Task SetMobileControlAsync(ushort? ch1 = null, ushort? ch2 = null, ushort? ch3 = null, ushort? ch4 = null, ushort? ch5 = null, ushort? ch6 = null, ushort? ch7 = null, ushort? ch8 = null, float? yaw = null, float? alt = null) + { + MAVLink.mavlink_rc_mobile_control_t rc = new MAVLink.mavlink_rc_mobile_control_t(); + rc.target_component = compid; + rc.target_system = sysid; + rc.chan1_raw = ch1 ?? ch1in; + rc.chan2_raw = ch2 ?? ch2in; + rc.chan3_raw = ch3 ?? ch3in; + rc.chan4_raw = ch4 ?? ch4in; + rc.chan5_raw = ch5 ?? ch5in; + rc.chan6_raw = ch6 ?? ch6in; + rc.chan7_raw = ch7 ?? ch7in; + rc.chan8_raw = ch8 ?? ch8in; + rc.Yaw = yaw ?? this.yaw; + rc.alt = alt ?? this.alt; + await SendPacketAsync(rc); + } + + public async Task GetParamAsync(string paramName, int millisecondsTimeout = Timeout.Infinite) + { + if (param.ContainsKey(paramName)) param[paramName] = null; + var paramId = Encoding.ASCII.GetBytes(paramName); + Array.Resize(ref paramId, 16); + var req = new MAVLink.mavlink_param_request_read_t + { + param_id = paramId, + param_index = -1, + target_component = compid, + target_system = sysid + }; + var stopwatch = Stopwatch.StartNew(); + while (true) + { + for (int ii = 0; ii < 5; ii++) + { + await SendPacketAsync(req); + await Task.Delay(10).ConfigureAwait(false); + } + + int i = 0; + for (; i < 5 && (!param.ContainsKey(paramName) || param[paramName] == null); i++) + { + await Task.Delay(50).ConfigureAwait(false); + } + if (i < 5) + { + stopwatch.Stop(); + break; + } + else if (millisecondsTimeout != Timeout.Infinite && stopwatch.ElapsedMilliseconds >= millisecondsTimeout) + { + stopwatch.Stop(); + throw new TimeoutException("The GetParamAsync operation has timed out."); + } + } + return param[paramName].Value; + } + + public async Task SendPacketAsync(TMavlinkPacket indata) + { + bool validPacket = false; + byte a = 0; + var packetType = indata.GetType(); + foreach (Type ty in MAVLink.MAVLINK_MESSAGE_INFO) + { + if (ty == packetType) + { + validPacket = true; + await GeneratePacketAsync(a, indata); + return; + } + a++; + } + if (!validPacket) + { + RaiseMessageCreated("The packet type is not valid."); + //log.Info("Mavlink : NOT VALID PACKET await SendPacketAsync() " + indata.GetType().ToString()); + } + } + + public double[] packetspersecond { get; set; } + DateTime[] packetspersecondbuild = new DateTime[256]; + + byte ratesensors = 1; + public byte RateSensors { get { return ratesensors; } set { ratesensors = value; } } + + private DateTime heatbeatSend; + private bool bInitChannel = false; + private bool bGPSBadHealth; + private bool bGyroBadHealth; + private bool bAccel; + private bool bCompass; + private bool bBarometer; + + public short gx; + public short gy; + public short gz; + public short ax; + public short ay; + public short az; + public short mx; + public short my; + public short mz; + + public short gx2; + public short gy2; + public short gz2; + public short ax2; + public short ay2; + public short az2; + public short mx2; + public short my2; + public short mz2; + + public float mag_ofs_x; + public float mag_ofs_y; + public float mag_ofs_z; + public float mag_declination; + public int raw_press; + public int raw_temp; + public float gyro_cal_x; + public float gyro_cal_y; + public float gyro_cal_z; + public float accel_cal_x; + public float accel_cal_y; + public float accel_cal_z; + + public ushort param_total; + public ushort WpCount; + + public async Task RequestDatastreamAsync(MAVLink.MAV_DATA_STREAM id, byte hzrate) + { + + double pps = 0; + + switch (id) + { + case MAVLink.MAV_DATA_STREAM.ALL: + + break; + case MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_SYS_STATUS] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_SYS_STATUS]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA1: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_ATTITUDE] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_ATTITUDE]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA2: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_VFR_HUD] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_VFR_HUD]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA3: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_AHRS] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_AHRS]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.POSITION: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.RAW_CONTROLLER: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.RAW_SENSORS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RAW_IMU] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RAW_IMU]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.RC_CHANNELS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + } + + //packetspersecond[temp[5]]; + + if (pps == 0 && hzrate == 0) + { + return; + } + + //log.InfoFormat("Request stream {0} at {1} hz", Enum.Parse(typeof(MAV_DATA_STREAM), id.ToString()), hzrate); + await GetDatastreamAsync(id, hzrate); + } + + public async Task StopDatastreamAsync(MAVLink.MAV_DATA_STREAM id, byte hzrate) + { + + double pps = 0; + + switch (id) + { + case MAVLink.MAV_DATA_STREAM.ALL: + + break; + case MAVLink.MAV_DATA_STREAM.EXTENDED_STATUS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_SYS_STATUS] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_SYS_STATUS]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA1: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_ATTITUDE] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_ATTITUDE]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA2: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_VFR_HUD] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_VFR_HUD]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.EXTRA3: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_AHRS] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_AHRS]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.POSITION: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_GLOBAL_POSITION_INT]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.RAW_CONTROLLER: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_SCALED]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + case MAVLink.MAV_DATA_STREAM.RAW_SENSORS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RAW_IMU] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RAW_IMU]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + //case MAVLink.MAV_DATA_STREAM.SCALED_IMU2: + + // break; + case MAVLink.MAV_DATA_STREAM.RC_CHANNELS: + if (packetspersecondbuild[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW] < DateTime.Now.AddSeconds(-2)) + break; + pps = packetspersecond[MAVLink.MAVLINK_MSG_ID_RC_CHANNELS_RAW]; + if (hzratecheck(pps, hzrate)) + { + return; + } + break; + } + //log.InfoFormat("Request stream {0} at {1} hz", Enum.Parse(typeof(MAV_DATA_STREAM), id.ToString()), hzrate); + await StopGetDatastreamAsync(id, hzrate); + } + + bool hzratecheck(double pps, int hzrate) + { + + if (hzrate == 0 && pps == 0) + { + return true; + } + else if (hzrate == 1 && pps >= 0.5 && pps <= 2) + { + return true; + } + else if (hzrate == 3 && pps >= 2 && hzrate < 5) + { + return true; + } + else if (hzrate == 10 && pps > 5 && hzrate < 15) + { + return true; + } + else if (hzrate > 15 && pps > 15) + { + return true; + } + + return false; + + } + + async Task GetDatastreamAsync(MAVLink.MAV_DATA_STREAM id, byte hzrate) + { + MAVLink.mavlink_request_data_stream_t req = new MAVLink.mavlink_request_data_stream_t(); + req.target_system = sysid; + req.target_component = compid; + + req.req_message_rate = hzrate; + req.start_stop = 1; // start + req.req_stream_id = (byte)id; // id + + + // send each one twice. + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_REQUEST_DATA_STREAM, req); + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_REQUEST_DATA_STREAM, req); + } + + async Task StopGetDatastreamAsync(MAVLink.MAV_DATA_STREAM id, byte hzrate) + { + MAVLink.mavlink_request_data_stream_t req = new MAVLink.mavlink_request_data_stream_t(); + req.target_system = sysid; + req.target_component = compid; + + req.req_message_rate = 0; + req.start_stop = 0; // start + req.req_stream_id = (byte)id; // id + + // send each one twice. + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_REQUEST_DATA_STREAM, req); + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_REQUEST_DATA_STREAM, req); + } + + public async Task SetParamAsync(string paramname, float value) + { + // param type is set here, however it is always sent over the air as a float 100int = 100f. + var req = new MAVLink.mavlink_param_set_t { target_system = sysid, target_component = compid, param_type = (byte)param_types[paramname] }; + + byte[] temp = Encoding.GetEncoding("ASCII").GetBytes(paramname); + + Array.Resize(ref temp, 16); + req.param_id = temp; + req.param_value = (value); + + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_PARAM_SET, req); + } + + public async Task SetParam2Async(string paramname, float value) + { + // param type is set here, however it is always sent over the air as a float 100int = 100f. + var req = new MAVLink.mavlink_param_set_t { target_system = sysid, target_component = compid, param_type = 4 }; + + byte[] temp = Encoding.GetEncoding("ASCII").GetBytes(paramname); + + Array.Resize(ref temp, 16); + req.param_id = temp; + req.param_value = (value); + + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_PARAM_SET, req); + } + + public async Task SetModeAsync(ac2modes modein) + { + try + { + MAVLink.mavlink_set_mode_t mode = new MAVLink.mavlink_set_mode_t(); + + if (TranslateMode(modein, ref mode)) + { + await SetModeAsync(mode); + } + } + catch { RaiseMessageCreated("Failed to change Modes"); } + } + + public async Task SetModeAsync(string modein) + { + try + { + MAVLink.mavlink_set_mode_t mode = new MAVLink.mavlink_set_mode_t(); + + if (TranslateMode(modein, ref mode)) + { + await SetModeAsync(mode); + } + } + catch { RaiseMessageCreated("Failed to change Modes"); } + } + + public async Task SetModeAsync(MAVLink.mavlink_set_mode_t mode, MAVLink.MAV_MODE_FLAG base_mode = 0) + { + mode.base_mode |= (byte)base_mode; + + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_SET_MODE, mode); + await Task.Delay(10); + await GeneratePacketAsync(MAVLink.MAVLINK_MSG_ID_SET_MODE, mode); + } + + public bool TranslateMode(ac2modes modein, ref MAVLink.mavlink_set_mode_t mode) + { + //MAVLink09.mavlink_set_mode_t mode = new MAVLink09.mavlink_set_mode_t(); + mode.target_system = sysid; + + switch (modein) + { + case ac2modes.STABILIZE: + case ac2modes.AUTO: + case ac2modes.RTL: + case ac2modes.LOITER: + case ac2modes.ACRO: + case ac2modes.ALT_HOLD: + case ac2modes.CIRCLE: + case ac2modes.POSITION: + case ac2modes.LAND: + case ac2modes.OF_LOITER: + case ac2modes.GUIDED: + mode.base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED; + mode.custom_mode = (uint)modein; + break; + default: + RaiseMessageCreated("错误模式: " + modein); + return false; + } + return true; + } + + public bool TranslateMode(string modein, ref MAVLink.mavlink_set_mode_t mode) + { + //MAVLink09.mavlink_set_mode_t mode = new MAVLink09.mavlink_set_mode_t(); + mode.target_system = sysid; + + var modeValue = EnumTranslator.GetValue(modein.ToUpper()); + switch (modeValue) + { + case (int)ac2modes.STABILIZE: + case (int)ac2modes.AUTO: + case (int)ac2modes.RTL: + case (int)ac2modes.LOITER: + case (int)ac2modes.ACRO: + case (int)ac2modes.ALT_HOLD: + case (int)ac2modes.CIRCLE: + case (int)ac2modes.POSITION: + case (int)ac2modes.LAND: + case (int)ac2modes.OF_LOITER: + case (int)ac2modes.GUIDED: + mode.base_mode = (byte)MAVLink.MAV_MODE_FLAG.CUSTOM_MODE_ENABLED; + mode.custom_mode = (uint)modeValue; + break; + default: + RaiseMessageCreated("错误模式: " + modein); + return false; + } + return true; + } + + public async Task GetWPsAsync() + { + MAVLink.mavlink_mission_request_list_t req = new MAVLink.mavlink_mission_request_list_t(); + + req.target_system = sysid; + req.target_component = compid; + + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_MISSION_REQUEST_LIST, req); + } + + /// + /// Gets specfied WP + /// + /// + /// WP + public async Task GetWPAsync(ushort index) + { + giveComport = true; + MAVLink.mavlink_mission_request_t req = new MAVLink.mavlink_mission_request_t(); + req.target_system = sysid; + req.target_component = compid; + req.seq = index; + //Console.WriteLine("getwp req "+ DateTime.Now.Millisecond); + // request + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_MISSION_REQUEST, req); + } + + public async Task SetWPTotalAsync(ushort wp_total) + { + giveComport = true; + MAVLink.mavlink_mission_count_t req = new MAVLink.mavlink_mission_count_t(); + + req.target_system = sysid; + req.target_component = compid; // MSG_NAMES.MISSION_COUNT + + req.count = wp_total; + + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_MISSION_COUNT, req); + } + + /// 任务信息。 + /// 任务编号。 + /// 坐标系。 + /// 0:在 Auto 模式下飞往指定位置;2:切到 GUIDED 模式,立即飞往指定位置;3:仅改变高度,立即执行。 + /// 指示是否自动继续执行下一个任务。 + public async Task WriteWPAsync(Locationwp loc, ushort index, MAVLink.MAV_FRAME frame, byte current = 0, byte autocontinue = 1) + { + MAVLink.mavlink_mission_item_t req = new MAVLink.mavlink_mission_item_t(); + + req.target_system = sysid; + req.target_component = compid; // MSG_NAMES.MISSION_ITEM + + req.command = loc.id; + + req.current = current; + req.autocontinue = autocontinue; + + req.frame = (byte)frame; + req.y = (float)(loc.lng); + req.x = (float)(loc.lat); + req.z = (float)(loc.alt); + + req.param1 = loc.p1; + req.param2 = loc.p2; + req.param3 = loc.p3; + req.param4 = loc.p4; + + req.seq = index; + + //log.InfoFormat("setWP {6} frame {0} cmd {1} p1 {2} x {3} y {4} z {5}", req.frame, req.command, req.param1, req.x, req.y, req.z, index); + + // request + await GeneratePacketAsync((byte)MAVLink.MAVLINK_MSG_ID_MISSION_ITEM, req); + } + + const float rad2deg = (float)(180 / Math.PI); + const float deg2rad = (float)(1.0 / rad2deg); + + public async Task SetSensorOffsetsAsync(sensoroffsetsenum sensor, float x, float y, float z) + { + return await DoCommandAsync(Plane.Protocols.MAVLink.MAV_CMD.PREFLIGHT_SET_SENSOR_OFFSETS, (int)sensor, x, y, z, 0, 0, 0); + } + + public byte rssi; + + + private void RaiseMessageCreated(string message) + { + var handler = MessageCreated; + if (handler != null) + { + var e = new MessageCreatedEventArgs { Message = message }; + RunOnUIThread(() => + { + handler(this, e); + }); + } + } + + private void RunOnUIThread(Action action) + { + if (SynchronizationContext.Current == _uiSyncContext) + { + action(); + } + else + { + _uiSyncContext.Post(delegate { action(); }, null); + } + } + + private void RaiseEventOnUIThread(EventHandler ev) + { + if (ev != null) + { + RunOnUIThread(() => ev(this, EventArgs.Empty)); + } + } + + private void RaiseEventOnUIThread(EventHandler ev, TEventArgs e) + { + if (ev != null) + { + RunOnUIThread(() => ev(this, e)); + } + } + } +} diff --git a/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.projitems b/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.projitems new file mode 100644 index 0000000..6a5a165 --- /dev/null +++ b/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.projitems @@ -0,0 +1,73 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + true + 2be393dc-21a4-48b3-83fd-f21cbe8b038b + + + Plane + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.shproj b/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.shproj new file mode 100644 index 0000000..e0a94e0 --- /dev/null +++ b/PlaneGcsSdk_Shared/PlaneGcsSdk_Shared.shproj @@ -0,0 +1,13 @@ + + + + 2be393dc-21a4-48b3-83fd-f21cbe8b038b + 14.0 + + + + + + + + diff --git a/PlaneGcsSdk_Shared/Protocols/MAVLinkTypes.cs b/PlaneGcsSdk_Shared/Protocols/MAVLinkTypes.cs new file mode 100644 index 0000000..506854b --- /dev/null +++ b/PlaneGcsSdk_Shared/Protocols/MAVLinkTypes.cs @@ -0,0 +1,3121 @@ +using System; +using System.Runtime.InteropServices; + +namespace Plane.Protocols +{ + //#if MAVLINK10 +#if PRIVATE + public class MAVLink +#else + internal class MAVLink +#endif + { + public const string MAVLINK_BUILD_DATE = "Sun Mar 03 21:09:54 2013"; + public const string MAVLINK_WIRE_PROTOCOL_VERSION = "1.0"; + public const int MAVLINK_MAX_DIALECT_PAYLOAD_SIZE = 25; + + public const int MAVLINK_LITTLE_ENDIAN = 1; + public const int MAVLINK_BIG_ENDIAN = 0; + + public const byte MAVLINK_STX = 254; + + public const byte MAVLINK_ENDIAN = MAVLINK_LITTLE_ENDIAN; + + public const bool MAVLINK_ALIGNED_FIELDS = (1 == 1); + + public const byte MAVLINK_CRC_EXTRA = 1; + + public const bool MAVLINK_NEED_BYTE_SWAP = (MAVLINK_ENDIAN == MAVLINK_LITTLE_ENDIAN); + + // ֿ, 20150721: Ϣȱδʹãû£ɾ + //public static readonly byte[] MAVLINK_MESSAGE_LENGTHS = new byte[] { 9, 31, 12, 0, 14, 28, 3, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 25, 23, 30, 101, 22, 26, 16, 14, 28, 32, 28, 28, 22, 22, 21, 6, 6, 37, 4, 4, 2, 2, 4, 2, 2, 3, 13, 12, 19, 17, 15, 15, 27, 25, 18, 18, 20, 20, 9, 34, 26, 46, 36, 0, 6, 4, 0, 11, 18, 0, 0, 0, 20, 0, 33, 3, 0, 0, 20, 22, 0, 0, 0, 0, 0, 0, 0, 28, 56, 42, 33, 0, 0, 0, 0, 0, 0, 0, 26, 32, 32, 20, 32, 62, 54, 64, 84, 9, 254, 249, 9, 36, 26, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 33, 25, 42, 8, 4, 12, 15, 13, 6, 15, 14, 0, 12, 3, 8, 28, 44, 3, 9, 22, 12, 18, 34, 66, 98, 8, 48, 19, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 30, 18, 18, 51, 9, 0 }; + + public static readonly byte[] MAVLINK_MESSAGE_CRCS = new byte[] { 50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 240, 183, 130, 130, 118, 148, 21, 0, 243, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 127, 106, 0, 0, 0, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 93, 211, 108, 32, 185, 235, 93, 124, 124, 119, 4, 76, 128, 56, 116, 134, 237, 203, 250, 87, 203, 220, 0, 0, 0, 29, 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 241, 15, 134, 219, 208, 188, 84, 22, 19, 21, 134, 0, 78, 68, 189, 127, 154, 21, 21, 144, 1, 234, 73, 181, 22, 83, 167, 138, 234, 240, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0 }; + + public static Type[] MAVLINK_MESSAGE_INFO = new Type[] { typeof(mavlink_heartbeat_t), typeof(mavlink_sys_status_t), typeof(mavlink_system_time_t), null, typeof(mavlink_ping_t), typeof(mavlink_change_operator_control_t), typeof(mavlink_change_operator_control_ack_t), typeof(mavlink_auth_key_t), null, null, null, typeof(mavlink_set_mode_t), null, null, null, null, null, null, null, null, typeof(mavlink_param_request_read_t), typeof(mavlink_param_request_list_t), typeof(mavlink_param_value_t), typeof(mavlink_param_set_t), typeof(mavlink_gps_raw_int_t), typeof(mavlink_gps_status_t), typeof(mavlink_scaled_imu_t), typeof(mavlink_raw_imu_t), typeof(mavlink_raw_pressure_t), typeof(mavlink_scaled_pressure_t), typeof(mavlink_attitude_t), typeof(mavlink_attitude_quaternion_t), typeof(mavlink_local_position_ned_t), typeof(mavlink_global_position_int_t), typeof(mavlink_rc_channels_scaled_t), typeof(mavlink_rc_channels_raw_t), typeof(mavlink_servo_output_raw_t), typeof(mavlink_mission_request_partial_list_t), typeof(mavlink_mission_write_partial_list_t), typeof(mavlink_mission_item_t), typeof(mavlink_mission_request_t), typeof(mavlink_mission_set_current_t), typeof(mavlink_mission_current_t), typeof(mavlink_mission_request_list_t), typeof(mavlink_mission_count_t), typeof(mavlink_mission_clear_all_t), typeof(mavlink_mission_item_reached_t), typeof(mavlink_mission_ack_t), typeof(mavlink_set_gps_global_origin_t), typeof(mavlink_gps_global_origin_t), typeof(mavlink_set_local_position_setpoint_t), typeof(mavlink_local_position_setpoint_t), typeof(mavlink_global_position_setpoint_int_t), typeof(mavlink_set_global_position_setpoint_int_t), typeof(mavlink_safety_set_allowed_area_t), typeof(mavlink_safety_allowed_area_t), typeof(mavlink_set_roll_pitch_yaw_thrust_t), typeof(mavlink_set_roll_pitch_yaw_speed_thrust_t), typeof(mavlink_roll_pitch_yaw_thrust_setpoint_t), typeof(mavlink_roll_pitch_yaw_speed_thrust_setpoint_t), typeof(mavlink_set_quad_motors_setpoint_t), typeof(mavlink_set_quad_swarm_roll_pitch_yaw_thrust_t), typeof(mavlink_nav_controller_output_t), typeof(mavlink_set_quad_swarm_led_roll_pitch_yaw_thrust_t), typeof(mavlink_state_correction_t), null, typeof(mavlink_request_data_stream_t), typeof(mavlink_data_stream_t), null, typeof(mavlink_manual_control_t), typeof(mavlink_rc_channels_override_t), null, null, null, typeof(mavlink_vfr_hud_t), null, typeof(mavlink_command_long_t), typeof(mavlink_command_ack_t), null, null, typeof(mavlink_roll_pitch_yaw_rates_thrust_setpoint_t), typeof(mavlink_manual_setpoint_t), null, null, null, null, null, null, null, typeof(mavlink_local_position_ned_system_global_offset_t), typeof(mavlink_hil_state_t), typeof(mavlink_hil_controls_t), typeof(mavlink_hil_rc_inputs_raw_t), null, null, null, null, null, null, null, typeof(mavlink_optical_flow_t), typeof(mavlink_global_vision_position_estimate_t), typeof(mavlink_vision_position_estimate_t), typeof(mavlink_vision_speed_estimate_t), typeof(mavlink_vicon_position_estimate_t), typeof(mavlink_highres_imu_t), null, null, null, null, typeof(mavlink_file_transfer_start_t), typeof(mavlink_file_transfer_dir_list_t), typeof(mavlink_file_transfer_res_t), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, typeof(mavlink_battery_status_t), typeof(mavlink_setpoint_8dof_t), typeof(mavlink_setpoint_6dof_t), typeof(mavlink_sensor_offsets_t), typeof(mavlink_set_mag_offsets_t), typeof(mavlink_meminfo_t), typeof(mavlink_ap_adc_t), typeof(mavlink_digicam_configure_t), typeof(mavlink_digicam_control_t), typeof(mavlink_mount_configure_t), typeof(mavlink_mount_control_t), typeof(mavlink_mount_status_t), null, typeof(mavlink_fence_point_t), typeof(mavlink_fence_fetch_point_t), typeof(mavlink_fence_status_t), typeof(mavlink_ahrs_t), typeof(mavlink_simstate_t), typeof(mavlink_hwstatus_t), typeof(mavlink_radio_t), typeof(mavlink_limits_status_t), typeof(mavlink_wind_t), typeof(mavlink_data16_t), typeof(mavlink_data32_t), typeof(mavlink_data64_t), typeof(mavlink_data96_t), typeof(mavlink_rangefinder_t), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, typeof(mavlink_rc_mobile_control_t), typeof(mavlink_set_pair_t), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, typeof(mavlink_memory_vect_t), typeof(mavlink_debug_vect_t), typeof(mavlink_named_value_float_t), typeof(mavlink_named_value_int_t), typeof(mavlink_statustext_t), typeof(mavlink_debug_t), null }; + + public const byte MAVLINK_VERSION = 2; + + + /** @brief Enumeration of possible mount operation modes */ + public enum MAV_MOUNT_MODE + { + /// Load and keep safe position (Roll,Pitch,Yaw) from EEPROM and stop stabilization | + RETRACT = 0, + /// Load and keep neutral position (Roll,Pitch,Yaw) from EEPROM. | + NEUTRAL = 1, + /// Load neutral position and start MAVLink Roll,Pitch,Yaw control with stabilization | + MAVLINK_TARGETING = 2, + /// Load neutral position and start RC Roll,Pitch,Yaw control with stabilization | + RC_TARGETING = 3, + /// Load neutral position and start to point to Lat,Lon,Alt | + GPS_POINT = 4, + /// | + ENUM_END = 5, + + }; + + /// + public enum MAV_CMD + { + /// Navigate to MISSION. |Hold time in decimal seconds. (ignored by fixed wing, time to stay at MISSION for rotary wing)| Acceptance radius in meters (if the sphere with this radius is hit, the MISSION counts as reached)| 0 to pass through the WP, if > 0 radius in meters to pass by WP. Positive value for clockwise orbit, negative value for counter-clockwise orbit. Allows trajectory control.| Desired yaw angle at MISSION (rotary wing)| Latitude| Longitude| Altitude| + WAYPOINT = 16, + /// Loiter around this MISSION an unlimited amount of time |Empty| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| + LOITER_UNLIM = 17, + /// Loiter around this MISSION for X turns |Turns| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| + LOITER_TURNS = 18, + /// Loiter around this MISSION for X seconds |Seconds (decimal)| Empty| Radius around MISSION, in meters. If positive loiter clockwise, else counter-clockwise| Desired yaw angle.| Latitude| Longitude| Altitude| + LOITER_TIME = 19, + /// Return to launch location |Empty| Empty| Empty| Empty| Empty| Empty| Empty| + RETURN_TO_LAUNCH = 20, + /// Land at location |Empty| Empty| Empty| Desired yaw angle.| Latitude| Longitude| Altitude| + LAND = 21, + /// Takeoff from ground / hand |Minimum pitch (if airspeed sensor present), desired pitch without sensor| Empty| Empty| Yaw angle (if magnetometer present), ignored without magnetometer| Latitude| Longitude| Altitude| + TAKEOFF = 22, + /// + /// // ֿ, 20160331, Թʦ˵Ǵļõġ + /// + TELL_COPTER = 23, + /// + /// // ֿ, 20160331, Թʦʼδ֪ + /// + FILE_TRANS_MODE = 24, + /// + /// // ֿ, 20160331, Թʦʼ RF ԡ + /// + RF_TEST = 25, + /// Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Region of intereset mode. (see MAV_ROI enum)| MISSION index/ target ID. (see MAV_ROI enum)| ROI index (allows a vehicle to manage multiple ROI's)| Empty| x the location of the fixed ROI (see MAV_FRAME)| y| z| + ROI = 80, + /// Control autonomous path planning on the MAV. |0: Disable local obstacle avoidance / local path planning (without resetting map), 1: Enable local path planning, 2: Enable and reset local path planning| 0: Disable full path planning (without resetting map), 1: Enable, 2: Enable and reset map/occupancy grid, 3: Enable and reset planned route, but not occupancy grid| Empty| Yaw angle at goal, in compass degrees, [0..360]| Latitude/X of goal| Longitude/Y of goal| Altitude/Z of goal| + PATHPLANNING = 81, + /// Navigate to MISSION using a spline path. |Hold time in decimal seconds. (ignored by fixed wing, time to stay at MISSION for rotary wing)| Empty| Empty| Empty| Latitude/X of goal| Longitude/Y of goal| Altitude/Z of goal| + SPLINE_WAYPOINT = 82, + /// Pass control to an external controller. |Timeout in seconds. The maximum amount of time that the external controller will be allowed to control the vehicle. 0 means no timeout| Altitude min. If vehicle moves below this altitude the command will be aborted and the mission will continue. 0 for no lower alt limit| Altitude max. If vehicle moves above this altitude the command will be aborted and the mission will continue. 0 for no upper alt limit| Horizontal move limit. If vehicle moves more than this distance from it's location at the moment the command was begun, the command will be aborted and the mission will continue. 0 for no horizontal movement limit| Empty| Empty| Empty| + GUIDED = 90, + /// Navigate at the specified velocity |coordinate_frame - see MAV_FRAME enum| Empty| Empty| Empty| x velocity| y velocity| z velocity| + VELOCITY = 91, + /// NOP - This command is only used to mark the upper limit of the NAV/ACTION commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| + LAST = 95, + /// Delay mission state machine. |Delay in seconds (decimal)| Empty| Empty| Empty| Empty| Empty| Empty| + CONDITION_DELAY = 112, + /// Ascend/descend at rate. Delay mission state machine until desired altitude reached. |Descent / Ascend rate (m/s)| Empty| Empty| Empty| Empty| Empty| Finish Altitude| + CONDITION_CHANGE_ALT = 113, + /// Delay mission state machine until within desired distance of next NAV point. |Distance (meters)| Empty| Empty| Empty| Empty| Empty| Empty| + CONDITION_DISTANCE = 114, + /// Reach a certain target angle. |target angle: [0-360], 0 is north| speed during yaw change:[deg per second]| direction: negative: counter clockwise, positive: clockwise [-1,1]| relative offset or absolute angle: [ 1,0]| Empty| Empty| Empty| + CONDITION_YAW = 115, + /// NOP - This command is only used to mark the upper limit of the CONDITION commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| + CONDITION_LAST = 159, + /// Set system mode. |Mode, as defined by ENUM MAV_MODE| Empty| Empty| Empty| Empty| Empty| Empty| + DO_SET_MODE = 176, + /// Jump to the desired command in the mission list. Repeat this action only the specified number of times |Sequence number| Repeat count| Empty| Empty| Empty| Empty| Empty| + DO_JUMP = 177, + /// Change speed and/or throttle set points. |Speed type (0=Airspeed, 1=Ground Speed)| Speed (m/s, -1 indicates no change)| Throttle ( Percent, -1 indicates no change)| Empty| Empty| Empty| Empty| + DO_CHANGE_SPEED = 178, + /// Changes the home location either to the current location or a specified location. |Use current (1=use current location, 0=use specified location)| Empty| Empty| Empty| Latitude| Longitude| Altitude| + DO_SET_HOME = 179, + /// Set a system parameter. Caution! Use of this command requires knowledge of the numeric enumeration value of the parameter. |Parameter number| Parameter value| Empty| Empty| Empty| Empty| Empty| + DO_SET_PARAMETER = 180, + /// Set a relay to a condition. |Relay number| Setting (1=on, 0=off, others possible depending on system hardware)| Empty| Empty| Empty| Empty| Empty| + DO_SET_RELAY = 181, + /// Cycle a relay on and off for a desired number of cyles with a desired period. |Relay number| Cycle count| Cycle time (seconds, decimal)| Empty| Empty| Empty| Empty| + DO_REPEAT_RELAY = 182, + /// Set a servo to a desired PWM value. |Servo number| PWM (microseconds, 1000 to 2000 typical)| Empty| Empty| Empty| Empty| Empty| + DO_SET_SERVO = 183, + /// Cycle a between its nominal setting and a desired PWM for a desired number of cycles with a desired period. |Servo number| PWM (microseconds, 1000 to 2000 typical)| Cycle count| Cycle time (seconds)| Empty| Empty| Empty| + DO_REPEAT_SERVO = 184, + /// Control onboard camera system. |Camera ID (-1 for all)| Transmission: 0: disabled, 1: enabled compressed, 2: enabled raw| Transmission mode: 0: video stream, >0: single images every n seconds (decimal)| Recording: 0: disabled, 1: enabled compressed, 2: enabled raw| Empty| Empty| Empty| + DO_CONTROL_VIDEO = 200, + /// Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. |Region of intereset mode. (see MAV_ROI enum)| MISSION index/ target ID. (see MAV_ROI enum)| ROI index (allows a vehicle to manage multiple ROI's)| Empty| x the location of the fixed ROI (see MAV_FRAME)| y| z| + DO_SET_ROI = 201, + /// Mission command to configure an on-board camera controller system. |Modes: P, TV, AV, M, Etc| Shutter speed: Divisor number for one second| Aperture: F stop number| ISO number e.g. 80, 100, 200, Etc| Exposure type enumerator| Command Identity| Main engine cut-off time before camera trigger in seconds/10 (0 means no cut-off)| + DO_DIGICAM_CONFIGURE = 202, + /// Mission command to control an on-board camera controller system. |Session control e.g. show/hide lens| Zoom's absolute position| Zooming step value to offset zoom from the current position| Focus Locking, Unlocking or Re-locking| Shooting Command| Command Identity| Empty| + DO_DIGICAM_CONTROL = 203, + /// Mission command to configure a camera or antenna mount |Mount operation mode (see MAV_MOUNT_MODE enum)| stabilize roll? (1 = yes, 0 = no)| stabilize pitch? (1 = yes, 0 = no)| stabilize yaw? (1 = yes, 0 = no)| Empty| Empty| Empty| + DO_MOUNT_CONFIGURE = 204, + /// Mission command to control a camera or antenna mount |pitch or lat in degrees, depending on mount mode.| roll or lon in degrees depending on mount mode| yaw or alt (in meters) depending on mount mode| reserved| reserved| reserved| MAV_MOUNT_MODE enum value| + DO_MOUNT_CONTROL = 205, + /// Mission command to set CAM_TRIGG_DIST for this flight |Camera trigger distance (meters)| Empty| Empty| Empty| Empty| Empty| Empty| + DO_SET_CAM_TRIGG_DIST = 206, + /// Mission command to enable the geofence |enable? (0=disable, 1=enable)| Empty| Empty| Empty| Empty| Empty| Empty| + DO_FENCE_ENABLE = 207, + /// Mission command to trigger a parachute |action (0=disable, 1=enable, 2=release, for some systems see PARACHUTE_ACTION enum, not in general message set.)| Empty| Empty| Empty| Empty| Empty| Empty| + DO_PARACHUTE = 208, + /// Mission command to perform motor test |motor sequence number (a number from 1 to max number of motors on the vehicle)| throttle type (0=throttle percentage, 1=PWM, 2=pilot throttle channel pass-through. See MOTOR_TEST_THROTTLE_TYPE enum)| throttle| timeout (in seconds)| Empty| Empty| Empty| + DO_MOTOR_TEST = 209, + /// Change to/from inverted flight |inverted (0=normal, 1=inverted)| Empty| Empty| Empty| Empty| Empty| Empty| + DO_INVERTED_FLIGHT = 210, + /// Mission command to control a camera or antenna mount, using a quaternion as reference. |q1 - quaternion param #1| q2 - quaternion param #2| q3 - quaternion param #3| q4 - quaternion param #4| Empty| Empty| Empty| + DO_MOUNT_CONTROL_QUAT = 220, + /// NOP - This command is only used to mark the upper limit of the DO commands in the enumeration |Empty| Empty| Empty| Empty| Empty| Empty| Empty| + DO_LAST = 240, + /// Trigger calibration. This command will be only accepted if in pre-flight mode. |Gyro calibration: 0: no, 1: yes| Magnetometer calibration: 0: no, 1: yes| Ground pressure: 0: no, 1: yes| Radio calibration: 0: no, 1: yes| Accelerometer calibration: 0: no, 1: yes| Compass/Motor interference calibration: 0: no, 1: yes| Empty| + PREFLIGHT_CALIBRATION = 241, + /// Set sensor offsets. This command will be only accepted if in pre-flight mode. |Sensor to adjust the offsets for: 0: gyros, 1: accelerometer, 2: magnetometer, 3: barometer, 4: optical flow| X axis offset (or generic dimension 1), in the sensor's raw units| Y axis offset (or generic dimension 2), in the sensor's raw units| Z axis offset (or generic dimension 3), in the sensor's raw units| Generic dimension 4, in the sensor's raw units| Generic dimension 5, in the sensor's raw units| Generic dimension 6, in the sensor's raw units| + PREFLIGHT_SET_SENSOR_OFFSETS = 242, + /// Request storage of different parameter values and logs. This command will be only accepted if in pre-flight mode. |Parameter storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM| Mission storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM| Reserved| Reserved| Empty| Empty| Empty| + PREFLIGHT_STORAGE = 245, + /// Request the reboot or shutdown of system components. |0: Do nothing for autopilot, 1: Reboot autopilot, 2: Shutdown autopilot.| 0: Do nothing for onboard computer, 1: Reboot onboard computer, 2: Shutdown onboard computer.| Reserved| Reserved| Empty| Empty| Empty| + PREFLIGHT_REBOOT_SHUTDOWN = 246, + /// Hold / continue the current action |MAV_GOTO_DO_HOLD: hold MAV_GOTO_DO_CONTINUE: continue with next item in mission plan| MAV_GOTO_HOLD_AT_CURRENT_POSITION: Hold at current position MAV_GOTO_HOLD_AT_SPECIFIED_POSITION: hold at specified position| MAV_FRAME coordinate frame of hold point| Desired yaw angle in degrees| Latitude / X position| Longitude / Y position| Altitude / Z position| + OVERRIDE_GOTO = 252, + /// start running a mission |first_item: the first mission item to run| last_item: the last mission item to run (after this item is run, the mission ends)| + MISSION_START = 300, + /// Arms / Disarms a component |1 to arm, 0 to disarm| + COMPONENT_ARM_DISARM = 400, + /// Starts receiver pairing |0:Spektrum| 0:Spektrum DSM2, 1:Spektrum DSMX| + START_RX_PAIR = 500, + /// | + ENUM_END = 501, + }; + + /** @brief */ + public enum FENCE_ACTION + { + /// Disable fenced mode | + NONE = 0, + /// Switched to guided mode to return point (fence point 0) | + GUIDED = 1, + /// Report fence breach, but don't take action | + REPORT = 2, + /// | + ENUM_END = 3, + + }; + + /** @brief */ + public enum FENCE_BREACH + { + /// No last fence breach | + NONE = 0, + /// Breached minimum altitude | + MINALT = 1, + /// Breached minimum altitude | + MAXALT = 2, + /// Breached fence boundary | + BOUNDARY = 3, + /// | + ENUM_END = 4, + + }; + + /** @brief */ + public enum LIMITS_STATE + { + /// pre-initialization | + LIMITS_INIT = 0, + /// disabled | + LIMITS_DISABLED = 1, + /// checking limits | + LIMITS_ENABLED = 2, + /// a limit has been breached | + LIMITS_TRIGGERED = 3, + /// taking action eg. RTL | + LIMITS_RECOVERING = 4, + /// we're no longer in breach of a limit | + LIMITS_RECOVERED = 5, + /// | + ENUM_END = 6, + + }; + + /** @brief */ + public enum LIMIT_MODULE + { + /// pre-initialization | + LIMIT_GPSLOCK = 1, + /// disabled | + LIMIT_GEOFENCE = 2, + /// checking limits | + LIMIT_ALTITUDE = 4, + /// | + ENUM_END = 5, + + }; + + /// + public enum MOTOR_TEST_THROTTLE_TYPE + { + /// throttle as a percentage from 0 ~ 100 | + MOTOR_TEST_THROTTLE_PERCENT = 0, + /// throttle as an absolute PWM value (normally in range of 1000~2000) | + MOTOR_TEST_THROTTLE_PWM = 1, + /// throttle pass-through from pilot's transmitter | + MOTOR_TEST_THROTTLE_PILOT = 2, + /// | + ENUM_END = 3, + + }; + + /** @brief Micro air vehicle / autopilot classes. This identifies the individual model. */ + public enum MAV_AUTOPILOT + { + /// Generic autopilot, full support for everything | + GENERIC = 0, + /// PIXHAWK autopilot, http://pixhawk.ethz.ch | + PIXHAWK = 1, + /// SLUGS autopilot, http://slugsuav.soe.ucsc.edu | + SLUGS = 2, + /// ArduPilotMega / ArduCopter, http://diydrones.com | + PlanePILOT = 3, + /// OpenPilot, http://openpilot.org | + OPENPILOT = 4, + /// Generic autopilot only supporting simple waypoints | + GENERIC_WAYPOINTS_ONLY = 5, + /// Generic autopilot supporting waypoints and other simple navigation commands | + GENERIC_WAYPOINTS_AND_SIMPLE_NAVIGATION_ONLY = 6, + /// Generic autopilot supporting the full mission command set | + GENERIC_MISSION_FULL = 7, + /// No valid autopilot, e.g. a GCS or other MAVLink component | + INVALID = 8, + /// PPZ UAV - http://nongnu.org/paparazzi | + PPZ = 9, + /// UAV Dev Board | + UDB = 10, + /// FlexiPilot | + FP = 11, + /// PX4 Autopilot - http://pixhawk.ethz.ch/px4/ | + PX4 = 12, + /// | + ENUM_END = 13, + + }; + + /** @brief */ + public enum MAV_TYPE + { + /// Generic micro air vehicle. | + GENERIC = 0, + /// Fixed wing aircraft. | + FIXED_WING = 1, + /// Quadrotor | + QUADROTOR = 2, + /// Coaxial helicopter | + COAXIAL = 3, + /// Normal helicopter with tail rotor. | + HELICOPTER = 4, + /// Ground installation | + ANTENNA_TRACKER = 5, + /// Operator control unit / ground control station | + GCS = 6, + /// Airship, controlled | + AIRSHIP = 7, + /// Free balloon, uncontrolled | + FREE_BALLOON = 8, + /// Rocket | + ROCKET = 9, + /// Ground rover | + GROUND_ROVER = 10, + /// Surface vessel, boat, ship | + SURFACE_BOAT = 11, + /// Submarine | + SUBMARINE = 12, + /// Hexarotor | + HEXAROTOR = 13, + /// Octorotor | + OCTOROTOR = 14, + /// Octorotor | + TRICOPTER = 15, + /// Flapping wing | + FLAPPING_WING = 16, + /// Flapping wing | + KITE = 17, + /// | + ENUM_END = 18, + + }; + + /** @brief These flags encode the MAV mode. */ + public enum MAV_MODE_FLAG + { + /// 0b00000001 Reserved for future use. | + CUSTOM_MODE_ENABLED = 1, + /// 0b00000010 system has a test mode enabled. This flag is intended for temporary system tests and should not be used for stable implementations. | + TEST_ENABLED = 2, + /// 0b00000100 autonomous mode enabled, system finds its own goal positions. Guided flag can be set or not, depends on the actual implementation. | + AUTO_ENABLED = 4, + /// 0b00001000 guided mode enabled, system flies MISSIONs / mission items. | + GUIDED_ENABLED = 8, + /// 0b00010000 system stabilizes electronically its attitude (and optionally position). It needs however further control inputs to move around. | + STABILIZE_ENABLED = 16, + /// 0b00100000 hardware in the loop simulation. All motors / actuators are blocked, but public software is full operational. | + HIL_ENABLED = 32, + /// 0b01000000 remote control input is enabled. | + MANUAL_INPUT_ENABLED = 64, + /// 0b10000000 MAV safety set to armed. Motors are enabled / running / can start. Ready to fly. | + SAFETY_ARMED = 128, + /// | + ENUM_END = 129, + + }; + + /** @brief These values encode the bit positions of the decode position. These values can be used to read the value of a flag bit by combining the base_mode variable with AND with the flag position value. The result will be either 0 or 1, depending on if the flag is set or not. */ + public enum MAV_MODE_FLAG_DECODE_POSITION + { + /// Eighth bit: 00000001 | + CUSTOM_MODE = 1, + /// Seventh bit: 00000010 | + TEST = 2, + /// Sixt bit: 00000100 | + AUTO = 4, + /// Fifth bit: 00001000 | + GUIDED = 8, + /// Fourth bit: 00010000 | + STABILIZE = 16, + /// Third bit: 00100000 | + HIL = 32, + /// Second bit: 01000000 | + MANUAL = 64, + /// First bit: 10000000 | + SAFETY = 128, + /// | + ENUM_END = 129, + + }; + + /** @brief Override command, pauses current mission execution and moves immediately to a position */ + public enum MAV_GOTO + { + /// Hold at the current position. | + DO_HOLD = 0, + /// Continue with the next item in mission execution. | + DO_CONTINUE = 1, + /// Hold at the current position of the system | + HOLD_AT_CURRENT_POSITION = 2, + /// Hold at the position specified in the parameters of the DO_HOLD action | + HOLD_AT_SPECIFIED_POSITION = 3, + /// | + ENUM_END = 4, + + }; + + /** @brief These defines are predefined OR-combined mode flags. There is no need to use values from this enum, but it simplifies the use of the mode flags. Note that manual input is enabled in all modes as a safety override. */ + public enum MAV_MODE + { + /// System is not ready to fly, booting, calibrating, etc. No flag is set. | + PREFLIGHT = 0, + /// System is allowed to be active, under manual (RC) control, no stabilization | + MANUAL_DISARMED = 64, + /// UNDEFINED mode. This solely depends on the autopilot - use with caution, intended for developers only. | + TEST_DISARMED = 66, + /// System is allowed to be active, under assisted RC control. | + STABILIZE_DISARMED = 80, + /// System is allowed to be active, under autonomous control, manual setpoint | + GUIDED_DISARMED = 88, + /// System is allowed to be active, under autonomous control and navigation (the trajectory is decided onboard and not pre-programmed by MISSIONs) | + AUTO_DISARMED = 92, + /// System is allowed to be active, under manual (RC) control, no stabilization | + MANUAL_ARMED = 192, + /// UNDEFINED mode. This solely depends on the autopilot - use with caution, intended for developers only. | + TEST_ARMED = 194, + /// System is allowed to be active, under assisted RC control. | + STABILIZE_ARMED = 208, + /// System is allowed to be active, under autonomous control, manual setpoint | + GUIDED_ARMED = 216, + /// System is allowed to be active, under autonomous control and navigation (the trajectory is decided onboard and not pre-programmed by MISSIONs) | + AUTO_ARMED = 220, + /// | + ENUM_END = 221, + + }; + + /** @brief */ + public enum MAV_STATE + { + /// Uninitialized system, state is unknown. | + UNINIT = 0, + /// System is booting up. | + BOOT = 1, + /// System is calibrating and not flight-ready. | + CALIBRATING = 2, + /// System is grounded and on standby. It can be launched any time. | + STANDBY = 3, + /// System is active and might be already airborne. Motors are engaged. | + ACTIVE = 4, + /// System is in a non-normal flight mode. It can however still navigate. | + CRITICAL = 5, + /// System is in a non-normal flight mode. It lost control over parts or over the whole airframe. It is in mayday and going down. | + EMERGENCY = 6, + /// System just initialized its power-down sequence, will shut down now. | + POWEROFF = 7, + /// | + ENUM_END = 8, + + }; + + /** @brief */ + public enum MAV_COMPONENT + { + /// | + MAV_COMP_ID_ALL = 0, + /// | + MAV_COMP_ID_CAMERA = 100, + /// | + MAV_COMP_ID_SERVO1 = 140, + /// | + MAV_COMP_ID_SERVO2 = 141, + /// | + MAV_COMP_ID_SERVO3 = 142, + /// | + MAV_COMP_ID_SERVO4 = 143, + /// | + MAV_COMP_ID_SERVO5 = 144, + /// | + MAV_COMP_ID_SERVO6 = 145, + /// | + MAV_COMP_ID_SERVO7 = 146, + /// | + MAV_COMP_ID_SERVO8 = 147, + /// | + MAV_COMP_ID_SERVO9 = 148, + /// | + MAV_COMP_ID_SERVO10 = 149, + /// | + MAV_COMP_ID_SERVO11 = 150, + /// | + MAV_COMP_ID_SERVO12 = 151, + /// | + MAV_COMP_ID_SERVO13 = 152, + /// | + MAV_COMP_ID_SERVO14 = 153, + /// | + MAV_COMP_ID_MAPPER = 180, + /// | + MAV_COMP_ID_MISSIONPLANNER = 190, + /// | + MAV_COMP_ID_PATHPLANNER = 195, + /// | + MAV_COMP_ID_IMU = 200, + /// | + MAV_COMP_ID_IMU_2 = 201, + /// | + MAV_COMP_ID_IMU_3 = 202, + /// | + MAV_COMP_ID_GPS = 220, + /// | + MAV_COMP_ID_UDP_BRIDGE = 240, + /// | + MAV_COMP_ID_UART_BRIDGE = 241, + /// | + MAV_COMP_ID_SYSTEM_CONTROL = 250, + /// | + ENUM_END = 251, + + }; + + /** @brief */ + public enum MAV_FRAME + { + /// Global coordinate frame, WGS84 coordinate system. First value / x: latitude, second value / y: longitude, third value / z: positive altitude over mean sea level (MSL) | + GLOBAL = 0, + /// Local coordinate frame, Z-up (x: north, y: east, z: down). | + LOCAL_NED = 1, + /// NOT a coordinate frame, indicates a mission command. | + MISSION = 2, + /// Global coordinate frame, WGS84 coordinate system, relative altitude over ground with respect to the home position. First value / x: latitude, second value / y: longitude, third value / z: positive altitude with 0 being at the altitude of the home location. | + GLOBAL_RELATIVE_ALT = 3, + /// Local coordinate frame, Z-down (x: east, y: north, z: up) | + LOCAL_ENU = 4, + /// | + ENUM_END = 5, + + }; + + /** @brief */ + public enum MAVLINK_DATA_STREAM_TYPE + { + /// | + MAVLINK_DATA_STREAM_IMG_JPEG = 1, + /// | + MAVLINK_DATA_STREAM_IMG_BMP = 2, + /// | + MAVLINK_DATA_STREAM_IMG_RAW8U = 3, + /// | + MAVLINK_DATA_STREAM_IMG_RAW32U = 4, + /// | + MAVLINK_DATA_STREAM_IMG_PGM = 5, + /// | + MAVLINK_DATA_STREAM_IMG_PNG = 6, + /// | + ENUM_END = 7, + + }; + + /** @brief Data stream IDs. A data stream is not a fixed set of messages, but rather a recommendation to the autopilot software. Individual autopilots may or may not obey the recommended messages. */ + public enum MAV_DATA_STREAM + { + /// Enable all data streams | + ALL = 0, + /// Enable IMU_RAW, GPS_RAW, GPS_STATUS packets. | + RAW_SENSORS = 1, + /// Enable GPS_STATUS, CONTROL_STATUS, AUX_STATUS | + EXTENDED_STATUS = 2, + /// Enable RC_CHANNELS_SCALED, RC_CHANNELS_RAW, SERVO_OUTPUT_RAW | + RC_CHANNELS = 3, + /// Enable ATTITUDE_CONTROLLER_OUTPUT, POSITION_CONTROLLER_OUTPUT, NAV_CONTROLLER_OUTPUT. | + RAW_CONTROLLER = 4, + /// Enable LOCAL_POSITION, GLOBAL_POSITION/GLOBAL_POSITION_INT messages. | + POSITION = 6, + /// Dependent on the autopilot | + EXTRA1 = 10, + /// Dependent on the autopilot | + EXTRA2 = 11, + /// Dependent on the autopilot | + EXTRA3 = 12, + /// | + ENUM_END = 13, + //Plane Stream + GHOST_STREAM = 15 + }; + + /** @brief The ROI (region of interest) for the vehicle. This can be be used by the vehicle for camera/vehicle attitude alignment (see MAV_CMD_NAV_ROI). */ + public enum MAV_ROI + { + /// No region of interest. | + NONE = 0, + /// Point toward next MISSION. | + WPNEXT = 1, + /// Point toward given MISSION. | + WPINDEX = 2, + /// Point toward fixed location. | + LOCATION = 3, + /// Point toward of given id. | + TARGET = 4, + /// | + ENUM_END = 5, + + }; + + /** @brief ACK / NACK / ERROR values as a result of MAV_CMDs and for mission item transmission. */ + public enum MAV_CMD_ACK + { + /// Command / mission item is ok. | + OK = 1, + /// Generic error message if none of the other reasons fails or if no detailed error reporting is implemented. | + ERR_FAIL = 2, + /// The system is refusing to accept this command from this source / communication partner. | + ERR_ACCESS_DENIED = 3, + /// Command or mission item is not supported, other commands would be accepted. | + ERR_NOT_SUPPORTED = 4, + /// The coordinate frame of this command / mission item is not supported. | + ERR_COORDINATE_FRAME_NOT_SUPPORTED = 5, + /// The coordinate frame of this command is ok, but he coordinate values exceed the safety limits of this system. This is a generic error, please use the more specific error messages below if possible. | + ERR_COORDINATES_OUT_OF_RANGE = 6, + /// The X or latitude value is out of range. | + ERR_X_LAT_OUT_OF_RANGE = 7, + /// The Y or longitude value is out of range. | + ERR_Y_LON_OUT_OF_RANGE = 8, + /// The Z or altitude value is out of range. | + ERR_Z_ALT_OUT_OF_RANGE = 9, + /// | + ENUM_END = 10, + + }; + + /** @brief Specifies the datatype of a MAVLink parameter. */ + public enum MAV_PARAM_TYPE + { + /// 8-bit unsigned integer | + UINT8 = 1, + /// 8-bit signed integer | + INT8 = 2, + /// 16-bit unsigned integer | + UINT16 = 3, + /// 16-bit signed integer | + INT16 = 4, + /// 32-bit unsigned integer | + UINT32 = 5, + /// 32-bit signed integer | + INT32 = 6, + /// 64-bit unsigned integer | + UINT64 = 7, + /// 64-bit signed integer | + INT64 = 8, + /// 32-bit floating-point | + REAL32 = 9, + /// 64-bit floating-point | + REAL64 = 10, + /// | + ENUM_END = 11, + + }; + + /** @brief result from a mavlink command */ + public enum MAV_RESULT + { + /// Command ACCEPTED and EXECUTED | + ACCEPTED = 0, + /// Command TEMPORARY REJECTED/DENIED | + TEMPORARILY_REJECTED = 1, + /// Command PERMANENTLY DENIED | + DENIED = 2, + /// Command UNKNOWN/UNSUPPORTED | + UNSUPPORTED = 3, + /// Command executed, but failed | + FAILED = 4, + /// | + ENUM_END = 5, + + }; + + /** @brief result in a mavlink mission ack */ + public enum MAV_MISSION_RESULT + { + /// mission accepted OK | + MAV_MISSION_ACCEPTED = 0, + /// generic error / not accepting mission commands at all right now | + MAV_MISSION_ERROR = 1, + /// coordinate frame is not supported | + MAV_MISSION_UNSUPPORTED_FRAME = 2, + /// command is not supported | + MAV_MISSION_UNSUPPORTED = 3, + /// mission item exceeds storage space | + MAV_MISSION_NO_SPACE = 4, + /// one of the parameters has an invalid value | + MAV_MISSION_INVALID = 5, + /// param1 has an invalid value | + MAV_MISSION_INVALID_PARAM1 = 6, + /// param2 has an invalid value | + MAV_MISSION_INVALID_PARAM2 = 7, + /// param3 has an invalid value | + MAV_MISSION_INVALID_PARAM3 = 8, + /// param4 has an invalid value | + MAV_MISSION_INVALID_PARAM4 = 9, + /// x/param5 has an invalid value | + MAV_MISSION_INVALID_PARAM5_X = 10, + /// y/param6 has an invalid value | + MAV_MISSION_INVALID_PARAM6_Y = 11, + /// param7 has an invalid value | + MAV_MISSION_INVALID_PARAM7 = 12, + /// received waypoint out of sequence | + MAV_MISSION_INVALID_SEQUENCE = 13, + /// not accepting any mission commands from this communication partner | + MAV_MISSION_DENIED = 14, + /// | + ENUM_END = 15, + + }; + + /** @brief Indicates the severity level, generally used for status messages to indicate their relative urgency. Based on RFC-5424 using expanded definitions at: http://www.kiwisyslog.com/kb/info:-syslog-message-levels/. */ + public enum MAV_SEVERITY + { + /// System is unusable. This is a "panic" condition. | + EMERGENCY = 0, + /// Action should be taken immediately. Indicates error in non-critical systems. | + ALERT = 1, + /// Action must be taken immediately. Indicates failure in a primary system. | + CRITICAL = 2, + /// Indicates an error in secondary/redundant systems. | + ERROR = 3, + /// Indicates about a possible future error if this is not resolved within a given timeframe. Example would be a low battery warning. | + WARNING = 4, + /// An unusual event has occured, though not an error condition. This should be investigated for the root cause. | + NOTICE = 5, + /// Normal operational messages. Useful for logging. No action is required for these messages. | + INFO = 6, + /// Useful non-operational messages that can assist in debugging. These should not occur during normal operation. | + DEBUG = 7, + /// | + ENUM_END = 8, + + }; + + public enum MAVLINK_MSG_ID + { + HEARTBEAT = 0, + SYS_STATUS = 1, + SYSTEM_TIME = 2, + PING = 4, + CHANGE_OPERATOR_CONTROL = 5, + CHANGE_OPERATOR_CONTROL_ACK = 6, + AUTH_KEY = 7, + SET_MODE = 11, + PARAM_REQUEST_READ = 20, + PARAM_REQUEST_LIST = 21, + PARAM_VALUE = 22, + PARAM_SET = 23, + GPS_RAW_INT = 24, + GPS_STATUS = 25, + SCALED_IMU = 26, + RAW_IMU = 27, + RAW_PRESSURE = 28, + SCALED_PRESSURE = 29, + ATTITUDE = 30, + ATTITUDE_QUATERNION = 31, + LOCAL_POSITION_NED = 32, + GLOBAL_POSITION_INT = 33, + RC_CHANNELS_SCALED = 34, + RC_CHANNELS_RAW = 35, + SERVO_OUTPUT_RAW = 36, + MISSION_REQUEST_PARTIAL_LIST = 37, + MISSION_WRITE_PARTIAL_LIST = 38, + MISSION_ITEM = 39, + MISSION_REQUEST = 40, + MISSION_SET_CURRENT = 41, + MISSION_CURRENT = 42, + MISSION_REQUEST_LIST = 43, + MISSION_COUNT = 44, + MISSION_CLEAR_ALL = 45, + MISSION_ITEM_REACHED = 46, + MISSION_ACK = 47, + SET_GPS_GLOBAL_ORIGIN = 48, + GPS_GLOBAL_ORIGIN = 49, + SET_LOCAL_POSITION_SETPOINT = 50, + LOCAL_POSITION_SETPOINT = 51, + GLOBAL_POSITION_SETPOINT_INT = 52, + SET_GLOBAL_POSITION_SETPOINT_INT = 53, + SAFETY_SET_ALLOWED_AREA = 54, + SAFETY_ALLOWED_AREA = 55, + SET_ROLL_PITCH_YAW_THRUST = 56, + SET_ROLL_PITCH_YAW_SPEED_THRUST = 57, + ROLL_PITCH_YAW_THRUST_SETPOINT = 58, + ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT = 59, + SET_QUAD_MOTORS_SETPOINT = 60, + SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST = 61, + NAV_CONTROLLER_OUTPUT = 62, + SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST = 63, + STATE_CORRECTION = 64, + RC_CHANNELS = 65, + REQUEST_DATA_STREAM = 66, + DATA_STREAM = 67, + MANUAL_CONTROL = 69, + RC_CHANNELS_OVERRIDE = 70, + VFR_HUD = 74, + COMMAND_LONG = 76, + COMMAND_ACK = 77, + ROLL_PITCH_YAW_RATES_THRUST_SETPOINT = 80, + MANUAL_SETPOINT = 81, + LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET = 89, + HIL_STATE = 90, + HIL_CONTROLS = 91, + HIL_RC_INPUTS_RAW = 92, + OPTICAL_FLOW = 100, + GLOBAL_VISION_POSITION_ESTIMATE = 101, + VISION_POSITION_ESTIMATE = 102, + VISION_SPEED_ESTIMATE = 103, + VICON_POSITION_ESTIMATE = 104, + HIGHRES_IMU = 105, + OMNIDIRECTIONAL_FLOW = 106, + HIL_SENSOR = 107, + SIM_STATE = 108, + RADIO_STATUS = 109, + FILE_TRANSFER_START = 110, + FILE_TRANSFER_DIR_LIST = 111, + FILE_TRANSFER_RES = 112, + HIL_GPS = 113, + HIL_OPTICAL_FLOW = 114, + HIL_STATE_QUATERNION = 115, + SCALED_IMU2 = 116, + LOG_REQUEST_LIST = 117, + LOG_ENTRY = 118, + LOG_REQUEST_DATA = 119, + LOG_DATA = 120, + LOG_ERASE = 121, + LOG_REQUEST_END = 122, + GPS_INJECT_DATA = 123, + GPS2_RAW = 124, + POWER_STATUS = 125, + SERIAL_CONTROL = 126, + DATA_TRANSMISSION_HANDSHAKE = 130, + ENCAPSULATED_DATA = 131, + BATTERY_STATUS = 147, + SETPOINT_8DOF = 148, + SETPOINT_6DOF = 149, + SENSOR_OFFSETS = 150, + SET_MAG_OFFSETS = 151, + MEMINFO = 152, + AP_ADC = 153, + DIGICAM_CONFIGURE = 154, + DIGICAM_CONTROL = 155, + MOUNT_CONFIGURE = 156, + MOUNT_CONTROL = 157, + MOUNT_STATUS = 158, + FENCE_POINT = 160, + FENCE_FETCH_POINT = 161, + FENCE_STATUS = 162, + AHRS = 163, + SIMSTATE = 164, + HWSTATUS = 165, + RADIO = 166, + LIMITS_STATUS = 167, + WIND = 168, + DATA16 = 169, + DATA32 = 170, + DATA64 = 171, + DATA96 = 172, + RANGEFINDER = 173, + AIRSPEED_AUTOCAL = 174, + RALLY_POINT = 175, + RALLY_FETCH_POINT = 176, + COMPASSMOT_STATUS = 177, + AHRS2 = 178, + MOBILE_CONTROL = 200, + SET_PAIR = 201, + MEMORY_VECT = 249, + DEBUG_VECT = 250, + NAMED_VALUE_FLOAT = 251, + NAMED_VALUE_INT = 252, + STATUSTEXT = 253, + DEBUG = 254 + } + + public const byte MAVLINK_MSG_ID_SCALED_IMU2 = 116; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_scaled_imu2_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// X acceleration (mg) + public Int16 xacc; + /// Y acceleration (mg) + public Int16 yacc; + /// Z acceleration (mg) + public Int16 zacc; + /// Angular speed around X axis (millirad /sec) + public Int16 xgyro; + /// Angular speed around Y axis (millirad /sec) + public Int16 ygyro; + /// Angular speed around Z axis (millirad /sec) + public Int16 zgyro; + /// X Magnetic field (milli tesla) + public Int16 xmag; + /// Y Magnetic field (milli tesla) + public Int16 ymag; + /// Z Magnetic field (milli tesla) + public Int16 zmag; + + }; + + public const byte MAVLINK_MSG_ID_SENSOR_OFFSETS = 150; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 42)] + public struct mavlink_sensor_offsets_t + { + /// magnetic declination (radians) + public Single mag_declination; + /// raw pressure from barometer + public Int32 raw_press; + /// raw temperature from barometer + public Int32 raw_temp; + /// gyro X calibration + public Single gyro_cal_x; + /// gyro Y calibration + public Single gyro_cal_y; + /// gyro Z calibration + public Single gyro_cal_z; + /// accel X calibration + public Single accel_cal_x; + /// accel Y calibration + public Single accel_cal_y; + /// accel Z calibration + public Single accel_cal_z; + /// magnetometer X offset + public Int16 mag_ofs_x; + /// magnetometer Y offset + public Int16 mag_ofs_y; + /// magnetometer Z offset + public Int16 mag_ofs_z; + + }; + + + public const byte MAVLINK_MSG_ID_SET_MAG_OFFSETS = 151; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 8)] + public struct mavlink_set_mag_offsets_t + { + /// magnetometer X offset + public Int16 mag_ofs_x; + /// magnetometer Y offset + public Int16 mag_ofs_y; + /// magnetometer Z offset + public Int16 mag_ofs_z; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MEMINFO = 152; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4)] + public struct mavlink_meminfo_t + { + /// heap top + public UInt16 brkval; + /// free memory + public UInt16 freemem; + + }; + + + public const byte MAVLINK_MSG_ID_AP_ADC = 153; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)] + public struct mavlink_ap_adc_t + { + /// ADC output 1 + public UInt16 adc1; + /// ADC output 2 + public UInt16 adc2; + /// ADC output 3 + public UInt16 adc3; + /// ADC output 4 + public UInt16 adc4; + /// ADC output 5 + public UInt16 adc5; + /// ADC output 6 + public UInt16 adc6; + + }; + + + public const byte MAVLINK_MSG_ID_DIGICAM_CONFIGURE = 154; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 15)] + public struct mavlink_digicam_configure_t + { + /// Correspondent value to given extra_param + public Single extra_value; + /// Divisor number //e.g. 1000 means 1/1000 (0 means ignore) + public UInt16 shutter_speed; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// Mode enumeration from 1 to N //P, TV, AV, M, Etc (0 means ignore) + public byte mode; + /// F stop number x 10 //e.g. 28 means 2.8 (0 means ignore) + public byte aperture; + /// ISO enumeration from 1 to N //e.g. 80, 100, 200, Etc (0 means ignore) + public byte iso; + /// Exposure type enumeration from 1 to N (0 means ignore) + public byte exposure_type; + /// Command Identity (incremental loop: 0 to 255)//A command sent multiple times will be executed or pooled just once + public byte command_id; + /// Main engine cut-off time before camera trigger in seconds/10 (0 means no cut-off) + public byte engine_cut_off; + /// Extra parameters enumeration (0 means ignore) + public byte extra_param; + + }; + + + public const byte MAVLINK_MSG_ID_DIGICAM_CONTROL = 155; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 13)] + public struct mavlink_digicam_control_t + { + /// Correspondent value to given extra_param + public Single extra_value; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// 0: stop, 1: start or keep it up //Session control e.g. show/hide lens + public byte session; + /// 1 to N //Zoom's absolute position (0 means ignore) + public byte zoom_pos; + /// -100 to 100 //Zooming step value to offset zoom from the current position + public byte zoom_step; + /// 0: unlock focus or keep unlocked, 1: lock focus or keep locked, 3: re-lock focus + public byte focus_lock; + /// 0: ignore, 1: shot or start filming + public byte shot; + /// Command Identity (incremental loop: 0 to 255)//A command sent multiple times will be executed or pooled just once + public byte command_id; + /// Extra parameters enumeration (0 means ignore) + public byte extra_param; + + }; + + + public const byte MAVLINK_MSG_ID_MOUNT_CONFIGURE = 156; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 6)] + public struct mavlink_mount_configure_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// mount operating mode (see MAV_MOUNT_MODE enum) + public byte mount_mode; + /// (1 = yes, 0 = no) + public byte stab_roll; + /// (1 = yes, 0 = no) + public byte stab_pitch; + /// (1 = yes, 0 = no) + public byte stab_yaw; + + }; + + + public const byte MAVLINK_MSG_ID_MOUNT_CONTROL = 157; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 15)] + public struct mavlink_mount_control_t + { + /// pitch(deg*100) or lat, depending on mount mode + public Int32 input_a; + /// roll(deg*100) or lon depending on mount mode + public Int32 input_b; + /// yaw(deg*100) or alt (in cm) depending on mount mode + public Int32 input_c; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// if "1" it will save current trimmed position on EEPROM (just valid for NEUTRAL and LANDING) + public byte save_position; + + }; + + + public const byte MAVLINK_MSG_ID_MOUNT_STATUS = 158; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 14)] + public struct mavlink_mount_status_t + { + /// pitch(deg*100) or lat, depending on mount mode + public Int32 pointing_a; + /// roll(deg*100) or lon depending on mount mode + public Int32 pointing_b; + /// yaw(deg*100) or alt (in cm) depending on mount mode + public Int32 pointing_c; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_FENCE_POINT = 160; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)] + public struct mavlink_fence_point_t + { + /// Latitude of point + public Single lat; + /// Longitude of point + public Single lng; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// point index (first point is 1, 0 is for return point) + public byte idx; + /// total number of points (for sanity checking) + public byte count; + + }; + + + public const byte MAVLINK_MSG_ID_FENCE_FETCH_POINT = 161; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 3)] + public struct mavlink_fence_fetch_point_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// point index (first point is 1, 0 is for return point) + public byte idx; + + }; + + + public const byte MAVLINK_MSG_ID_FENCE_STATUS = 162; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 8)] + public struct mavlink_fence_status_t + { + /// time of last breach in milliseconds since boot + public UInt32 breach_time; + /// number of fence breaches + public UInt16 breach_count; + /// 0 if currently inside fence, 1 if outside + public byte breach_status; + /// last breach type (see FENCE_BREACH_* enum) + public byte breach_type; + + }; + + + public const byte MAVLINK_MSG_ID_AHRS = 163; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_ahrs_t + { + /// X gyro drift estimate rad/s + public Single omegaIx; + /// Y gyro drift estimate rad/s + public Single omegaIy; + /// Z gyro drift estimate rad/s + public Single omegaIz; + /// average accel_weight + public Single accel_weight; + /// average renormalisation value + public Single renorm_val; + /// average error_roll_pitch value + public Single error_rp; + /// average error_yaw value + public Single error_yaw; + + }; + + + public const byte MAVLINK_MSG_ID_SIMSTATE = 164; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 44)] + public struct mavlink_simstate_t + { + /// Roll angle (rad) + public Single roll; + /// Pitch angle (rad) + public Single pitch; + /// Yaw angle (rad) + public Single yaw; + /// X acceleration m/s/s + public Single xacc; + /// Y acceleration m/s/s + public Single yacc; + /// Z acceleration m/s/s + public Single zacc; + /// Angular speed around X axis rad/s + public Single xgyro; + /// Angular speed around Y axis rad/s + public Single ygyro; + /// Angular speed around Z axis rad/s + public Single zgyro; + /// Latitude in degrees + public Single lat; + /// Longitude in degrees + public Single lng; + + }; + + + public const byte MAVLINK_MSG_ID_HWSTATUS = 165; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 3)] + public struct mavlink_hwstatus_t + { + /// board voltage (mV) + public UInt16 Vcc; + /// I2C error count + public byte I2Cerr; + + }; + + + public const byte MAVLINK_MSG_ID_RADIO = 109; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_radio_t + { + /// receive errors + public UInt16 rxerrors; + /// count of error corrected packets + public UInt16 fixedp; + /// local signal strength + public byte rssi; + /// remote signal strength + public byte remrssi; + /// how full the tx buffer is as a percentage + public byte txbuf; + /// background noise level + public byte noise; + /// remote background noise level + public byte remnoise; + }; + + + public const byte MAVLINK_MSG_ID_LIMITS_STATUS = 167; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_limits_status_t + { + /// time of last breach in milliseconds since boot + public UInt32 last_trigger; + /// time of last recovery action in milliseconds since boot + public UInt32 last_action; + /// time of last successful recovery in milliseconds since boot + public UInt32 last_recovery; + /// time of last all-clear in milliseconds since boot + public UInt32 last_clear; + /// number of fence breaches + public UInt16 breach_count; + /// state of AP_Limits, (see enum LimitState, LIMITS_STATE) + public byte limits_state; + /// AP_Limit_Module bitfield of enabled modules, (see enum moduleid or LIMIT_MODULE) + public byte mods_enabled; + /// AP_Limit_Module bitfield of required modules, (see enum moduleid or LIMIT_MODULE) + public byte mods_required; + /// AP_Limit_Module bitfield of triggered modules, (see enum moduleid or LIMIT_MODULE) + public byte mods_triggered; + + }; + + + public const byte MAVLINK_MSG_ID_WIND = 168; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)] + public struct mavlink_wind_t + { + /// wind direction that wind is coming from (degrees) + public Single direction; + /// wind speed in ground plane (m/s) + public Single speed; + /// vertical wind speed (m/s) + public Single speed_z; + + }; + + + public const byte MAVLINK_MSG_ID_DATA16 = 169; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_data16_t + { + /// data type + public byte type; + /// data length + public byte len; + /// raw data + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] data; + + }; + + + public const byte MAVLINK_MSG_ID_DATA32 = 170; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 34)] + public struct mavlink_data32_t + { + /// data type + public byte type; + /// data length + public byte len; + /// raw data + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] data; + + }; + + + public const byte MAVLINK_MSG_ID_DATA64 = 171; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 66)] + public struct mavlink_data64_t + { + /// data type + public byte type; + /// data length + public byte len; + /// raw data + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] + public byte[] data; + + }; + + + public const byte MAVLINK_MSG_ID_DATA96 = 172; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 98)] + public struct mavlink_data96_t + { + /// data type + public byte type; + /// data length + public byte len; + /// raw data + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 96)] + public byte[] data; + + }; + + + public const byte MAVLINK_MSG_ID_RANGEFINDER = 173; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 8)] + public struct mavlink_rangefinder_t + { + /// distance in meters + public Single distance; + /// raw voltage if available, zero otherwise + public Single voltage; + + }; + + + public const byte MAVLINK_MSG_ID_HEARTBEAT = 0; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_heartbeat_t + { + /// A bitfield for use for autopilot-specific flags. + public UInt32 custom_mode; + /// Type of the MAV (quadrotor, helicopter, etc., up to 15 types, defined in MAV_TYPE ENUM) + public byte type; + /// Autopilot type / class. defined in MAV_AUTOPILOT ENUM + /// // ֿ, 20160311, ںй GPS ģʽı־ + public byte autopilot; + /// System mode bitfield, see MAV_MODE_FLAGS ENUM in mavlink/include/mavlink_types.h + public byte base_mode; + /// System status flag, see MAV_STATE ENUM + public byte system_status; + /// MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version + public byte mavlink_version; + }; + + + public const byte MAVLINK_MSG_ID_SYS_STATUS = 1; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 31)] + public struct mavlink_sys_status_t + { + /// Bitmask showing which onboard controllers and sensors are present. Value of 0: not present. Value of 1: present. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control + public UInt32 onboard_control_sensors_present; + /// Bitmask showing which onboard controllers and sensors are enabled: Value of 0: not enabled. Value of 1: enabled. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control + public UInt32 onboard_control_sensors_enabled; + /// Bitmask showing which onboard controllers and sensors are operational or have an error: Value of 0: not enabled. Value of 1: enabled. Indices: 0: 3D gyro, 1: 3D acc, 2: 3D mag, 3: absolute pressure, 4: differential pressure, 5: GPS, 6: optical flow, 7: computer vision position, 8: laser based position, 9: external ground-truth (Vicon or Leica). Controllers: 10: 3D angular rate control 11: attitude stabilization, 12: yaw position, 13: z/altitude control, 14: x/y position control, 15: motor outputs / control + public UInt32 onboard_control_sensors_health; + /// Maximum usage in percent of the mainloop time, (0%: 0, 100%: 1000) should be always below 1000 + public UInt16 load; + /// Battery voltage, in millivolts (1 = 1 millivolt) + public UInt16 voltage_battery; + /// Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current + public Int16 current_battery; + /// Communication drops in percent, (0%: 0, 100%: 10'000), (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV) + public UInt16 drop_rate_comm; + /// Communication errors (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV) + public UInt16 errors_comm; + /// Autopilot-specific errors + public UInt16 errors_count1; + /// Autopilot-specific errors + public UInt16 errors_count2; + /// Autopilot-specific errors + public UInt16 errors_count3; + /// Autopilot-specific errors + public UInt16 errors_count4; + /// Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot estimate the remaining battery + public byte battery_remaining; + + }; + + + public const byte MAVLINK_MSG_ID_SYSTEM_TIME = 2; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)] + public struct mavlink_system_time_t + { + /// Timestamp of the master clock in microseconds since UNIX epoch. + public UInt64 time_unix_usec; + /// Timestamp of the component clock since boot time in milliseconds. + public UInt32 time_boot_ms; + + }; + + + public const byte MAVLINK_MSG_ID_PING = 4; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 14)] + public struct mavlink_ping_t + { + /// Unix timestamp in microseconds + public UInt64 time_usec; + /// PING sequence + public UInt32 seq; + /// 0: request ping from all receiving systems, if greater than 0: message is a ping response and number is the system id of the requesting system + public byte target_system; + /// 0: request ping from all receiving components, if greater than 0: message is a ping response and number is the system id of the requesting system + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL = 5; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_change_operator_control_t + { + /// System the GCS requests control for + public byte target_system; + /// 0: request control of this MAV, 1: Release control of this MAV + public byte control_request; + /// 0: key as plaintext, 1-255: future, different hashing/encryption variants. The GCS should in general use the safest mode possible initially and then gradually move down the encryption level if it gets a NACK message indicating an encryption mismatch. + public byte version; + /// Password / Key, depending on version plaintext or encrypted. 25 or less characters, NULL terminated. The characters may involve A-Z, a-z, 0-9, and "!?,.-" + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 25)] + public byte[] passkey; + + }; + + + public const byte MAVLINK_MSG_ID_CHANGE_OPERATOR_CONTROL_ACK = 6; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 3)] + public struct mavlink_change_operator_control_ack_t + { + /// ID of the GCS this message + public byte gcs_system_id; + /// 0: request control of this MAV, 1: Release control of this MAV + public byte control_request; + /// 0: ACK, 1: NACK: Wrong passkey, 2: NACK: Unsupported passkey encryption method, 3: NACK: Already under control + public byte ack; + + }; + + + public const byte MAVLINK_MSG_ID_AUTH_KEY = 7; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] + public struct mavlink_auth_key_t + { + /// key + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] key; + + }; + + + public const byte MAVLINK_MSG_ID_SET_MODE = 11; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 6)] + public struct mavlink_set_mode_t + { + /// The new autopilot-specific mode. This field can be ignored by an autopilot. + public UInt32 custom_mode; + /// The system setting the mode + public byte target_system; + /// The new base mode + public byte base_mode; + + }; + + + public const byte MAVLINK_MSG_ID_PARAM_REQUEST_READ = 20; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_param_request_read_t + { + /// Parameter index. Send -1 to use the param ID field as identifier (else the param id will be ignored) + public Int16 param_index; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] param_id; + + }; + + + public const byte MAVLINK_MSG_ID_PARAM_REQUEST_LIST = 21; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)] + public struct mavlink_param_request_list_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_PARAM_VALUE = 22; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 25)] + public struct mavlink_param_value_t + { + /// Onboard parameter value + public Single param_value; + /// Total number of onboard parameters + public UInt16 param_count; + /// Index of this onboard parameter + public UInt16 param_index; + /// Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] param_id; + /// Onboard parameter type: see the MAV_PARAM_TYPE enum for supported data types. + public byte param_type; + + }; + + + public const byte MAVLINK_MSG_ID_PARAM_SET = 23; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 23)] + public struct mavlink_param_set_t + { + /// Onboard parameter value + public Single param_value; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// Onboard parameter id, terminated by NULL if the length is less than 16 human-readable chars and WITHOUT null termination (NULL) byte if the length is exactly 16 chars - applications have to provide 16+1 bytes storage if the ID is stored as string + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] + public byte[] param_id; + /// Onboard parameter type: see the MAV_PARAM_TYPE enum for supported data types. + public byte param_type; + + }; + + + public const byte MAVLINK_MSG_ID_GPS_RAW_INT = 24; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 30)] + public struct mavlink_gps_raw_int_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// Latitude in 1E7 degrees + public Int32 lat; + /// Longitude in 1E7 degrees + public Int32 lon; + /// Altitude in 1E3 meters (millimeters) above MSL + public Int32 alt; + /// GPS HDOP horizontal dilution of position in cm (m*100). If unknown, set to: 65535 + public UInt16 eph; + /// GPS VDOP horizontal dilution of position in cm (m*100). If unknown, set to: 65535 + public UInt16 epv; + /// GPS ground speed (m/s * 100). If unknown, set to: 65535 + public UInt16 vel; + /// Course over ground (NOT heading, but direction of movement) in degrees * 100, 0.0..359.99 degrees. If unknown, set to: 65535 + public UInt16 cog; + /// 0-1: no fix, 2: 2D fix, 3: 3D fix. Some applications will not use the value of this field unless it is at least two, so always correctly fill in the fix. + public byte fix_type; + /// Number of satellites visible. If unknown, set to 255 + public byte satellites_visible; + + }; + + public const byte MAVLINK_MSG_ID_GPS_STATUS = 25; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 101)] + public struct mavlink_gps_status_t + { + /// Number of satellites visible + public byte satellites_visible; + /// Global satellite ID + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] satellite_prn; + /// 0: Satellite not used, 1: used for localization + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] satellite_used; + /// Elevation (0: right on top of receiver, 90: on the horizon) of satellite + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] satellite_elevation; + /// Direction of satellite, 0: 0 deg, 255: 360 deg. + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] satellite_azimuth; + /// Signal to noise ratio of satellite + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)] + public byte[] satellite_snr; + + }; + + + public const byte MAVLINK_MSG_ID_SCALED_IMU = 26; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_scaled_imu_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// X acceleration (mg) + public Int16 xacc; + /// Y acceleration (mg) + public Int16 yacc; + /// Z acceleration (mg) + public Int16 zacc; + /// Angular speed around X axis (millirad /sec) + public Int16 xgyro; + /// Angular speed around Y axis (millirad /sec) + public Int16 ygyro; + /// Angular speed around Z axis (millirad /sec) + public Int16 zgyro; + /// X Magnetic field (milli tesla) + public Int16 xmag; + /// Y Magnetic field (milli tesla) + public Int16 ymag; + /// Z Magnetic field (milli tesla) + public Int16 zmag; + + }; + + + public const byte MAVLINK_MSG_ID_RAW_IMU = 27; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 26)] + public struct mavlink_raw_imu_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// X acceleration (raw) + public Int16 xacc; + /// Y acceleration (raw) + public Int16 yacc; + /// Z acceleration (raw) + public Int16 zacc; + /// Angular speed around X axis (raw) + public Int16 xgyro; + /// Angular speed around Y axis (raw) + public Int16 ygyro; + /// Angular speed around Z axis (raw) + public Int16 zgyro; + /// X Magnetic field (raw) + public Int16 xmag; + /// Y Magnetic field (raw) + public Int16 ymag; + /// Z Magnetic field (raw) + public Int16 zmag; + + }; + + + public const byte MAVLINK_MSG_ID_RAW_PRESSURE = 28; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 16)] + public struct mavlink_raw_pressure_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// Absolute pressure (raw) + public Int16 press_abs; + /// Differential pressure 1 (raw) + public Int16 press_diff1; + /// Differential pressure 2 (raw) + public Int16 press_diff2; + /// Raw Temperature measurement (raw) + public Int16 temperature; + + }; + + + public const byte MAVLINK_MSG_ID_SCALED_PRESSURE = 29; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 14)] + public struct mavlink_scaled_pressure_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Absolute pressure (hectopascal) + public Single press_abs; + /// Differential pressure 1 (hectopascal) + public Single press_diff; + /// Temperature measurement (0.01 degrees celsius) + public Int16 temperature; + + }; + + + public const byte MAVLINK_MSG_ID_ATTITUDE = 30; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_attitude_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Roll angle (rad, -pi..+pi) + public Single roll; + /// Pitch angle (rad, -pi..+pi) + public Single pitch; + /// Yaw angle (rad, -pi..+pi) + public Single yaw; + /// Roll angular speed (rad/s) + public Single rollspeed; + /// Pitch angular speed (rad/s) + public Single pitchspeed; + /// Yaw angular speed (rad/s) + public Single yawspeed; + + }; + + + public const byte MAVLINK_MSG_ID_ATTITUDE_QUATERNION = 31; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] + public struct mavlink_attitude_quaternion_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Quaternion component 1 + public Single q1; + /// Quaternion component 2 + public Single q2; + /// Quaternion component 3 + public Single q3; + /// Quaternion component 4 + public Single q4; + /// Roll angular speed (rad/s) + public Single rollspeed; + /// Pitch angular speed (rad/s) + public Single pitchspeed; + /// Yaw angular speed (rad/s) + public Single yawspeed; + + }; + + + public const byte MAVLINK_MSG_ID_LOCAL_POSITION_NED = 32; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_local_position_ned_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// X Position + public Single x; + /// Y Position + public Single y; + /// Z Position + public Single z; + /// X Speed + public Single vx; + /// Y Speed + public Single vy; + /// Z Speed + public Single vz; + + }; + + + public const byte MAVLINK_MSG_ID_GLOBAL_POSITION_INT = 33; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_global_position_int_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Latitude, expressed as * 1E7 + public Int32 lat; + /// Longitude, expressed as * 1E7 + public Int32 lon; + /// Altitude in meters, expressed as * 1000 (millimeters), above MSL + public Int32 alt; + /// Altitude above ground in meters, expressed as * 1000 (millimeters) + public Int32 relative_alt; + /// Ground X Speed (Latitude), expressed as m/s * 100 + public Int16 vx; + /// Ground Y Speed (Longitude), expressed as m/s * 100 + public Int16 vy; + /// Ground Z Speed (Altitude), expressed as m/s * 100 + public Int16 vz; + /// Compass heading in degrees * 100, 0.0..359.99 degrees. If unknown, set to: 65535 + public UInt16 hdg; + + }; + + + public const byte MAVLINK_MSG_ID_RC_CHANNELS_SCALED = 34; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_rc_channels_scaled_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// RC channel 1 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan1_scaled; + /// RC channel 2 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan2_scaled; + /// RC channel 3 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan3_scaled; + /// RC channel 4 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan4_scaled; + /// RC channel 5 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan5_scaled; + /// RC channel 6 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan6_scaled; + /// RC channel 7 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan7_scaled; + /// RC channel 8 value scaled, (-100%) -10000, (0%) 0, (100%) 10000, (invalid) 32767. + public Int16 chan8_scaled; + /// Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows for more than 8 servos. + public byte port; + /// Receive signal strength indicator, 0: 0%, 100: 100%, 255: invalid/unknown. + public byte rssi; + + }; + + + public const byte MAVLINK_MSG_ID_RC_CHANNELS_RAW = 35; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_rc_channels_raw_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// RC channel 1 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan1_raw; + /// RC channel 2 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan2_raw; + /// RC channel 3 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan3_raw; + /// RC channel 4 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan4_raw; + /// RC channel 5 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan5_raw; + /// RC channel 6 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan6_raw; + /// RC channel 7 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan7_raw; + /// RC channel 8 value, in microseconds. A value of 65535 implies the channel is unused. + public UInt16 chan8_raw; + /// Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows for more than 8 servos. + public byte port; + /// Receive signal strength indicator, 0: 0%, 100: 100%, 255: invalid/unknown. + public byte rssi; + + }; + + + public const byte MAVLINK_MSG_ID_SERVO_OUTPUT_RAW = 36; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 21)] + public struct mavlink_servo_output_raw_t + { + /// Timestamp (microseconds since system boot) + public UInt32 time_usec; + /// Servo output 1 value, in microseconds + public UInt16 servo1_raw; + /// Servo output 2 value, in microseconds + public UInt16 servo2_raw; + /// Servo output 3 value, in microseconds + public UInt16 servo3_raw; + /// Servo output 4 value, in microseconds + public UInt16 servo4_raw; + /// Servo output 5 value, in microseconds + public UInt16 servo5_raw; + /// Servo output 6 value, in microseconds + public UInt16 servo6_raw; + /// Servo output 7 value, in microseconds + public UInt16 servo7_raw; + /// Servo output 8 value, in microseconds + public UInt16 servo8_raw; + /// Servo output port (set of 8 outputs = 1 port). Most MAVs will just use one, but this allows to encode more than 8 servos. + public byte port; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_REQUEST_PARTIAL_LIST = 37; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 6)] + public struct mavlink_mission_request_partial_list_t + { + /// Start index, 0 by default + public Int16 start_index; + /// End index, -1 by default (-1: send list to end). Else a valid index of the list + public Int16 end_index; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_WRITE_PARTIAL_LIST = 38; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 6)] + public struct mavlink_mission_write_partial_list_t + { + /// Start index, 0 by default and smaller / equal to the largest index of the current onboard list. + public Int16 start_index; + /// End index, equal or greater than start index. + public Int16 end_index; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_ITEM = 39; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 37)] + public struct mavlink_mission_item_t + { + /// PARAM1 / For NAV command MISSIONs: Radius in which the MISSION is accepted as reached, in meters + public Single param1; + /// PARAM2 / For NAV command MISSIONs: Time that the MAV should stay inside the PARAM1 radius before advancing, in milliseconds + public Single param2; + /// PARAM3 / For LOITER command MISSIONs: Orbit to circle around the MISSION, in meters. If positive the orbit direction should be clockwise, if negative the orbit direction should be counter-clockwise. + public Single param3; + /// PARAM4 / For NAV and LOITER command MISSIONs: Yaw orientation in degrees, [0..360] 0 = NORTH + public Single param4; + /// PARAM5 / local: x position, global: latitude + public Single x; + /// PARAM6 / y position: global: longitude + public Single y; + /// PARAM7 / z position: global: altitude + public Single z; + /// Sequence + public UInt16 seq; + /// The scheduled action for the MISSION. see MAV_CMD in common.xml MAVLink specs + public UInt16 command; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// The coordinate system of the MISSION. see MAV_FRAME in mavlink_types.h + public byte frame; + /// false:0, true:1 + public byte current; + /// autocontinue to next wp + public byte autocontinue; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_REQUEST = 40; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4)] + public struct mavlink_mission_request_t + { + /// Sequence + public UInt16 seq; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_SET_CURRENT = 41; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4)] + public struct mavlink_mission_set_current_t + { + /// Sequence + public UInt16 seq; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_CURRENT = 42; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)] + public struct mavlink_mission_current_t + { + /// Sequence + public UInt16 seq; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_REQUEST_LIST = 43; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)] + public struct mavlink_mission_request_list_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_COUNT = 44; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4)] + public struct mavlink_mission_count_t + { + /// Number of mission items in the sequence + public UInt16 count; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_CLEAR_ALL = 45; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)] + public struct mavlink_mission_clear_all_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_ITEM_REACHED = 46; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 2)] + public struct mavlink_mission_item_reached_t + { + /// Sequence + public UInt16 seq; + + }; + + + public const byte MAVLINK_MSG_ID_MISSION_ACK = 47; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 3)] + public struct mavlink_mission_ack_t + { + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// See MAV_MISSION_RESULT enum + public byte type; + + }; + + + public const byte MAVLINK_MSG_ID_SET_GPS_GLOBAL_ORIGIN = 48; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 13)] + public struct mavlink_set_gps_global_origin_t + { + /// global position * 1E7 + public Int32 latitude; + /// global position * 1E7 + public Int32 longitude; + /// global position * 1000 + public Int32 altitude; + /// System ID + public byte target_system; + + }; + + + public const byte MAVLINK_MSG_ID_GPS_GLOBAL_ORIGIN = 49; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 12)] + public struct mavlink_gps_global_origin_t + { + /// Latitude (WGS84), expressed as * 1E7 + public Int32 latitude; + /// Longitude (WGS84), expressed as * 1E7 + public Int32 longitude; + /// Altitude(WGS84), expressed as * 1000 + public Int32 altitude; + + }; + + + public const byte MAVLINK_MSG_ID_SET_LOCAL_POSITION_SETPOINT = 50; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 19)] + public struct mavlink_set_local_position_setpoint_t + { + /// x position + public Single x; + /// y position + public Single y; + /// z position + public Single z; + /// Desired yaw angle + public Single yaw; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// Coordinate frame - valid values are only MAV_FRAME_LOCAL_NED or MAV_FRAME_LOCAL_ENU + public byte coordinate_frame; + + }; + + + public const byte MAVLINK_MSG_ID_LOCAL_POSITION_SETPOINT = 51; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 17)] + public struct mavlink_local_position_setpoint_t + { + /// x position + public Single x; + /// y position + public Single y; + /// z position + public Single z; + /// Desired yaw angle + public Single yaw; + /// Coordinate frame - valid values are only MAV_FRAME_LOCAL_NED or MAV_FRAME_LOCAL_ENU + public byte coordinate_frame; + + }; + + + public const byte MAVLINK_MSG_ID_GLOBAL_POSITION_SETPOINT_INT = 52; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 15)] + public struct mavlink_global_position_setpoint_int_t + { + /// WGS84 Latitude position in degrees * 1E7 + public Int32 latitude; + /// WGS84 Longitude position in degrees * 1E7 + public Int32 longitude; + /// WGS84 Altitude in meters * 1000 (positive for up) + public Int32 altitude; + /// Desired yaw angle in degrees * 100 + public Int16 yaw; + /// Coordinate frame - valid values are only MAV_FRAME_GLOBAL or MAV_FRAME_GLOBAL_RELATIVE_ALT + public byte coordinate_frame; + + }; + + + public const byte MAVLINK_MSG_ID_SET_GLOBAL_POSITION_SETPOINT_INT = 53; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 15)] + public struct mavlink_set_global_position_setpoint_int_t + { + /// WGS84 Latitude position in degrees * 1E7 + public Int32 latitude; + /// WGS84 Longitude position in degrees * 1E7 + public Int32 longitude; + /// WGS84 Altitude in meters * 1000 (positive for up) + public Int32 altitude; + /// Desired yaw angle in degrees * 100 + public Int16 yaw; + /// Coordinate frame - valid values are only MAV_FRAME_GLOBAL or MAV_FRAME_GLOBAL_RELATIVE_ALT + public byte coordinate_frame; + + }; + + + public const byte MAVLINK_MSG_ID_SAFETY_SET_ALLOWED_AREA = 54; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 27)] + public struct mavlink_safety_set_allowed_area_t + { + /// x position 1 / Latitude 1 + public Single p1x; + /// y position 1 / Longitude 1 + public Single p1y; + /// z position 1 / Altitude 1 + public Single p1z; + /// x position 2 / Latitude 2 + public Single p2x; + /// y position 2 / Longitude 2 + public Single p2y; + /// z position 2 / Altitude 2 + public Single p2z; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// Coordinate frame, as defined by MAV_FRAME enum in mavlink_types.h. Can be either global, GPS, right-handed with Z axis up or local, right handed, Z axis down. + public byte frame; + + }; + + + public const byte MAVLINK_MSG_ID_SAFETY_ALLOWED_AREA = 55; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 25)] + public struct mavlink_safety_allowed_area_t + { + /// x position 1 / Latitude 1 + public Single p1x; + /// y position 1 / Longitude 1 + public Single p1y; + /// z position 1 / Altitude 1 + public Single p1z; + /// x position 2 / Latitude 2 + public Single p2x; + /// y position 2 / Longitude 2 + public Single p2y; + /// z position 2 / Altitude 2 + public Single p2z; + /// Coordinate frame, as defined by MAV_FRAME enum in mavlink_types.h. Can be either global, GPS, right-handed with Z axis up or local, right handed, Z axis down. + public byte frame; + + }; + + + public const byte MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_THRUST = 56; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_set_roll_pitch_yaw_thrust_t + { + /// Desired roll angle in radians + public Single roll; + /// Desired pitch angle in radians + public Single pitch; + /// Desired yaw angle in radians + public Single yaw; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_SET_ROLL_PITCH_YAW_SPEED_THRUST = 57; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_set_roll_pitch_yaw_speed_thrust_t + { + /// Desired roll angular speed in rad/s + public Single roll_speed; + /// Desired pitch angular speed in rad/s + public Single pitch_speed; + /// Desired yaw angular speed in rad/s + public Single yaw_speed; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + + public const byte MAVLINK_MSG_ID_ROLL_PITCH_YAW_THRUST_SETPOINT = 58; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_roll_pitch_yaw_thrust_setpoint_t + { + /// Timestamp in milliseconds since system boot + public UInt32 time_boot_ms; + /// Desired roll angle in radians + public Single roll; + /// Desired pitch angle in radians + public Single pitch; + /// Desired yaw angle in radians + public Single yaw; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + + }; + + + public const byte MAVLINK_MSG_ID_ROLL_PITCH_YAW_SPEED_THRUST_SETPOINT = 59; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_roll_pitch_yaw_speed_thrust_setpoint_t + { + /// Timestamp in milliseconds since system boot + public UInt32 time_boot_ms; + /// Desired roll angular speed in rad/s + public Single roll_speed; + /// Desired pitch angular speed in rad/s + public Single pitch_speed; + /// Desired yaw angular speed in rad/s + public Single yaw_speed; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + + }; + + + public const byte MAVLINK_MSG_ID_SET_QUAD_MOTORS_SETPOINT = 60; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_set_quad_motors_setpoint_t + { + /// Front motor in + configuration, front left motor in x configuration + public UInt16 motor_front_nw; + /// Right motor in + configuration, front right motor in x configuration + public UInt16 motor_right_ne; + /// Back motor in + configuration, back right motor in x configuration + public UInt16 motor_back_se; + /// Left motor in + configuration, back left motor in x configuration + public UInt16 motor_left_sw; + /// System ID of the system that should set these motor commands + public byte target_system; + + }; + + + public const byte MAVLINK_MSG_ID_SET_QUAD_SWARM_ROLL_PITCH_YAW_THRUST = 61; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 34)] + public struct mavlink_set_quad_swarm_roll_pitch_yaw_thrust_t + { + /// Desired roll angle in radians +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] roll; + /// Desired pitch angle in radians +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] pitch; + /// Desired yaw angle in radians, scaled to int16 +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] yaw; + /// Collective thrust, scaled to uint16 (0..65535) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public UInt16[] thrust; + /// ID of the quadrotor group (0 - 255, up to 256 groups supported) + public byte group; + /// ID of the flight mode (0 - 255, up to 256 modes supported) + public byte mode; + + }; + + + public const byte MAVLINK_MSG_ID_NAV_CONTROLLER_OUTPUT = 62; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 26)] + public struct mavlink_nav_controller_output_t + { + /// Current desired roll in degrees + public Single nav_roll; + /// Current desired pitch in degrees + public Single nav_pitch; + /// Current altitude error in meters + public Single alt_error; + /// Current airspeed error in meters/second + public Single aspd_error; + /// Current crosstrack error on x-y plane in meters + public Single xtrack_error; + /// Current desired heading in degrees + public Int16 nav_bearing; + /// Bearing to current MISSION/target in degrees + public Int16 target_bearing; + /// Distance to active MISSION in meters + public UInt16 wp_dist; + + }; + + + public const byte MAVLINK_MSG_ID_SET_QUAD_SWARM_LED_ROLL_PITCH_YAW_THRUST = 63; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 46)] + public struct mavlink_set_quad_swarm_led_roll_pitch_yaw_thrust_t + { + /// Desired roll angle in radians +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] roll; + /// Desired pitch angle in radians +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] pitch; + /// Desired yaw angle in radians, scaled to int16 +-PI (+-32767) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public Int16[] yaw; + /// Collective thrust, scaled to uint16 (0..65535) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public UInt16[] thrust; + /// ID of the quadrotor group (0 - 255, up to 256 groups supported) + public byte group; + /// ID of the flight mode (0 - 255, up to 256 modes supported) + public byte mode; + /// RGB red channel (0-255) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] led_red; + /// RGB green channel (0-255) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] led_blue; + /// RGB blue channel (0-255) + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] + public byte[] led_green; + + }; + + + public const byte MAVLINK_MSG_ID_STATE_CORRECTION = 64; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 36)] + public struct mavlink_state_correction_t + { + /// x position error + public Single xErr; + /// y position error + public Single yErr; + /// z position error + public Single zErr; + /// roll error (radians) + public Single rollErr; + /// pitch error (radians) + public Single pitchErr; + /// yaw error (radians) + public Single yawErr; + /// x velocity + public Single vxErr; + /// y velocity + public Single vyErr; + /// z velocity + public Single vzErr; + + }; + + + public const byte MAVLINK_MSG_ID_REQUEST_DATA_STREAM = 66; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 6)] + public struct mavlink_request_data_stream_t + { + /// The requested interval between two messages of this type + public UInt16 req_message_rate; + /// The target requested to send the message stream. + public byte target_system; + /// The target requested to send the message stream. + public byte target_component; + /// The ID of the requested data stream + public byte req_stream_id; + /// 1 to start sending, 0 to stop sending. + public byte start_stop; + + }; + + + public const byte MAVLINK_MSG_ID_DATA_STREAM = 67; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 4)] + public struct mavlink_data_stream_t + { + /// The requested interval between two messages of this type + public UInt16 message_rate; + /// The ID of the requested data stream + public byte stream_id; + /// 1 stream is enabled, 0 stream is stopped. + public byte on_off; + + }; + + + public const byte MAVLINK_MSG_ID_MANUAL_CONTROL = 69; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 11)] + public struct mavlink_manual_control_t + { + /// X-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to forward(1000)-backward(-1000) movement on a joystick and the pitch of a vehicle. + public Int16 x; + /// Y-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to left(-1000)-right(1000) movement on a joystick and the roll of a vehicle. + public Int16 y; + /// Z-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a separate slider movement with maximum being 1000 and minimum being -1000 on a joystick and the thrust of a vehicle. + public Int16 z; + /// R-axis, normalized to the range [-1000,1000]. A value of INT16_MAX indicates that this axis is invalid. Generally corresponds to a twisting of the joystick, with counter-clockwise being 1000 and clockwise being -1000, and the yaw of a vehicle. + public Int16 r; + /// A bitfield corresponding to the joystick buttons' current state, 1 for pressed, 0 for released. The lowest bit corresponds to Button 1. + public UInt16 buttons; + /// The system to be controlled. + public byte target; + + }; + + + public const byte MAVLINK_MSG_ID_RC_CHANNELS_OVERRIDE = 70; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_rc_channels_override_t + { + /// RC channel 1 value, in microseconds + public UInt16 chan1_raw; + /// RC channel 2 value, in microseconds + public UInt16 chan2_raw; + /// RC channel 3 value, in microseconds + public UInt16 chan3_raw; + /// RC channel 4 value, in microseconds + public UInt16 chan4_raw; + /// RC channel 5 value, in microseconds + public UInt16 chan5_raw; + /// RC channel 6 value, in microseconds + public UInt16 chan6_raw; + /// RC channel 7 value, in microseconds + public UInt16 chan7_raw; + /// RC channel 8 value, in microseconds + public UInt16 chan8_raw; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + + }; + + public const byte MAVLINK_MSG_ID_MOBILE_CONTROL = 200; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 26)] + public struct mavlink_rc_mobile_control_t + { + /// Change YAW + public Single Yaw; + /// Change Alt + public Single alt; + /// RC channel 1 value, in microseconds + public UInt16 chan1_raw; + /// RC channel 2 value, in microseconds + public UInt16 chan2_raw; + /// RC channel 3 value, in microseconds + public UInt16 chan3_raw; + /// RC channel 4 value, in microseconds + public UInt16 chan4_raw; + /// RC channel 5 value, in microseconds + public UInt16 chan5_raw; + /// RC channel 6 value, in microseconds + public UInt16 chan6_raw; + /// RC channel 7 value, in microseconds + public UInt16 chan7_raw; + /// RC channel 8 value, in microseconds + public UInt16 chan8_raw; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + }; + + public const byte MAVLINK_MSG_ID_VFR_HUD = 74; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_vfr_hud_t + { + /// Current airspeed in m/s + public Single airspeed; + /// Current ground speed in m/s + public Single groundspeed; + /// Current altitude (MSL), in meters + public Single alt; + /// Current climb rate in meters/second + public Single climb; + /// Current heading in degrees, in compass units (0..360, 0=north) + public Int16 heading; + /// Current throttle setting in integer percent, 0 to 100 + public UInt16 throttle; + + }; + + + public const byte MAVLINK_MSG_ID_COMMAND_LONG = 76; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 33)] + public struct mavlink_command_long_t + { + /// Parameter 1, as defined by MAV_CMD enum. + public Single param1; + /// Parameter 2, as defined by MAV_CMD enum. + public Single param2; + /// Parameter 3, as defined by MAV_CMD enum. + public Single param3; + /// Parameter 4, as defined by MAV_CMD enum. + public Single param4; + /// Parameter 5, as defined by MAV_CMD enum. + public Single param5; + /// Parameter 6, as defined by MAV_CMD enum. + public Single param6; + /// Parameter 7, as defined by MAV_CMD enum. + public Single param7; + /// Command ID, as defined by MAV_CMD enum. + public UInt16 command; + /// System which should execute the command + public byte target_system; + /// Component which should execute the command, 0 for all components + public byte target_component; + /// 0: First transmission of this command. 1-255: Confirmation transmissions (e.g. for kill command) + public byte confirmation; + + }; + + + public const byte MAVLINK_MSG_ID_COMMAND_ACK = 77; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 3)] + public struct mavlink_command_ack_t + { + /// Command ID, as defined by MAV_CMD enum. + public UInt16 command; + /// See MAV_RESULT enum + public byte result; + + }; + + + public const byte MAVLINK_MSG_ID_ROLL_PITCH_YAW_RATES_THRUST_SETPOINT = 80; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_roll_pitch_yaw_rates_thrust_setpoint_t + { + /// Timestamp in milliseconds since system boot + public UInt32 time_boot_ms; + /// Desired roll rate in radians per second + public Single roll_rate; + /// Desired pitch rate in radians per second + public Single pitch_rate; + /// Desired yaw rate in radians per second + public Single yaw_rate; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + + }; + + + public const byte MAVLINK_MSG_ID_MANUAL_SETPOINT = 81; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 22)] + public struct mavlink_manual_setpoint_t + { + /// Timestamp in milliseconds since system boot + public UInt32 time_boot_ms; + /// Desired roll rate in radians per second + public Single roll; + /// Desired pitch rate in radians per second + public Single pitch; + /// Desired yaw rate in radians per second + public Single yaw; + /// Collective thrust, normalized to 0 .. 1 + public Single thrust; + /// Flight mode switch position, 0.. 255 + public byte mode_switch; + /// Override mode switch position, 0.. 255 + public byte manual_override_switch; + + }; + + + public const byte MAVLINK_MSG_ID_LOCAL_POSITION_NED_SYSTEM_GLOBAL_OFFSET = 89; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 28)] + public struct mavlink_local_position_ned_system_global_offset_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// X Position + public Single x; + /// Y Position + public Single y; + /// Z Position + public Single z; + /// Roll + public Single roll; + /// Pitch + public Single pitch; + /// Yaw + public Single yaw; + + }; + + + public const byte MAVLINK_MSG_ID_HIL_STATE = 90; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 56)] + public struct mavlink_hil_state_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// Roll angle (rad) + public Single roll; + /// Pitch angle (rad) + public Single pitch; + /// Yaw angle (rad) + public Single yaw; + /// Roll angular speed (rad/s) + public Single rollspeed; + /// Pitch angular speed (rad/s) + public Single pitchspeed; + /// Yaw angular speed (rad/s) + public Single yawspeed; + /// Latitude, expressed as * 1E7 + public Int32 lat; + /// Longitude, expressed as * 1E7 + public Int32 lon; + /// Altitude in meters, expressed as * 1000 (millimeters) + public Int32 alt; + /// Ground X Speed (Latitude), expressed as m/s * 100 + public Int16 vx; + /// Ground Y Speed (Longitude), expressed as m/s * 100 + public Int16 vy; + /// Ground Z Speed (Altitude), expressed as m/s * 100 + public Int16 vz; + /// X acceleration (mg) + public Int16 xacc; + /// Y acceleration (mg) + public Int16 yacc; + /// Z acceleration (mg) + public Int16 zacc; + + }; + + + public const byte MAVLINK_MSG_ID_HIL_CONTROLS = 91; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 42)] + public struct mavlink_hil_controls_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// Control output -1 .. 1 + public Single roll_ailerons; + /// Control output -1 .. 1 + public Single pitch_elevator; + /// Control output -1 .. 1 + public Single yaw_rudder; + /// Throttle 0 .. 1 + public Single throttle; + /// Aux 1, -1 .. 1 + public Single aux1; + /// Aux 2, -1 .. 1 + public Single aux2; + /// Aux 3, -1 .. 1 + public Single aux3; + /// Aux 4, -1 .. 1 + public Single aux4; + /// System mode (MAV_MODE) + public byte mode; + /// Navigation mode (MAV_NAV_MODE) + public byte nav_mode; + + }; + + + public const byte MAVLINK_MSG_ID_HIL_RC_INPUTS_RAW = 92; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 33)] + public struct mavlink_hil_rc_inputs_raw_t + { + /// Timestamp (microseconds since UNIX epoch or microseconds since system boot) + public UInt64 time_usec; + /// RC channel 1 value, in microseconds + public UInt16 chan1_raw; + /// RC channel 2 value, in microseconds + public UInt16 chan2_raw; + /// RC channel 3 value, in microseconds + public UInt16 chan3_raw; + /// RC channel 4 value, in microseconds + public UInt16 chan4_raw; + /// RC channel 5 value, in microseconds + public UInt16 chan5_raw; + /// RC channel 6 value, in microseconds + public UInt16 chan6_raw; + /// RC channel 7 value, in microseconds + public UInt16 chan7_raw; + /// RC channel 8 value, in microseconds + public UInt16 chan8_raw; + /// RC channel 9 value, in microseconds + public UInt16 chan9_raw; + /// RC channel 10 value, in microseconds + public UInt16 chan10_raw; + /// RC channel 11 value, in microseconds + public UInt16 chan11_raw; + /// RC channel 12 value, in microseconds + public UInt16 chan12_raw; + /// Receive signal strength indicator, 0: 0%, 255: 100% + public byte rssi; + + }; + + + public const byte MAVLINK_MSG_ID_OPTICAL_FLOW = 100; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 26)] + public struct mavlink_optical_flow_t + { + /// Timestamp (UNIX) + public UInt64 time_usec; + /// Flow in meters in x-sensor direction, angular-speed compensated + public Single flow_comp_m_x; + /// Flow in meters in y-sensor direction, angular-speed compensated + public Single flow_comp_m_y; + /// Ground distance in meters. Positive value: distance known. Negative value: Unknown distance + public Single ground_distance; + /// Flow in pixels in x-sensor direction + public Int16 flow_x; + /// Flow in pixels in y-sensor direction + public Int16 flow_y; + /// Sensor ID + public byte sensor_id; + /// Optical flow quality / confidence. 0: bad, 255: maximum quality + public byte quality; + + }; + + + public const byte MAVLINK_MSG_ID_GLOBAL_VISION_POSITION_ESTIMATE = 101; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] + public struct mavlink_global_vision_position_estimate_t + { + /// Timestamp (microseconds, synced to UNIX time or since system boot) + public UInt64 usec; + /// Global X position + public Single x; + /// Global Y position + public Single y; + /// Global Z position + public Single z; + /// Roll angle in rad + public Single roll; + /// Pitch angle in rad + public Single pitch; + /// Yaw angle in rad + public Single yaw; + + }; + + + public const byte MAVLINK_MSG_ID_VISION_POSITION_ESTIMATE = 102; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] + public struct mavlink_vision_position_estimate_t + { + /// Timestamp (microseconds, synced to UNIX time or since system boot) + public UInt64 usec; + /// Global X position + public Single x; + /// Global Y position + public Single y; + /// Global Z position + public Single z; + /// Roll angle in rad + public Single roll; + /// Pitch angle in rad + public Single pitch; + /// Yaw angle in rad + public Single yaw; + + }; + + + public const byte MAVLINK_MSG_ID_VISION_SPEED_ESTIMATE = 103; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 20)] + public struct mavlink_vision_speed_estimate_t + { + /// Timestamp (microseconds, synced to UNIX time or since system boot) + public UInt64 usec; + /// Global X speed + public Single x; + /// Global Y speed + public Single y; + /// Global Z speed + public Single z; + + }; + + + public const byte MAVLINK_MSG_ID_VICON_POSITION_ESTIMATE = 104; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] + public struct mavlink_vicon_position_estimate_t + { + /// Timestamp (microseconds, synced to UNIX time or since system boot) + public UInt64 usec; + /// Global X position + public Single x; + /// Global Y position + public Single y; + /// Global Z position + public Single z; + /// Roll angle in rad + public Single roll; + /// Pitch angle in rad + public Single pitch; + /// Yaw angle in rad + public Single yaw; + + }; + + + public const byte MAVLINK_MSG_ID_HIGHRES_IMU = 105; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 62)] + public struct mavlink_highres_imu_t + { + /// Timestamp (microseconds, synced to UNIX time or since system boot) + public UInt64 time_usec; + /// X acceleration (m/s^2) + public Single xacc; + /// Y acceleration (m/s^2) + public Single yacc; + /// Z acceleration (m/s^2) + public Single zacc; + /// Angular speed around X axis (rad / sec) + public Single xgyro; + /// Angular speed around Y axis (rad / sec) + public Single ygyro; + /// Angular speed around Z axis (rad / sec) + public Single zgyro; + /// X Magnetic field (Gauss) + public Single xmag; + /// Y Magnetic field (Gauss) + public Single ymag; + /// Z Magnetic field (Gauss) + public Single zmag; + /// Absolute pressure in millibar + public Single abs_pressure; + /// Differential pressure in millibar + public Single diff_pressure; + /// Altitude calculated from pressure + public Single pressure_alt; + /// Temperature in degrees celsius + public Single temperature; + /// Bitmask for fields that have updated since last message, bit 0 = xacc, bit 12: temperature + public UInt16 fields_updated; + + }; + + + public const byte MAVLINK_MSG_ID_FILE_TRANSFER_START = 110; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 254)] + public struct mavlink_file_transfer_start_t + { + /// Unique transfer ID + public UInt64 transfer_uid; + /// File size in bytes + public UInt32 file_size; + /// Destination path + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)] + public byte[] dest_path; + /// Transfer direction: 0: from requester, 1: to requester + public byte direction; + /// RESERVED + public byte flags; + + }; + + + public const byte MAVLINK_MSG_ID_FILE_TRANSFER_DIR_LIST = 111; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 249)] + public struct mavlink_file_transfer_dir_list_t + { + /// Unique transfer ID + public UInt64 transfer_uid; + /// Directory path to list + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 240)] + public byte[] dir_path; + /// RESERVED + public byte flags; + + }; + + + public const byte MAVLINK_MSG_ID_FILE_TRANSFER_RES = 112; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_file_transfer_res_t + { + /// Unique transfer ID + public UInt64 transfer_uid; + /// 0: OK, 1: not permitted, 2: bad path / file name, 3: no space left on device + public byte result; + + }; + + + public const byte MAVLINK_MSG_ID_BATTERY_STATUS = 147; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 16)] + public struct mavlink_battery_status_t + { + /// Battery voltage of cell 1, in millivolts (1 = 1 millivolt) + public UInt16 voltage_cell_1; + /// Battery voltage of cell 2, in millivolts (1 = 1 millivolt), -1: no cell + public UInt16 voltage_cell_2; + /// Battery voltage of cell 3, in millivolts (1 = 1 millivolt), -1: no cell + public UInt16 voltage_cell_3; + /// Battery voltage of cell 4, in millivolts (1 = 1 millivolt), -1: no cell + public UInt16 voltage_cell_4; + /// Battery voltage of cell 5, in millivolts (1 = 1 millivolt), -1: no cell + public UInt16 voltage_cell_5; + /// Battery voltage of cell 6, in millivolts (1 = 1 millivolt), -1: no cell + public UInt16 voltage_cell_6; + /// Battery current, in 10*milliamperes (1 = 10 milliampere), -1: autopilot does not measure the current + public Int16 current_battery; + /// Accupack ID + public byte accu_id; + /// Remaining battery energy: (0%: 0, 100%: 100), -1: autopilot does not estimate the remaining battery + public byte battery_remaining; + + }; + + + public const byte MAVLINK_MSG_ID_SETPOINT_8DOF = 148; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 33)] + public struct mavlink_setpoint_8dof_t + { + /// Value 1 + public Single val1; + /// Value 2 + public Single val2; + /// Value 3 + public Single val3; + /// Value 4 + public Single val4; + /// Value 5 + public Single val5; + /// Value 6 + public Single val6; + /// Value 7 + public Single val7; + /// Value 8 + public Single val8; + /// System ID + public byte target_system; + + }; + + + public const byte MAVLINK_MSG_ID_SETPOINT_6DOF = 149; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 25)] + public struct mavlink_setpoint_6dof_t + { + /// Translational Component in x + public Single trans_x; + /// Translational Component in y + public Single trans_y; + /// Translational Component in z + public Single trans_z; + /// Rotational Component in x + public Single rot_x; + /// Rotational Component in y + public Single rot_y; + /// Rotational Component in z + public Single rot_z; + /// System ID + public byte target_system; + + }; + + + public const byte MAVLINK_MSG_ID_MEMORY_VECT = 249; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 36)] + public struct mavlink_memory_vect_t + { + /// Starting address of the debug variables + public UInt16 address; + /// Version code of the type variable. 0=unknown, type ignored and assumed int16_t. 1=as below + public byte ver; + /// Type code of the memory variables. for ver = 1: 0=16 x int16_t, 1=16 x uint16_t, 2=16 x Q15, 3=16 x 1Q14 + public byte type; + /// Memory contents at specified address + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] + public byte[] value; + + }; + + + public const byte MAVLINK_MSG_ID_DEBUG_VECT = 250; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 30)] + public struct mavlink_debug_vect_t + { + /// Timestamp + public UInt64 time_usec; + /// x + public Single x; + /// y + public Single y; + /// z + public Single z; + /// Name + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] name; + + }; + + + public const byte MAVLINK_MSG_ID_NAMED_VALUE_FLOAT = 251; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_named_value_float_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Floating point value + public Single value; + /// Name of the debug variable + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] name; + + }; + + + public const byte MAVLINK_MSG_ID_NAMED_VALUE_INT = 252; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 18)] + public struct mavlink_named_value_int_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// Signed integer value + public Int32 value; + /// Name of the debug variable + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)] + public byte[] name; + + }; + + + public const byte MAVLINK_MSG_ID_STATUSTEXT = 253; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 51)] + public struct mavlink_statustext_t + { + /// Severity of status. Relies on the definitions within RFC-5424. See enum MAV_SEVERITY. + public byte severity; + /// Status text message, without null termination character + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 50)] + public byte[] text; + + }; + + + public const byte MAVLINK_MSG_ID_DEBUG = 254; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_debug_t + { + /// Timestamp (milliseconds since system boot) + public UInt32 time_boot_ms; + /// DEBUG value + public Single value; + /// index of debug variable + public byte ind; + + }; + + public const byte MAVLINK_MSG_ID_RALLY_POINT = 175; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 19)] + public struct mavlink_rally_point_t + { + /// Latitude of point in degrees * 1E7 + public Int32 lat; + /// Longitude of point in degrees * 1E7 + public Int32 lng; + /// Transit / loiter altitude in meters relative to home + public Int16 alt; + /// Break altitude in meters relative to home + public Int16 break_alt; + /// Heading to aim for when landing. In centi-degrees. + public UInt16 land_dir; + /// System ID + public byte target_system; + /// Component ID + public byte target_component; + /// point index (first point is 0) + public byte idx; + /// total number of points (for sanity checking) + public byte count; + /// See RALLY_FLAGS enum for definition of the bitmask. + public byte flags; + + }; + + public const byte MAVLINK_MSG_ID_SET_PAIR = 201; + [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 9)] + public struct mavlink_set_pair_t + { + /// 1 -- Start Pair 0 -- Stop Pair || 1 -- Pair success 0 -- Pair fail + public byte pair; + public int TxID; + public int RxID; + }; + + } + //#endif +} diff --git a/PlaneGcsSdk_Shared/Protocols/MavlinkCRC.cs b/PlaneGcsSdk_Shared/Protocols/MavlinkCRC.cs new file mode 100644 index 0000000..b8dc56c --- /dev/null +++ b/PlaneGcsSdk_Shared/Protocols/MavlinkCRC.cs @@ -0,0 +1,43 @@ +namespace Plane.Protocols +{ + class MavlinkCRC + { + const int X25_INIT_CRC = 0xffff; + const int X25_VALIDATE_CRC = 0xf0b8; + + internal static ushort crc_accumulate(byte b, ushort crc) + { + unchecked + { + byte ch = (byte)(b ^ (byte)(crc & 0x00ff)); + ch = (byte)(ch ^ (ch << 4)); + return (ushort)((crc >> 8) ^ (ch << 8) ^ (ch << 3) ^ (ch >> 4)); + } + } + + internal static ushort crc_calculate(byte[] pBuffer, int length) + { + if (length < 1) + { + return 0xffff; + } + // For a "message" of length bytes contained in the unsigned char array + // pointed to by pBuffer, calculate the CRC + // crcCalculate(unsigned char* pBuffer, int length, unsigned short* checkConst) < not needed + + ushort crcTmp; + int i; + + crcTmp = X25_INIT_CRC; + + for (i = 1; i < length; i++) // skips header + { + crcTmp = crc_accumulate(pBuffer[i], crcTmp); + //Console.WriteLine(crcTmp + " " + pBuffer[i] + " " + length); + } + + return (crcTmp); + } + + } +} \ No newline at end of file diff --git a/PlaneGcsSdk_Shared/Protocols/MavlinkUtil.cs b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil.cs new file mode 100644 index 0000000..6a0b717 --- /dev/null +++ b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil.cs @@ -0,0 +1,265 @@ +#if !NET4 && !NET45 + +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +//using log4net; + +namespace Plane.Protocols +{ + /// + /// Static methods and helpers for creation and manipulation of Mavlink packets + /// + internal static class MavlinkUtil + { + //private static readonly ILog log = + // LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Create a new mavlink packet object from a byte array as recieved over mavlink + /// Endianess will be detetected using packet inspection + /// + /// The type of mavlink packet to create + /// The bytes of the mavlink packet + /// The position in the byte array where the packet starts + /// The newly created mavlink packet + internal static TMavlinkPacket ByteArrayToStructure(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + if (bytearray[0] == 'U') + { + throw new NotSupportedException("bytearray[0] == 'U' is not supported."); + //ByteArrayToStructureEndian(bytearray, ref obj, startoffset); + } + else + { + int len = Marshal.SizeOf(); + + IntPtr i = Marshal.AllocHGlobal(len); + TMavlinkPacket packet; + + try + { + // copy byte array to ptr + Marshal.Copy(bytearray, startoffset, i, len); + packet = Marshal.PtrToStructure(i); + } + // 林俊清, 20151026, 改为不吞异常了。 + //catch + //{ + // //log.Error("ByteArrayToStructure FAIL", ex); + //} + finally + { + Marshal.FreeHGlobal(i); + } + + return packet; + } + } + + internal static TMavlinkPacket ByteArrayToStructureBigEndian(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + object newPacket = new TMavlinkPacket(); + throw new NotSupportedException("ByteArrayToStructureBigEndian is not supported."); + //ByteArrayToStructureEndian(bytearray, ref newPacket, startoffset); + //return (TMavlinkPacket)newPacket; + } + + //internal static void ByteArrayToStructureEndian(byte[] bytearray, ref object obj, int startoffset) + //{ + // int len = Marshal.SizeOf(obj); + // IntPtr i = Marshal.AllocHGlobal(len); + // byte[] temparray = (byte[])bytearray.Clone(); + + // // create structure from ptr + // obj = Marshal.PtrToStructure(i, obj.GetType()); + + // // do endian swap + // object thisBoxed = obj; + // Type test = thisBoxed.GetType(); + + // int reversestartoffset = startoffset; + + // // Enumerate each structure field using reflection. + // foreach (var field in test.GetRuntimeFields()) + // { + // // field.Name has the field's name. + // object fieldValue = field.GetValue(thisBoxed); // Get value + + // // Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + // TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType()); + + // if (typeCode != TypeCode.Object) + // { + // Array.Reverse(temparray, reversestartoffset, Marshal.SizeOf(fieldValue)); + // reversestartoffset += Marshal.SizeOf(fieldValue); + // } + // else + // { + // reversestartoffset += ((byte[])fieldValue).Length; + // } + + // } + + // try + // { + // // copy byte array to ptr + // Marshal.Copy(temparray, startoffset, i, len); + // } + // catch + // { + // //log.Error("ByteArrayToStructure FAIL", ex); + // } + + // obj = Marshal.PtrToStructure(i, obj.GetType()); + + // Marshal.FreeHGlobal(i); + + //} + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// little endian (LSB first) + /// + /// Note - assumes little endian host order + internal static byte[] StructureToByteArray(TMavlinkPacket packet) + { + int len = Marshal.SizeOf(packet); + byte[] arr = new byte[len]; + IntPtr ptr = Marshal.AllocHGlobal(len); + try + { + Marshal.StructureToPtr(packet, ptr, true); + Marshal.Copy(ptr, arr, 0, len); + } + finally + { + Marshal.FreeHGlobal(ptr); + } + return arr; + } + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// big endian (MSB first) + /// + internal static byte[] StructureToByteArrayBigEndian(TMavlinkPacket packet) + { + //// The copy is made becuase SetValue won't work on a struct. + //// Boxing was used because SetValue works on classes/objects. + //// Unfortunately, it results in 2 copy operations. + //object thisBoxed = list[0]; // Why make a copy? + + object thisBoxed = packet; + Type test = thisBoxed.GetType(); + + int offset = 0; + byte[] data = new byte[Marshal.SizeOf(packet)]; + + object fieldValue; + //TypeCode typeCode; + + byte[] temp; + + // Enumerate each structure field using reflection. + foreach (var field in test.GetFields()) + { + // field.Name has the field's name. + + fieldValue = field.GetValue(thisBoxed); // Get value + + //// Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + //typeCode = Type.GetTypeCode(fieldValue.GetType()); + + //switch (typeCode) + switch (fieldValue.GetType().Name) + { + case nameof(Single): // float + { + temp = BitConverter.GetBytes((Single)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Single)); + offset += Marshal.SizeOf(); + break; + } + case nameof(Int32): + { + temp = BitConverter.GetBytes((Int32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int32)); + offset += Marshal.SizeOf(); + break; + } + case nameof(UInt32): + { + temp = BitConverter.GetBytes((UInt32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt32)); + offset += Marshal.SizeOf(); + break; + } + case nameof(Int16): + { + temp = BitConverter.GetBytes((Int16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int16)); + offset += Marshal.SizeOf(); + break; + } + case nameof(UInt16): + { + temp = BitConverter.GetBytes((UInt16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt16)); + offset += Marshal.SizeOf(); + break; + } + case nameof(Int64): + { + temp = BitConverter.GetBytes((Int64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int64)); + offset += Marshal.SizeOf(); + break; + } + case nameof(UInt64): + { + temp = BitConverter.GetBytes((UInt64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt64)); + offset += Marshal.SizeOf(); + break; + } + case nameof(Double): + { + temp = BitConverter.GetBytes((Double)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Double)); + offset += Marshal.SizeOf(); + break; + } + case nameof(Byte): + { + data[offset] = (Byte)fieldValue; + offset += Marshal.SizeOf(); + break; + } + default: + { + int length = ((byte[])fieldValue).Length; + Array.Copy(((byte[])fieldValue), 0, data, offset, length); + offset += length; + + //System.Diagnostics.Debug.Fail("No conversion provided for this type : " + typeCode.ToString()); + break; + } + }; // switch + } // foreach + + return data; + } // Swap + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET4.cs b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET4.cs new file mode 100644 index 0000000..88e1b57 --- /dev/null +++ b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET4.cs @@ -0,0 +1,258 @@ +#if NET4 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +//using log4net; + +namespace Plane.Protocols +{ + /// + /// Static methods and helpers for creation and manipulation of Mavlink packets + /// + internal static class MavlinkUtil + { + //private static readonly ILog log = + // LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Create a new mavlink packet object from a byte array as recieved over mavlink + /// Endianess will be detetected using packet inspection + /// + /// The type of mavlink packet to create + /// The bytes of the mavlink packet + /// The position in the byte array where the packet starts + /// The newly created mavlink packet + internal static TMavlinkPacket ByteArrayToStructure(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + object newPacket = new TMavlinkPacket(); + ByteArrayToStructure(bytearray, ref newPacket, startoffset); + return (TMavlinkPacket)newPacket; + } + + internal static TMavlinkPacket ByteArrayToStructureBigEndian(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + object newPacket = new TMavlinkPacket(); + ByteArrayToStructureEndian(bytearray, ref newPacket, startoffset); + return (TMavlinkPacket)newPacket; + } + + internal static void ByteArrayToStructure(byte[] bytearray, ref object obj, int startoffset) + { + if (bytearray[0] == 'U') + { + ByteArrayToStructureEndian(bytearray, ref obj, startoffset); + } + else + { + int len = Marshal.SizeOf(obj); + + IntPtr i = Marshal.AllocHGlobal(len); + + // create structure from ptr + obj = Marshal.PtrToStructure(i, obj.GetType()); + + try + { + // copy byte array to ptr + Marshal.Copy(bytearray, startoffset, i, len); + } + catch + { + //log.Error("ByteArrayToStructure FAIL", ex); + } + + obj = Marshal.PtrToStructure(i, obj.GetType()); + + Marshal.FreeHGlobal(i); + } + } + + internal static void ByteArrayToStructureEndian(byte[] bytearray, ref object obj, int startoffset) + { + int len = Marshal.SizeOf(obj); + IntPtr i = Marshal.AllocHGlobal(len); + byte[] temparray = (byte[])bytearray.Clone(); + + // create structure from ptr + obj = Marshal.PtrToStructure(i, obj.GetType()); + + // do endian swap + object thisBoxed = obj; + Type test = thisBoxed.GetType(); + + int reversestartoffset = startoffset; + + // Enumerate each structure field using reflection. + foreach (var field in test.GetFields()) + { + // field.Name has the field's name. + object fieldValue = field.GetValue(thisBoxed); // Get value + + // Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType()); + + if (typeCode != TypeCode.Object) + { + Array.Reverse(temparray, reversestartoffset, Marshal.SizeOf(fieldValue)); + reversestartoffset += Marshal.SizeOf(fieldValue); + } + else + { + reversestartoffset += ((byte[])fieldValue).Length; + } + + } + + try + { + // copy byte array to ptr + Marshal.Copy(temparray, startoffset, i, len); + } + catch + { + //log.Error("ByteArrayToStructure FAIL", ex); + } + + obj = Marshal.PtrToStructure(i, obj.GetType()); + + Marshal.FreeHGlobal(i); + + } + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// little endian (LSB first) + /// + /// Note - assumes little endian host order + internal static byte[] StructureToByteArray(object obj) + { + int len = Marshal.SizeOf(obj); + byte[] arr = new byte[len]; + IntPtr ptr = Marshal.AllocHGlobal(len); + Marshal.StructureToPtr(obj, ptr, true); + Marshal.Copy(ptr, arr, 0, len); + Marshal.FreeHGlobal(ptr); + return arr; + } + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// big endian (MSB first) + /// + internal static byte[] StructureToByteArrayBigEndian(params object[] list) + { + // The copy is made becuase SetValue won't work on a struct. + // Boxing was used because SetValue works on classes/objects. + // Unfortunately, it results in 2 copy operations. + object thisBoxed = list[0]; // Why make a copy? + Type test = thisBoxed.GetType(); + + int offset = 0; + byte[] data = new byte[Marshal.SizeOf(thisBoxed)]; + + object fieldValue; + TypeCode typeCode; + + byte[] temp; + + // Enumerate each structure field using reflection. + foreach (var field in test.GetFields()) + { + // field.Name has the field's name. + + fieldValue = field.GetValue(thisBoxed); // Get value + + // Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + typeCode = Type.GetTypeCode(fieldValue.GetType()); + + switch (typeCode) + { + case TypeCode.Single: // float + { + temp = BitConverter.GetBytes((Single)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Single)); + break; + } + case TypeCode.Int32: + { + temp = BitConverter.GetBytes((Int32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int32)); + break; + } + case TypeCode.UInt32: + { + temp = BitConverter.GetBytes((UInt32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt32)); + break; + } + case TypeCode.Int16: + { + temp = BitConverter.GetBytes((Int16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int16)); + break; + } + case TypeCode.UInt16: + { + temp = BitConverter.GetBytes((UInt16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt16)); + break; + } + case TypeCode.Int64: + { + temp = BitConverter.GetBytes((Int64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int64)); + break; + } + case TypeCode.UInt64: + { + temp = BitConverter.GetBytes((UInt64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt64)); + break; + } + case TypeCode.Double: + { + temp = BitConverter.GetBytes((Double)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Double)); + break; + } + case TypeCode.Byte: + { + data[offset] = (Byte)fieldValue; + break; + } + default: + { + //System.Diagnostics.Debug.Fail("No conversion provided for this type : " + typeCode.ToString()); + break; + } + }; // switch + if (typeCode == TypeCode.Object) + { + int length = ((byte[])fieldValue).Length; + Array.Copy(((byte[])fieldValue), 0, data, offset, length); + offset += length; + } + else + { + offset += Marshal.SizeOf(fieldValue); + } + } // foreach + + return data; + } // Swap + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET45.cs b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET45.cs new file mode 100644 index 0000000..fbd48aa --- /dev/null +++ b/PlaneGcsSdk_Shared/Protocols/MavlinkUtil_NET45.cs @@ -0,0 +1,285 @@ +#if NET45 + +using System; +using System.Runtime.InteropServices; + +//using log4net; + +namespace Plane.Protocols +{ + /// + /// Static methods and helpers for creation and manipulation of Mavlink packets + /// + internal static class MavlinkUtil + { + //private static readonly ILog log = + // LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Create a new mavlink packet object from a byte array as recieved over mavlink + /// Endianess will be detetected using packet inspection + /// + /// The type of mavlink packet to create + /// The bytes of the mavlink packet + /// The position in the byte array where the packet starts + /// The newly created mavlink packet + internal static TMavlinkPacket ByteArrayToStructure(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + if (bytearray[0] == 'U') + { + throw new NotSupportedException("bytearray[0] == 'U' is not supported."); + //ByteArrayToStructureEndian(bytearray, ref obj, startoffset); + } + else + { + int len = MarshalEx.SizeOf(); + + IntPtr i = Marshal.AllocHGlobal(len); + TMavlinkPacket packet; + + try + { + // copy byte array to ptr + Marshal.Copy(bytearray, startoffset, i, len); + packet = MarshalEx.PtrToStructure(i); + } + // 林俊清, 20151026, 改为不吞异常了。 + //catch + //{ + // //log.Error("ByteArrayToStructure FAIL", ex); + //} + finally + { + Marshal.FreeHGlobal(i); + } + + return packet; + } + } + + internal static TMavlinkPacket ByteArrayToStructureBigEndian(this byte[] bytearray, int startoffset = 6) where TMavlinkPacket : struct + { + object newPacket = new TMavlinkPacket(); + throw new NotSupportedException("ByteArrayToStructureBigEndian is not supported."); + //ByteArrayToStructureEndian(bytearray, ref newPacket, startoffset); + //return (TMavlinkPacket)newPacket; + } + + //internal static void ByteArrayToStructureEndian(byte[] bytearray, ref object obj, int startoffset) + //{ + // int len = Marshal.SizeOf(obj); + // IntPtr i = Marshal.AllocHGlobal(len); + // byte[] temparray = (byte[])bytearray.Clone(); + + // // create structure from ptr + // obj = Marshal.PtrToStructure(i, obj.GetType()); + + // // do endian swap + // object thisBoxed = obj; + // Type test = thisBoxed.GetType(); + + // int reversestartoffset = startoffset; + + // // Enumerate each structure field using reflection. + // foreach (var field in test.GetRuntimeFields()) + // { + // // field.Name has the field's name. + // object fieldValue = field.GetValue(thisBoxed); // Get value + + // // Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + // TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType()); + + // if (typeCode != TypeCode.Object) + // { + // Array.Reverse(temparray, reversestartoffset, Marshal.SizeOf(fieldValue)); + // reversestartoffset += Marshal.SizeOf(fieldValue); + // } + // else + // { + // reversestartoffset += ((byte[])fieldValue).Length; + // } + + // } + + // try + // { + // // copy byte array to ptr + // Marshal.Copy(temparray, startoffset, i, len); + // } + // catch + // { + // //log.Error("ByteArrayToStructure FAIL", ex); + // } + + // obj = Marshal.PtrToStructure(i, obj.GetType()); + + // Marshal.FreeHGlobal(i); + + //} + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// little endian (LSB first) + /// + /// Note - assumes little endian host order + internal static byte[] StructureToByteArray(TMavlinkPacket packet) + { + int len = MarshalEx.SizeOf(packet); + byte[] arr = new byte[len]; + IntPtr ptr = Marshal.AllocHGlobal(len); + try + { + Marshal.StructureToPtr(packet, ptr, true); + Marshal.Copy(ptr, arr, 0, len); + } + finally + { + Marshal.FreeHGlobal(ptr); + } + return arr; + } + + /// + /// Convert a struct to an array of bytes, struct fields being reperesented in + /// big endian (MSB first) + /// + internal static byte[] StructureToByteArrayBigEndian(TMavlinkPacket packet) + { + //// The copy is made becuase SetValue won't work on a struct. + //// Boxing was used because SetValue works on classes/objects. + //// Unfortunately, it results in 2 copy operations. + //object thisBoxed = list[0]; // Why make a copy? + + object thisBoxed = packet; + Type test = thisBoxed.GetType(); + + int offset = 0; + byte[] data = new byte[Marshal.SizeOf(packet)]; + + object fieldValue; + //TypeCode typeCode; + + byte[] temp; + + // Enumerate each structure field using reflection. + foreach (var field in test.GetFields()) + { + // field.Name has the field's name. + + fieldValue = field.GetValue(thisBoxed); // Get value + + //// Get the TypeCode enumeration. Multiple types get mapped to a common typecode. + //typeCode = Type.GetTypeCode(fieldValue.GetType()); + + //switch (typeCode) + switch (fieldValue.GetType().Name) + { + case nameof(Single): // float + { + temp = BitConverter.GetBytes((Single)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Single)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(Int32): + { + temp = BitConverter.GetBytes((Int32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int32)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(UInt32): + { + temp = BitConverter.GetBytes((UInt32)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt32)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(Int16): + { + temp = BitConverter.GetBytes((Int16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int16)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(UInt16): + { + temp = BitConverter.GetBytes((UInt16)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt16)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(Int64): + { + temp = BitConverter.GetBytes((Int64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Int64)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(UInt64): + { + temp = BitConverter.GetBytes((UInt64)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(UInt64)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(Double): + { + temp = BitConverter.GetBytes((Double)fieldValue); + Array.Reverse(temp); + Array.Copy(temp, 0, data, offset, sizeof(Double)); + offset += MarshalEx.SizeOf(); + break; + } + case nameof(Byte): + { + data[offset] = (Byte)fieldValue; + offset += MarshalEx.SizeOf(); + break; + } + default: + { + int length = ((byte[])fieldValue).Length; + Array.Copy(((byte[])fieldValue), 0, data, offset, length); + offset += length; + + //System.Diagnostics.Debug.Fail("No conversion provided for this type : " + typeCode.ToString()); + break; + } + }; // switch + } // foreach + + return data; + } // Swap + + /// + /// 为 .NET 4.5.1 以下版本提供 SizeOf、PtrToStructure 等方法。 + /// + private static class MarshalEx + { + public static T PtrToStructure(IntPtr ptr) + { + return (T)Marshal.PtrToStructure(ptr, typeof(T)); + } + + public static int SizeOf() + { + return Marshal.SizeOf(typeof(T)); + } + + public static int SizeOf(T structure) + { + return Marshal.SizeOf(structure.GetType()); + } + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/Arduino/ArduinoSTKv2.cs b/PlaneGcsSdk_Shared/TaskTools/Arduino/ArduinoSTKv2.cs new file mode 100644 index 0000000..26fa546 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Arduino/ArduinoSTKv2.cs @@ -0,0 +1,428 @@ +#if INTERNAL_TOOL + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using System.Threading; +//using log4net; + +// Written by Michael Oborne + +namespace TaskTools.Arduino +{ + public class ArduinoSTKv2 : System.IO.Ports.SerialPort, IArduinoComms + { + //private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + public event ProgressEventHandler Progress; + + public new void Open() + { + // default dtr status is false + + //from http://svn.savannah.nongnu.org/viewvc/RELEASE_5_11_0/arduino.c?root=avrdude&view=markup + base.Open(); + + base.DtrEnable = false; + base.RtsEnable = false; + + System.Threading.Thread.Sleep(50); + + base.DtrEnable = true; + base.RtsEnable = true; + + System.Threading.Thread.Sleep(50); + } + + public byte[] genstkv2packet(byte[] message) + { + byte[] data = new byte[300]; + byte ck = 0; + + data[0] = 0x1b; + ck ^= data[0]; + data[1] = 0x1; + ck ^= data[1]; + data[2] = (byte)((message.Length >> 8) & 0xff); + ck ^= data[2]; + data[3] = (byte)(message.Length & 0xff); + ck ^= data[3]; + data[4] = 0xe; + ck ^= data[4]; + + int a = 5; + foreach (byte let in message) + { + data[a] = let; + ck ^= let; + a++; + } + data[a] = ck; + a++; + + this.Write(data,0,a); + //Console.WriteLine("about to read packet"); + + byte[] ret = readpacket(); + + //if (ret[1] == 0x0) + { + //Console.WriteLine("received OK"); + } + + return ret; + } + + byte[] readpacket() + { + byte[] temp = new byte[4000]; + byte[] mes = new byte[2] { 0x0, 0xC0 }; // fail + int a = 7; + int count = 0; + + this.ReadTimeout = 1000; + + while (count < a) + { + //Console.WriteLine("count {0} a {1} mes leng {2}",count,a,mes.Length); + try + { + temp[count] = (byte)this.ReadByte(); + } + catch { break; } + + + //Console.Write("{1}", temp[0], (char)temp[0]); + + if (temp[0] != 0x1b) + { + count = 0; + continue; + } + + if (count == 3) + { + a = (temp[2] << 8) + temp[3]; + mes = new byte[a]; + a += 5; + } + + if (count >= 5) + { + mes[count - 5] = temp[count]; + } + + count++; + } + + //Console.WriteLine("read ck"); + try + { + temp[count] = (byte)this.ReadByte(); + } + catch { } + + count++; + + Array.Resize(ref temp, count); + + //Console.WriteLine(this.BytesToRead); + + return mes; + } + + + /// + /// Used to start initial connecting after serialport.open + /// + /// true = passed, false = failed + public bool connectAP() + { + if (!this.IsOpen) + { + return false; + } + + Thread.Sleep(100); + + int a = 0; + while (a < 5) + { + byte[] temp = new byte[] { 0x6, 0,0,0,0}; + temp = this.genstkv2packet(temp); + a++; + Thread.Sleep(50); + + try + { + if (temp[0] == 6 && temp[1] == 0 && temp.Length == 2) + { + return true; + } + } + catch { } + } + return false; + } + + /// + /// Used to keep alive the connection + /// + /// true = passed, false = lost connection + public bool keepalive() + { + return connectAP(); + } + /// + /// Syncs after a private command has been sent + /// + /// true = passed, false = failed + public bool sync() + { + if (!this.IsOpen) + { + return false; + } + return true; + } + /// + /// Downloads the eeprom with the given length - set Address first + /// + /// eeprom length + /// downloaded data + public byte[] download(short length) + { + if (!this.IsOpen) + { + throw new Exception(); + } + byte[] data = new byte[length]; + + byte[] temp = new byte[] { 0x16, (byte)((length >> 8) & 0xff), (byte)((length >> 0) & 0xff) }; + temp = this.genstkv2packet(temp); + + Array.Copy(temp, 2, data, 0, length); + + return data; + } + + public byte[] downloadflash(short length) + { + if (!this.IsOpen) + { + throw new Exception("Port Closed"); + } + byte[] data = new byte[length]; + + byte[] temp = new byte[] { 0x14, (byte)((length >> 8) & 0xff), (byte)((length >> 0) & 0xff) }; + temp = this.genstkv2packet(temp); + + Array.Copy(temp, 2, data, 0, length); + + return data; + } + + public bool uploadflash(byte[] data, int startfrom, int length, int startaddress) + { + if (!this.IsOpen) + { + return false; + } + int loops = (length / 0x100); + int totalleft = length; + int sending = 0; + + for (int a = 0; a <= loops; a++) + { + if (totalleft > 0x100) + { + sending = 0x100; + } + else + { + sending = totalleft; + } + + //startaddress = 256; + if (sending == 0) + return true; + + setaddress(startaddress); + startaddress += sending; + + // 0x13 + + byte[] command = new byte[] { (byte)0x13, (byte)(sending >> 8), (byte)(sending & 0xff) }; + + //log.InfoFormat((startfrom + (length - totalleft)) + " - " + sending); + + Array.Resize(ref command, sending + 10); // sending + head + + Array.Copy(data, startfrom + (length - totalleft), command, 10, sending); + + command = this.genstkv2packet(command); + + totalleft -= sending; + + + if (Progress != null) + Progress((int)(((float)startaddress / (float)length) * 100), "Uploading Firmware"); + + if (command[1] != 0) + { + //log.InfoFormat("No Sync"); + return false; + } + } + return true; + } + + /// + /// Sets the eeprom start read or write address + /// + /// address, must be eaven number + /// true = passed, false = failed + public bool setaddress(int address) + { + if (!this.IsOpen) + { + return false; + } + + if (address % 2 == 1) + { + throw new Exception("Address must be an even number"); + } + + //log.InfoFormat("Sending address " + ((address / 2))); + + int tempstart = address / 2; // words + byte[] temp = new byte[] { 0x6, (byte)((tempstart >> 24) & 0xff), (byte)((tempstart >> 16) & 0xff), (byte)((tempstart >> 8) & 0xff), (byte)((tempstart >> 0) & 0xff) }; + temp = this.genstkv2packet(temp); + + if (temp[1] == 0) + { + return true; + } + return false; + } + /// + /// Upload data at preset address + /// + /// array to read from + /// start array index + /// length to send + /// sets eeprom start programing address + /// true = passed, false = failed + public bool upload(byte[] data,short startfrom,short length, short startaddress) + { + if (!this.IsOpen) + { + return false; + } + int loops = (length / 0x100); + int totalleft = length; + int sending = 0; + + for (int a = 0; a <= loops; a++) + { + if (totalleft > 0x100) + { + sending = 0x100; + } + else + { + sending = totalleft; + } + + //startaddress = 256; + if (sending == 0) + return true; + + setaddress(startaddress); + startaddress += (short)sending; + + // 0x13 + + byte[] command = new byte[] { (byte)0x15, (byte)(sending >> 8), (byte)(sending & 0xff) }; + + //log.InfoFormat((startfrom + (length - totalleft)) + " - " + sending); + + Array.Resize(ref command, sending + 10); // sending + head + + Array.Copy(data, startfrom + (length - totalleft), command, 10, sending); + + command = this.genstkv2packet(command); + + totalleft -= sending; + + + if (Progress != null) + Progress((int)(((float)startaddress / (float)length) * 100),""); + + if (command[1] != 0) + { + //log.InfoFormat("No Sync"); + return false; + } + } + return true; + } + + public Chip getChipType() + { + byte sig1 = 0x00; + byte sig2 = 0x00; + byte sig3 = 0x00; + + byte[] command = new byte[] { (byte)0x1b, 0, 0, 0, 0 }; + command = this.genstkv2packet(command); + + sig1 = command[2]; + + command = new byte[] { (byte)0x1b, 0, 0, 0, 1 }; + command = this.genstkv2packet(command); + + sig2 = command[2]; + + command = new byte[] { (byte)0x1b, 0, 0, 0, 2 }; + command = this.genstkv2packet(command); + + sig3 = command[2]; + + foreach (Chip item in Arduino.Chip.chips) + { + if (item.Equals(new Chip("", sig1, sig2, sig3, 0))) + { + //log.Debug("Match " + item.ToString()); + return item; + } + } + + return null; + } + + public new bool Close() { + + try + { + byte[] command = new byte[] { (byte)0x11 }; + genstkv2packet(command); + } + catch { } + + try + { + if (base.IsOpen) + base.Close(); + } + catch { } + + base.DtrEnable = false; + base.RtsEnable = false; + return true; + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/Arduino/IArduinoComms.cs b/PlaneGcsSdk_Shared/TaskTools/Arduino/IArduinoComms.cs new file mode 100644 index 0000000..da37412 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Arduino/IArduinoComms.cs @@ -0,0 +1,116 @@ +#if INTERNAL_TOOL + +using System; +using System.Collections.Generic; +using System.Collections; +using System.Text; +using System.IO.Ports; +using System.IO; + +namespace TaskTools.Arduino +{ + public delegate void ProgressEventHandler(int progress, string status); + + /// + /// Arduino STK interface + /// + public interface IArduinoComms + { + bool connectAP(); + bool keepalive(); + bool sync(); + byte[] download(short length); + byte[] downloadflash(short length); + bool setaddress(int address); + bool upload(byte[] data, short startfrom, short length, short startaddress); + bool uploadflash(byte[] data, int startfrom, int length, int startaddress); + + Chip getChipType(); + + event ProgressEventHandler Progress; + + // from serialport class + int BaudRate { get; set; } + bool DtrEnable { get; set; } + string PortName { get; set; } + StopBits StopBits { get; set; } + Parity Parity { get; set; } + bool IsOpen { get; } + void Open(); + void Close(); + int DataBits { get; set; } + } + + public class Chip + { + public string name = ""; + public byte sig1 = 0; + public byte sig2 = 0; + public byte sig3 = 0; + public uint size = 0; + + static bool creating = true; + + public static List chips = new List(); + + public static void Populate() + { + creating = false; + + chips.Clear(); + + chips.Add(new Chip("ATmega2561", 0x1e, 0x98, 0x02, 0x100U)); //128 words + chips.Add(new Chip("ATmega2560", 0x1e, 0x98, 0x01, 0x100U)); //128 words + chips.Add(new Chip("ATmega1280", 0x1e, 0x97, 0x03, 0x80U)); //128 words + chips.Add(new Chip("ATmega1281", 0x1e, 0x97, 0x04, 0x80U)); //128 words + chips.Add(new Chip("ATmega128", 0x1e, 0x97, 0x02, 0x80U)); //128 words + chips.Add(new Chip("ATmega64", 0x1e, 0x96, 0x02, 0x80U)); //128 words + chips.Add(new Chip("ATmega32", 0x1e, 0x95, 0x02, 0x40U)); //64 words + chips.Add(new Chip("ATmega16", 0x1e, 0x94, 0x03, 0x40U)); //64 words + chips.Add(new Chip("ATmega8", 0x1e, 0x93, 0x07, 0x20U)); //32 words + chips.Add(new Chip("ATmega88", 0x1e, 0x93, 0x0a, 0x20U)); //32 words + chips.Add(new Chip("ATmega168", 0x1e, 0x94, 0x06, 0x40U)); //64 words + chips.Add(new Chip("ATmega328P", 0x1e, 0x95, 0x0F, 0x40U)); //64 words + chips.Add(new Chip("ATmega162", 0x1e, 0x94, 0x04, 0x40U)); //64 words + chips.Add(new Chip("ATmega163", 0x1e, 0x94, 0x02, 0x40U)); //64 words + chips.Add(new Chip("ATmega169", 0x1e, 0x94, 0x05, 0x40U)); //64 words + chips.Add(new Chip("ATmega8515", 0x1e, 0x93, 0x06, 0x20U)); //32 words + chips.Add(new Chip("ATmega8535", 0x1e, 0x93, 0x08, 0x20U));//32 words + + foreach (Chip item in chips) + { + // Console.WriteLine(item); + } + } + + public Chip(string nm, byte s1, byte s2, byte s3, uint size) + { + if (chips.Count == 0 && creating) + Populate(); + + name = nm; + sig1 = s1; + sig2 = s2; + sig3 = s3; + this.size = size; + } + + public override string ToString() + { + return "Chip(" + name + ", " + sig1.ToString("X") + ", " + sig2.ToString("X") + ", " + sig3.ToString("X") + ", " + size + ")"; + } + + public override bool Equals(object obj) + { + Chip item = obj as Chip; + return (item.sig1 == this.sig1 && item.sig2 == this.sig2 && item.sig3 == this.sig3); + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/Attributes/DisplayTextAttribute.cs b/PlaneGcsSdk_Shared/TaskTools/Attributes/DisplayTextAttribute.cs new file mode 100644 index 0000000..34e34fc --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Attributes/DisplayTextAttribute.cs @@ -0,0 +1,44 @@ +#region Using Statements + +using System; + +#endregion + +namespace TaskTools.Attributes +{ + /// + /// Used to decorate a type or type member with display text. + /// + [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)] + internal sealed class DisplayTextAttribute : Attribute + { + + private readonly string _text; + + /// + /// Initializes a new instance of the class. + /// + /// The text. + /// + /// Thrown when is null or empty. + /// + internal DisplayTextAttribute(string text) + { + if (String.IsNullOrEmpty(text)) + { + throw new ArgumentException("\"text\" is required."); + } + _text = text; + } + + /// + /// Gets the text. + /// + /// The text. + internal string Text + { + get { return _text; } + } + + } +} diff --git a/PlaneGcsSdk_Shared/TaskTools/Attributes/PrivateAttribute.cs b/PlaneGcsSdk_Shared/TaskTools/Attributes/PrivateAttribute.cs new file mode 100644 index 0000000..612b6e5 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Attributes/PrivateAttribute.cs @@ -0,0 +1,35 @@ +#region Using Statements + +using System; + +#endregion + +namespace TaskTools.Attributes +{ + [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = false)] + internal sealed class PrivateAttribute : Attribute + { + private readonly bool _isPrivate; + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [is private]. + internal PrivateAttribute(bool isPrivate) + { + _isPrivate = isPrivate; + } + + /// + /// Gets a value indicating whether this instance is private. + /// + /// + /// true if this instance is private; otherwise, false. + /// + internal bool IsPrivate + { + get { return _isPrivate; } + } + + } +} diff --git a/PlaneGcsSdk_Shared/TaskTools/HIL/Matrix3.cs b/PlaneGcsSdk_Shared/TaskTools/HIL/Matrix3.cs new file mode 100644 index 0000000..9de20e8 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/HIL/Matrix3.cs @@ -0,0 +1,193 @@ +#if INTERNAL_TOOL + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TaskTools.HIL +{ + public class Matrix3 + { + // '''a 3x3 matrix, intended as a rotation matrix''' + + Matrix3 self; + public Vector3 a; + public Vector3 b; + public Vector3 c; + + public Matrix3() + { + self = this; + self.identity(); + } + + public Matrix3(Vector3 a, Vector3 b, Vector3 c) + { + self = this; + + this.a = a; + this.b = b; + this.c = c; + } + + public new string ToString() + { + return String.Format("Matrix3(({0}, {1}, {2}), ({3}, {4}, {5}), ({6}, {7}, {8}))", + self.a.x, self.a.y, self.a.z, + self.b.x, self.b.y, self.b.z, + self.c.x, self.c.y, self.c.z); + } + + public void identity() + { + self.a = new Vector3(1, 0, 0); + self.b = new Vector3(0, 1, 0); + self.c = new Vector3(0, 0, 1); + } + + public Matrix3 transposed() + { + return new Matrix3(new Vector3(self.a.x, self.b.x, self.c.x), + new Vector3(self.a.y, self.b.y, self.c.y), + new Vector3(self.a.z, self.b.z, self.c.z)); + } + + + public void from_euler(double roll, double pitch, double yaw) + { + // '''fill the matrix from Euler angles in radians''' + double cp = Utils.cos(pitch); + double sp = Utils.sin(pitch); + double sr = Utils.sin(roll); + double cr = Utils.cos(roll); + double sy = Utils.sin(yaw); + double cy = Utils.cos(yaw); + + self.a.x = cp * cy; + self.a.y = (sr * sp * cy) - (cr * sy); + self.a.z = (cr * sp * cy) + (sr * sy); + self.b.x = cp * sy; + self.b.y = (sr * sp * sy) + (cr * cy); + self.b.z = (cr * sp * sy) - (sr * cy); + self.c.x = -sp; + self.c.y = sr * cp; + self.c.z = cr * cp; + } + + public void to_euler(ref double roll, ref double pitch, ref double yaw) + { + // '''find Euler angles for the matrix''' + if (self.c.x >= 1.0) + pitch = Math.PI; + else if (self.c.x <= -1.0) + pitch = -Math.PI; + else + pitch = -Utils.asin(self.c.x); + roll = Utils.atan2(self.c.y, self.c.z); + yaw = Utils.atan2(self.b.x, self.a.x); + //return (roll, pitch, yaw) + } + + public Vector3 to_euler_yxz() + { + double cos_phi = Math.Sqrt(1 - self.c.y * self.c.y); + double phi = Utils.atan2(self.c.y, cos_phi); + double omega = Utils.atan2(-self.c.x, self.c.z); + double kappa = Utils.atan2(-self.a.y, self.b.y); + + return new Vector3(omega, phi, kappa); + } + + + public static Matrix3 operator +(Matrix3 self, Matrix3 m) + { + return new Matrix3(self.a + m.a, self.b + m.b, self.c + m.c); + } + + public static Matrix3 operator -(Matrix3 self, Matrix3 m) + { + return new Matrix3(self.a - m.a, self.b - m.b, self.c - m.c); + } + + public static Vector3 operator *(Matrix3 self, Vector3 v) + { + return new Vector3(self.a.x * v.x + self.a.y * v.y + self.a.z * v.z, + self.b.x * v.x + self.b.y * v.y + self.b.z * v.z, + self.c.x * v.x + self.c.y * v.y + self.c.z * v.z); + } + + public static Matrix3 operator *(Matrix3 self, Matrix3 m) + { + return new Matrix3(new Vector3(self.a.x * m.a.x + self.a.y * m.b.x + self.a.z * m.c.x, + self.a.x * m.a.y + self.a.y * m.b.y + self.a.z * m.c.y, + self.a.x * m.a.z + self.a.y * m.b.z + self.a.z * m.c.z), + new Vector3(self.b.x * m.a.x + self.b.y * m.b.x + self.b.z * m.c.x, + self.b.x * m.a.y + self.b.y * m.b.y + self.b.z * m.c.y, + self.b.x * m.a.z + self.b.y * m.b.z + self.b.z * m.c.z), + new Vector3(self.c.x * m.a.x + self.c.y * m.b.x + self.c.z * m.c.x, + self.c.x * m.a.y + self.c.y * m.b.y + self.c.z * m.c.y, + self.c.x * m.a.z + self.c.y * m.b.z + self.c.z * m.c.z)); + } + + public static Matrix3 operator *(Matrix3 self, double v) + { + + return new Matrix3(self.a * v, self.b * v, self.c * v); + } + + public static Matrix3 operator /(Matrix3 self, double v) + { + return new Matrix3(self.a / v, self.b / v, self.c / v); + } + + public static Matrix3 operator -(Matrix3 self) + { + return new Matrix3(-self.a, -self.b, -self.c); + } + + public Matrix3 copy() + { + return new Matrix3(self.a.copy(), self.b.copy(), self.c.copy()); + } + + public void rotate(Vector3 g) + { + // '''rotate the matrix by a given amount on 3 axes''' + Matrix3 temp_matrix = new Matrix3(self.a.copy(), self.b.copy(), self.c.copy()); + + temp_matrix.a.x = a.y * g.z - a.z * g.y; + temp_matrix.a.y = a.z * g.x - a.x * g.z; + temp_matrix.a.z = a.x * g.y - a.y * g.x; + temp_matrix.b.x = b.y * g.z - b.z * g.y; + temp_matrix.b.y = b.z * g.x - b.x * g.z; + temp_matrix.b.z = b.x * g.y - b.y * g.x; + temp_matrix.c.x = c.y * g.z - c.z * g.y; + temp_matrix.c.y = c.z * g.x - c.x * g.z; + temp_matrix.c.z = c.x * g.y - c.y * g.x; + self.a += temp_matrix.a; + self.b += temp_matrix.b; + self.c += temp_matrix.c; + } + + public void normalize() + { + // '''re-normalise a rotation matrix''' + Vector3 error = self.a * self.b; + Vector3 t0 = self.a - (self.b * (0.5 * error)); + Vector3 t1 = self.b - (self.a * (0.5 * error)); + Vector3 t2 = t0 % t1; + self.a = t0 * (1.0 / t0.length()); + self.b = t1 * (1.0 / t1.length()); + self.c = t2 * (1.0 / t2.length()); + } + + public double trace() + { + // '''the trace of the matrix''' + return self.a.x + self.b.y + self.c.z; + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/HIL/Utils.cs b/PlaneGcsSdk_Shared/TaskTools/HIL/Utils.cs new file mode 100644 index 0000000..96ec8b8 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/HIL/Utils.cs @@ -0,0 +1,333 @@ +#if INTERNAL_TOOL + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace TaskTools.HIL +{ + internal class Utils + { + internal const double rad2deg = (180 / System.Math.PI); + internal const double deg2rad = (1.0 / rad2deg); + internal const double ft2m = (1.0 / 3.2808399); + internal const double kts2fps = 1.68780986; + + internal const bool True = true; + internal const bool False = false; + + internal static string str(byte[] input) + { + string st = Encoding.GetEncoding("ASCII").GetString(input, 0, input.Length); + + int pos = st.IndexOf('\0'); + + if (pos != -1) + { + st = st.Substring(0, pos); + } + + return st; + } + + internal static double sin(double val) + { + return System.Math.Sin(val); + } + internal static double cos(double val) + { + return System.Math.Cos(val); + } + internal static double acos(double val) + { + return System.Math.Acos(val); + } + internal static double asin(double val) + { + return System.Math.Asin(val); + } + internal static double atan2(double val, double val2) + { + return System.Math.Atan2(val, val2); + } + internal static double radians(double val) + { + return val * deg2rad; + } + internal static double degrees(double val) + { + return val * rad2deg; + } + internal static double sqrt(double val) + { + return System.Math.Sqrt(val); + } + internal static double abs(double val) + { + return System.Math.Abs(val); + } + + internal static int[] range(int no) + { + int[] range = new int[no]; + for (int a = 0; a < no; a++) + { + range[a] = a; + } + return range; + } + + internal static double fabs(double val) + { + return System.Math.Abs(val); + } + + internal static double tan(double val) + { + return System.Math.Tan(val); + } + + internal static int len(object[] data) + { + return data.Length; + } + + internal static int len(List data) + { + return data.Count; + } + + internal static Tuple EarthRatesToBodyRates(double roll, double pitch, double yaw, + double rollRate, double pitchRate, double yawRate) + { + //convert the angular velocities from earth frame to + //body frame. Thanks to James Goppert for the formula + + //all inputs and outputs are in degrees + + //returns a tuple, (p,q,r) + + + var phi = radians(roll); + var theta = radians(pitch); + var phiDot = radians(rollRate); + var thetaDot = radians(pitchRate); + var psiDot = radians(yawRate); + + var p = phiDot - psiDot * sin(theta); + var q = cos(phi) * thetaDot + sin(phi) * psiDot * cos(theta); + var r = cos(phi) * psiDot * cos(theta) - sin(phi) * thetaDot; + + return new Tuple(degrees(p), degrees(q), degrees(r)); + } + + internal static Tuple EarthRatesToBodyRatesRyan(double roll, double pitch, double yaw, + double x, double y, double z) + { + // thanks to ryan beall + + var phi = radians(roll); + var theta = radians(pitch); + var psi = radians((360 - yaw) * 1.0); + var Po = radians(x); + var Qo = radians(y); + var Ro = radians(-z); + + var P = Po * cos(psi) * cos(theta) - Ro * sin(theta) + Qo * cos(theta) * sin(psi); + + var Q = Qo * (cos(phi) * cos(psi) + sin(phi) * sin(psi) * sin(theta)) - Po * (cos(phi) * sin(psi) - cos(psi) * sin(phi) * sin(theta)) + Ro * cos(theta) * sin(phi); + + var R = Po * (sin(phi) * sin(psi) + cos(phi) * cos(psi) * sin(theta)) - Qo * (cos(psi) * sin(phi) - cos(phi) * sin(psi) * sin(theta)) + Ro * cos(phi) * cos(theta); + + + // P = 0; + //Q = 0; + //R = 0; + + + return new Tuple(degrees(P), degrees(Q), degrees(R)); + } + + internal static Tuple EarthRatesToBodyRatesMine(double roll, double pitch, double yaw, + double rollRate, double pitchRate, double yawRate) + { + // thanks to ryan beall + + var phi = radians(roll); + var theta = radians(pitch); + var psi = radians(yaw); + var Po = radians(pitchRate); + var Ro = radians(yawRate); + var Qo = radians(rollRate); + + var Q = Po * cos(psi) + Qo * sin(psi); + + var P = Po * sin(psi) + Qo * cos(psi); ; + + var R = Ro; + + return new Tuple(degrees(P), degrees(Q), degrees(R)); + + + /* + double Cr, Cp, Cz; + double Sr, Sp, Sz; + + var phi = radians(roll); + var theta = radians(pitch); + var psi = radians(yaw); + var Po = radians(rollRate); + var Ro = radians(pitchRate); + var Qo = radians(yawRate); + + Cr = Math.Cos((phi)); + Cp = Math.Cos((theta)); + Cz = Math.Cos((psi)); + Sr = Math.Sin((phi)); + Sp = Math.Sin((theta)); + Sz = Math.Sin((psi)); + + // http://planning.cs.uiuc.edu/node102.html + // Z Y X + // roll -Sp, CpSr, CpCr + // pitch SzCp, SzSpSr+CzCr, SzSpCr-CpCr + // yaw CzCp, CzSpSr-SzCr, CzSpCr+SzSr + + var P = -(Qo * Sp) + Po * Cp * Sr + Ro * Cp * Cr; + + var Q = Qo * (Sz * Cp) + Po * (Sz * Sp * Sr + Cz * Cr) + Ro * (Sz * Sp * Cr - Cp * Cr); + + var R = Qo * (Cz * Cp) + Po * (Cz * Sp * Sr - Sz * Cr) + Ro * (Cz * Sp * Cr + Sz * Sr); + + return new Tuple(degrees(P), degrees(Q), degrees(R)); + * */ + } + + internal static Tuple OGLtoBCBF(double phi, double theta, double psi, double x, double y, double z) + { + double x_NED, y_NED, z_NED; + double Cr, Cp, Cy; + double Sr, Sp, Sy; + + //Accelerations in X-Plane are expressed in the local OpenGL reference frame, for whatever reason. + //This coordinate system is defined as follows (taken from the X-Plane SDK Wiki): + + // The origin 0,0,0 is on the surface of the earth at sea level at some "reference point". + // The +X axis points east from the reference point. + // The +Z axis points south from the reference point. + // The +Y axis points straight up away from the center of the earth at the reference point. + + // First we shall convert from this East Up South frame, to a more conventional NED (North East Down) frame. + x_NED = (x) * -1.0; + y_NED = (y) * 1.0; + z_NED = (z) * -1.0; + + // Next calculate cos & sin of angles for use in the transformation matrix. + // r, p & y subscripts stand for roll pitch and yaw. + + Cr = Math.Cos((phi)); + Cp = Math.Cos((theta)); + Cy = Math.Cos((psi)); + Sr = Math.Sin((phi)); + Sp = Math.Sin((theta)); + Sy = Math.Sin((psi)); + + // Next we need to rotate our accelerations from the NED reference frame, into the body fixed reference frame + + // THANKS TO GEORGE M SIOURIS WHOSE "MISSILE GUIDANCE AND CONTROL SYSTEMS" BOOK SEEMS TO BE THE ONLY EASY TO FIND REFERENCE THAT + // ACTUALLY GETS THE NED TO BODY FRAME ROTATION MATRIX CORRECT!! + + // CpCy, CpSy, -Sp | local_ax + // SrSpCy-CrSy, SrSpSy+CrCy, SrCp | local_ay + // CrSpCy+SrSy, CrSpSy-SrCy, CrCp | local_az + + x = (x_NED * Cp * Cy) + (y_NED * Cp * Sy) - (z_NED * Sp); + y = (x_NED * ((Sr * Sp * Cy) - (Cr * Sy))) + (y_NED * ((Sr * Sp * Sy) + (Cr * Cy))) + (z_NED * Sr * Cp); + z = (x_NED * ((Cr * Sp * Cy) + (Sr * Sy))) + (y_NED * ((Cr * Sp * Sy) - (Sr * Cy))) + (z_NED * Cr * Cp); + + return new Tuple((x), (y), (z)); + } + + + /// + /// From http://code.google.com/p/gentlenav/source/browse/trunk/Tools/XP_UDB_HILSIM/utility.cpp + /// Converts from xplanes to fixed body ref + /// + /// + /// + /// + /// + /// + internal static void FLIGHTtoBCBF(ref float x, ref float y, ref float z, float alpha, float beta) + { + float Ca = (float)Math.Cos(alpha); + float Cb = (float)Math.Cos(beta); + float Sa = (float)Math.Sin(alpha); + float Sb = (float)Math.Sin(beta); + + float X_plane = (x * Ca * Cb) - (z * Sa * Cb) - (y * Sb); + float Y_plane = (z * Sa * Sb) - (x * Ca * Sb) - (y * Cb); + float Z_plane = (x * Sa) + (z * Ca); + + x = X_plane; + y = Y_plane; + z = Z_plane; + } + + internal static Vector3 BodyRatesToEarthRates(Matrix3 dcm, Vector3 gyro) + { + //'''convert the angular velocities from body frame to + //earth frame. + + //all inputs and outputs are in radians/s + + //returns a earth rate vector + //''' + + var p = gyro.x; + var q = gyro.y; + var r = gyro.z; + + double phi = 0; + double theta = 0; + double psi = 0; + + dcm.to_euler(ref phi, ref theta, ref psi); + + var phiDot = p + tan(theta) * (q * sin(phi) + r * cos(phi)); + var thetaDot = q * cos(phi) - r * sin(phi); + if (fabs(cos(theta)) < 1.0e-20) + theta += 1.0e-10; + var psiDot = (q * sin(phi) + r * cos(phi)) / cos(theta); + + return new Vector3((phiDot), (thetaDot), (psiDot)); + } + + + internal void gps_newpos(double lat, double lon, double bearing, double distance, ref double latitude, ref double longitude) + { + // '''extrapolate latitude/longitude given a heading and distance + // thanks to http://www.movable-type.co.uk/scripts/latlong.html + // ''' + // from math import sin, asin, cos, atan2, radians, degrees + double radius_of_earth = 6378100.0;//# in meters + + double lat1 = radians(lat); + double lon1 = radians(lon); + double brng = radians(bearing); + double dr = distance / radius_of_earth; + + double lat2 = asin(sin(lat1) * cos(dr) + + cos(lat1) * sin(dr) * cos(brng)); + double lon2 = lon1 + atan2(sin(brng) * sin(dr) * cos(lat1), + cos(dr) - sin(lat1) * sin(lat2)); + + latitude = degrees(lat2); + longitude = degrees(lon2); + //return (degrees(lat2), degrees(lon2)); + } + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/HIL/Vector3.cs b/PlaneGcsSdk_Shared/TaskTools/HIL/Vector3.cs new file mode 100644 index 0000000..68c1a74 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/HIL/Vector3.cs @@ -0,0 +1,154 @@ +#if INTERNAL_TOOL + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +//using GMap.NET; +using TaskTools.Utilities; + +namespace TaskTools.HIL +{ + public class Vector3 + { + Vector3 self; + public double x; + public double y; + public double z; + + public Vector3(double x = 0, double y = 0, double z = 0) + { + self = this; + this.x = x; + this.y = y; + this.z = z; + } + + public Vector3(Vector3 copyme) + { + self = this; + this.x = copyme.x; + this.y = copyme.y; + this.z = copyme.z; + } + + public new string ToString() + { + return String.Format("Vector3({0}, {1}, {2})", self.x, + self.y, + self.z); + } + + // 林俊清,20150702:删除 MissionPlanner.Utilities.dll。 + //public static implicit operator Vector3(PointLatLngAlt a) + //{ + // return new Vector3(a.Lat,a.Lng,a.Alt); + //} + + // 林俊清,20150702:删除 GMap.NET.Core.dll(仅此处使用其 PointLatLng)。 + + //public static implicit operator Vector3(PointLatLng a) + //{ + // return new Vector3(a.Lat, a.Lng, 0); + //} + + //public static implicit operator PointLatLng(Vector3 a) + //{ + // return new PointLatLng(a.x,a.y); + //} + + public static Vector3 operator +(Vector3 self, Vector3 v) + { + + return new Vector3(self.x + v.x, + self.y + v.y, + self.z + v.z); + } + + + public static Vector3 operator -(Vector3 self, Vector3 v) + { + return new Vector3(self.x - v.x, + self.y - v.y, + self.z - v.z); + } + + public static Vector3 operator -(Vector3 self) + { + return new Vector3(-self.x, -self.y, -self.z); + } + + + public static Vector3 operator *(Vector3 self, Vector3 v) + { + // '''dot product''' + return new Vector3(self.x * v.x + self.y * v.y + self.z * v.z); + + } + + public static Vector3 operator *(Vector3 self, double v) + { + return new Vector3(self.x * v, + self.y * v, + self.z * v); + } + + public static Vector3 operator *(double v, Vector3 self) + { + return (self * v); + } + + public static Vector3 operator /(Vector3 self, double v) + { + return new Vector3(self.x / v, + self.y / v, + self.z / v); + } + + public static Vector3 operator %(Vector3 self, Vector3 v) + { + // '''cross product''' + return new Vector3(self.y * v.z - self.z * v.y, + self.z * v.x - self.x * v.z, + self.x * v.y - self.y * v.x); + } + + public Vector3 copy() + { + return new Vector3(self.x, self.y, self.z); + } + + + public double length() + { + return Math.Sqrt(self.x * self.x + self.y * self.y + self.z * self.z); + } + + public void zero() + { + self.x = self.y = self.z = 0; + } + + //public double angle (Vector3 self, Vector3 v) { + // '''return the angle between this vector and another vector''' + // return Math.Acos(self * v) / (self.length() * v.length()); + //} + + public Vector3 normalized() + { + return self / self.length(); + } + + public void normalize() + { + Vector3 v = self.normalized(); + self.x = v.x; + self.y = v.y; + self.z = v.z; + } + + const double HALF_SQRT_2 = 0.70710678118654757; + } +} + +#endif diff --git a/PlaneGcsSdk_Shared/TaskTools/Utilities/EnumTranslator.cs b/PlaneGcsSdk_Shared/TaskTools/Utilities/EnumTranslator.cs new file mode 100644 index 0000000..5204267 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Utilities/EnumTranslator.cs @@ -0,0 +1,170 @@ +#region Using Statements + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using TaskTools.Attributes; + +#endregion + +namespace TaskTools.Utilities +{ + internal static class EnumTranslator + { + /// + /// Translates this instance. + /// + /// + /// + internal static Dictionary Translate() + { + return Translate(true); + } + + internal static List> EnumToList() + { + var ans = Translate(string.Empty, true, false); + + return ans.ToList(); + } + + /// + /// Translates the specified check private. + /// + /// + /// if set to true [check private]. + /// + internal static Dictionary Translate(bool checkPrivate) + { + return Translate(string.Empty, checkPrivate); + } + + /// + /// Translates the specified default text. + /// + /// + /// The default text. + /// if set to true [check private]. + /// + internal static Dictionary Translate(string defaultText, bool checkPrivate) + { + return Translate(defaultText, checkPrivate, true); + } + + /// + /// Translates the specified default text. + /// + /// + /// The default text. + /// if set to true [check private]. + /// if set to true [sorting]. + /// + internal static Dictionary Translate(string defaultText, bool checkPrivate, bool sorting) + { + var types = new Dictionary(); + var tempTypes = new Dictionary(); + if (!String.IsNullOrEmpty(defaultText)) types.Add(-1, defaultText); +#if NETFX_CORE + foreach (FieldInfo fieldInfo in typeof(T).GetRuntimeFields()) +#else + foreach (FieldInfo fieldInfo in typeof(T).GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)) +#endif + { + if (fieldInfo.FieldType != typeof(T)) + { + continue; + } + bool add = true; + string displayText = string.Empty; + T type = (T)fieldInfo.GetValue(typeof(T)); +#if NETFX_CORE + var displayTextAttr = fieldInfo.GetCustomAttribute(true); + displayText = displayTextAttr?.Text ?? type.ToString(); +#else + object[] displayTextObjectArr = fieldInfo.GetCustomAttributes(typeof(DisplayTextAttribute), true); + displayText = (displayTextObjectArr.Length > 0) + ? ((DisplayTextAttribute)displayTextObjectArr[0]).Text + : type.ToString(); +#endif + if (checkPrivate) + { +#if NETFX_CORE + var privateAttr = fieldInfo.GetCustomAttribute(true); + if (privateAttr != null) + { + add = !privateAttr.IsPrivate; + } +#else + object[] privateAttributeObjectArr = fieldInfo.GetCustomAttributes(typeof(PrivateAttribute), true); + if (privateAttributeObjectArr.Length > 0) + { + add = !((PrivateAttribute)privateAttributeObjectArr[0]).IsPrivate; + } +#endif + } + if (add) + { + tempTypes.Add(Convert.ToInt32(type), displayText); + } + } + if (sorting) + { + foreach (var x in tempTypes.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value)) { types.Add(x.Key, x.Value); } + } + else + { + foreach (var x in tempTypes.ToDictionary(x => x.Key, x => x.Value)) { types.Add(x.Key, x.Value); } + } + return types; + } + + /// + /// Gets the display text. + /// + /// + /// The value. + /// + internal static string GetDisplayText(T value) + { + var displayText = string.Empty; +#if NETFX_CORE + var fieldInfo = value.GetType().GetRuntimeField(value.ToString()); +#else + var fieldInfo = typeof(T).GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public).FirstOrDefault(); +#endif + if (fieldInfo != null) + { + T type = (T)fieldInfo.GetValue(typeof(T)); + if (type != null) + { +#if NETFX_CORE + var displayTextAttr = fieldInfo.GetCustomAttribute(true); + displayText = displayTextAttr?.Text ?? type.ToString(); +#else + object[] displayTextObjectArr = fieldInfo.GetCustomAttributes(typeof(DisplayTextAttribute), true); + displayText = (displayTextObjectArr.Length > 0) + ? ((DisplayTextAttribute)displayTextObjectArr[0]).Text + : type.ToString(); +#endif + } + } + return displayText; + } + + internal static int GetValue(string item) + { + var list = Translate(); + + foreach (var kvp in list) + { + if (kvp.Value == item) + return kvp.Key; + } + + return -1; + } + + } + +} diff --git a/PlaneGcsSdk_Shared/TaskTools/Utilities/locationwp.cs b/PlaneGcsSdk_Shared/TaskTools/Utilities/locationwp.cs new file mode 100644 index 0000000..ac95f0e --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskTools/Utilities/locationwp.cs @@ -0,0 +1,22 @@ +namespace TaskTools.Utilities +{ + /// + /// Struct as used in Ardupilot + /// +#if PRIVATE + public struct Locationwp +#else + internal struct Locationwp +#endif + { + public byte id; // command id + public byte options; + public float p1; // param 1 + public float p2; // param 2 + public float p3; // param 3 + public float p4; // param 4 + public double lat; // Lattitude * 10**7 + public double lng; // Longitude * 10**7 + public float alt; // Altitude in centimeters (meters * 100) + }; +} diff --git a/PlaneGcsSdk_Shared/TaskUtils.cs b/PlaneGcsSdk_Shared/TaskUtils.cs new file mode 100644 index 0000000..08dd977 --- /dev/null +++ b/PlaneGcsSdk_Shared/TaskUtils.cs @@ -0,0 +1,23 @@ +using System.Threading.Tasks; + +namespace Plane +{ + public static class TaskUtils + { + public static readonly Task CompletedTask = +#if NET45 + Task.FromResult(true); +#else + Task.CompletedTask; +#endif + + public static Task Delay(int millisecondsDelay) + { +#if NET4 + return TaskEx.Delay(millisecondsDelay); +#else + return Task.Delay(millisecondsDelay); +#endif + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/BluetoothConnection.cs b/PlaneGcsSdk_UWP/Communication/BluetoothConnection.cs new file mode 100644 index 0000000..d87dd6b --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/BluetoothConnection.cs @@ -0,0 +1,80 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Windows.Devices.Bluetooth; +using Windows.Devices.Bluetooth.Rfcomm; +using Windows.Networking; +using Windows.Networking.Sockets; + +namespace Plane.Communication +{ + /// + /// 提供蓝牙通信的能力。 + /// + public class BluetoothConnection : StreamSocketConnection + { + private const uint ErrorCodeDeviceTurnedOff = 0x8007048F; + private const uint ErrorCodeNotFoundElement = 0x80070490; + + private HostName _remoteHostName; + + public BluetoothConnection(string hostName) : this(new HostName(hostName)) + { + } + + public BluetoothConnection(HostName hostName) + { + _remoteHostName = hostName; + } + + public override async Task OpenAsync() + { + Close(); + _socket = new StreamSocket(); + + var chatService = await FilterDevice(hostName: _remoteHostName); + if (chatService != null) + { + var cancellationTokenSource = new CancellationTokenSource(3000); + var cancellationToken = cancellationTokenSource.Token; + try + { + await Task.Run(async () => await _socket.ConnectAsync(chatService.ConnectionHostName, chatService.ConnectionServiceName), cancellationToken); + IsOpen = true; + _inputStream = _socket.InputStream; + _outputStream = _socket.OutputStream.AsStreamForWrite(); + } + catch (TaskCanceledException) + { + throw new TimeoutException(); + } + } + else + { + throw new PlatformNotSupportedException("找不到匹配的蓝牙服务设备!"); + } + } + + private async Task FilterDevice(HostName hostName) + { + try + { + var blthDevice = await BluetoothDevice.FromHostNameAsync(hostName);//获取蓝牙设备 + return blthDevice.RfcommServices.FirstOrDefault();//获取Rfcomm服务对象 + } + catch (Exception ex) + { + if ((uint)ex.HResult == ErrorCodeNotFoundElement) + { + return null; + } + else + { + throw new Exception(ex.Message + "hostName:" + hostName); + } + } + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/CopterFactory.cs b/PlaneGcsSdk_UWP/Communication/CopterFactory.cs new file mode 100644 index 0000000..e15f4eb --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/CopterFactory.cs @@ -0,0 +1,19 @@ +using Plane.Communication; +using Plane.Copters; + +namespace Plane.CopterManagement +{ + public partial class CopterFactory : ICopterFactory + { + public ICopter CreateBluetoothCopter(string hostName, string name = "GHOSTDRONE") + { + var connection = new BluetoothConnection(hostName); + var copter = new PLCopter(connection, _uiSyncContext) + { + Id = "Bluetooth_" + hostName, + Name = name + }; + return copter; + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/DeviceAccessDeniedException.cs b/PlaneGcsSdk_UWP/Communication/DeviceAccessDeniedException.cs new file mode 100644 index 0000000..1c78e80 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/DeviceAccessDeniedException.cs @@ -0,0 +1,18 @@ +using System; +using Windows.Devices.Enumeration; + +namespace Plane.Communication +{ + /// + /// 设备访问被拒绝时引发的异常。 + /// + public class DeviceAccessDeniedException : Exception + { + public DeviceAccessDeniedException(string message, DeviceAccessStatus deviceAccessStatus) : base(message) + { + DeviceAccessStatus = deviceAccessStatus; + } + + public DeviceAccessStatus DeviceAccessStatus { get; set; } + } +} \ No newline at end of file diff --git a/PlaneGcsSdk_UWP/Communication/SerialPortConnection.cs b/PlaneGcsSdk_UWP/Communication/SerialPortConnection.cs new file mode 100644 index 0000000..149506f --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/SerialPortConnection.cs @@ -0,0 +1,71 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Windows.Devices.Enumeration; +using Windows.Devices.SerialCommunication; + +namespace Plane.Communication +{ + /// + /// 提供串口通信的能力。 + /// + public class SerialPortConnection : StreamConnection + { + private uint _baudRate; + private SerialDevice _device; + private string _deviceId; + + public SerialPortConnection(string deviceId, uint baudRate = 115200) + { + _deviceId = deviceId; + _baudRate = baudRate; + } + + public override void Close() + { + base.Close(); + _device?.Dispose(); + } + + public override async Task OpenAsync() + { + _device = await SerialDevice.FromIdAsync(_deviceId); + if (_device != null) + { + _device.BaudRate = _baudRate; + _device.DataBits = 8; + _device.StopBits = SerialStopBitCount.One; + _device.Parity = SerialParity.None; + _device.IsDataTerminalReadyEnabled = true; + _device.IsRequestToSendEnabled = true; + _device.ReadTimeout = TimeSpan.FromMilliseconds(1200); + + _inputStream = _device.InputStream; + _outputStream = _device.OutputStream.AsStreamForWrite(); + + IsOpen = true; + } + else + { + var deviceAccessStatus = DeviceAccessInformation.CreateFromId(_deviceId).CurrentStatus; + string message; + if (deviceAccessStatus == DeviceAccessStatus.DeniedByUser) + { + message = "Access to the device was blocked by the user : " + _deviceId; + } + else if (deviceAccessStatus == DeviceAccessStatus.DeniedBySystem) + { + // This status is most likely caused by app permissions (did not declare the device in the app's package.appxmanifest) + // This status does not cover the case where the device is already opened by another app. + message = "Access to the device was blocked by the system : " + _deviceId; + } + else + { + // Most likely the device is opened by another app, but cannot be sure + message = "Unknown error, possibly opened by another app : " + _deviceId; + } + throw new DeviceAccessDeniedException(message, deviceAccessStatus); + } + } + } +} \ No newline at end of file diff --git a/PlaneGcsSdk_UWP/Communication/StreamConnection.cs b/PlaneGcsSdk_UWP/Communication/StreamConnection.cs new file mode 100644 index 0000000..4a5ad98 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/StreamConnection.cs @@ -0,0 +1,95 @@ +using System; +using System.IO; +using System.Runtime.InteropServices.WindowsRuntime; +using System.Threading.Tasks; +using Windows.Storage.Streams; + +namespace Plane.Communication +{ + /// + /// 所有以字节流形式进行通信的 实现者的基类。 + /// + public abstract class StreamConnection : ExceptionThrownEventSource, IConnection + { + protected bool _canFlush = true; + protected IInputStream _inputStream; + protected Stream _outputStream; + private bool _reopening; + + public bool IsOpen { get; protected set; } + + public virtual void Close() + { + IsOpen = false; + try + { + _inputStream?.Dispose(); + } + catch { } + try + { + _outputStream?.Dispose(); + } + catch { } + } + + public abstract Task OpenAsync(); + + public virtual async Task ReadAsync(byte[] buffer, int offset, int count) + { + try + { + IBuffer buf = new Windows.Storage.Streams.Buffer((uint)count); + buf = await _inputStream.ReadAsync(buf, (uint)count, InputStreamOptions.None); + buf.CopyTo(0, buffer, offset, count); + return count; + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + await ReopenIfNeededAsync(); + return 0; + } + } + + public virtual async Task WriteAsync(byte[] buffer, int offset, int count) + { + try + { + await _outputStream.WriteAsync(buffer, offset, count).ConfigureAwait(false); + if (_canFlush) + { + await _outputStream.FlushAsync().ConfigureAwait(false); + } + } + catch (NotImplementedException) // 不支持 Flush。 + { + _canFlush = false; + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + await ReopenIfNeededAsync(); + } + } + + private async Task ReopenIfNeededAsync() + { + if (!_reopening) + { + _reopening = true; + Close(); + try + { + await OpenAsync(); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + await Task.Delay(1000); + } + _reopening = false; + } + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/StreamSocketConnection.cs b/PlaneGcsSdk_UWP/Communication/StreamSocketConnection.cs new file mode 100644 index 0000000..972b6df --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/StreamSocketConnection.cs @@ -0,0 +1,22 @@ +using Windows.Networking.Sockets; + +namespace Plane.Communication +{ + /// + /// 提供使用 对象进行通信的能力。这是一个抽象类。 + /// + public abstract class StreamSocketConnection : StreamConnection + { + protected StreamSocket _socket; + + protected StreamSocketConnection() + { + } + + public override void Close() + { + base.Close(); + _socket?.Dispose(); + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/TcpConnection.cs b/PlaneGcsSdk_UWP/Communication/TcpConnection.cs new file mode 100644 index 0000000..800bf82 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/TcpConnection.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Windows.Networking; +using Windows.Networking.Sockets; + +namespace Plane.Communication +{ + /// + /// 提供 TCP 通信的能力。 + /// + public class TcpConnection : StreamSocketConnection + { + private HostName _remoteHostName; + private string _remoteServiceName; + + public TcpConnection(string remoteHostName, int remotePort = 5250) + { + _remoteHostName = new HostName(remoteHostName); + _remoteServiceName = remotePort.ToString(); + } + + public override async Task OpenAsync() + { + if (IsOpen) + { + return; + } + _socket = new StreamSocket(); + await _socket.ConnectAsync(_remoteHostName, _remoteServiceName); + _inputStream = _socket.InputStream; + _outputStream = _socket.OutputStream.AsStreamForWrite(); + IsOpen = true; + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/UdpConnection.cs b/PlaneGcsSdk_UWP/Communication/UdpConnection.cs new file mode 100644 index 0000000..ada05b4 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/UdpConnection.cs @@ -0,0 +1,80 @@ +using System; +using System.Threading.Tasks; +using Windows.Networking; +using Windows.Networking.Sockets; +using Windows.Storage.Streams; + +namespace Plane.Communication +{ + public class UdpConnection : UdpConnectionBase + { + private HostName _remoteHostName; + + private string _remoteServiceName; + + private DatagramSocket _socket; + + public UdpConnection(string remoteHostName, int remotePort = 5250) + { + _remoteHostName = new HostName(remoteHostName); + _remoteServiceName = remotePort.ToString(); + } + + public event EventHandler MessageReceived; + + public override void Close() + { + if (IsOpen) + { + IsOpen = false; + _socket?.Dispose(); + } + } + + public override Task OpenAsync() + { + if (!IsOpen) + { + IsOpen = true; + _socket = new DatagramSocket(); + _socket.MessageReceived += _socket_MessageReceived; + } + return TaskUtils.CompletedTask; + } + + protected override async Task SendAsync(byte[] datagram, int bytes) + { + if (datagram.Length != bytes) + { + Array.Resize(ref datagram, bytes); + } + try + { + var outputStream = await _socket.GetOutputStreamAsync(_remoteHostName, _remoteServiceName); + var writer = new DataWriter(outputStream); + writer.WriteBytes(datagram); + await writer.StoreAsync(); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + } + } + + private void _socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) + { + try + { + var reader = args.GetDataReader(); + var data = new byte[reader.UnconsumedBufferLength]; + reader.ReadBytes(data); + EnqueueDatagram(data); + MessageReceived?.Invoke(this, EventArgs.Empty); + } + catch (Exception ex) + { + RaiseExceptionThrown(ex); + } + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/UdpServerConnection.UWP.cs b/PlaneGcsSdk_UWP/Communication/UdpServerConnection.UWP.cs new file mode 100644 index 0000000..ca16ba3 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/UdpServerConnection.UWP.cs @@ -0,0 +1,74 @@ +using System; +using System.Threading.Tasks; +using Windows.Storage.Streams; + +namespace Plane.Communication +{ + internal class UdpServerConnection : UdpConnectionBase + { + private bool _disposed; + + private IOutputStream _outputStream; + + private DataWriter _writer; + + /// + /// 初始化 的实例,并指定输出流。 + /// + /// 用于发送数据的输出流。 + public UdpServerConnection(IOutputStream outputStream) + { + _outputStream = outputStream; + _writer = new DataWriter(_outputStream); + } + + public bool NeedNewOutputStream { get; private set; } + + public override void Close() + { + NeedNewOutputStream = false; + IsOpen = false; + _outputStream?.Dispose(); + _writer?.Dispose(); + _disposed = true; + } + + public override Task OpenAsync() + { + if (_disposed) + { + NeedNewOutputStream = true; + } + IsOpen = true; + return TaskUtils.CompletedTask; + } + + public void SetOutputStream(IOutputStream outputStream) + { + _outputStream?.Dispose(); + _writer?.Dispose(); + _outputStream = outputStream; + _writer = new DataWriter(_outputStream); + NeedNewOutputStream = false; + _disposed = false; + } + + protected override async Task SendAsync(byte[] datagram, int bytes) + { + if (datagram.Length != bytes) + { + Array.Resize(ref datagram, bytes); + } + try + { + _writer.WriteBytes(datagram); + await _writer.StoreAsync(); + } + catch (Exception ex) + { + Close(); + RaiseExceptionThrown(ex); + } + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/UdpServerConnectionManager.UWP.cs b/PlaneGcsSdk_UWP/Communication/UdpServerConnectionManager.UWP.cs new file mode 100644 index 0000000..2c01955 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/UdpServerConnectionManager.UWP.cs @@ -0,0 +1,76 @@ +using System; +using Windows.Networking.Sockets; + +namespace Plane.Communication +{ + public partial class UdpServerConnectionManager + { + private DatagramSocket _socket; + + private UdpServerConnectionManager() + { + _socket = new DatagramSocket(); + var temp = _socket.BindServiceNameAsync("5250"); + } + + public void StartReceiving() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(UdpServerConnectionManager)); + } + if (_shouldReceive && _isReceiving) + { + return; + } + _shouldReceive = true; + _isReceiving = true; + _socket.MessageReceived += _socket_MessageReceived; + } + + public void StopReceiving() + { + if (_shouldReceive) + { + _shouldReceive = false; + _socket.MessageReceived -= _socket_MessageReceived; + _isReceiving = false; + } + } + + private async void _socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) + { + try + { + var reader = args.GetDataReader(); + var data = new byte[reader.UnconsumedBufferLength]; + reader.ReadBytes(data); + var remoteAddress = args.RemoteAddress.CanonicalName; + if (!_connections.ContainsKey(remoteAddress)) + { + var connection = new UdpServerConnection(await _socket.GetOutputStreamAsync(args.RemoteAddress, args.RemotePort)); + _connections.Add(remoteAddress, connection); + RaiseConnectionEstablished(connection, remoteAddress); + } + else + { + var connection = _connections[remoteAddress]; + if (connection.NeedNewOutputStream) + { + connection.SetOutputStream(await _socket.GetOutputStreamAsync(args.RemoteAddress, args.RemotePort)); + } + } + _connections[remoteAddress].EnqueueDatagram(data); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex); + } + } + + private void DisposeCore() + { + _socket.Dispose(); + } + } +} diff --git a/PlaneGcsSdk_UWP/Communication/UdpThroughDtuServiceConnection.UWP.cs b/PlaneGcsSdk_UWP/Communication/UdpThroughDtuServiceConnection.UWP.cs new file mode 100644 index 0000000..05ac572 --- /dev/null +++ b/PlaneGcsSdk_UWP/Communication/UdpThroughDtuServiceConnection.UWP.cs @@ -0,0 +1,166 @@ +using Windows.Storage.Streams; +using Windows.Networking; +using Windows.Networking.Sockets; +using System; +using System.Threading.Tasks; +using System.Threading; + +namespace Plane.Communication +{ + public partial class UdpThroughDtuServiceConnection + { + #region Fields + private IOutputStream _outputStream; + private DatagramSocket _socket; + private DataWriter _writer; + private readonly AutoResetEvent _loginResultSignal = new AutoResetEvent(false); + private bool _isLogined; //是否已登录成功 + private byte[] loginResultDatagram; //记录登陆时返回的报文数据 + #endregion + + /// + /// 初始化 的实例。 + /// + /// + /// + public UdpThroughDtuServiceConnection(string ip, int port) + { + DtuServiceIP = ip; + DtuServicePort = port; + } + + /// + /// 登陆到Dtu服务端。 + /// 登陆方式极其简单,只需发送一个数据包(内含希望连接到的飞机ID) + /// + /// + public virtual async Task OpenAsync() + { + if (IsOpen) + { + return; + } + + await Task.Run(async () => + { + var bytes = ConstructHandShakeDatagramToDTUService(); + if (_socket == null) + { + var hostName = new HostName(DtuServiceIP); + _socket = new DatagramSocket(); + + //对于WP平台,若没有打开网络连接(比如WIFI),下面语句会报: + //“No such host is known.(Exception from HRESULT:0x80072AF9)” + try + { + await _socket.ConnectAsync(hostName, DtuServicePort.ToString()); + } + catch (Exception ex) + { + _socket = null; + if ((uint)ex.HResult == 0x80072AF9) + { + throw new Exception("请检查是否已打开网络连接。"); + } + else + { + throw ex; + } + } + _socket.MessageReceived += _socket_MessageReceived; + _outputStream = await _socket.GetOutputStreamAsync(hostName, DtuServicePort.ToString()); + _writer = new DataWriter(_outputStream); + } + + _writer.WriteBytes(bytes); + await _writer.StoreAsync(); + + //等待服务端的应答,获取是否连接成功飞机的结果 + if (_loginResultSignal.WaitOne(10000)) + { + var ret = AnalyzeHandShakeDatagramFromDTUService(loginResultDatagram); + if (ret == DTUHandShakeResult.Successful) + { + IsOpen = true; + _isLogined = true; + } + else if (ret == DTUHandShakeResult.Occupied) + { + throw new Exception("飞机已被占用!"); + } + else if (ret == DTUHandShakeResult.NotExisted) + { + throw new Exception("飞机不存在!"); + } + else + { + throw new Exception("未知状态!"); + } + } + else + { + IsOpen = false; + throw new Exception("连接超时!"); + } + }).ConfigureAwait(false); + } + + public virtual void Close() + { + IsOpen = false; + _outputStream?.Dispose(); + _writer?.Dispose(); + if (_socket != null) + { + try + { + _socket.MessageReceived -= _socket_MessageReceived; + _socket?.Dispose(); + _socket = null; + } + catch (Exception) { } + } + } + + private async Task SendAsync(byte[] datagram, int bytes) + { + if (datagram.Length != bytes) + { + Array.Resize(ref datagram, bytes); + } + try + { + _writer.WriteBytes(datagram); + await _writer.StoreAsync(); + } + catch + { + //发送异常可以内部消化之,因为Udp发送失败也无办法,同时也不用冒泡异常 + } + } + + private void _socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) + { + try + { + var reader = args.GetDataReader(); + if (!_isLogined) + { + loginResultDatagram = new byte[reader.UnconsumedBufferLength]; + reader.ReadBytes(loginResultDatagram); + _loginResultSignal.Set(); + } + else + { + //以后收到的直接透传 + var data = new byte[reader.UnconsumedBufferLength]; + reader.ReadBytes(data); + EnqueueDatagram(data); + } + } + catch (Exception) + { + } + } + } +} diff --git a/PlaneGcsSdk_UWP/PlaneGcsSdk_UWP.csproj b/PlaneGcsSdk_UWP/PlaneGcsSdk_UWP.csproj new file mode 100644 index 0000000..59871f2 --- /dev/null +++ b/PlaneGcsSdk_UWP/PlaneGcsSdk_UWP.csproj @@ -0,0 +1,154 @@ + + + + + Debug + AnyCPU + {B0226F52-8D27-4C05-8C04-536E0BCC3B99} + Library + Properties + Plane + PlaneGcsSdk_UWP + zh-CN + UAP + 10.0.10586.0 + 10.0.10586.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + prompt + 4 + bin\Release\PlaneGcsSdk_UWP.xml + + + ARM + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + true + + + ARM + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + true + + + x64 + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + x64 + bin\x64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x64 + false + prompt + true + + + x86 + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + x86 + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + + + + + + + + + + + + + + + + + + + + + + + {18ecd88e-5d74-43e8-8bc2-d28f6db13a47} + PlaneGcsSdk.Contract + + + + + 14.0 + + + + + + + + + \ No newline at end of file diff --git a/PlaneGcsSdk_UWP/Properties/AssemblyInfo.cs b/PlaneGcsSdk_UWP/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..88e5868 --- /dev/null +++ b/PlaneGcsSdk_UWP/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("PlaneGcsSdk_UWP")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Plane, Inc.")] +[assembly: AssemblyProduct("PlaneGcsSdk_UWP")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("3.0.0.0")] +[assembly: AssemblyFileVersion("3.0.0.0")] +[assembly: ComVisible(false)] \ No newline at end of file diff --git a/PlaneGcsSdk_UWP/Properties/PlaneGcsSdk_UWP.rd.xml b/PlaneGcsSdk_UWP/Properties/PlaneGcsSdk_UWP.rd.xml new file mode 100644 index 0000000..d9e310f --- /dev/null +++ b/PlaneGcsSdk_UWP/Properties/PlaneGcsSdk_UWP.rd.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/PlaneGcsSdk_UWP/project.json b/PlaneGcsSdk_UWP/project.json new file mode 100644 index 0000000..c594939 --- /dev/null +++ b/PlaneGcsSdk_UWP/project.json @@ -0,0 +1,16 @@ +{ + "dependencies": { + "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0" + }, + "frameworks": { + "uap10.0": {} + }, + "runtimes": { + "win10-arm": {}, + "win10-arm-aot": {}, + "win10-x86": {}, + "win10-x86-aot": {}, + "win10-x64": {}, + "win10-x64-aot": {} + } +} \ No newline at end of file diff --git a/packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.XML b/packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.XML new file mode 100644 index 0000000..dbfa9ae --- /dev/null +++ b/packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.XML @@ -0,0 +1,268 @@ + + + + Microsoft.Practices.ServiceLocation + + + + + The standard exception thrown when a ServiceLocator has an error in resolving an object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + + The generic Service Locator interface. This interface is used + to retrieve services (instances identified by type and optional + name) from a container. + + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + This class provides the ambient container for this application. If your + framework defines such an ambient container, use ServiceLocator.Current + to get it. + + + + + Set the delegate that is used to retrieve the current container. + + Delegate that, when called, will return + the current ambient container. + + + + The current ambient container. + + + + + This class is a helper that provides a default implementation + for most of the methods of . + + + + + Implementation of . + + The requested service. + if there is an error in resolving the service instance. + The requested object. + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + When implemented by inheriting classes, this method will do the actual work of resolving + the requested service instance. + + Type of instance requested. + Name of registered service you want. May be null. + The requested service instance. + + + + When implemented by inheriting classes, this method will do the actual work of + resolving all the requested service instances. + + Type of service requested. + Sequence of service instance objects. + + + + Format the exception message for use in an + that occurs while resolving a single service. + + The actual exception thrown by the implementation. + Type of service requested. + Name requested. + The formatted exception message string. + + + + Format the exception message for use in an + that occurs while resolving multiple service instances. + + The actual exception thrown by the implementation. + Type of service requested. + The formatted exception message string. + + + + This delegate type is used to provide a method that will + return the current container. Used with the + static accessor class. + + An . + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Activation error occurred while trying to get all instances of type {0}. + + + + + Looks up a localized string similar to Activation error occurred while trying to get instance of type {0}, key "{1}". + + + + + Looks up a localized string similar to ServiceLocationProvider must be set.. + + + + diff --git a/packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.dll b/packages/CommonServiceLocator.1.3/lib/portable-net4+sl5+netcore45+wpa81+wp8/Microsoft.Practices.ServiceLocation.dll new file mode 100644 index 0000000000000000000000000000000000000000..95bbd51e3a3482858c15f779c1e2724612cbe2df GIT binary patch literal 18112 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 WkFIW^%O7#~x4&GSU#I^q68bMcgSfH) literal 0 HcmV?d00001 diff --git a/packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.dll b/packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.dll new file mode 100644 index 0000000000000000000000000000000000000000..fb8950dad9fcb12df0b1108c547cf42a0bf3a9e9 GIT binary patch literal 313504 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 z

2xPzob?8I5I?d?mbRph$8wC5cNdK_$<#NBgpyvIIVg$u&8Wv6E!zB+1!&!N*IZ znz{a^yjmN|c}=*~p96BP4k0$KfQ)e1HIUPNq$m1snCM8_M9FEs8UdPE_m5)ia-9jd zC#rcb_|Ys>#K&Jl!M+0_kKg=A7RRZvuK*ggeQaSWWUF%K8E1@H({z0PcMbj)w4Sqw zb<~uzq=Ir5ku});&ytp<-|cR?6_kI+6Qo;)yasyG?f+ea{a?aTzxztkO_MHrORLp7 z3}akw<@g;~V(M^Sh13rOfk>4#ax{|27^@szUXimG35C7fYGP-Uq9j%8ID< zMg%T`p|Dr%ch4`*O__5De+R|X=4G;8+Ep1y-t4IMo%OuF;ETwfffiGm1HHGF_jXX$=l0ZF z_z|x*TYqca8(QBman%CHUeBN^2&G2?n zFK^c-yy=@ljr5yBXw%q+)d%LS^)xuxyA^4VKdfKtlfxBD<3FVon)<&Rw^1yP#_z#1 z9%0o}R?Rzy)!P?1O_~e}cr+tY9mz;_xAzkm%i+0v;=e1s-`)8(#)c8^cjV+de=mo} zY5x~)_Y!zpNKpmC+>zvVbQtk;l>DReFLC~={55`L|CGS&pLqa?z5&bwKsgz}JOC_9 zy}@N3oi8~V+3PPU@61&XtsltzTaP;;JytvS0aiQU=H#L0QK!azjoq|QeuYtk-u!(9 zTYR*4?ia&<;9fahiI>k&S$UIE8|X0Kik%eRK#TlXr4Q^k+ZGa4Z9QCL+d|qdwQZrm zOr9-x!kE@98L#PL7;_6{uc6?3(E>k`q&4bOh&>?*TYExDP&ry_O|~f3_`EZSh0^=E zyoF{y(a&3-d9lpN!8Qwhxnm;$c)}Bi4O)5rE zu4Zk6m~oV=)+EG<8dYTyiY^l;7yIdpo3LYlvw=jSDdGF1=`=r9KzOt*(Z@`WGmlx- z&Ud9PU&xeJK|fP)KJM~80rF`g0N+;vhOVoSlJuVAuSepwF>`TI_uc}|rB)}R;0VuL@K7@Pp1ELa@@6o)m%KDQbJats;S#v#WP6`b$uyUc75gLTRO}G=EU}l!rGZe`pSXeCdyP_m(l*f5z z-QwmTnS9!kPiqmmn&AAPEpeDk@Jm)EFxM_}-c?pJK!Kk%al{BrlserXk}A?X~Ecif5v7aZ}M4=;JBMLy+^MaX=8APj3I*r!sWM0*U^p+$ZPezI7fs$3ox= zgPAi;KCQP<$ZT3i$W=#~6sM)UDuZLnjV&^e7<3@5GoG19*bz_mQdVG|rD@J|_4*wv zNp!E+6Dw!!gsi%v%W`)hRg?qCuKwT6KdGX`zKYde!OLDhGcDJAduYv$VrIr!8D^a9vG&6s z9tUM7oKl*^yI%KXFRPoG#yV!L&@M9l)(@(kK4?zUD@^gxu^#3pj~(SGqIh&gn{;-x zYWD0@j4S50(vqp-^l7vOchfqcJsBrWrQE}SBQ?eAIT?EnYjSWuES|0HLFqnO_*pL2m zPe0nzce;mv)OSY5l7+g>h||}2Tp!6ZwVfYOu?)iY;b`=vppA{p1Hd9QHZsrU{%%E> zhWfh&N|g2DVCPmUorA-HZAeDXBp;47-0Da!>NCoGu+0b(R9b5nYZiHd!(N~I)I{94 z=?_-9UiX$!YNb3I*UtP9DhViiL7(MOjd^Dt>Bc>}WnQ{}=*DHlAKBv4{iqw4(M;oh z+>Og1{;x zEd5!;@fKk%U@&P;bR_oXzWQ~2d*(*p)0mh0gW0lX=CLK}?%MTZX~bg|k!!JQuTOuZ zA02ySOU$klyL1U}gxPH*Jm9+_PjTa3a!uE?izbGCS5ECJs+{qMMU$IL3~*0EaLMMP zTa>m0*>7SwP?X0@mi|uAwuew)`C%Pero2 z3v3y?{GYlM5X)s+kzEwn0|8UGYoVHsbEtzkRHmpTw>}HvQ9{H$dVYeQJV@ZoSAK{) zGl^J}3cN50W}4W0k1Kz+yU4X|Bpk{WV>b5ERryMoFgcx`y`D7C1Sr!f;|$P}!djeI zG<31%(8YZ(x?9p$<=wP~+5C7~eXjf)mJFrbKf2|@p6-d4AeGU$r$uV$#!tq=f-4 zd|3}F+oL({3S8zD={GT9dRxTNfYQ~aaM?x6CYN1Q3Rg@|JKOm>aG#&*LeSNP64xx+ zKj5MQ&c223E0hy^n_1NXf0)irY3Sq@PBV!9p9?EE=i!)o^LBxOf-cDJ-`e=<4ETFN zmp{9E^(0u+71H_nSmSWtt+}ye(J(23>A6ZV@vfL+=$x5^nqKQ9Qe`x`+mo$>LdpPu; zD!t3@$R#?oA7A14tw{#iKq2$c^Xqkv{V^W>e3r&xG}B@`@v+npU)aNv*%Pfd$e#G% zc4h4Ip#e$IwbcXTsD$IC>iCax?n@tZP4;(ex)aF5!MR}7rnjAU-)TR*bBi-W)2o*L z@^>#=@|Ee6wmp8r3~zcqiEZ``qo*gixnk3d)ADc4KGc$ag6P0sFUm~hl(na8p(%L; z*{7V2?V#v6CVEO%$C z9eMpyeWcpDgXa-+z3ng{9sSq@=9NJ0TUc*`-gfA@)aAmd0RZL?ws<^=Tffd<;>bA~ zPAFd{Ei2>#ch?<}eBH*_0^`K%#od zzj2Wh;qPZUJ?8n#=F;1htudSEy5j9fy5m=+La;*4R!>HgY++V9rFyC0s$N#irV>wt zZSjH5k9v&Dkh7X-kZb)dC62$!Poi8w7=MkB(6Mu}OV2C<4@;O=YAi7&{RQvaoz!EqQ)Bj7D;_w~@7m)BwRPkJfr%}dpB_1u- z*w?(Y9?M#W{rRou5Y_QD2y1;E9y)<}zaei<-W8?WP)5I#?+t{8^i3fR$Xn|S%Goo@ zuidx%Q@Ct>i})FV4BiT|tfb-IX-YKS*Bk6dDz@r_Z;9w!-C?TAg z)7I~%w;@K%m;7s{3K4tBjmcw2Y#<4F5$%faaQZI!(BLLz02Rf70>0->~4=1h^yLveJ5=Gjg?*avm8->n)* z!i zte%{NEyKV!HrQb_C2gBZwxx?K81)SY-0*rQWc>cjSL@> z7MZFJ8*)TV2^}vkmoyV4D{y)1jgX8x!b6x#&K{%3pUr&}T0^tkDK-5>K>a5=l-%@b{n*rMS)y9$T;c3k0weK35W+DXnDP?#6O;ppHsN zt&4X^?`N0jw^*AT;GqVAIYstESDcu+70=*o{3OXaXv7q?q%oS=NwiwX1SKW=#k>qdmFUqI8X zIbnnJoyP_9*Ax5Cq%4Ib`{j?H{nDxV3@m}C17~mJG*(izcgXi{=a*iO{VMmcrNSpH z+xeB}lSY4gs#KHp#1E*!J|DChfebz~BwsDXcwdGgkilmb$v2i_yg$Pb$lx=J@nv6Y z4LU4`YkO+BoP6h?xseC&ABoLW64_40%2isqmKb-L!Wt5p2f&IHU>*R6I6$pqo{RUa zAv{rPeGYbKQn35>P>P;ocA;so)3 zicu;o{xgurFV?YS){Z|;Ah6%~*Fr~48BY|MWwntH-+QXvMwi;>zH(w@`I1TW8_^o& zLojS%t1eb^oxpv6$UgC8@*630E6lBBD7>f6kE!@yk!9<*P?! zYf)z|T$&MRkA7mlc|#s5Ozh*`vl`z~CnvcEK&tEbJg?~Vz-m)*j;MsWxe<9H>g>c@ zRfGieH6EG&^xI3DUXK=r@dsgMG%A45*lOSJ8YnJpQ30j6pPwSa_@dY?3Bqd}36p&2 zWenxWpINn{!^KIBL{s;hv z#b<2ePZRn9%U>OP>o$ zzRxyVc3+(0DEvh^ZKITKzq-2aq!t@bsA0SWhi_5|ZeN4a$-z<~sYwn|mI`C>n4FkX zg#2>xvs5oPFV=$AZ48+P_7w*E2S&?tYlKJlR3VkHt%B~j4Efo|I%IDSQk~Si=WI_! zc#C(zcfEpSe8@pF(qCG;TeVDG#_wyO6GUaLh2Q5wF>O&VU}$uJqj3R_Mlgp=#aP~O z{C0uB$uaq84Stg#H zgj>G=Yk+T3{t&mAkAEyD7ypBtAqHr2SC`{MNK=SDODG)57ii)?z}xy1Kk?`F^N;+D zH(w&%pqBLkQWYb{?1qh(rdbCr>x+A{)^%!^d4+fGlzWA56f64*NBu1S3SFBq&~FU* zZHaLx-#>?ohZf>uC^xEg_+~GNGn|ej6}#Zw+G3LspA9t)bHIDFvmd#tv8~HBTFhv{EpJ) z8hnbc-29db^?uc5Wl3PxxFgOgOS%khW>V{oj*PV4Bm$$A(aMsJc&dz!cEo69bhkK7 zDxf#vG7{z+F<-@m@l7ZhEzkv0`o`=^wYnZk+3-B`R7Ts1*X<2HYP~%T9_E6!T62@C zf8$N$;YZ&lyRi+YR7P`;Pc|c%i}xpW9HesbDzX@<4p*bY@f2Vv>((&#A}!knmO!^@%*vnbMrbE20I zFYn2fBRah-9W;DU5808TKE0W*^iPj)8?#b!G8rjX84`7>BZKwrRc_o&Rrtip%tPIwiXlI4xloP3edW9@b6y#ti|01vo7Dk4Tf@VV%E+8I-rV~FvI$sn zZv*kZ5U;3+Ayc>rul0p>|fm0Pc4 zG-iK(E0PqBVK&@1%M65}t`p!;H_w%eX-6Lz7Uy z$?UO6Ya6kFJ2BFlzyaT&p^jIUc-Ucf$#WULu`zKJ;SO6K9Hhu~*5MX(phjC^2(7f@ zdFwF6$KcECxAI8SCsdQX8a%6@M7;PC>ikD3rk$6{F8y#{Th!fmav3jpFN2Qdp70hQ zuM`{k;hUV#U_`e`i3>((pnhyI-b{FqF|dfX#jy_X()wA~;Q5kLqC1CgJ&t>6@rgkC z8Mb{%=hN^{JjetgH(R|Vn;;;zWdCu@yWmD(*sEeS^-_qR23q4xUb7aZ0&~*S1X$^} zRYipauBE`!Mepk{xKZakllb@>#=Rr;bTHP`uSwEqUC?MvaqC^oME?cu#52>3e@3k^ zd9ZB!w)7(5`92C(*n2T~&~AT2npOcwLRD*t#>w9ik**Z>?YB}G#K%ZH&mh~8a{Yu# zIX(j~b4$slXktMeV!Pi-fQNg((Wha{Zh6lMbu$ALWTBdh zpQ+3S>PIoDK2u)QSMsI_J&T}aqmTMZ5mVS%M1X!a&cv789Q>-Ri8)laL^)Wmah3n4 zh)heA%8tu0=a6g-;GYAYc!cDGz3Y!j@^e9QjKo?ZRl7~+rYs@Yd&46%hI9^!dU*}P z&%oU|5B_GtCjkEzZtq<7QNo7e2}3iY^W|zrWF7#|Nde{oa6t+% z4}c3(fO&MkFWZN5+onPE7y@AS)dyQVu^GrQJ0Ioc4H^dpHf#&r2rt;Vn6;*fU|GHI zkZC^fz4A-QVA5@=W*w;VxgWUxlKsX@V8m}73rRhDi1*nDx^soR5o6;ps9tk)xw)>! z5PTh4vnyxev$Jr%N;Hq>C(%PWg>UYLL!McDvx1i@H8PqK>0D=8PQJ5E4tD>!=H@#W znHvrjqJznN|5=LaHRrt({%@sTlexCvUdymCML<-$;* zqdW>j#g2G>k~PtK3yFClsv{;{wfsdUXICx1%))-i{+INlLz7nD`F>-rNjK-p&_or$|{IOALYTY&&v`vZIrrK>Owkz*tBH_2?#BY`W zE*8L$tDL|~QVF=O+)$1*=UGzwoedFWvXlQGG8wL54>gky3!hJW zj)y^!rMilAW~s~rKx`{QjLQ|%a>ce>6-BPtlKXtQGIizwAd%UawmX)Rto9#E3HtbB zscyR7vD8B8bdK;In(Gb$2J6r1w*deOB^#$f z)pHO~MQU$bjav2_$OfGlM z6>>@&AB2V0^Y9P$x30v|x?wK93SWgI7SB)I7bNc0=C-cE(XK&K$}2PLGa0{77>ZCy zdn2}6MEoM75MPVaUya2?Kgg0mLd4rTY5WT;G4y~{lK#?AZX{in_TxoVQEhV89|;47 z%@YH|h1n%nQ|*;Pol77UVq1T~52w>&63?g|(7t`|a*DlII$;w8oqp4pexk4v_)MK| zSVh+n=G{2WA9U1UZggPL<*=}!>f0nh2X6y69XL<<4SR*?dXipgIv9A5LYKvTzJKuo zSnzjW&2Pkk!n)rUAZ~)|x37`+CluOmzffKcas!(T4b)c`Q(aYpFm7cj61}yFNAj{5 zx>{^7E8a*y@O_uXp6w*Fx#n?_$_|px2xRbhr%@AE@eOzf>kZ2MVtfob#8tt~yELns zz(|R^1Y~3VAbN>nzQSNVn617j8|#m|y@^fUx@%k;@xAwWoBqKKr`dxL>Azle|-ck^J}uT25w0T8DE^8mOm z1(@dzJoL_ri_hV`jfjlV>t;DDEXd*2fs=4~Fe~U>PdY|{O*#2aOH`mHs9b^N8vL*P z=v0znBj1(TNQYXRa;UW{9BStU)wU4fQd5)ONM#m6WASX<>T^CvN_7`W*c#rhsLNW%_|@& zzfLNrGzF92jttp4%IWa0KPWy;lDuBClISeFERXM8mi8QD#B1#7+wa&l(^FSZ1JdS{ zZ@&hb)R;8y-3`6ljaTJgyBwyJY3=gzvfD(S=VtDZn}~WcELcfz60BI88&$hzvNv{Y zZft?*p0rEn#wzVx1o2nUex=9VhD4Utqq4`mB*_-DL(VBU-eML`5|PsOREUAJtJhn3O6L7aDH{J0%jmW)j%!HmMz(PV$JpQ!7{VdPLu2w*{1yF3&Atz&W_n>0${xm;KA(!38)SDNHIVL8~_kMtoK4fdT z?p@9l@xG8ZBgB6aTFOUV$bk1gE>n@A>w70d*YtR|h`^j2v(BY(;z)nDG$tuRbfeY8 z#E8FJM3aIfP?{g~LhpY1_}8i~ndz~XkR5P+WJ^9;!**)thB?4R+^82V=S<^%&jsa7 zPev4~lzf=a8{OJHmO0gVvFI$ySu5|nM1dfFBc-baHsto(f=#Iwr?+=r>f+yYp!i*i z&t1=gMjzjzCjeo!rR~#v_{0U(+P0^x^j?_SN~xmX6WeKnxd0JV{*R(lT7bqp0!A|J z{Jm_1(aLx!>*J{6Cpt|+-;K}b6iOG;0pjW`=e-$4y3^X9;!`uSTh(V$nA*-qY7{tK zMdgDO=?1v(a3mVxh-MducG^P@juULj_5U74n*1M6v77P2Y_dMsL-fh;_(T*3(>vui z>e6@n$4Diss^gBY2=)lDBx)Njhb^;UYZdbK+iE6JUGlz}CIF$n1qk&yLN1Ey&5lqK zJP;v&0YbhbIJkvxwm@)=+XzRfP8 zU0q!kJtAdce30&7xAzcj0~hl!aJVrAmKTOXn3}C8M>y=AFTw zcJ4IqP4eDt-j~Vyx-RbP<+bt$42=F!LjaZsSe_%aWO*9O6RKySz>cxI!}}YCg7_^I zHWv@@ySCgsRcN-!&gksbqMq;ECMVZqI0{E(r>2xy8eMxmtm=rEPc@ui%G-!@;C#W2;aL!`y-AyQpK(vk#pOy6OVx39fMI}=cVFmGPtR!#1uVo~;y~{`teIp>#UGt<$t$s7_ z{fhpRaT=#*Ye``q-4f)cx~G9T;64qf*g!^~>|X26o~B{Nb^Z7>17j(;(H>@Jg7p!U zLmv>7DEjN?=Zy@z|9U0g&DI8nLl<2M>x%%26i>o9#B@uDDPu9gD%OYCClXdIVM+~1 zxveKRYg-A2BiSaut95>3390POhmeVXmW0 zLMyozoqr$=UZ+ODqT;<;RAj5V`@MRaUQz-3uT8019)E307%pA!+SGpOP!3aCtcuG~Z{W`SP7^VE*H0CzSXjPmo=b--vg_ z<}ANk7syYrC&*7I@%#VS{InN(X3<_NMV@M+G|6KRLKkc`&0pQV16XacBWEZq)sJ-M zfho~-7CS45`G=YXxuVD%j|O6$ibC^ zt9P(mpieixUK#X7Z@{r$^d`Y82iNAszj0ptSQ`H(mwtZy(s}Xo>Bnz?Yh6UKZo+=! z*GX=I_tf#oA?WZSro&n;ayqPH#t(u>Os2z!^y+XvX6RX}o<#TW9m;;L{%#!1d?UF- ziO}E7NWSY0^KOrKMg3Wo6}H4XQs~DxX_fhe6`dYSxf$*)qZ#;+nYRM>PHt)fyK z8Qi!A4_nz<=NMt8ZK4^p37r$o(D0BG%`dy685~~ZMAM!lnn5R;#TDN8>WYRyS2P5= zq9M=~&EkanJNC0PfS5PUb0$zV#0t0PC$4<0_kR#!(x{K|+et>S2@ zIl7rFh_vO@??Ug0-sM!ktwD4A9ubM^M+`^Nd*$WGsz%VmqtOEdao#6N!>lgbDlupu z05I_|WPn~VUv(mt|&>F|+G+DnF)IB9%uK$U9z31HASd-_IrK5}jy86O{n zVs#yR*j=v1(SdQtmCk6&K*#?Vd+z}sRnh&8-`w5oZZ-ur2}uYb0RmjofCLc`2*nBr z3MeVI0HFph?gjRF*dLYT{eI8P-My*e`+q150UArMn92jH2`+SKTg7FIIJ^B)vq{p?;xUTNIT94|P<8q7&H^1N&^kauIny zJ$`r|fhUxkWj_G7u)B^a4uo>E1r*BVS7>`XVj&!}G-3vN804zZovVVeKcnSE4j`@3 zAMU+y-FscUh~&C5z9Ti;GlS`j!9}=?#OClKg!cjdEVynys}LRv_}wkw?;y;z7_YB6 zeousl06wh+99s)`mx3H(aP!Afs-!y?t{Z+1!nXr|6vj>toadLW1MD)i#gW%AhJ}^K z%q6w(1bpG(h%^~*nl*N*;UI*=5ZZ`!H1)}lSP=`uI<^^zrKp|+ux2)kV5wTOn}KMA z)*SoWvjO@pJ`*lOTlY$gX3V4iz}4rdi93>PDfQNk#Z^+=x ziU*&Cd1skyk#Ay!^%V*f-+-mTRQync#uebFT1oD8y_4+5<1(f-VAI+3CgYNAHKo)a z_{yk8^41>!<&g*M_{KAZ($wOs^j(N8XdZglqv|Kl%dvWTRPFR+O3USG*2~_Fc-$H+ zQ{}d%%pF9@oRQzI=P*x^yCFyPDzr_wpore9>2l9iJKT*57!ecTyA2jhFaml zT>3)fOC^R&M!=Zc_n4H=et;pqLG&Oz7)w3`Cy?PU9PG!-NO>5hCaH7Y7>+$G7+E~& zf-4;{O63{9q|$do{Di_ADns7VXZ6&DIUL!5rVZy9aka{aD1GZ(Dp#$^KZm@mm$GM8 zg2V1W7y>e|?=|qZ5IvBQIBX5Te!Oe41W!!yu2^df^MpfQ=fIU2{>Mn9XaYc4)>^=d zdcm8myjk$(C~q>nUB!#l3FZI~=@RdJ#ZDbT7g_OC2J(f(l1k4GCDM;?=pk?U@yM1t zo8y^HY)i4u0}I-=Pu}ae68TH#S2K>2vMcl=cJ@qf&QS{(;%tDSYRmv6FQ_*}ZB}T2 zaT4J#-B0h@i^76orVMnfI@$yvm#0XkuxgS||R> zfUnZ|bm*(Zb;lv^e4+Om<3KO8{349FbM`WTW#HzJsrRhk5W=*5TNx8n;2iP39FgW7zpxQS7Gz5*+Yb6ksaT-on* z4rIOxdQ|grd~uUmb8K86^TcQ7J~c6q#VE1rTnK7ru7s{@9jzwjIy%P2MbC@VuY<7m zlPK@{6ESS%K75}sG(l8sG+(X6GecdWyl@ZK$}g#*H9ATd`4Xo9N_+v}!#hz_p5^OY zGn97`SBbA=E;a8@3X?z8Q$?9?=`zpzak4@5UBD z!Mv#jP&i_3KAs531@jgFx$;X(pi4`jORJ$v>!M5hqI)Y{ZjTesRLA^??!f^f+75tX zn!>{YqVg+4bz!Ph7h9i_3J9&JlsFne%6YOXX0~{2va%L5;v!1%IOya~j^UiicrO+hg{GQ;~c z&NXC&H`QY-l$0)ZQDt%MV32>5KQaVxvRHmNx|+5gwT+2_PvGPW$0Z@QnI4SqcKF&V zmMc;@EX@Y7(gvDk8Zg8X8)$mgF6ckaKOt*$56mdCQig4X^3r?((TE}oh`##D7dAIU zKEqY_&G1J*1f!5&^4c~jKkKzc8i+C`6c8n(B|526Oy!q+D#mTa#uO+Q)F2z>W1+jm z5pN9DpW6Qu58*hep` z7{`3s3(9gi$SKQA^8%i=AZvkam9d{@kIfELS;Yj^<^YAujjCxt55e}R&bk)N&?otg z9+)$3L>+bN+lld7mK=knIKHOTSgpy%u58&BaeQ5Mn!h^3$^8%I&0+%8^03{olTd=5 zkg7?2#R@{+DlvpOl%*d^tWq_|0Sm5mG8R;W{^l^S#1k+v7^wv>C8;@#c&W}CdTJop zry=v!13y}EN_iS~)C*B{1_r1&u{jdMQD`(R(fWw`4q$*>VLb!Qx`0V|9wCm2JC2AM zOmbstU@~6)3RGgH6^odaIKr8dvtZEZP%3_hg@PGrg}8ttqf=oHMh+ny5RDgOs1paS zSWOHi;rM4719)sLlwA5!K`8aLP|9mOxF5{u>{#3w?fI}ALR2*iWblY;MtW98#;{tn z2%b>7GzG`8v&zWygfd*gF6o)7Xq@cfjIaaITEMB@OlhTJD#*x*K^&Z}p`47|!UJ%& zwOe6Xs9V;8(te?CX^8{#u*kBY6iY8@zJZyc&Y@gr<+V^ZsOYt9>pA2o)Qwr~22ghC z(^!5%0NA0frFUyN(!0d%Atph*xVpDMW6`^dMVD$1Eit&otj5hvm)>42&{}fSXgx!F zW#kR}1qL4Kp3!UAd-QY;luM$l8d908j57>Qxsjo{CVOD`0WM29KeKdSf{_ z34x6KP<|*h4oCJ-KZ~-OGgS&JT;Swbm5Pk)w32l01Qaur5KbZYs*5KayCNU`;4sej zQjl;F3&)iKT{yj19=$@nLOsg6p;->)F`Ng)p5-RP85!xJ3>;6!iC}N}MOaJD!kV!y z_mE}u%R??!XY|j)nrb1q_YGO1mZF?cKX^Yu(i#0i{Xv^^(rhZ20?+82CADb z4J;F&&J~6VTy?IH*(n4tsr1EA0Rsh~OD?^?V3)_Et~Bm5`>6L0@Z9%td1=5StwNzs z#dJ>aU`TTfnjqEc%7zmRgD|i38Urzw#{4+s!3RR8APiUQn#GqOhkXNV)zO5!@jgvK z)DTB{y-KbEunTjr;(eILl70>ky+}U*EY@_XH45Sy%~bM6A@&vy7HdN@ECMPq-%gCl zU52JK7AP5n^#fQGCgfEW=w=eDFv-Um_iD8hC&?d5!eceqCW+?{Rofi$V$VCu3`u&* zQ(-m!q`K-1%n0#GWDDBS8Hr{L>|W$geXrXI zAF@p5_wHfae5KV`*1{%dF%J(*aMCk7cqFZm!$L-;<-lTHEx9To1|PBF&xu*Ji1~w z(9&ev=mK*k%}r)dRhTtl#3gZ<3;CQl&YUDpntaoG6k%LxE_Dzrfq>OdNHFU+ei}3ypcEvjy#gpCimS}6Nu@p&CzDN=Cf%y# zZrz*;x1tfU*qPzs9*Bp(*s}vaJfc!)ndKbpt!*8{j50>`j4z-U*EkI#vD%Ht z!x1XZ#47hbfD|P=iIx{S12o?M%7&vdHQnqhhnA8mtl^XpK`gZdlPawjg?)_GzJJFG zdpSWo3dA9Ag*8Gm+egBc)(&uUn7afV{&!rJ9Hb;C7bUM$=`d?5O>-sNO|>fpXYH^? z_b3RlUko?6OAPm?$Xx;ZQsP80>}q!$w?8mfh@-VPi{q9ss;ezJp6;j24xO?9Gvu>W z!Lh#L3j~vG&*17RV?|d1R7#;yTiIU=R1wOQ^u<{0*N|&fH@v+2P`zIvUlO?4=!U(p zfOag{ukhO0aBwDL8$o(ErS&AJvBmTaIIgDPG^oxMJe>xU7<~l!a$a&pLVbf48*rbs zgFLdM+Y!xX@macTmBjdK{}Phi zEcKp1&%Teb%p0DDzZe(HJ_HwM#3T%3B1&DCR5FMD<`V55-tdpk(-!lpWUETlC==fpUx5I6}MWLox#8 zK}I$g8fw+RHm#j707#@wJX6vvQ0t@tV~c4RTPTb59_V6g6ZpO>t)pHRv^f2Y_bqVRB+d`!FqA0Lq3P07UUh8GH8P+TKt(NC+yw{fjbIXU!0MysFkLtK6` z@SCx1hkon}3NbFF!(!~6DkjdnJr-vw#JH>uiy`53eiRhm=(&Q{rw~*?!c;(?IUv!1 zfIfFX!cjn9IG``#kvGJwuN=_VG0->gabu$WZ+LK1W*%&m2{cY$Dj>h zyUy?a{PPqQnGH`dll!UrQk49SzIVV^=1f)@JD}_+k%J9N||Ih={}Y!^~B;2SzeZET*_c!<(1s3AD#}Q*zeh5v`;hI|MKcuR zNEf8R22sV?2P254FAGi~ZuJ+Y%uP{$706Uk=rrR|x{p;++7xaiI!C{)2%1 zBYp}UdPZ{!OJinla(VcrD2uGQmFjmPy5qbMoA^yYG%EMLy}_bEy8Z%2j{RTpXZRz3kTj5;kyJPso6`S82)n{vT%16h z4fZJqLs$yr_VGaJa}HI9NehkN{)?#w?A>(aJ`$|y+f4{5D+Y`;k^NGVk?S?MKO~gc zwX~0?C=VMJ5=(Q_yhT}Qc?trl5?XALU zuE$x({SW{L$AM`iyi}W(n1;)c^x*;P19T7}FAgZErPM&_rD?ti#R<3)LyMK3;E3g$ z;D{u5v=%PcX}~!I;#AE0Ldi-n8WH4}2x((5t(a7tTWAAG!!%M_Os-^HoQm!D zO0E>NZ2C6UK$5Na(2Qe zi%=+C$;o2{ouNM*O4vjFWn^V!7D9g+Dy@%|{w9h3G)$|e3%)qDfuvy?33W%8YleKE z%2IOS^5jq^s53#G1q7@Gr2*ewfb0c8 z&&~|xB9x0zE(19T@Od>;)bI)V`>Grl$f6^PXxf zA*ivbi7~xri0LUXy+i58)+uEKc&_)Tn6Dz{J4$TGW8f(?wXTOfS)Zdp4(bnMAj9*0 zCu6cwz}r0DXZ2H$`&J;hO9kmL_<;)2sZdYiwxFqOPQ##!rc%*dhHWI{X?1sL+$?@*6veFZ&OKj5c; zp>G)a4?}NgYV9~YG^?tZCRFD1jU5G-YGJhFh@>TRu=r*lzi;r*Nk%`WtVFKF6(Bk# z6oeFj%7Tt?=@V!SF+ybuJo(*c99*^+rew}3X#mS$^U5;tey^_@4+@Hw{7w$VLzaH6 zrN^3!=-_F=;+jy8L|5VN9p-NqlHy-H8{|o1Ej)8o{$CayTQ; zSrBPn+CuBEa)6I$4OKMkUA|V3tEy&L6A%-eUnh*OECaJWk=Rt&q97~ zWquMYPN?AUBL}Ou1Pv9eW(4Opa7O8P2^uO`oopE%d_TmkfNHVH^joraWcq5siY&Rm zn=TH9fKR&VX9RgMf^LPybtJxd%ss@;`U)bYZBk7XuEbK!j%s}>vH0CA)@&ZD+ckyk zl%dC97jhfxBUYvU%U0$$`~!{ zU{$R{wi2KVF<`Ep;?f7FfXho#V_si%p|jENhw^05vKoPwYoRXITmW^mHXYVn|Exe+ z#|XJ@>LTP~shiN_5OS@w8KIXk@ysMD#8_s04xt|&5UQq)Wn{7&#vf=oh<6FEN8K^u z^(aycuP%oHI`behYH}wFnmm>TO|G*LBWF(B3$QQ=E5< z<3G)MjPUP0E7<4BY-C}d!h8qeNh{)Fxmi(J?? z<8(7tHx-nYmuJ+vtFSbs4EIoBX&WoiO*!<^v?HkLou=BMciLWuUK-O%-ifZ$m#!dA z?=xk1kU4cXIwCxVPG}d^2)#-9EEb~Q@&^WHps{G-RBGfNgdht5s=y1Z6^0fv~DQ3Lmc| z$MohHn?F#UYWk9_Z#nAxl0!`Hf5W#><1WaDyEnL14++xY^{?(A(vwY1h<;Z`({+MX z6*!*B%lfK=iSYv7C${1Chw?@b?)bzJ*r{0GRY~9gX7eOC(fz~d7Kt0AbP#TTJr z*xYI)sZ?b(5#Mc?d+|#)Gki&kX*3TvXa@8vU{Y2_a9E=Og9sMkC|M!4;bFC%{v`MV8L<;ZCuYR1xopB27kxfdWX992 zk^qmvqz=Ie862R&DVd@40n?TFzrj?>-xHoLjdjcuM|t9V1qXG;*_>DycWvNe-%t=M z&iHPYQ~n1o*pcJ>{7B?{h08842RK_cDZK`J$7c1{;c(v>gR)UiJOD@pckYSjTr|LG z&^ziPoieUsbXH+HasxE)15QVP_W`f+6a_p>7s57Vzw>eQc{cM`P_PKPk_lPWXw=P> zOhUXhXdqaxhoB7mq8QcIs12ylIk*u+-xo~6*p?`fQ-@^JQ^5+z{02~vxi{$~M&F`? zW72QK<@Y*|F&+G|mn4K8L|i%y;GLH8fA*StOL6F2$#-#K%0yG{!@I{-Mz& zHriY|WrGnW6~c7n7H3i;Ooyc=To5L+SgGyRtkmjarAD7;Gk-0j6g+0GWI7fOqN3E8 zgm`Prm1OVu$y)iPjXo4|#>?^+l%?zLXR=#+GfGzOekMm9!rjm0sYBS4K(0EZ%9%Uu z*l44i+2L@VS#?ROXL33u2(>Der?B*8mZXey`;ZFJ`DqTKmOLyW!bP zuQiP2ccHnGQs~m7$g1?rmE@vJQrdie>xj1#FQT1@Z-i0k*9R-&UVLx2BgZ*&5jvWO*^J49*SvxBWjcU14+F4oaQ%ingEV9;@&_G9w zg*>2pI$|s^e15)N%b&IkpK#A+i5;s9AFVAD)v9B9j_R0*<7Wa|jkGS(vYv6hEYYA& z`3Hk^$s9j~`o67e5AF{1|lct5oZrH$pd}d}rO%q=#hUApu%l zSt3>K4sU{wU(YW2GmT>4AK&#UyAFCeg&7kFZt7D0(6-IUEqhA?>`Os8xt z!sLZ89kDI)M3|1)7I`B~M{J8}AWTPWiv@qEE_m44651Jm+OjjkJ)0$#BxqnEC*?iJ z(dA0YsjZG8I+jN996v>K{1nUaQzYd_{Za3Xkgd7$8$>jAK^Y|ISLFT;fcAbX-V}5L z=Fa0N_EQHlw1FQQqC`QEZ#g0(Pm-tMgt+XjI_lA0BHmu9so!t0Pz6u9|Eww zAxe*F)w0}BX6|#BKO?4ixScvy}N)EM7; zrD%9|4#WjLJ7cRI;n^iP5lK&1u0mw%Ku&XLim%RB2m9imKBVa98{b}EZBBJvAnw&T z`qe#IE7R#Fc_pM$N1tRGoxu!S`|!Qb3PEfv^3R5bd<9>d4L?GjqQOdF?yjcbHYVu4 zqV6hST5>wV8UO{$xQ^Gt%0Bj>ya{)oCl~N9S7Cn;-^)=LO^R8=r?oV zUob&IJko_*n3+i(H|2d+?2UqL{0;)%S&|*4FTA=Jrh^f*U?>ltg`26l)~VK%<^bP= ztMJNFO>aG_Wz&pnW)vbtBoj=nBaolf6t>`DCkrc( z1vAnGvC%&eVOmQGX!M-`Cvpn#?JSCeD$8h9M<+uk{8KQVjTTZjQ8tKBy9F+>z-pVd znVD%XqaG*Y8Gsy+;iMUU6$}c89*#g-4~X9Wgba2rqhS~*019iP%yDOXAHUrL9@te3 z$!Ft~w9i^jq`eT=&u_1Rj*DO474#SR{4L%J>~0L4sNVge?uR4I2a#r^Cz)m?7xpy$ z@^Vp1&%8jHFK;8_Q*cRUp753JQuZTYUiy}PzzFf=!?Cm~^S>awDs%e6jeA(;FuH^& zv&1qdW!(H$Q*E2fhTVXAEZioEOBA~BBHgnPq27|WY9N!{3qrPuc=nzmp4k>+^ZYeJ z3Y9h$c>!JjP=HSmS@o8Jj~#@qSv9&E4m@nr6$m1T9wFW zQLk`LAJm3rP93mM2Q+d9eo(KXL{#WBXTwBNTn!S>(WZ48(h8podKG7%39xT|`j ze0Q#Javk?Y`XIv2XX$eupMmxRx2Ir?5kSS}jda@~fPNl0(idn^FW8xpe)J}aw?Dl; z@mloy>GecCbgT=INwY!xjlPQzhztOZJrs-CG4K^JaH$)-E(RV#aL**&Hxz(@v%rAI zGp%GcK_UG3qDf4%L4F&3mylk1`iY2aPM@sTWXD|XqW4FWgzEW2|qfro~=gbC@aNHt^W+7u7 zx3IYF2{aMqokXv-o_s+n?gTfMb(tiIHYUJ#uBGpHvs~s1*nTv*yzqB6gf2Q-$55r2 zRvn^RqU!Jf8oZKncN`1z0S8JB=z=eYB#{x+80OINW^l6E06Xy7?E5_SzKHLK5r-Q# z5-_$Oe5*GKJK7FA@(e#7K99XRo+6X6sv!FCYKb~29z_v(2+=ouj6|IhkD|z93IH`5 zXmd91Gr$QJ`9_hMk(i0&FjwON7`YHPV2?&*l+yA#!ys11u=U1gk0D7?VF7N{#pf>= zO$0r>FD2xUX9DksBBt1n9u{B9aNtGR$&0X)B-n|5=U2FxLf# z7z)Z*;)0)~Z5;zIwuagEfso8)#8{G)h^&?o?mD2V3qGw&9e}NPWuM`rvGz~ez2w4T zztirqt7&bwNi-GQ`0carfCNwR-`Omd7w z{DXlTAK~Bi_$POYnOziDvw>W!g-AMzc8OOSp|W|0Z2=-q#xl}uAVj9%QB*Wu>Od!o z7MF8krj#9gpG6vHN(AdlsKP!7r4mK;@R~V-S~w8&4BH1Y2DOw7=_rO>HN#!|X#$PC z23A%4glXM~ykZHIBH>LPI!ZpXf#R1RgiD~Zg1h{twFQXpq1_ydcAIM8p9%f&ADS%r z!w87Ez+ej_g5U}nXZJ=7=No1Na~AaFRPImH1eN?NAa4rsUaZf`G0a@W(&4uvc6XE% zUA%asEZu^|j-o^nycb9m!d9Q_Af^#QVzi5%jZTS2S>o~L5Ano{kN;9&ma*~QGZ@h9 zY(Q3JHq?ClM?|xMza0Oi(&hM1JQ(L)g)$2d>&x*RL9y|lz^AqYSL4Oj`19JsZwIc% zm#z7z@nviH?d|Z{(GL8}cHrKAZRfXpJMdvG;JJ|vP@9a^H`0SXwU}kO%9&q22`JZL z9)zoofKPz&vjDoX0JsE1k7++da?GXoLP*V}qbNqsr3vw@Wk}7Xfz;DMs=o@hi5ZbV zJSzTkvmp=h#RV8UZ3S1W7bGf5v0&ao8^h-yZc#jx-mR@*lif&&qB~_=*ATM!jl)XFo3 zH=&;6=||y@v!%kBCrx9VZ*X(Io}6);JbJ`r%^5dLW`&Z}mus9Ei*r5b~+ zRURBu#Rrp+&(u(=%IC(r#|*Vyfok5-spPExK9Y#&bAsq*5h zW1%daPLFsxs5sqWILc-{#sp;QN!qNZ&TPm>ggqJN#ldMYIyihzi@|sYO9^4tF<8Gf z8~Om*Yd?>a6_Te;p0vluqy{DsGyI{vcZU#b8*mGbFdJyN%8W};qaGl1DC*pu@F<*8 zvmS#l(|&|eXc`2?0X|BgtkYwxEPw9m+7~OWtV3{Ex6F9$wPLll5NC!|MP85bheFo? zE`}(=R#ja|!9HX#QhiG5`AFzvesEPUq$KB!ak$!hG4@Uj_WDzHb#hJzC!IUL^z-Zj z9?OtE2iv~ zWWyi6o$H%dAw|J#Mzg&Q8uko1=iCB(?6>T8l`lKzD&K0BYu9sb2C(l=Oi8@fp~(1Z zmRfuX_ErjT<1@Zl3@mTPcu7{9#JeHF+y%SG}j)(12llIF@Ol<#f zr7-j;1At~)&ml(E>&%9N769u7#1$2o)(*P89SVl*!;m3|f@lJ8>@6Q@+)sOJCvb5}>5C1u{jV{7$<;=PNwFf3xyq_MI}{2|-(yIh7rbkcR40 zW&U?GEP(KN|BQx(QgEHgN8Ry_ZnYy->>J&OlnpB{L9V<6X&6PIP=+xI*c@{Z5-<2- zCw}u7#$(_@h-WQBv4KlT42jlABtn{fDPVo{$Xe8M(nh=mNiekFg;GoZ3nKLG?*NqI zFYX$MHO?iek!i?DGWK)61w?<*5RBD{#)l4reslx-V>Yio;8fYSp^6c9puo_K1*`1a z0mB+RHkb5(ubz3dZo=FS{eXr^zN|X{GwZ1^`#tc-6>F{l+IRuBuz@>RHo{TreN5Y^ z_wR#8OB*_D)OE{mA?|cOXoH5TFE}1W00l(RAK*GR@eZaJ27=rj zjpu#I`47y%@oARR+<~+Qj9-aWfDc7`Wkm)Nq{?lrVHnS|9UXoud|5$H_;F<3{tcAL z{%}PC{OERqT}rx};n@g9$wozl@qK5Bum|SaW|)`9F&W{)^cC~n0?KG%`2cSYX9rEc zWX4y7^3G)@AZ#gx}*v}?Q`?U`cTzBFXqB^9QD+$G&cqp*K zpwD0Sfok{Krt1kM)&C70zAG3nxY8?1#XY}~5umj9#Scd^GRc8*h9POut9SqyPQYpA zO1d7t2o@B*GH8a&n6tmA*B1F2f#}xxBDCXt#p&GnYL70SFGbfuzOeSE@+BVRYa{`% z7rL$zW6%sA#(Z^7RQ57TW72hDGH8Zzzg`@3G%;^A8|bb*7cGiMe(h>UYm6|%=ecRh zH4WXh=Lrpe<1~ygWuy_4Xbfo}J6)GV44UE1Zti0>CS4aMgJyV}8*`k-r0c?D&s344UE80WM7RKf;r)3zI=J+{1-w{h}MAgER$Q7X^bYcppqm7#H2O z_yh>!;&0qg7-5D7ww1~R(z3M_53GM80ZAEl(M9UV#Y@w^!h;FSbLOa$~oX)MQ_UPieQgj{Y zsuoGJD$reffm8+l#;uwWX86TehR|1!*UFkhTGnduv>IE?MRe=D654TI<8uSwkTGSg0)6Gu)-5H3%V{A44UDkWPx{;W#+J2 zW72hDGH8Y`aAU3^CKO9|?d4Lf`5Uj+jKEmUO>+`ypjf)D{*ytpXl~4ti3#p>+Z+lo zLJtKT*-z0lbldE68KL`Jhvrn$pwFe-cAv`_-RBBX%Rcus#J8@0gmzs2;&kr%*B)KG z{wcZ+>fh-|T1sC$DE%`CK!v31DpLm022ty0>C!(_W72hDGH8Z>b7P*RG3mN68PsDY z;n|{ZIvdfgbwy~$x{A}eb=4kSTvv*&16^H=q(xWafvzqg0J@^<$`^xX*i#5yU95G5 zUABTr*M-R-2EsASR_*m=KxnN4LOa$$oX)L-_UPg|P;?#W;Bq7_IuH+Za0LOVdvw=c zEj63J@tVyDGdzlUyjE*t9ciF9x-M-nh#90CbG^o->%wHv44>@AypouZgYMdmA_srt zaxlUSuXodIAPwZ8>*CHJ>@tSg!Y;2ubn7x9wBs^~)49u}J-T?AD7p^H(7Hqyz(!3$*G0h~Cbw--Ttf=>65>I*Z_+I2x>zu%+x`c2V*k>ZbX}MX zn&G#Zn1gw(#-!`QWY7$MqG3mN688pLZcw9WM)0lK!m<*cXP>~CBi^inu!ekHw zix_6BI(j`2TH6Dm9os{k&TS9v(Z%gS(RE-CcOz*jEAgPL?jZm@DP50sj5Dre&YOBVi>%wHv4420+Tj}6lAhgy2p&jcWPUqG^dvtLfD7p@Ga37Ku9f$`y*hT5W>D*3r`Ey!8k4RIlR>Qm!EB|22Y}F82ZVO4gE*aA2kp_tb)e`v(7}U9n(YEz zmq9bA7d4!U_mIL|N!OKS2F>vPG1G?{AJ&+3U6>4-;b|^R>mjYqM@YezLp)%yU9k|? zB^JSExP~k~(xi`SOu8;i2F>vD7-oz1`7uPdE(bz8E{8asyByl1i!2JSN7AAJ z@jwGl5P*WA>&h2{nEx|h-)IdysWIugFd5Wsl3=#7#ixMKS_g!7tb;h6TLFJh^n%rY&%PSa=9Bh9|T?^!UwHx=wD^B^{|7|2n= z%!cP;Flj3LZycs>@B$e1OJAq+cONUAb`4FjG{KE+0nc&+0oN=!*Vv{2!HnyK(d zhIq#<_4kU_AHD)={UzzVcns?ARi(cmfPbSuT7pY|47RVoU#Pz@g%Q5oR{*h{dEbM)XG*^heU>`iqlj{Z*NABf`!+Sb%)dm%9=0 z<<$y-8$JT}f|W-iklN}EpM|g5g~}F9gZqSEgRbHmNzDdq8kc>-*hlW{6Q)<~6TTBH zxlb6|#=TK&B3D~SZvwQ%K4Fsl%|2n_YBrFI+9!2VE#a|!!i+Q<2vPflu}hq4 zp%cZXckUA=oA^Fq&6Eg|f3;5-n}xYgn31wim|?X~7@NDvkd9*5RWp=*!osaVu-Bjh zai8#A$Sd{6c_m7 zR5;R%Q4HEfu8zJ9nphV9pCnl6N>K3;QDf;Uv8to*s05iVPPIw$@>`|pe<-gI!>faJ=XG(&W$_Qt#+y8IHt zxW>Dk)%cT8j6bn;u=RMiC7p~vJEZd(j5md{2j}>+*M+xXt|J7pE6QF0{GhMkm8{kOfpk`P*wgAp_|*AV?DO_8>MeW;&ubl=qEbz892Reya~L__#}cOC*wCtB`a0iry$(>r0W~@wNGWd=-)n#z$>RcJIp>k4m^Xv znGcT~VV@ZTB5Uz<&x(QlxMic!SK}m|?6=QmT%;4aCFdxyG1_$$*cbglMB;Bih-Z?x z8#IA48WY)@Wm{{(19p(C#~Lsh!_2b(fKw#!c%#qm;tt6qbq?xBOp1tvQ~BVI z`@h7s-v)1NWhcyR_)y2twa=xjnNj+2`veUe^H(wOg2@sr_N_XPvaC9vzqzZDI6eZ3 zxUsqGTVl^mAa~W}6Iiv(m4u=$WBSy(F1MtUy1d7924rcS9-$ql7pHTl_xE%OZKg+P z$LYoC-05{hhXOs>!~H@t5L8 zFCZ6n@f4+d(7-bg*~HfWViI_)Tr_&JM%IlUOq19J@Z=slN-V@l@1yzwiLx&tTj2d0 zoMe6_9)8328q=}+_I;O46$QY;z7!N5`!f8F7zzZBeL1{6b4q$?Uv5dZ_TfO3_H`Y@ zGtlV?ja}HkrYH23A-oe=;v9^Du_WmMW966%nWePA#U)D`!Hv5;j$4jKS@Xr!OKszF zZbQB<+}t*CA%o0=)E;|>*_djaw&HB0!jx;1n!(9aP0*|{D3=t|!r2#e_0|YF0o;f| z*Xoa7s}H?d5;N>m^gBxKymR0!aWZju*^xL9g=*`}E{!qOEt6G~Qw-~ZJZ2P2Or@oz z`>-6+N~%5MsTLlmlf-u0c#<>9s{Ripi8({dBw?dh(B!xWd=paL1^e>Y>i{Z(0nxSB zGmz;D*jECQU6xRQn_gh1L7y_j4S*^`EIwKrxOEk2@xZ)kUkzWBV>%P{gsxSNj7O-Y zD2II-8vT?0_z(^6y}L(+9&01`$k-9@;z8aIq&}#=r|XZlo~p-OafEYT4# zBMiK+17LUoygEUgQW=d56!~!?fl#=NSXE*w9u>t@vi4jtl1O|`g` zf_w2{8X1YGi``i{npIg&Dci2IreCZ{)j6Ev6mEsxxjFbTf!Zu7kIO0Bp#lZ3WUjwHh@)UV0RB#hmq@WZD z4CIk+|+jj!&vF~D}eK&q_ z3m(k)9{B97`021|u%^JeTeSrDf=t>iECXse*qb}e5#`Y7_f`qp_W@*pVZF#VisovdxzETjTf`Rl4xkK8r`+CVb~1i0*~QZZoH zTkwW%*}e7y$VQ#levnSQ$BS~(t=jL%Lx_rU;*AY^QWc8R^mO!L#PEz{1LyQ!yPmBW zg4QH>Xj@+6SJc(d#I}fHACCw;8Lav*MP|Nors zl-Z+k%7}N32%B1xX#ZULk(=L z=ZIyEPq(gyK6NbX%08)EY$sLcqu4VmND!TVFU?*LP*hvzvs{A&ot*8Ely%XN;~dDo zH!{nLGtsQ=kP6o~LLCbS;Zk(T5wYD7L($Gk##*)eaYl6*Kwt*p9{R+Y)u~50RgYk% zC#rQEw8QQ(5U(IZliqBsh2Be=YQ<_PyU2n`(zsN|_93$Wo$z5Hu%fBz!bK$Mzt|8y+|F2QQ;V z-w1S!DARZ^vPQz}7`*ml$e+7U@Y;_Hq(yh&wVwdkep2FEbO$=_DT!;@9r*CphOuDu<-m$OjkI|m5v#3f zJws8S#Sfm8-w!uKJqItYJF}lBoIOUWKVZKAR~OepJ%m^od65`9@PiL@(gaipOYnfs zg2i{?;;2Mi9F?f=L6g~+63@w}-+qbYKIy{>^!n3C}BNTOXMXpIdV79`Dzx1 zu0gDf^Mrp6clYe+%X+!Xz)Afk&y_!K=0i9}vU>}rAp zZoh$`!oyNypwV{^aoz+FOO0>AQG6AKI~#8!&XL!L8e$y-LQL;O6UZ08Lw*mJf6&** z(3hvUvl-b6Jz7Trci4-Jv5tkeIMow=9?Ri!lDIG-Gx`O!+rVGB-)6)nqAEamv57rG zeLyAa<_c9ueFPriKgnny%Ar{lGQ1@0DQ+t&8PM=PZAO(dYFe97r$LNxb@M1~2gti= zVE2donGIaYE?#6dPz6Qk1!CDM!lalt?rAJVhmDctEY<84**w;qY2#RBhE6j!oC~6$;lVAEJNsm=QPC%=o3rX4cuZQ~; z?J*@YHL?{EysyU-B`rq(QQ;)yMbllP!czN3V7E8}?z2l!ymkX84+g7zI%~Cq!tB*b!l{N$QM@~gGsVzJ)4o!VBx7r>b^-E*L30Ig_AM4|L=6jTPSV8 zArR5E7~R0IT9J;_fhU_if*O656eFel%;e##{>nwA$c|hvJ>t3kZw~TXB9sUZ3=W<^$x1x+8=?j zDUgdTCs6#RfZU@KWybVEJw6|Dab6bct$d`HH3**z6UB?xwl4B9xa#$LB4*j20HBC) zQ{Xo04CCdXje(&C+ZZ3j4~ru&wD}|8^3QBI6p6!V8>Z0hW;Pr~H$%Zy$Sy;X<1Qyb zwTB>}vGM6}DzL3;qzY3Pzcy0dg@ltHTA47^JiKy%U{MafDzoBA$nJ&I@acsy=%L*0 zvM2VQrdl^G9^ffLmlY*XJd8kAxO|Z=n%ou(tHQguhZ$MPk8Wh%EYV!(tDk3S9t7jp zAr()fw4*%Z>=BWR@a@4Bb0TBd{v^o#c;7OAQgW&e4ra@Me76@*%PF{U)f}X}a~|q} z+JiNYML3r~fCV?-jtDO9rosqhaaTM5q&Wcb0MN++hzEeq4nRBrgdBi)07!QL;sGGT z0f+}1>^LgGecm)^WCFR9STj&dE|U_+r8>PQIG4uCzV@S)Eg;9f7H2ma{+Ym+C^#oK8veP!!-NYPne){3S$75hwv`V#wl^nwrevnFW#o7r z$sDzc#B4t{y8@muW(Zb+V$&)G!Ruwe0u?uRRThIsL{=hI>kFu~{tj?hEl?!+B_IW(J$XY+!^q5(=h1=%r5XogF;b$ROUOsFx6Sqr&5pS2mX3^}#O}rX$vr|~VBAmQ)mK2c>DJD&UgVUQXZ;9uRe<&pZ@MI}>fBlgnptlCJ-H?_8A zc5S#QZ&75H9j=={vncO~+HhpPy?E4+l0p2hC~y4Iy85Nz+EI&Zm)3`C>WcCXT{^RF z{;Y|$%ct85YZs52xz9c|d(YZ?=-}aHLuv;N8{VgNVoMj-&tFvQq&}^-9+@!$_{YCP z$L`1fZ+xxq*Ps48{!bf%k zpDW~VCVpSRzjMK}z{c>d)(9JQMvbxDh!_KnS%z&aGL|45!G9&jO!yWdo_{56qb~tz z*qCq3HRfRlaGWI7XBgvJlhh%F8e=vH7K4PThXDyAm0C%&Mxb#vZ>1VWe%oy3f-sKw zPG?*m+dkqk$dzrJASu=&{bP`~OruqnKEXK2mg9#s8(lmpk#Bgh%+Cl#Pjj$0fx~l0Oh4X=Z6^6jB&Prr(SrXyTczbbu*sd#?ap(bY3mv?t7FsrV=A5!&dk?Ld zT{d(`ZQ0)4ju|qmE?m60W>IZqNzJU<5gjI2GUfQ%a9z#vNWVQpGmIYS`(RyrhF&t> zUbLi!8<8;*otj`wo-u#%Z2N@BxSB|9Jg<9P8(ZeJ`wY{Vc4)XZQoFdmrXCf0ydC~O z!uLpzQQ_u$Kp5&g!45C{KOl7Ge#Y>5_4P|e3>+AlHLrG2O{8Q|%qC{piw2%BfAO4U z14{=D8ai-U&7!)2OI#WBU`%fs9w^gmOxA5t1(5zXX}tmRm%pIFRYfm(=#aQxX5TGWYhe-~;@xq_D{|wh4PiuWb5~cVQb%UeA`@ zMt;i9Cf|5e%37qGpYlvRK!S&xfbevaZ}8xfA$t#omXlv@N*rD?c-TJhr@qwWA5sO3LQAxsZX&n#|Htt0_P2@}|JF+PQXZ+0a1)n(~7eH+jd|b+dan z_004e;FLPOc3J({y7_Y#FG2?MQ~X9Or(XP-y`I8K%Kt5$LAOH+|3PQdqr*-EE6CNQ z|A1S`ezg&lLVkx#H4?h5p)`^~9V0uPA-b(4%TZ(J)&Eb&6(3prPsjED^^PlZc*3H8 zQX%7AUgrM3*;1YUH)>#u^yc&!S$Ayl&us{tMy5hJbhX5t~8CNrFp(5bm zA+fE&L!ur$$ml>19(=6_5B}DJhyH9Gdv%<9%x`-8FVY5r= zZ|4*M* z-4E#&i_O#y4yXTe2B|%<(g8>cCbo-f!&6}wOC$MMTtdrnL5mTrdzjrbErDeILu+Pp z;*gKm=|F)2^)XEx4eNP~iSev%2h&X>#cgk>1yTdJGPfs#*}ty=gINO#JFF$K#R$}Z zx%U5<{QoT`|3#yb-}RoRj5?J1F-z7xXLWmDG8{8NIG~yUSsZhW6jz+wGZ+XL!y%clFvXhZUuq6@1J8X|GM^ zp8T&f&U)_8j~f29@Qnw5`~1bmd)^%V#mzr$xa%eV_CU&|2bCSR_v(}z#_bjQ@Z_hT zc{`xyx%lqqt`h0`B^hRF%B&@j_rTq=dT*8 zH~fADK8aUf+^b8%#tV$RjM_8yGv@7U-2BoJXYFrP3^Fq3OnhRv@m8@h=-?T14l-`P z*Vw+JbMl==AjKGT*cqn|z_)GV*k}6mS!SGag^_u{k26O8r|{O!U*NOYvMcT!xh;SA z{%fiO#mD()%qZE*+Hr7pVdl^pvu53xlE;=`(Y18VkWL@|^nzh*yr2tm`_t}aJJN35 zv191DThopy{`wJLQ}3BGKWY5zrJI(Z;6AEf^>Sm;z`Jr+@9SH=sBu%@@4WMlPTsim zx3lNm*=fu@#>TJSneo#S>Sq6I&foU-+n;^<>01+?7*}2M+>B`B+{cdDK4W*?e^-tC z>$hJ%eE8%1HKj+bInew2hmXDR^Q6t)U%D{ql$q~+e%^t9-J9I>SC3bFKXLHPZ50KX zpB$Ec+`0R$Tl-V#=H6$HyKumheP3ys{qYAye|koLu(xshg3$>L7ZhKA)GW`h6Z?0r zsNeoEZ0g4c>_=a-0-n|LPX6en6Pms+-+kc5zQ*b~2VZ!cVH~|*e#!Lb?kay8t@C~x z*A(17w%gB-<`ixBb$>MRy+@P(I(FzOpWckDBPjGA8WoRKi|tcpJ82C}a> z_4i(n9^_3wJ3sH)GcphBJ@JCQ4;no6tm%1&AJpT=QDJlV=|>)L{{{O#W0aos*J%$P zIQZf!P3-t;y5Z%-QP zJz-p4&0b>hnhWc^LycH=Hs4iGA|Z&m3Rcf7|)y!FOCc{gw1r4tQnp)IMJo-LQVhLAiY{diI^! z3-9y~zqlx`@R?IT-SFw-pO$^v?bBXARtGoC9CO^Yzfb$vn)=*=30*(y{MnGte6^RC zjy?Qe>!!Yc{Wa4=d!JV|?v`t|PQC50)347MvUJ_>7f;SQc;e<;HeK>+?!4@Izsc;)%84*c@6FFik>kdk^@my@49W3JV8eU3k8Zr2lXZo7QabzNUQ zyX(`_2kkTXo6EnrqSF=j;S~j23s!cy;JM%>6E5j@Nw?57QOX=!^@_9azoN;vjT;XAW?Hvtb8p!9`qOWmd%Zoq{MuEOyU+AhK0fL3 zDdVp_Y~vlreDdH^dC9Z7-nFc#*TU4BPFuQW?Eb!%{!cDH?)NL}CntSjZMp2HRcGzW{C>d41G-%|WYV_5wMQOeEoX$n|R3AhkUng>LJ^%8*tsellGnT^ouXNxaq|=uGoA1sKIZR zezE?G^>42K;ND}amQ@vPy?*O`wFlq%Y1MU=-)((x@u^kAD>qjhUUk%62i&sZmcDO1 zaLWT*LR+>?zG(7ISG_U!@!S8i_1UdA+}ri`&))LAd+XLkTcb5|XJ*g6_sLry|L&rP zE{fhCJ!khQf9mOPr`^<}s>iCx-Qmm;M~v9DZpW41l}Dfa`O>cj&aHT<^Gk1)eX=#< z`2kPN-!N_cs|U`_p1Un_@=s@+edffIo-es3{0!r_MO7 z{M;pHROG%q__DoEc=^5Ykq`F!W4}xH+qHh~;3>mzE1s}-!RQ-H7L0snpZka0U;b3d zoXQtouh>v=aNWf2!%GTo9lE&g;Sc`$_NUW7-tckqCk@$`4}9jRCCjhb@z~F&Zppf# zB)w?FrDGyFP`R61(JLxWGg@PhM?8+T)` zLoV7n_v^Wz&pH12n`=+Kv+>ErXWu(;uS@*TF1+jfn-eRGgImX4_vQ2|>&*iHopWnv z%z5O+GoKrN=}lJ^zWD76cRly+`TJb?{nbt1razYc(S=(#pEhwuagU16AG&$L@HaWW-+jYP zPi&k0(wtZ3eD(RR;;X9DF1_)x&o4_`oci`Vcc*@E#NFTi^6UQZ4!rC|>)i)V-a3BU zzaANR--ESVp55`{zU9-eo&NLmKc)};?v?lNsd@AF#V>!?t>M96hy45XcdH-#ZTIMB zAAa}ngu@Scea`E(e;)kjUB8vzdghH^{eJ16i;lWw@}lFuecJPiXScsk+SWI>z4m&K zS4K^rdfpp_-yE3sbkBzyH++9Waq7_2!_T?$sgL_C*>Cx$U;UQ!!Ebw|j(F$zwGB6a zmeYfJFdm85a_Eop5 z_Sy0N&krsCPgc_#uU|EM)cX(pw8H-F$=`nYAnW~A;r_dKJpaJ|V(&fRvaJ69|8uVE z25xTI;6jue#0|)DCW_($aRY7*1r!(}sJmEO%O3Dq8MQnz<@-ECzI}fG@Au+yzd6tIK6_o~8s}VJ45@T|)z;Qqd)$e-*6@qy(-S^x z(B;vo6E{wc?zer&+}npwHM?s+e(b?VQ-7G^8f`aa)|9<@&UxR>u3f)Qov#~YKD_*3 zN%Xj-qj^bRDb@b&%Qf;;PA}D^IpI8`m}8WMlO1IW&3xf-}y5Cdzkh!@BA!n%ONm?m|KRbr2XPAE z_kOW4&DTP2JMP}S`*VlHgpIIwgymn(I{f`xON`R+cYdb7ngg@hY^Uq=#D^XV{Ivs_ z_eYDFivP>ubK{1Mo38#c1n7cbM_q0M^hbZG|9A6W&P0&}c%ggHt*^gw#0(!kA~=2E zz~|xVSAz#K@9g2>@zVIb3F(z9SDpqg`&R=0SKR*P7El;Tl`2)|ojrTz2P6_V`{?_z zVlQg!heG{t{I|oQ`IPaY+uOcRaZ}9I)z!}5-ya_{#R&E^YJt_< z@+M5E_r-}5p?f~rldyf;wks%%y+|3IE%u-=uKiIe;hvg0Jx~1t?hoL133jtOb?iWy zrY>*{On33mF|Af_qO@)!w)GV)PE@xTc4H!cX#)Cv9T>WpvLWwAOHLY z+|0#q1zJe=MvbCN?%A`uB*J*qASx>R%<0p2T+lM=JyWj)&OndWuV42qbZ;Q+mB@Uo zqoZS5i?}%N5+zDHe)IL$clPYrb1f_^%pJPfD1_Ia7QfBzk48{L^u$>J?h871>bME^ z9p7EE<^=K6j&HvC=0@+7DeA1O`G=WzDt)b-Tvd~3>RO2{q+rGem9!%MA%GxXZ338;{~Ci zVeU^0kV)vK4h#E?%Is&n2b5`@@ev{Hhfx-LL-r-dqd}*keKL;j6A>~c3sUff9d77_&B=6b&Nwk%a$!o#i(B# z{@X`KNB`*w)SoVZGiT0R+q`MhS9udA)-LrM1I&X54<2pWwDHuO*|Sgm^wUpoA@lD% zE#*J{_{04dUVN!8M)&eKz1gE5m!3Ok&XL=QCT} zYu2m@KX&XWO?pnMur{n)x3(VU9CyG+j~zQUJ1Z;mL0pTtvc;T=*}e15>QfKyKX{ax zmE{TjA6~8fnF9Fyi<2j>HEY%^KqcUbe{^16uwedYI3>|3jV3-c8+_^k-9ac)@uM;0 z#=(OJqVWF_e!HMMf&T*CqRrg7b7+RRT@@k~lQ>1q zMq*a}ZcP6HB{E+oAfUp6@Q83voK~+^$bQw#hoQ){movis|+xJRJ`@c8ai>%%L|Kkd)zrP&!pI+4z;JCj) z52N+K|3&MYu*%lgLkj#WhPB0o>)!+L-oF`}Tx6%BYeg1dJ;C2uqGVepfMv;Qxw9sU zaj$KUB~$5rW<4yrG%CPxPl1jlIaq3p1Sj&vnK(v+_|I~^myWd>VWdF1kP4;R<6E9g(E1DdBy`stdudiq_s})VWa;eCQ zCP%fR$?}^knk-MQXevg9@QW2q#ng(X-^#Uvk-q@kQv1acZ+|0Q<&9(nIAU#7;ff|& zzHV<>UbwDAt+S4xmDa{O>ql4?Lh}vZVou^w;j$3iNO$4-ZkN(4JBgO4qY51k7s#4w zsdi`}|2_BciB;aV1=~%VM)c~Lf(6@dZyGDOn>Gz?LVp1cZxl#c`~Ad9amU^0Xd&om z#^RG9xF<<>^8aXC4ZlBJepQR+4*$YBJ^1>+Z7Ym@MgD(yZYr|s>hYo|@pw@bo*&rJ zGR#mkdZ+0H_N{0ui!}cNwTS>4N5K>0pJhscsY7NG2EYKJ5$(}xMG=2cRcy|Gkq`le_~6UfA1~>|KSaC{%^oA28{o}7Byunq1FG170144 zywe{FOMFshpOkFc=)@PhY8`th%xyBUElp2RYI@m5 zbR)6e@4Hp2>DvsebCdLBgYh_gAA&60$i}u&j<1W0_y{R7c8}@k>*87jJNY`h z5!&-^IURkS-5*mYUl$MBN$0Uo&m!2#*U9VgK0Cfn#f7Or*hLRa8<^?qT!O&9b?@F; zDcQcoOH!6xj4Z{arl-Ur{l4Z>#<*OzEVyBhCPRYGIfK&2^k3^)E{2=*w@ zF|gQ|lH!G^as}A2q1T|S#MG=oNonn~hZ$Qub$&$KC$TdJI1`sJqtFDlB|3WaDAp8^ zceeksfHr`@$mCB01Z_rvHQnVO6b#oc6_me^e-{hN|BQbZ3TRz7Cinp!CgFreN25>@ znrrNT$V^XXpK7pRHiVdcSsl_zAK38v!T(P`dl<5|}f@I1FJS>iq>HLC{ z(qz7VQku@6NSCGu-=|1Z?ISPB!*B22C9bD-)(%g<_?8$q{v|ohZhS=c!+l5GqmsTH zAWiYFHpNGR-ws!%ofWQ$_GD*w> z`UogqOt^*y*9@;6S}QOlxOQmmh&mM?1<+M$Sa5ia8Z{nUIyehG@u3KQzCgzbBf!~3 zI4F;83j&;7g@f`=wc8l3ots?WFKUYOLbS7@WOv`X zcgzdTe4|WPcRVlchWH=Jd17t!>in4a|k?Y6pka4pU7N`^ARv$bk*-cw@jY zx_?1i1(KosTj<=EaJhv>92OiwUH8d*8%4M0Fxov@UC%&K2=PGncwicD3`|b1?GsMZYl)-gLyy>C@|sXd znqtStV2ffhU0>2e93@k~PX`Ip!h<;f6cfc!Vj(y}1A{_?L$Tj)N>E4$ zwrLC~=_K53x{zS*w-LW6&FC7o!uoY*FH+Q`R2`Wv_|^CnkAVjBODzb)51)PM9P;FS zvBDdx>b6~&aof&lh15O^TOplW-oPB;8XDuR-`O9A?yo(b7TEpO6FJWw_F&}HY?lt$ zo#XLI`_NNWJWGgu=oXXJJT*HWyHa9Wl!`4pfB&?K#Qnx;l`>03Mf+#f2&6yW;s&;u zXa_i!7J6{48W_>3=Na=0oM9iIY>k~Ni)`)nghL7(Gv@$jOrRU5^iIM)(ePdDtZgH( zqBmAdIwpatZfdH!`7Nia=uJpDw)XjN-^ZFRed$p9Shw(Rbe8Zd{H%?!9dd8%qC5y& zE@z8q?AQF{=F;R)`h2|1IwEA0)po^X#a2cc12cKMUUDIB;Dycq`f{Lk5p<|>IPp{a zSu^M6ynC=(gYBc6|MYR-q1Jmc8xQ-o^{q{}9`>H_!1DG9yEUWN`eeBzhp#;6RcF4} z+jZaUaw=wI-ANfs5X^F1#i!s$uP9Z<|8*#5eAQCm+jM-4!&Li4n3}2#DlZQ?x$dvPbB^i$cc3HGt>g<8q5+4MjZ>DV`%w#81xKH70`NBeoxQSYw> z)QT%QO?2cf#@ix*QZb?p?+4xwarQ!-N!X>Ew%?u#WgCi$_Tw&0Ts$}tiAceg+qAiN zCNypEpSBjy#s=R{Hm6@_g9eW|ze(`7x8E|OyJ7Y6{+I&9qS6&;!UC}mWWIhHRHyW;KL;Mu( zHK|Bw8X_^eAti(~nPN7gtNrJrGxFOK)l1%Q!gJK0_uLL?Fg^~@6amnu0jSU8LlUCR zZ+CYZ41PI4{P7U55`oIrxVzCiwa*~q6k;7PC@b6AGsT*QO%qd+VZwIXDc0=1Db@i= z8El&sXiZ8_w)RR&w+>8C8&<^eK->}wmi0RhNHabaVI7o(AhHKqQ*oaxH7PB1xDisX zCt^fE=>s{=^g(H9!SdM{+*R&J4@fbYv8JS@(8kbNkK@B`<*CUjR$P~1H`9SgS*G>r zJ_cr5ar4HC*ywuz*5uSo1e!K1Sh~lg4@PQ|k)2+A;tZB`u{$d5fzDaWf;*ULM{;XM z;qIA~0F};^0U6oDtO(vnaAYg&44P#flA7H&HJytpi+rk33jOs>8f@gAmHktOS^aS$ z_YamG+8fbv7Ab}&T^3DDW%g1f&{~*UScH!9uVPe)@$C&O?80CdEJG90vj$~ga*&N$ z$i#N))^sG)h!#~s1yiKrvA2A%tYk|Iw*yW|VO&X%_jL`H)ry84pVa4fL#?2bWuegwM!U!iwzj5L$&Ck151B*;vaMPChDBDeEMFL+VMEnu3meJdtzPAHS?CH; zV!!<-T(!fK`;_00h8qJVm-gxpw05O>v!bfH`cp`Zfd&qtCz?E^qfP}oYZBOKp2-98 z^%S%$c)>k?q`gF8ss^W~455nUoB#B#wh+%@nE9`t_o?|<;k?hcM)Int?=7eIKFp{{ zd1#1V9)44BPOSIj=>PPAx(NnI;|nS+G1AgkTZ}KLP+(DolQWtT_4%DS$8QDF3xU*r zGLQtsmWuOKFH!h0li%_@1D<74VSN>8r@_|t*k;{2D1%#bk~KMHa7r3IMYAUL>V>;a z+18}&x>ohch9N_S{NigC7=^Q{+x%ovCoj^}vy*ydTic`aP(NssmV)nsShF+H8~Wh> zwG|&ZfW3^RQBjTWupLxnlt{=-wYI0PXrO&7@0mzlQZmNDJ}ES4_*2UKt^BEt6l!_> zG2i~LZ+C@@Mb-7j^$v??E!x*|5w*X`uUXbKjB{V-e5&U$YKyVEqaJ?s@gWatlhxWq zhwVJlGkU%$yv;VW$+wVS+W5XSel%|zkKZnshu}wt1x(i%$@tC1kIvd&P0=!G4&4S* z3*-7CjUAUNRJ2Evq83V18=4{GImzE^{ay&b+5(}bVOl_+7BXf9ZF3 z?8J4F{0pBA$>(F$FMZ-`??Res(C?j+lC4ZQ1OHEq2rd+D|J1aByyQh zC^af&jyAJ2jMz9f%P6b?FdCM_k}{K(B^d=R!27QsZ;(bl)ObT_{s6u5#+GgM8epPT zIDd=u$9Jjxttsif2GaBYNdJWRra`s+8`O8U)Wci}i_b8A!+m;IB#*nl`HiEjl%&jF zeXG-aHm&-Qtm>E}XICE_>Th_iJ2WfR766@6hJ^F?gYa%(X!VXQ<9NhR3QA2ko@zh# zmHfxP{E=42dbSUI)VG|g7DSa6E#?&$kS1H3V&E?Ap zy7~x&0$UO%59$TKG}WUo2;r3qniAt|Mm`5%UXQacP2cg^A*=cxl66QXxk|U<%se2K zzmH_?ojGtok?a(?^A=pMx-H{eAdL`DGHtt!GirTxGRIjvcyMZFHlAIhy0ZHQr>A6B zXNRbJ)ZMRkYp!Q#3xlD8#w#G%gYa5Ra!P&FUcKr?_^}!Q zZW|6lIb!Z?%%#!XP<|XRUgAkDItk)z9UkSu?COLj!c2ZjX(0bK>VMG2Ndo;o+Vqry>s7v$yNdIOj z1My`yx`x2pG#T`E4HCdzkJ~naajcinu6{!Mde!ld!-Y*u7G46$7=#ow%uGqD-y2sT zDfO!V!uGM__JtQ>^|LbvvBSqUg|2AchKruUv?3B^6O-P1U}40MZRzr~eml&~I-upo zCG|{6%R*HfVX#hx3m=6UtDn*5;=x zJE~}lWFrojQG+n6d|VJl(fr!JFeA3?Jy9TkqLdn@WTJZi$#QBKSXfg3RRvSnd@%6+ zV=d_asrK{N3hMW}827yDNwyvq+%F@gPlG;@G?@LP-38Z&@iZ#f`rH5DaFW<0uu;dr zxWKrEzu7LrYyG#3D>!TQ?w#7}&leUoh+4ln<{Awm8RM=oxp~Tvn-Q7an{%HOX=^wC zEu}$ok--2j(JwFlYGfiW(eRJx<+0$5`>tj#+q7EBkNeg@gFVGh(}r_!|{dqzBo8 ztDce`l+eEV2uz!)YhiLds``lG0|ySkzX7S~aY@8v7?@6mq@l_N2G}$}@nW_cIl}lK zkD0SE2gFmA$Ps;w52_kAm@Gz)NW#TM3(Ok->1KhCK;!ZW--_+?uNCKzl%82?T8`^! zGOLdje?;vd0a9)YWE(H9U01|Y`PW+XCr-JE+Y~{ zAD)TOqY-0#$80|mxnWR`WFkixm$uoB2BoGYCmK(%jJUFlPx?lVPzJ-6rtsVh{^@FI zgbJa{+CQumzF_&?>t+gyK5g_*XDNE%fS!0qoG<$S4cTfnuzzY&kN=j;71oz=A@y&_ z9tGGVi7(6k+bZwhmdD3c_&=0WTfG$CLa0~0@Lr0#ZDM0}W5vce9gvg99@Nbjw&0r~ zv;}RW_OW>V2KTmc&}zoP^r`vqknqqtWMhY?3wTr@r6~Wr5G(ONWRDQ#vGfO(okcEA zeImuxAlN0e7klnXf$y7&^34)r8sq;7@SQH;Mri|kl4Bfrr0LdS&W37^zJQ-Agwr0l z6ni@edhXH=&sVnK9j@8<(Hm6P!6Wd07d(tKI^?XN)Ei#yH~&I7hFyO2$F7qY1Vvx{itLZS6x`$4d` z7h_ny09it8beV@0W_w}w7I$4vx|9=suFkIILgw3D0 zu5i4_cjU28amw$V z62jSDlqz+vq`#K0)JLUUM3d4Vm9mIqrOEwiZz_j}-jtV(WmcB4hyy-kv#spv zvKDc(?3a-CzT`5(_sg;_Vy<;J%&q*$rVGo@AuEb9<=x7=h>_*Ver0(p;<`}&1Z+G4 zD9k|tT>>m(R=|`158+nfE@bse0*edsE0fuy3gxajq`kv^G7m@s?5Y>SvXo9s8TJjU`i zOQ$(xUx8&5%PuUl=hT>LFDA~RT6h!EA~vx7L6!w`uFmPAdCsMrHk#`{7bOo_Rpdb0 zi)nMo{ffC%oBQWd315cUL-@?Qi*_<_-e#v2V$3}9yJjBw-3uGESV#}?)4biN9sl{e z(FU5#zgN;;^q5cWvjo`ftXZZDz{z;!XnK$g$2>;Y*JFD|B%U%QxE z`?EbQYA<=(VQe7-qISnDKTS+1N zuOgc$^b~v1X7!u(T|}qV6ie1>8hNI!rV@A)(qFv0nqvF{5@YW>OVb8QqlFB7_v##f zQR+R5TUF8Gy$0`L$<$hEQNAq0Sx#9?hH(a?pW(0F0yo7$31#ohejUa+jW%d z&Fd-ruhvr@Z>{gpXs@WT0oyv8D6YNSCjG^t4ILU`RM|-BX~8m^^D?AG{0JL=5xm)Jv%eU|feSaxTjakQUK+ z8}+sJ+o-IjY`Z$gTddqhwYH6IK8M*wT-&xAqnX%F=Q6MDG2GVW&_61%0x{O?WZ|iEd1OOd)vDlyt#NVR)B>C|XfJrg)}Wc)gZ%{g@)f zD5l{|4e{>PT<}DYKuTUhmfge~tcw;e3u$!|t3hRoN!v|yNjhIQucT+Kw zb(dKeqv#$}EYG^!gp)>jkHrFDDwpzFORa)vCzdm1Dq6*%j0HJDw+1P46O$CJ<@n|y z6hG)TaLU$bl(Iz7T(~_1od9iSm#3f$0&U?KegK7nwuxNip}0<^+d+IRau7pBrq1Y_ z6kh|-bSw?{f~g}@UqMSY+(ZVu94Ibxn6EMo5V%vPvl|x?j~A-yyShf8=@Yd zP^|x$$~2x`J`~fL-ef8*S0PLxR)hS6Rc>bb5ELXT5FwPW*kuLz0qgFuE=YdDbh0)9gS!?Wq;im1kI&&Mu?mcUm#zb`W%tqOrWe zVdg*=B$^Vz-z)60sl3fJm#Lk+&$JfgCFA8I_P2-qb(9Wz4*a#{((Nd*uNde&bbVz< zS%&Ec4yCUQ)y;_A&Ox(_6a!=}CQqj4BvzfnpEt-+WXtxf3uWE&GLfknQ?Bf$Q+c)n z1&KU-dz1X7v%fsqpJ_PLOgVvRD$`s!jcEzfJ8~)0drVv94i57pkRL{%Gdhn%tUCyz z_&#IZVd-q5Jlp_9ierj?VESB^WZgrild?RMota#ol3`5FOy^`2Q*oyAGR8zbprW}B zM&~Oso~b4%0sW=}Q#8m){3!b}wJ~=zcLJp|jb^$hvzcCCdMHPls9nDeazuX{W1>>p ztY|#D+|MqhHVK4Jz<_E9O`F0l&#_Ae|;PVRaL=9HSi_MVNMpDU+$T_9N3+rf0NAOjAH+ zt+D1|NB-VsYOa-GTE{M9H7lJw#a@t~Xsd;=?ilO3Df-kz@ja{6X5A_1Dr+fPW2VdO zvbWZZ={8eettE%~5acJ)v<^&Wrh!CAi`hbcB%$*=Vu}u4r=`_if-Fc`y2oo1)V{!GVRfRVBKm^Me&Jt z*N*z;j$(9PIjrFu7NBE_JZaUKxCmM*&S~EEW1;&FJ8(IQVtNWbpW!C%Fgb%LJ{PA_ zPL9G$AHtzD1dSIZ^bz(F{$ibaJG~%E>d)Kjpb`rxl#=>5rp-%;%IbMcZ8Xj|08t)3-A=kf>b;XFMqkG|k6lEu z`Ua*tOmX@qrc|cZ`up~6b85S#i1s<{+y+4Qfs|q-%keB7at6ycN|-Qb*bG@yIFxjR*{|dt zq+tll^(@Pma)EttDN2>8bRfAeP3dgnJr3q1?-wBRyeC6$^CtV<-iu(q;=K>jzRYpW zU6d(v3g&<^127lwQs&w(T>AJ#>BzMYrMasQg*Mcu1#AM!u7Ye@mcr~&mfVafOKuL9 z{Sf8{Wq0U_IUUOFl8HG3Smr|7+utsiA`)}%muqH9%#ps$OzxtXZ-S|9&TL=uyO`yB zEVr>d$nr~;msx%XSr|^B-wA{h%JLaVDW>^3*tv@}er}K-`caO)^($_NR^d-I*o0*} zmM%_Y)1A$ISZ1&s$#Np3Nxa5#Hl!5o$|s}m4l0kn$6-p5Q~m{*rIck$cRckA!900N%pElsTxtK4{TnnL@j&{o7b>B z%<>ky(JPZn=gOV1XGz7%G16VMWjToD8<0|bUb(+RP23=ML^~Y8awp6CEMu#Z{RWoz zAf@OKSl*2MviyRjR}k66uv`(k4dx@ERA0A3XCTHcE9|SdiyM&Cic*l;I^iVaSoR60 z(t9O5#8HZS;S(TBMNEgxj3E1|knY^-+_}|BQK25?Xh=N=l>G8~jbYwYk8=TueiTWm zZNzdO%R7*vqFH@Pc~SQp>kq}!h7anSpxqMXs3qp)G#Y@`JB{U1mTOslz;X}EgDlTO zw$1sTrBgJevkJ>_mQADmoup_RT?z8pXv%2{%YM;;u%Qv7u!Xm6+{Gy|rz6XrEc>&} zYD_(AG|QJ*&V-a=5zEyqH?jN(?xon+ghqf5n~tjsVaro01FUUhNR2rW_(zsN|W|JA)7v@c|lOb=$rl4%gv>=z&ThMskumz3h zaV_40wr7iZkm)TJLym8;0&;DO^^nI}Y=gYQ@(1?o7`F>HW#XvURE(n*(j@KxYzD?1 zg&Y+(10_?u2I($Nwl>P-4fwj% zdJd#hn`MwS+iZYLY_kP!mb_OG;x4{?&nvVrv_L-}x5S+7ZAc!1Y@1V}Ew#pKZDZY} zsNJ>$WV^P>kUiT{dK$J!g*m$|jZP)n`M@06ZV_a~_O~JHxBm%pY6Rt?Tl>1Yj=CmB7PjsHJ#!~JCLPOU%Bxqa5*Es zALQbA3T;dLK$s85Q>|T%ry8^*khx649<+*n8_1;*!o&nh)x(6#u<=TydJIpbQM6?u z#dW2_tJvK7PKP;=dPkC;9Vzy*EGx5&WZAAG)qdBG6ta=3w2t%Peq_fbkdr#DgQVD{ z_@?6xm>oLZgRI#}#}uY9%g&uBh5b9NK<)S2P_w2KVVx;2tyuPFnaA=-XG+7(rj(vr zkcl}jbRnBXT_`VWyUawGA9ta?d7SOPWb;jy_FdnGwirtnmSek8EN^us_glIif!3%g z!#=YcXC!akF`A!nW zvYF*?)!MEk>ct0=DE;3gg<=`hb+*xZlG&>#X{)n2ip}?XkxL^NMjq!TQ+|z>vnF{J zeEqsiwk1=^>}Gi?nL;q~wIYR5_$Y-+rcCe4@LQuhwYu`Xsa1saCSOKqP1xM6H@P=L zNbXJZu}rpqqc?@{d2eb_R9}yK>uijo$NG>w%kmP-Ykg?^d<0qOvU0y`B@=VPA*E>0 zk78-WvPnNmZF80_Shj-1)17dVNsu+g@_yY)6}7P!YkuLT&?cWlczmY7xr1#!WqF9@ z=PW(?(=4Uv+4FOpZH?LZll{&ZVZ!?##!fzs`_ru3n1>tVEzK*WIM<(ML09|FKnO8u zH{h~!+7G34aXHNm`|6RsE?NyJtIS2`oQ1yp(y2_s(rdv@t@L`3_0yX|#-_J{Y?s~{ zvRgXUS9*GXhfpyho#qKEVJ;e4VQGJm@mlG`oLwvrvOEddHs`wx8u9LC(A?hcIWl{& zEcYDQRD&6@!;Ep@xebW1({np8H%?)jk&rdTy5|b#PEvgL+@8{*A~o|U}qA0P_tceP$w zCNbv>!cWXO3^T48hEoX`8Et7yKiC+u(U@0Y9yaC;$dzLj zLLOn8@7P8gOE$H}Zh@RJ_AunBaka}~tQbdk2ClRGp5^^<)IuJyl;g>4V(Gxr!qSIiWwUF&j@HZL0}Xp50kyP9VQ8On3!u=CFA^n?IdE z^M^0k&9@UMX6K~{V5 z1Y|3gLs;rB-7n`Z4!lhB>hE@b)iE)rMsd2nYdo34tTu&G*qCLvDKmX>Magms%Oxy# zK^DFCbQb}y%<;7sRTiAm>~W{%pufGK`zLsp1@}+zL>YHr?D_tQy_h+T%vBbgset*+ zJL`kd2G&rF;~>et4&Hg%xn_H?z4&a+UPzy*lkM$!er_)+uip_yZuUSnTfZN&!}`mZ zWA|I%6Z364tJ;fRuTwZ*Ziug8FTUIG7D9`hNj9l7XCNiRSf1PJU!P*%1o=elZ*Ri0 z@LL~{eDDGJGJikwDar!bi=2~mn^oVd&sqICC}N>(sjR`Aqh z3E``#j;BSI5|tHo^<04G{1cg`ivFJN(p%hM%Huln5qF;;QIWzV-7M)No-xS$j@LSR z@~-H8uUWFJh-2Dep^_*kaurcYloK-*QT>$@D-F`9rc^&t#<2PaL(;Ik^1VAhUb%Q`oHgilXwx&w(B>3dWTzs~yAUZN#aGX~BLs?P0qG$=IlGwvE zPJD<^DvRq(dFHFdPs%FdN2Xl!qvE&lCPsnMxs^C6s|tsz9D~`v#4S-(;FTX7l-qN% zng}#VM3lH9gG3zDR1sO?h71-X4Syo8#E&vmoKTclqCiH_>moREMPED$s3G<+<(cc2 z+z%3X`xP;mJAi76+KMKEYKaU*Z-Z)!rHb}|>WFiS&VuTSQoQAlQ7g}gLk5ZHQl8o~ zqHJ}JLBy0=AnJ)&gUqc;d297VS4GLC)IeJiBblcOOy`P8j3cG0zr+$c&44Acj?+%v{+#Cw*dPQuCUQL(EG~Y@Y1J5 z6Y;U4v8B&}_A<>dPb%F&Ybx$4nh9zyOreyPe6hH6Gc8tBRkW&foYq3rVj62cUAhgZ z0aLE|YUxB!bEUgqx|6usyZ50~BsA@AKmt!*?;A0)Dw^30$6 zOw)&nkxaSf?|j|@jaNFVhvDL7rK5Ala4|#aC@mwzY^4)r7lW249i?ofct`0HzUJ$#%@k7=Jz{!Gk&CrJ&J?0Pha$>>W{E&WRjup98)7F@t~u1| zt-T>G8zdT9ugEuqTLbc!D>{JQ6!jHlSQlVVr(sO_Vxx7Q=`AryQNDGBX|`C$WTbkY z*jmKpJaMRq%LSr+6sL?^&tlPqX@>cTb%SZK=%wg1Q-4LbtXrVVX1X9t`RxN;Qe*`! z7dM!U*jJ0YPf&r4&f(23b3=iHTe+2vQJLduuT{EmsW z>{1u`GS%;*X}ygG`TbzpEIe#6JTSd4{0uUW_S5XPh$>9E<`?`Pn6`)rrWxj|e!g~F zMPEgCK_7@W4H9<#)$BeLD{WNEZl@>}O;Ju0ZvKt!_KIkxsiK5`b5ORT%KokG_K8;w z;?eDZ*k}-+s}69gX*P4!&t(6Y?t%^$>g-DRFTnek#*uHg^~QK6&>}j3_8Y?$Me?X;uO<#an8Sn{c%ybF@-t~`KxDtQp`|v$G?gFX|YLBh4OLs z=fsJo#-;rf95)!n`TmS{U(B zm^bm^B%)k#ul#!ZAH_sPK>;7xKM-!M4PC2%PwXFwHEj%Drcb zdFE{ar-Xwn$&_o}8*mO}Rl4KQnPp|Ay9k{bTfZCr=p5iE>nI(a0~}=|r7Kh6s=Y;Pjo^4#B_*hCuo**lXDYDm&fN#cln+o zIy@ws+b0UC1fk6opKud zm6F&|mg8Gl#ak;adn(#gr9hUJgOtBx@aHYZG3AP5@aH48F*Irxo3-k^%Zo z`Lk5ba407qD1Vl!!yK$Kx`Pp)ch#32{A7Znu&S?udNEBEz2VPaKF73Ez65^(GF!Q% znyw(1Dx#XMAa63|iltQ-h>Eg!M~cCiJyn!(OnK&$RcAU>mYoz`tU4RiU(wB~3qT{4 zKl^G6L=_p)*+{2XwPg-fWIaW})jYK-vWcSR)!uQaDqAY*Qf(cmqd_9X?R|%8a;}X& zb_kM}Z1konME+!>#d?@r*M;MQzr7COa#Pnr`qH7M+|!L{EOb{L>dKo;dFH%o{j^9K z+nsc|=GUv8l##LzQ=a+#YTnRgD>}fGtLR*{9~>g(bVW2nLMS~blsxf$wfoQ|Dsl?6 zH#d-d6$J#knxo`CMGXSI&5h)FgUqRcLFQ=b^DKvA9t~**DD8S1lRu>y{)UEFq*c1<^ELC75QAUW4YE6hXWc}1&2Zi!*C%|OHD9)vPnMrRO>73V`1h>>zXQ?4i$ zy3ssR-c%G3YLU;&-H6Xis(xCO_{=!$M;y?lmise{j)daV1xMV^p<>H z>6V1oaC}SVDcT$!4Vt28Z+JV$x8>`K&V;9c<{E@hhB?lb`wSA_hmUrgBVC73I`jBW z+dLU)5Z@=7CnFTmeWH0XQc*(0DKTF*QPd;i9H~-DU*@+CGvnG z%KK7zNl_}oTq-LL<+N~am&#x!;~Hx@X<1{Ew(dvlv zj?3g*iauj{Pti|IdlWg=AeUzp)nvM(s5_Ho7^Q5Q`E@3%qC-qI6`5*MC~=CKF!fY4 zlxe7<#Y~eGonu<4NY5!uKOcxaOVtSxxGLy$}Bc0orDl59lR9}%#ZHggY zQDdfliZYmTn5d5}5X?mM!wQqURzTShmV<73IO@hw`SPO_9wl+hy2Dif@Ma zG_sB5BiTgJDY)Dr+bAklzmsK`d{t4|`bn02xkyp<`WX&;8mo7X(xwr zRYohKP_D{E<&Q$SCI={@P_A+Q3hzi% z^P*2-eNCF8ccRaMt|$lRZYkOqod>dikwbC(GJ2gbXmmj+=y-rAlbF3~@Vxb)HbPktPxua@-$ zy>6p7O}^R+8@=G1_^7`x)}yuUOu6D{lYLH&wXkWdGoL`2HP@Od`Wj`{TuV}P6}lMhHAO!_ z7o)9F^a#3GZKoo0(*hZ*omJ$~)LUzzc}_QCC<9#!Em#rVJ&4n4DhhzhIIX#&V5ZKB z>NF*n0~9r5%2AZiGy}R5ih4oUQu|KPb4=njBlgj7*;4DsM6=2(POY?e6wL&+(Y7$< z3#!d_+Brq^q^X_ufGJPB-1Lr9do5=Mhbd+@z3&vS9e$lCA2oeSBxqkU8TFo^U1Boo zJyB~kll`F{-ZXX8+8JcN9pFla4GF;;Mn4@zyZ8sC;*3G%Qc39C&(6ib(CgY6IQ=@bt4|cK5yq$Y$muE4_*k0?Vwb_va@JEv&3lrEuJZD*{(Rl1(d8awy3Q93BqMx&awbna)PNzFPqr`c!$D7}!J z-*48#IYYb8F&NLFGc?m16vYe?)_gQ{GZnRK{(^I+7V);B8_;~d^HA-OqS4J)I1kgj zW*fShpb=UJMejC$*LjpSQ_+s*?>j%QdCf6ge$jk~^Jp!KX_{ydxW_q1J7=TMoX2Rj z=aS25A|UWH=keNPCZhx=YO9#&Io<*>QCrV6!(1ljmh(hyD^tFp(w(R|%o8|>$~(WH z1uCM_eMy^SquS1sw5^J$bSGKB8jCK@iyapZ}?pf|PUOf$rom=(@%X=j*>ywBFIFd5fX zvo-5N!{6E_Rb6IleHBHN2y>aM-BENp#^NwftG&o@c|NA9%Y1Dj6O~zgmxbCCrm^O$ zF>%^L?R7;z#T0W~sBL1(6{gq)Vv**wltLM6c8qQ8vPcVL$`#(RRY8*!RgASbEYajL za*6wQ#OwZ=^2%&D=(9G7buOk>T@$7Z^$(3UEi3|gt3 zGhB*!aJfpuV;dYs+g+_WG10g?!DY4PZ;-il#f$nHttwNl`JLEdj%&1VrK8y2)t*sA zvA?S|HVB~F01%0HAptx#8&!8bs1;vJq2!s5 zwW{lSL@TT4RI4aZ1x1%z**hH3f)vG6XbN2oMR!}pfg%+ZYuygiRFQA%IM<_ED@D&h zcU0@3s6*>@;+WRMAknM!0uZI7a7JB7G^5UO{aoqj8Q+VpU)YGA@tx87awydQw!5Cy za+r+q?5uW9#gN)2AG+r2IJY9T&F8M)Xls~^XBro^ZA`{9jf&ug0tx~+73+D>#c z>-QC%Z#x5o$E`T>1;y^Dhioy3Vt3J#6;bSNdc;=JyrNC*zHlq4S5tJP-C0nC zqO0xJiBft!ML)NjB}?f|6q(y!a4W61R8+G4RZyZqC?&inr$74yZ8r!r<0yA;J>VmO zBTrO|Z|?4+r!nP<>hTs?mg}Lg&HE~%HqqYQ&qh?Y{x%xq*VVm(?({K-iP%TFSJYP; zWDZK$FRJS26-9%p={`G**dt23=pLx|Rn#?MntPD$l~1}{F)-l`_h8-3{%9ns6%nRS zV4cx+!}Uo_#`QzEzEcs+I3x5kOw?Xhx<}}D3^GqiSm$0-f54P$o|W)E$Zj{M#k?Tl zBllXmGgGd4eZp=~38mYeaKOE`UQX$bB~)>!tyfaIuM*m5b@b{=cOxMYRNK%Y_7m=P zRVh(gzA{DH%B-2+8}1Eklu*6n@gA*gl-8lY zM{E6cE*GOux6|j^N@=r4JKgIOt_PG-zDFnh>Ze94nAh>RM^AnBUZQ+6r8-$(tcX&b ztiPj(N-0I(sEA4_Mc<}~N-0I(t%yn~ML(#BN-0G@u82x0ML(;EN+LzSsEA4;MZc+t zN}{*^lOigK-g?MBBb`(dee}Kt2`Y)cx^+M61eHXpzLP1>{BFks?rD0+0n+7)10BzL zr0EA$-pv~=GDF{YkaR|y&(xbABFf`1GxcW=8`QC4DbFlD-5~SOPQISm`UpiYcB%oI zXb?(wfymZR7-5R*8%xy8*0(B`8#=8MgY}(Ex#nG+X34?&ex*AG-4OjVr8^JZ5dDnO z-GOeXenIK9&a>oD{f5%HbzUci>35aR54vHxIKrt$T9Q16>lJO3>iN7LX^{C`=Qu4_ zZ=&dSn2$%U-cnHkQ-VR_R_A=TTz!JlJwSZ9`gEolW=oe0&s_b1a#^}dDbKNb{86LK z%6A#*IZj`yD74F1&+&TmV}>rW%PBElKg48Q8;;lSD57h_@w)qGjNqZC!?I!jL1^Ay$S>aD$|Pgc~dYk_=Ce_c_hu4_GK=yMdM zcijqFY7q55&)4;QrK2<68~Oo7bjEu_Kdy*ke^WoJh+=-tCFjUo2fDX)i=uYW&DK2>^@MIVk0FKUqdAJ`eDsayJR7C@eeb!@MuYqw zc`nm^j8KrH)?Ul?W2cPx)^+dVwMsvwh-UDs^z(`ibocdKrGKyJQula|ReI=Y!ynDW zSL<~Y(M)``9(RUxGlbS7$?F|`I#ZsR=H>6{`xMc^#DaRdlbm^`gBE2d*Iqae@jvK9=Nv9P3Md-2Sc|}cTzMRx{Z3aLAaXe=e0@S zewkg0_j-)=+NO`YV$lD`+?#+^Rek;A`waVVFHRtX%y0n(6bA%zLIrU`$q_*u62t+N z%rPfaZs35kW-1N^;)Ggi;($|-Xi{2QR%TQXHc&QL_ASfuzt-AYy+-x+ec$KzJpX$9 zus&<8z4qF}*=M+CI5`@Q{I$E1RS@(48f|OY_0g-qb0je<`+RhvbD6gP0XytmuDRbt zPq<@gbgA=sEmpEd$@a=?+E~e&0jtomh~fV4rt=$GrC{vK9}%W zM~K1wgX8R##`V0M83yeYozr>WPx!y6dXX zkPKJ1CUBQ7d9tK&g~0Yp*6{H+T$<=(6|`ARlg7R8;-Qxd#&W^aL$A`Q9Q5wDU>gr_ zBEkA_h4$7b6U#B-3hk}Wk~ZvlAAO-@*z-R64$1b6FNXIUzAV|%@yyj%KSeCtbbkCt z4Sn^E@a*ON7WwJ`VGmt zrRBKx)>Gk`bM)+!mh0L_pC(yi+G^LndZuI@)4o&U^yefSlh$1ypdXiPYTCXA1NBcN zJKXa**TK3IJfV#-Gt-`Pjn{iicDQGOYl5Efz*gWoOkXS6qO=!XhwFPEuw$+x^^20N zN-J}HLcjiiz2Taye<|6G@68>4Cw56{YWO@~mDi*_rf`CL8q35Mg^i{X&z? zdZA>M>F+ezs+UW4JN=U;&+GR>(NpYGx9g2s5`$kq;QFrKL^8a4YKQJ88Qwj$QxBF5 z@1EMJhY`c0*dLng(uYd63D_Pzg_tNNNlfUqlmpMSt_wp#4t}Mw_?3sYw9KV717D< zsNRH_$n&_~UNX$HL{F0p^DNQJiD8~w^b-9lu??mtCwjY`)bB`UKf>GXwC>YJ)G%ja zh}$cAd%@Vjv~agFeVAms(z>{v)t@J}m@R@l%k@&pRuHR_o|`9zyOrzCVH6X#fN;0- zdOOJq(t5dF(EADo?Hl6uhCW%cO~5YcbBT%ey`}G$4BK~EKSvB(lw1F@UipBHaeGI< zCm4Hq;&tU+y>VO7q808F-QLyvNOof4G1vF?*^+Gn+Xs3MvBmJK*9^B0^&`RtSB>Vm zRq8d;cDQG*+sC>kT(l@NZJygF`T$}g&uV?5WSHlt`Wne_96r@QCMM2kKh=2zMiH~; zQ$3Ivj`SM0&-LlVM9eSsoswb9TKzrgxd}XL^&65sIdQYw*Lp-d(OUZvo87+ApOI|N z#9eOR=`RY#3epa`-O|g6VeO~gZtHCxqg?1$#9#FelHu=$zv@wvRl?Z*s`ruXQ(^-p zyGd-AWd9+SOblD}n%l4XTav-OcW!s}4~dEP{h>Rw$J)jD<~@BZG0d!x-P2DIvofzq zD^2%wrw-^@P0tA{ycaRysq;C4neb>-=T^xcpH$DR^JS9Zu_@>4BpU%X&bLU0zhW4? zP%``#!{GZR%a41{&5jpKwl=O3SUIt3W#XhlX5wu+ip;hU%aIJ9XEyP`PG~EqyJ+h1 zC}LKI&-B*knUdji!u7d-XY{l(eEPROZ!XzIXnRB6ftYBm1CJsmp4)Zcy(Povb{%+s zV&_fx6t)A8mo|Kg*MUzIjGp3k;2Fe3%*K4KU?#kmzcF7S8Q#m^nCBDwT=@;!=fp1) zt5zCi)VewGpNWZi?ZR6}VjDzE7e1O;wrN7f?`|$UO|sb;{;CUqm6(;~W}LHk<=2Rn zD`gpmyBm+|f>GA8_cQ*ZdhqqcMD3ouoS3NHlYdQ2)aT9b2*ylLRxxjmPvk=`%m`?;s{(`tdiUt(}j*yFY(hvK~Icz&<1<>I>vG#KfqGSt*JtbKou_eSreNFi$Vj}CN`~oqN zbyI$om>7p3?iY1`9LBl_@u+CZg;h*0WWoF*G4VV}F#n}H+Tdx<$&=iJIlT0pSS@%q z=i!q5G8v8>d1uM&pR!j%`9R46o+@OmxN{Ft?v&Sb_g4I7Pr*7pHOaj-Z_rDy0l>m| zlw@O|TsSZ9gSNG7@>6r%!+A9^(Vr3greM^c5xi9_dW!yx;Ezd${Tac#NjCqfO4g1i zO16sFQ<7m{x8qAB+eWq*Br7I%OfnpYcKj{La2(q4FC?oV&wG+p5^K^|WcCfQ){@;L z)?2bhQ!vVC$t=WX5yPiB7rD3N3nc5|vmDqGVq)Ce^VN^A1A>`WP4!UQ^JB!aO$Af$ zDed`rX{(re(!B$}CfW6=Wx&3c44;DO$bXj%pMvSg>-D2CGToiJ$h{NqBN%g>c2DWV z?>&BlWwwCpsHpQ+R-!5%^!4}Q; zO4~57Mf2m*HVkYryv+ctVJ(|C?QDY>K1H(pX&<`x;Cm!H47OgJ4Mb0|J@n>nh-I_d zXgFxpp*;$8{VXXfCUQ68gtpk$q9_5#+D zShfkD4^QUpB#WDw3M^4FobxGsv}8EvQ@B;Kkux9n7{hZVn>up{uziv(o;lnjl^>RD z!^~u0*NBOGF2{0*M3EWZb2*OpA(q2-&8%YMc?K~t&nEC0(i7V-foDpFZJ59p5ra1m z%q(VUe5GXH&&*TO_(AE3@2yDZUrL7cP2_&Vuy#@3B;JFVs4s)Z5&N9_EQ7~OhV^Ce zQN*%MxleEOc#@BkZ0pn8fGv^iz|%WCCiB&joqc*QutSo)|MVe`r+A5EpFe#J*k_Ve zOg-Z?mNB#6<1$_zh{h zJ8Qh>JbqI$)9egj4M&Jx!gnHMa#zVxW>5FbFi>b#g9q$;p{vmi+>>5e`YW8wDM}n z^f}9cH5e(f?(cQj=^5@KnXC6HU_FS5G0NtdlHnNT@M27+s=2g-Yx0S{G zOUbZ(i}@{L*`^b7Jk%xpj%2UTxu-1QUZXGs!uCCByob^9o{ccNpBKx`JPk4DShE!GDwt?=xP>f0GRFGhWHPpAh|m_ZhF^O(nzo zj92kK#6+H}d6s0D=Nf*Tn84!q%%@0(xoqKkh>2Xb@{7boF5CE3 zV%etrxs_}iuaxZQ+$vyy*myqAjTBM)_jA2GpXUuF`*p5Aur|a*%olhEX~UJ_1s-+3 z9IOm4@G+9%>Xy$ZN`|XjKHngj!#oeQfIlyp=e&DL0WT#cYS_*%NL%k-UY^_eWyyy2 z@(1>VWK+Rb$bXe=A=nDJ*O-T6yMqT3%Qhv=yX3iphe|en-uuA%+j#Ee3B<%K*vX%e z3`cAypCHSY zqkJ|ok>@dJm+_6be!i&7CQeW<2XMlS(o`CUM2jjWP|3n z2KFT}k;@70H~wKRC;2d9B9~JLGP?zp>=k}RGM5Eaz4Zz|c~1xdgLNtOcT zUgb%WJqhJr<(b4p`_A%W$*`}>`AuS?edoAC8rC4%cb>Zu%Z58JE8$)}KgkLp=6T-T z#`87aSK5v)nCbNzA1v9c3l;*KVdHs$XA%?h>;lh`4EyW?Un$GsHdeu(lMJ`93Vuwo zRtqcH>--hTIxnmORxMedg}->d!D}TOy^wjm!Rw`qK6`rMZm)~nNwVb&4*_c@S^mOP zUYB?m$@VXN71(IWjxVh6dXrC(?EJ#FfUO`V`tvPbE*bXcWqy~K=+7(MZ{oxLe47Uo z6K#K+w~-9n{x}V7tzrlI$SZ zuJiT8L@poli;`h3m0Ztwn9D~zn3%}rW8Q{XHe6}j=K?eaweT_CD122_GZb zr%>M~JV&x`z*faqNcIcZs`yL9L=DyaC^6C6YJNsCY;84vO_pnCg{#v1Ey;RXtAO2- zY^e1ouNr4#6oF616a`}QEm!7z4e8Ed4!(6`L z6~y3}!OPwIOMXQ%=IsmYN6BzT*7DyZ!x>r2{U$%mCdEi|A(J?P{U;J zpZQyYncSb5?fo0SVPpG^|NOv~<9(0Ue+t_mGP}o}AFwKRk9$94Dl>u}up)2O2z$T| zdFw``V5TA2=e!MLhGf%$*%|vKE6V=R+hp93tQ45paGydws9;an8$ps`Pt-HoONKqs z(C9mK`W{NN8r5XHpc?jvNm)$Z(Wwf6hH6 z$ncP?7;M3YzhoD{7HotHM!!^q7+VEnE{h_4LX4`}A~VlLeSAWV(7DL0CZEMqd|Df0 zC5r&o#@I@1Eel?H!yIOOEf`%#2{Q)HqbO8Em@#ZVvT_!_w2*}vOC`hi{)8Flh;1-M zE_Kn`8W$ytUAoz)t#MVd|IEH&4mZA(EMe&jKH=mGtwmc1K49mzGTk1FZ#4Mu1VGvSO>#lp(r;5SVyCeWJ_{Od^#Cfl065kvvFLq z3%TcfB8~4QdmmUABRES$QI=it>1rfP)&N*HW0Pdz%RcpqGA>Kj4Op~cvWjxUfOR*b zBpVMb#+WUc6<81Bpk%9o^)x<{EPvUzKD~?|Bs;e3Hn7Ieh?s9Ko8r^k=pflA!1@@` zl6fv?zOhEEWRER3fTc?|Xn8T~YfP0ad3m1F*T^JR&N7!b@a<<*=3ouwY|CGtn zRm7qsD_A+$cY+Zo+3A&c^>pI~F?eH^%W&U`hQ0~Qtz`p%O)@Nk(HrD43_sdZt?aWy zQN9^Quw>>V_R3`A0JUf>J6-~~j(~bU;jagOCJl#l? zY%>k+W7^elJRcfwrQ84DPdadtVqr+zGv&Ha6 zzCt$7SSOk1>SAC!h>72N<{A5mi8ratGrpD#-=s3n_(3v!lgd2fS7IAX5o>n%W*SYl zPz_XjrlAlMSI;vIUt;AfYRy6LY%SU3H79%*7?F}KTyxIXYQ#ylX3Z7fMaE*uiq=&6 zE;ZH=6Z`4qM$2$$klbr8H`)ot!V6Q?<;IG>4{a-q^@6dByN{Vx7&CUEty+mbu(#DJ zgIKc?PKO6P7dpgeJ6=g&p&G%euSM8j4e1)$euL@U9j~`dW4M?4C))=_^i=g+-FQN z*Bfzyv5UuRoYotk#ylM9jmB4kv9C@Ab=_$EA(?tQsOu(Ue=qc`R{ETNscW8bTQcnH zJmaop*w=YRn?B@ee*W}~pgg04VAR)nMwDdO*Lg;k^u)f-GnNt)eVu3QCI)v>o+)IT zjjMEYA!^@jcug0%VC|cYK*_N7&Bib~DygR0Hyg=@64d%?i3nwP9$@GbN6fEud-1n;$f#=1T;1F)1qp8ssE z8%<~&sH_*D$^z=hP2n@mDmyd-GwI>{Fdy4`PxMFq4I8V_q);>=+txmo^tPI*RQp2G zuO!?+noWQj+f16xl*#wK@O$rDN%I1sZJfW8caZ1bweiI|ab70PF&q6UkX3exG`8}` zHa@nse@gx%y)gf;$me-~jPN7Lzmk=$!+x_Pe8mH;^+>kuTU-5~W&Cy~mhz%ndI0M1 zeFDZfeAj_7{H_DWuj_+ZJ?dlIGdp`=sh0>J=B%+Gh^(_t6u&2+!3G1u*Mk66s!^j% zbojOe>TP?YuKe_aQt&!88+jqcL{!-ll11-rAi0qA82^5+3e5%3-`BiJo^P+id7Cs9 zGkKddACsm(X+D-dXsspr9-zt^KKtj)ok%0l4`h`ElSatc&+y;~jp;vI(MM(BP*!7I z0d?vz(Mx}&uiFoOsP+L=yX_2lC~NQ~Ka7l?@U0!fQG|8--)|}AlL}UiGSO)sa*ANE zr>NBb>|-Za9xM6V&LZ0y>&C%6In`pw2(l0Vl$8SCQ+YJcztSwD+69W<5aWVnADxGP zj;2$4AI&5SR@DE#)ZazMl^MUSf-!CT2Q?}yB)yRLll)I{9?i@~^+^{SL{t%EP3Q7b+G zyzld8jn1m5>^I~oRtyo%SdS}%SXGSm80{Y#7P5aYR0%2W<6q`|6*pI-5$7 zbEuZ(b>y{m>a~sbf04iMh3)zQP?K|}lJ7pq&T+n z-|gQ$J#o~oQYqVcF6#Y|^j}gmTe)tupU6j)@*I!t665kv)|l}e)@7?{V54y++42DI zM?j6r+CI=LOlaCY(EOEEME<+7Vw7#Ib&okaQT#rHg8@}G>Oqb0-QTYN*X^tBC{LtX zL`!YwmGJ!M4C_V{8r!{X-C6W!&Hep|?VdLz23z`PPlbuODvqe@TI=SML9LqxsIj@! zleRwMSo)ujJ^tTW@mNun$BGYSjoz`3-+sPt6&jtD(NU$C;kK=?mBo?gVrumoYOk#< zwjgo5v6*~?TtM<3@)z;Negxkvrm-WWKSe&TlIAr)on0dR+oZovGVVv_oxg3i ze#*z8ql_p$o}k3$oqwqUQcS=!0ifIF|bc5WgyiafGMXyNR<2JU&-xKH%OK zeR@!2u}8*pUU3$q&|VBzFg(i}L_Wf5t9h9J{TBV-+bHI$XuFU_+i@==X7c@Qc?@NR zM^-AE_CU5h;<~RFV^`O+?iyt~%CjgYMpohL<5+uLtI!O5;?GuFPaLC1%L=P)?KxCe z$szQ##gI){``g2Dl!J$%_1|c=!cn~n-xSAE;;jE{9gS^u(vKGlf+!Uw-)j?wDs#gVXW4-7kutrPg}Ml5w55WZLpIjC#^WwLZAY7kXwm-fgR z*1z`@5mrH;!xaobooxq%@A%Ou23NpiVs|MnPd>C434Z zs5CB*_Ka;?{v7Agk^Qsvel35kzkha&t-gPLZCjVE{8*BhGkCOla4fE73eBtAiI}qn zZPeiF@7OMHKu%kk!L0EP4tBCmAyE3#jGj;HReX1b$x6#w)6jg zULpT#1ryr^Zs{6);r`EAb%7jI_(CdL=lqL&L~de#y@*O}0faA%LVV8lfNZcF7+E_u zKMw0E0gcMe0^VQW(jW(oU9!=L73ovb*lzo_GVUW()&&r*w$aFzCS#nlfI2%5$XNy8 z{aQYI5dXgB+d7(`>uB`6`w=i&0^sUOw(6=glZS^`>6^5QF za~^{^d_`psq+nUB3qHQI8AqWJpowxb%iM5u;7DvUwhp6dGFmuz-p~AxaTpnAj`lyS zeztQ}$hMElKqY?3YLR&PNjgPJ^@zh4)Gn(XCfGT^2 z{FeagEDw;gB0z&3fnKs>Z-Q)Mt)ZXIED8|5+YK6c;US<#R-JtYGH1U48q94A_Ph_E zi3I|hSumhzm&!sx)>yyI%|9H|2C(UxWLa4K3kRRG=tFc)3{`vP`vBuW*{O8|r>t1{Ro%-2+8}^}yX`6{7=vC%H)&N3V zfBbDlk-uIE+16_NTb_t)Yi&x=Z0q_vS^RqSch(S!BjVSsQRoG>BF`>>Digow+Qzi~ zHN;ka7y*8jpa_EqhfsulJul|Jf>X`!_y+*NXq0{@>U5Z#@5vPu)EKccuP!asEwR|HkM4 zQu{>Ox)JYR?U_azu_FDm)$tiDH6Q%phzn4czi$7Xel0~tRN1~da*2(;Zi|HGpYtiB z2zV_{W45h$o$9hJEAAk&)zmHZ-$ui;2JyRE2M)+hrc`E?+*C8 z6aMamzq{EcbvH|gzfZ!ysqk+m{PTx@9ob&69btd4BkUXP2ve0K>=y8j>(v2^WR{$9UY{e%3Ye(Bmrv3vb2%AASU{ch>s=YQu{qWqEnzPUtk zDyU@ZAmb&xH1>N;91;201+_Q~;65q4^ z5=&QN-QXz)essH&I*1Qw76YCxiwc>AMY#6$x3Jf@5Ash@-r1hyUmt224>;bvgE|MY zJ!kL8Dz`u5e@kBh?RBK@KV1Z$jsAI1mu|kwZf-B~&sBceeiV=u#;LdTMun&Rud)Mu zqu|+w0nPe2?qCB8i=iKI?56T5g=RH`zc%zM|2ce9p<(Ap--b%(_%68=LNoMLA_9bO$ViZRkG2`-ec*ba!su z*&T4wN*r-~U!gl+M4DW}RXd?B1;6v<&euuLeGN*$vkK@ex+s>p3F{0MY42);(e7?})Sr4C^nlo8%>0j^6hEkLpD>9o>|&Qb&S+wLTI?Jh5q@f^#oW!8sO4 z?YgCm-d)UYDPswz?}pqI9Mh{X`cdG6y;MuBxTRQkFNDY|!84S~MiAy2dv;%H8mhds zyO8A?#k;RIU2EW0oCj^edDwVQO;fWLyyu>OgfgsIk$))VU^VLR_G(-JKHpQeKQ}e2 z_Z;rQmkRsu$x{xAvg(vQteIJjfh{qT>Izjbt5C{66685%N7enAkY+u|YBfghehg&m zp00ps?V&8&6Wgo|q77(PL3LFa`}YiJ7OH#{TjU={r2>`GJqwz}D=Q1uHyf$oS~OC@ z`5ZwJB0)btU@Yn5ND~K|;g$^2gsAD3Q_V8Szt*_5=ReJGTfW=O9onJ>g{bBt=b&3q zFMLIkFrCJ32Gwg(1{8G)%2P%bMFmX-P46JZ4tp$GyJ_hk)Da>;AA)`;$XP|bgQB%n zu)+^gv7e*0l|>VR%-|1wu0|$43D%OL8A0xLuN7TwI)gIIqzp4Dw;41#(dxA#!_H!7 zzcq;985Tpa4cX5LPZy@*YVXcZ?S*wf#Wg=qd3A3T^vRohiO?a2EEUl0YQdbr{6I{)=6c~27YIx$#;AlnP_miF3&SBqcjvZB8;XA7C`z`_E z9P6n1gS?(r(T@l8=2UvvtI)`DJy;|;aTi)MAL+Lthia4O*v!hFIK z!pnrUg!)TnHCM&AU+1d$z1mzAzf&8ndc9=W&4C$Gtp~DDcNksf3Rpt(c?Zq9{a}Un z^3s-7OtbV9&AM{ZTqI2i9KHO&O4I?(qFR)w2m1B~#2LGTW^4&<1%tpkphX__YMx!l zOPB2P>>^%z2e2FDRzUg!(if1vfb@5u_9|wvyAgY+g~G?bbh1S(JMUN8B86wYbhSk^ zi{DWVnETRKpo!mM3N2IiyyO;IVh7(z2aIq$Z^i2J5WSeG1HRVvB>hgLUX9sWYQ z4Hy9$`vXaUP6rCvZKYoL7upS4!7^xVuhkFtOl@_SYX86v=e(}sI#$i`S-V>52S;tm zq3TwSTHc{J_#*Mjf^S;YC!hK%u64H|hbTv^*SYl#Xi=1725s-o(DQT5&g${Ls~URI z2nG^{5=H=4>$f02ZYh?R-)ikeW8?+nvM%V3UBb&>wZ3CF@@4xrfuz4t>NK3#ZkkpI|CxXF|Dcf;bP`!!aY<5tb0ZNnQFwEreT@t z*E?H>IhuAKZXcEd(W>=3b_Wg*2wOpNhI;hy#IOv?XFcV!o-)}gt!EA|37bJ}%#esZ zkfGv=YBo9e7sFSCH@UA13xV9WhMBcHhYQ0xQl4h5Me$xJi+yg^dKTaF-=X4&@0U3& zDfVc)L&XuFLD^a~_h-7atpIBwt58=KBW^7IzG;QJr?@bzLcLVn9jqULKGyUdU@>`~ zA}m&Mjupe0MmZK!v~sn#rH^BXw)se$8ln{uo;&h!+d-zwB!6+_M%xgL9sLGy*zOVHG+7oVfvP*a)>aI93D9CdD8 zN&Qo)`W}U2QMJXi@ z$U7n;Kt2@_sbN2R(L9OJaJ$gqED7S!Y}7UEw;oh)93UKBQ0>tg?!Tfn+<(PuIF3E2 zRIZYlwzeI7Z{V1R+Jp4*8h&f6BSnbTQs&-MqO}CTj#|{QciVN;h8(MGm#dCGmZzkU zPaez=I0i5+1Z#n5$FUl~GsnIHM9&hkmY8sbFEQZ?pQlzGyVY*3ir-j|rwAiee*6n9 zolh9i@3D~@Zc`&6lR4(GV1;8s4d?Ah=m9vMq29=#R?h%yqxPAEBPq@msH>j&imBIe z#6ibH+kar1Frst&9I~z;Tu&IS%{;!ieYEz%@s)r_j@#Q6vD3%bw=ZJn0JnlqJ@Zz| z0V8*9Hd4c*wHz9S9W)C2HJtxDD3h(w=S@2lYq&BLYuJ`Bb(4EL(BPa2qvMS*6^}H+ z;ERojc%C%d&@Lz_pA;V$#Xq<=1>lyG?#K@S)8luX%Fcs%yn2K{Uj{5wLDW)W*vqc$F0_WPw2*OmrTy;{( zu+EBkb;%Q*W3|mC#Y{2dT+LOBN^Z5YD5uHu9N{IxcL_fttObmPmY#Nt)zC9mL!Vd; zePT5%6|3Q~T&(s}3F7aBcw85&VT4!>kNRRY5eJX`6f-|DwsRhxdBxG(fMdK9WsbRO zz=_<>jxx6{Csud1vVJEv01iE|t+PAnEfQy)_<@B;dFzSd&S4~nnen*7VlFvxvU7;} zaL+O*^~H$`oufg16WTtYC@j*V{CEQU=Ql#_B+B&&od`V%0|@Uq^ohi)F?cnj^~vtK zBMU$IPGA8YKSXPtPr`R>+4z&^BV*0QCoe`uYd^!eKoMPsIYd4w=IbXLbit!dd%OA+ zr@oHISM_x~*0L&Jo@~*@s{904z#LD7bxAklR`0Ci3hAZe3YiX>_wIsQG+akAd7c{9 zB}v2g+eT~tr_Ab9XtljviV}ZnN|!*2A4(WO7)dymjymuR<@qiV6uAdQ&Q)ha1S|EM z)%<<)6J4z4sAKkaR`bSFWnH4RS5IA_n2p+F%tq}oW~25P6OoPzC=OnqvA4THwK(gz z0z1PI&Kz?n`NWgYNRbI?GDzdBKYPZ$Te`MpO<1=A^Y~YyyCrE)zp~7}jQSss?qHv5x9F97 z${}iL31IV(GLkC@uK?yLR=&&qohV26ia>Am1Jb8}=KJpHfMq>%m0j-3AFn2TE#WP| z<{@{WmQh3Ru+gQ3aJ?1lLaY*~qFm&ScnEM#=@;4x{pf-V;E&(QoFUH9sMT8ub73p1 z*5g=V=~qKD$-0B|ckIrUHcxQpz02@eG>&i(pkgGHWh5vDUXi$^>wV#!ciN<~X$eIT z$M7wtvPIhTvfPAIQeIg0d_uXD_iR6$aEMm0L)xygR}vKaGi57$4{5i`&LxmKAVd=p6}dIdc681;9$UL?UKj0KCs7}ecLBjy%@9DE{EDu zq~W_&u4uh2qY~5AmXUBB1J>kmiMcAiNyV&Besxx&#eT)B^AkhtUwSn=u>?GG!Fue~ zVrJIex~v5m-?Ea<@a-xUVBMXl=x@Io2kRTYVWkW-N5H2N{KMe*?KH^vu9aN%`&V(T z)6c?t0~DXL@Qr1y^;v9bcRC0=fn@R zm(Ko?7;As(>~%Oh!#A}=+gF@zJS@kOE z`-Jj1HOU^10uZ3Tj2}MNpOx(t-CXPv(`n*#MZF|E z#(Z1KcxLL(@Li&7?e0Ak~*L{#QoCEKGYsi)=KLXxVBkMI}->U-vZ>!@0e^D0#-c>gMGVK7Mu9X6swD$q)YrgXorR^+M`WsU}F0z z!a;2c$i>=Bz~kE71`SxLhCNWO-2lyPZDT_d%h9JcGO?vP*0@4{8ss(lJiz0mIi+I` zr8@RQx!%pe1UC%%IzpfGK)}l!BZS&v**13Q8DWRncCf>2Bkh7+8?Y$5Fjo`nLq2ij zbKEWsenq=s_k){>nM`fnp`|8_5M{y$Jxmy(k0}}YAk(pCiyDK*C=v?J=WF19_xy<$GW2Iv93O(k0bpalJ}E*kbH{C z=eRxQbIKlbC?}r_CYC7IPjy}2IdA3~TGT&9TP5Uw6$BtpSdhLjY)=?;b#!7{|jND`H|uA0st2_CIw; zeV>?A@Vo?wrBcb74f?R2*`&#qni~7S9;ly9c%1OZ9);vn2oav_SxBB|K|bH}EXg$z zYwSIHX^m^_rvYLuT4TynVvYU9UNK;`^o}8G4CzxPQdVG{)jON4*&ts486y;e?A51` z^o6833!2G&&Po}}){wP^G&Nv-t&iqZWA7fTIZ+NEKN%Z9a*Weq54XOEBLHjc%VJ}k zFhUGjQ%Oz*{qDZ0q_H~Te8?s_8}v%QZ1O1}eIdz(WGw{ih<;_HKMV1FSqnkl*S}E8SZ^75o^{qd0|%T1e{DcDX=+GTTqr{q z%tUiRtA#WHqzNER49PJhr@G)OS0GBc(st)c5nOTW3m`cF^vjZB0Ba*-T!-kMU1G?Z zO4e+`Lc+6zHH2Cdj1xc@LzqgKO;|{HmavA9xuL%wVE|zaVJcxZVId*&AWy<5Z zvk3DEO9`t8nGg9BMiC|xW)bESrud?dRiHo01%zdU)r3j_#UYF$OeV}CtR}1tpcOt4 zF_*B2Fr_KQCscwc4xxoGiZGfmh0sb^Kv+gtO&Agk-*$+K4aSu@oiLZMh_HgJwIrKE z&@&_iJ!1*e33CaH2rCF{3C+#X)6yJs3n4j{FrCm!`dpF=NG>9|jO2>uSXVX4wWK$< zz-S?av4rV_SuHSrZVU9!C%K696{M*mO)Y6yD0-ShDGp&QVKV8{Loq@Y$+;xwlUzhT zr6iXTR*C}g5+wFYg=L_tQAI62+gf9 zrXR^6B*zjalO~as~NRlUz%Br46;c4Mw(*971w5$+0A-kep7kmE>HK3rH>^xuOl$UQ4n$jPfLm zB}^yGB`gX<&kB-j3C(R$6Vet-#S*3y<`NbWR*+A1TgDuBBt~@3u~j5uz;|P(9)aqgaw3Ugw=#fAGBHsqY15q1%zdU z)r3kcc@m}&S_umX%LuCpqx;rC%oIW^VF6(oVKt%B4}C0z(S#|4R>HD=R975gG+_#1 z0ioq_(i0Xuj&aHemHsGO2&4O>kCo&C!ZN~Y(klbdY9Wj!Od+%q77$hwDg()rFq$xh z&`MZ9s0<<>!f3+$K{z4>gKD6bQj*I^t|n9lqdsad`b3kQOmYgz1%okK8KGqe%F%== zgjT`=!fHY#o_q*X2(5$#gr)IVOBu;kBv+HnhN3=-FnTEFlT307$yp>@NiHBPBdjL0 zB%psZVG3b>0<|{*GbtsxjATn9G=x3Cjqp2&)O%Nb(_!B1|UCBFrZ&C9EQ3qsU+2Xp~C{s|Z;#SqY;ElL@m3^9d~} z=o3v?Kv+gtO{k1PtA#L{Fom!*74=nwrDI7JI1c5~@uVSS6HxXej3P`X%p%MuEEPDB zN)fV2REjW)Fqtr)u#~WhkY$i3VH9C9VHRONVJRV-OrC^U(^1YRWHU)mm^GX9gnp~= z_{wh;9(P5N9JLCMwW5S(HR)HQPx5NiCrcUiY>hyQum-JuYlMvY{Ivp6Q@R$drKBlc zi<9yMCYh{qCn(ye+LPy)4r#`Ih~b z?7=07z5 zqj^G$H7z!`C~R@A#SbkULPJC6gc>bfTL!nB-EwWq!!0kgyxj6?%bJ!QTTN{BMJuDV zU+Ye-(^_Y@u4w&U>l>|o+Kg^f)aF2&lWnTneBS0zSZv$8wtL#1Zfh6*boh7SgCnj+ zbZ?i`Zgji(?KZdD-R_rm10Os3SU~%>?W5Yqw%^NKI# zyiUtIJ=^JpPOooU5_o-S9r7+vGLuIc)E*UMc$?&{FZy_r8`y1l zw~VMMLpKaPH1yceOGDKJQ$mM?t_gz@t|a`FV3+8g*dnoe;-tjQiTQ~K5?@QKPP7~5 zHmv2a$A@hj)-Wk3saMkYq?t)`li*ztaOXHaFRsD8;|2=^))cN{H3Ll$XqvNnaQCY3 zjL))NUIer>L3tM85klP^ZjEQ3Sz7%iCWf{J{U*W>2%TG^CYDgdoYwa-&}?`dBYWaa z{g0r~3w&=pT1Bb<*VsP06K0j&6|nx|?tnX&egqGm+$3z7i}L*3YQWREp8?*q~+)M8P7B8@P!^j4JH3&4# zfwctI21Y0hMyM@}OazQfC$Mye>x=_nbcTROJZl9rp*0%@o>Red8a!n%9Xy|5?O+D9 zhxdbbfzj{AR>5`pJQfWj9>cb>9x&=XVbpuUsP~3Z?*pSA%l5;sVu#rvR?G&oqY&{F z%&$_IUlnX5dk3C9co&{l_<$v|kKmr!DwuPh!LtD0z`Xkj<{eWeF|(4v>M2uLBV`(M zQKmC@Wd`$x>-Ij%Z04)XV}Z&77OpI0?UgLnNwKmn$}=ol$!5Kj9M(r!1Roq-48H{| zVF^ku8>uW~PbkaT7-a=ZRaUaG${IF7SqHxoJPY@duZQ0Wo@0}h4eTj+fyyj+ZNfZd z3tOOUh2I9Yu|>-BY_U?nRw~=s8U@~xt?XbMl%4R~(jK-|DPr4{{p@+=MV7A|V7rxr z>?P$8I|xrH98%7(!%7)D0%KWb=K;9D$q(?l5(xN)IRtRIQv~3%gxd)B5e~NN0Q#d& zT>;NIV<}s!C@V@`c6k`#nk)K$PFU#XqcV2H4a>gejz0Mw@cJya&jVg1!Cu#202H;q z?{OUD240ccqndoL8K8OD3*)?}VX0GIb3wDs`^W=NTc20FKO}uM;8ahnah@NRT}rr~ z@Hf9Q9iGpzAUavj1Maod z$k4NGIsD9V)r>W^Xp60z&0YtMDBHH}TOfCC`z~Nq+v|V@Y87Atd8W3-etV`ZmR(19 z$>}q&iq_?~#XdaV_BLoPw!H^fLz(W1l5h;+M#9$!^-gFFCmcoiEa5@ID}=ui8l5Q) z;c&twga-)UA^eT7XC$^UFA~RMTy&K^V-pFdMt=^nHTovt>S*kre3B1E{{Wg&(p(|U z4U%sY-lejp?!SOf_vJ+R zv9DiW9N8g#M}d615sh-Qbr0l*{ZKPVH#dS=)E{%6*uN3Tq6ftG`yA=TR-YM=1lCP4 zqXD-Jz}efb**K72;*$V(4nRCT0OKr;{T5_T<7EfN#t%LY=wt^El`wAC0B}zPmOVMd z3FIq7(Er0B?jWZndlHmOMqzO>##xt)rFIeejNRn| zbBxfoH`>a30TW#i8yu_C-{Tac2%kM#Z0~?OrMDIBtqLce2_G35?T$y`h>P^ z6ti@YUIT~zwtExX{gGHdf6H)o$Cc{gdS3n{ZlN`V`ed<=J+y{RK}}ae;TcQvNJ86E zPm(5+Fqd#6VIkom!aLKj6(;jfkb_vgt4zOvEcRmir{n5$f>7+me$*Sn+ag5ff7h;) zGbezL*o%pn)67qTCfht6P*}C6add>-d)8;5Pnh*J;P2*JfF|?Lfa7OjOQ+2G9pu@w zGyS>&E{duw|k-fbHeHKK79~pXr?PX z!JC?iZAq~A0r|;H%uQroH^YmWSj&5aqAenmar1F~n`QqPL=c*C`(%(8n$UmF0>niN z#)D=J$(aGDd2_+C2mT_5s|!*8(L&7X`-SfTDp^&4=B&>jcpl5bmF*OvsOwl3_QNSc z(a)L{HTHzUXO5L}u-bdy&oJMs8OS1X;4=$A4t!=AV8SBovEhU_SK@I|vOVree_EOD z3r8=jo(A+^l?m8!750@lcB)y8HGWO_JU|CDvB%)A100*{py%+v369AP(DVSr_odo_ zrYHP!fa7y4Z3mG|aGY)rnm&N=MFKc`P~fbg9%zQZS%e9W*z1GF5zZ!5(81j|>@0Yh z*sFjloKrLc%|-ZUVs8M#v*6(Cz&-?viCqVTcanilfpbYG&{P3)VAX&MoT0dY+*)x3 zeJel(&PbYoe*hrdkD|DNH4G5mx(a8WCe~K*08Kcc3TKs`poviM?4}){3grw^3gyq6m4G_e=p2^a^K52(P|P*c!% z1ax3Osm;K88&H8elY&6s8PLRBwP3I|0fe`s!5Nf^g=oz|(;QG`kHfi?iA~o+K{Epo z-uek=RVqsaG_k{4E6^7MDsb-88uX(8P3$eL4d^ceDl8e!x>PnA(1HD^<8$6W0IG0~ z6b{xgfDY_8Jp%N<0;+5*oSB(eL;e`(8v&|t7KP{aEqMpfhXSf_k5xy|wBwyX69K5g z^WdF96U`$*69uTk)8Sn})0cMzO)Mb14-C%pOl$~`0)0H73QvzmgFK&i2R(e{95i!b zu0enD9-z+!RM|Y5YwLI~&^!yMz;oukLB9ad#J2N3pf3bem=(?uRh9*4VkdZC(4Pc^ zH?hH;FbZ6A=m+|89tZk!fC^g#y$kQF12nNWd4JHq1qfg8fU{Q<`-Be!O%))#trN~V z6}VC{2=ujlFzCMmRN>5Z2x#u|c+mU~sIme!6y$q60rYfGV8JX9K#z89J;6gdWNg(6|G_`yt?LU1gqxfpEqS>j0du z!?v%i1`JZx0tUlbyUIe~oE^4SIAez`7ZA2kB@g6CKzL6ioWZMbJzyJXx)Y97UI0xh z;W#*-SJ-$!6|Msmf}92jZ^4A~dWB6@c7r?xP=UJ!i$I1%?-jY6f@{Q2ZZnK zDD^=8|9E>BIJ>W^UVP7aOw&iwX3|n>Q#zq9O6fF{N0Y)NIIko_Gnq6qc@^q#a?Woi zhnzWQdd`_7(}K>xRq#Sl{>nu}6jTsI1cXYt%A+bOBG_S_wCcjWGbyEAte+n4bKj@EdV+`Bwmv7q^)IA;1gb zUYTEo|Em0};I7aAFx(CKSHrzJ|D$lP$-fr4`tpy#zfs&x`5y!1TDXvP`8U9SbN(mb zf0nrY`8UG9CI2S4&(6OY?k)MZz`Zs9R=Bt2e-7^L`L`q29dIG*^1lH0?)*F8ZqNS` z+#UIM!`+pC57O+03p&Za7yjqNg$&HU5B?!>_vSwU$R2Tr^B;tNB>y7Lme@fg+{`UYW zi<{&>1^67?oT=qM4R;~`8MyWQ9|7Kg3+bBwWB4By_iX-80a=3EW6tM43;#KBm-BxP z$Rlu}SL7iH%*)|I66XH`?i=$@0rFqqfHHVrz9s*6aDOKM zC8T_-xbMz?8IX6u?ZJ8LufYEvxcC-X{;Tl67jBPvfBtLmzfar`->a`HlRy;s3AV{$~DP0Qo4~ocUP(J8+-O|0~?z$@k=X%qQXE`+NC3 z{J#e`XMR6lg!`%dWq|wvT*%D)o+#Xf(oTx|;=GAa1p=9sZXUcEUYV z*af#%xDRfl@B*Y?gp08*?1BF*Tu7(F3*o-HFbv3R;9{=Cxn|6jg>ksAE$oN;vxNz` zKUcUPY2F4Gnpm?h}Otz&~AR0P+WLd(3AF z55xb5;{LZn3y?p83)xjzg8$FO{e0mZAfFTWe-xGh{|mS|^Vfw(;r>nG6>z^;_#wD| zTUdqr_k~v>&6nUpqbvL{{9lF(Ew1ot_`d=dnp@#V;s2_*Un{&8kbi`Wd9Cmm{Qo5G zw+cT7$hXD)*TNeB|37dc@rpkIzY#ZAd?O%vaf`(_0bUTdxA> z+^xlr05T}<_Tp~J)Yk<58F4kYg{|)~S!v*ISzXAWN#eJ;!O+a1;x5xZg@!Rmf9&V3$L-AkW z|8a5uOYu8^ya_I3b@5-}f3vu6DfZ+cvBmwFVm=R94HsNrEW-bDaG|>vFN6Q>aKYWh z%i;eexZvyJmGJ+vxbH2l2jo}8{ng^tfWHqe^pN64_&)#_JYL)c{|Ci=ym%cTAA*Z- zMisAz|JUK-#ron6@IN8$$BH)s@^NvWEZzk8C&c}&;?02nHeAT?;uiQnCGMw-w*c}7 z;{IXrHo!k4?w=O#0Q^tj_L$EW?}Y!q!-bS6-Ua`k!G)Gvyc_<{!|gHuU-2IJ{{k+) zL{S`s|0!{CF9VRjfeX1&+zJ2R!p)h#EAE2-@8M$YR=f}HKNVj9$hEzD;NJwd$2_C= zh45b|?v~zRK%Na38c6Rb{I~Uv!+$GWa7yof_;-st)H?yl9=PC+-uvNyA>5pKY40Tb zbG=jWCvdTb>U{wId2y?~(}27TE@pw=qwv?@LKEmc4u2gkW`y38@Z(F{@IT!9V)&bI zL6f}?!Cmg11>_O9nEiW8a9`V7hWq;71nxU}=i$Dqw+i=Hd(XiAK<`364;vFLJ2iy2 zV|Ir2WA+yEuw?uQ+=tDttOGxo-&)tkp7JNwHR1jaAZ_zE>xx+8{uA7@CUweW*<_1%p5?jkD0OcZvf;VQhv-FLduVs!$|q0IR^NX<^)ncX&yw%C(TQc_et{u zNcp6BDN;UZP9fzc?BQ?0p8Zy{+k8K)c2nlD!tvsl*Ztsz8=m#-XT9|1g`2%y%ox7Kg_@NK_)TmS9%+`e@C zf4==~xBv3(AH03r9m{uo^!~m z;hm4%`}%u-{@#DN_xpA|xNC0Lxm`cA>+8GB?&s}(;qC*wPwqaw`x(!_;kAKmPvn&G*5@2DJYV>v-%f zreRl@_jiGPBm?U)U(dj&qYG?3Ea&NTn7K1B*lTa;Om~HOE56W>&U=OV zl^@B%p8t!4@jv$d)xV3qtq0Zr0r>yl7pwmt2v5|%^Y@JT{?qDz1pfEe)c>3CpI%V^ zx8bK1`Uq@oGqA4xD$e=54}Twoh4@3Tmp%?F^smEC`eDRBfxnO7@4v!s_8a*7O<24> z3Jc=L@b?MxaZvhuU|)VOEY0sVzk|O|;*X`@ZXUzVYyqc7`Zlob51P#zpuynxR>9@# z%t`rur+Kl&ztg-_!tb)-cS*PaOHu7+$V2=-3X40e`322)-8%i@g4B^LW0n^~3o44g5WxpBVfG{T2*@VB_@VD#um9TYR zg&VQx%Ftw^vQ$gM!nr^)CP_p-ZxOG)y%}$;AUDcQ%yiN|R!zQg0*JLaAq~m85y$A_qnr&BP2Z zF4n5$QoGuyPgJ^`U6^)6?xzJ29h;#pPyo{&f5PWH}WWZ7eL7nkdz$m@L&x^D*E^^6*m9YIhWL zBxxjIPZa^wwN?uI+%`EsEK+!Q9oO%RV(A?%gLg2V=`$1F^%TY zcC}V*FB_tHq*OjL-)t<^E5?=YqK_x1rjzE`Dk^uN(Pp&`U`aiMwClwrDdj1mnw~OBh97O=@9G3@L+N_sR1kXx$68CNRdO@@XYeA>ojG6kR(7jIar*a%>@IL6F1E`Bo-A0|+GBQPRF-dk zvZat|5Pw~JC+VfD>^h+1&1Rz+plJQU(lST1w1`nz1R=GgPlp?|<#|*JIK9GU6APev zkJ}maep-my9Be4323`xp8sZ%BILHy8BcwarXn`mj^(pXR6O2Oj?5GBPCE-lc~oV=jt`GU(@U--Brt79G7R~&bQN%$QgMSTDcpDk5uM4<0Th_i%w1f4!xs<&AuW+>_Vcx67>S1W-( zY)km#5Dn@sFV!erjfkPCxv`{;YLK}tJS8PzzF2CR(bJ7aD_J|49cZb>`bQf;HJAuo z6@wu#%gyQ{Yi0Q$UJQlxdMaVe@g_1J19df;Lb0O_B&^mktkcUFt%b2_6Oj}ahpXoy zL=V?W^ zHwNKZf*3hkueQxJCPC;fG9Aq%=OHpMB`sF#<_H=o-LwR)V)24q1+LqqZ#UUO9w+4` z5ot1Sx6IKN*{d-JgtGBqO2;n3kIm&t&|0O`F0BEcvgIJ}bbA?v97qI}Qm~V%?2Q%U z6hTvS7fJUQEEjjWQGlpBy7S2c?XHbvh|E%cq4_%xJY)Mh%ug;EN^%G~6{s z8ZPAmI1O33z&x$RM!ls|i3?0GEi9CpP*!ZeHHpb|d`&ntso|yeY3hsOxRdE$em#d{5tp! zlYK`eUR;OC0ErYEUE)EDYBxhf8%;o*+L^BDiUO z9PA6t0dgX#KwGUYQm8>LKvcF%5CrI})kiPPzrX^N)OHn$s~3SX2LP>=i8>~Tda1_o zx7>B2v{3W$he`_|g%T)BClw41ny?SkU&6`FsLUETUadnLY(eiAnbR`+n~+2cEeOF{ z^^{FzbXIkFh_XfNTVW6QAX*6SNLY|F-l1YYo_`(oBp$j8VfR&Ni2@jzIDmhyS3o8IG$VDueEm zZu7txM1z@-X)vUj1kHjWT5UfI1`4wnH4_kei;b2j82fAy1x*pJ z5U^NS=|XUguFsemPS!IzJx^#aSrz)3noCAYSjngqbPcl|B-J<+I%=3KHP0+98Yxdk z8hPq6^Koea{g=9<%u%+GBTJAB3&{Xj6N}C2BSLJz{&}QrRjDQbed)orTx@Abxy-RJ zDn>2m+b(QtiL(sYI4tU1DmHgvsct2dtu1PULV%g!)^fc}T!{`B@UD#@#l}<>ErsG$ znqx^J@GjiQ2_VILvb64?s>!5MEe(hZ%>Zgevw9vLl+6V_g~_(DC0&d=-E|ZT&9*7W zE3{)tQx+*Hpj*+*j)F*+u%wx_Ynh3PnWbKl(SKuMC;fy;Ye{DyCGa z%=$nRONg^c2wzy##zq$qv0`7y7ab|})ACK8Cv7AT92@;d*irE0AbK_;N;iAac(bzPrVh%y=i4>P@0&}SMh0dxjU zIn&4{GbIs~elRJ<6?DAXK7FusDyg+nkzhE0Y?^eNJM(pmrHU9xC6xmlmyRW+X$yoH ztk?bw%Nhrqzdvb5mNHX{jfTi4b`!`N8cdKH%D$L|bY09EQdUN(C=G!@4@kE5muXsX zT#@5-FrV6G$bFszJ5-RAl<0^PVbKY*GNThbRquqP8#-Jr!&FvYHv5(yc|=)TXGf8Z zgUV1T2)oZI4y!y}9cI#OBYJgKhez$LK6nCp=h%795@Pa&A)-l>*avAL9PHotgR@;fSFjqW)^CZnT@zmC1PcriuM~^ zSIKE&T;QxGp2p&=TND`hC+gTfkR^f~HS)JO*U2<#2IJHvQdA2d`Bdwe?gMB%b)pPwR`*CWA0v$citv#BTSl%6WfSqFu# zU9~YVTL+VddN9>2>K>rYm7&rhtGi_*GG%9z_=+-7o%K2jaAty*H`utXM@(H}z(Lq0 z-d}5+3JYJ`P}%5oiJjs}thu6HfrMp97Ay@B9jq?Et~!p1;`9+1 zCzn9juxes)s4$upmlo_!j*oIeVWxrACO0N^MHdGcrDi`vG|n`v=@yBTnFc{H>0m-n zS~Cq+jLilE-d;*(XQBRKSJ#Zepdj`Y=z-kSfxww*><2HaWD!Jl1dk;1n7Sm!rH(*I z+!@j_3Fe*A8cpOgVN(~_>}uK@Uu;!tFxzAKIbS-|SYm^r(KWH2Rh7#Hl3Jt84Ixa$ z7%`1gKL$q(ox^5CnJ~_dw6il&7Seqjp02~t-_YWYF4AZkmm%eXQ_Hj>CU#Ati8D~w zz_92tsSI(gHbRP@piL@lgix)cK^_JHc(K@PQ@x~q=l$%{u&iLDt?CUc7Xi|aZ%-rG zpD2Mu+7eyKR6U_f;7kFn^%M2Qr8abGoQcrwW-Rs2HqInwLKfy=1`v<6<+wfP5fBY% zMv`HbV0~NNRs*DZo_nXiZ zD41Rd2L^&&!7SQC8kqEHVZcsEqkRaI5{zCmDhC&{0ATZu1Qa^xO0w$Y30NNS zNAoV$Dp~hR?zIUZ<<6kp&IpY$ zwdr)xY6G~|NXf@4p9}& z*-T1e7C5pbVw*5AH89a?P(oCw-9wdvo{Yf=*;w2pZ!Kkwg$T6`EL|_)x1stbV720t=V<Nwk}9tdyvMLq?4)|`ea|<@)&I3 z+~uEz1Hah_SSLsy{J>dY*SZ8Cd;pPfyx1|x^vr?tndTy;kpq!T^w zqE(4D?NW_m?oXOotDVN507fpD;G{MuUO~_5HV}lmShlCnRYCv5I6V-dB3oZDCe8|$ z$>7+}GqV>=s_NN=( zmI!WXE<<000F*622a0V5b~*1y*RAHU30pm-2k%7ol%aq|Fp)nUFu_Gg<7zWg^^O=< z2Mcz4`z+A;?Qc|og~S<^EL1WHg&2iIxfGDf6jp3Vr>8VU{&j&z>wK3sE<2mUR^){V zj3jF&GOB&L<%RwA`O{hp|zbry8&wCKjiFEIVbAcw&so zakRmLoUvc_{jg$jVOdT^E2y>L$l_L6f$QB`Ojlo>a2BQGJEc4OqI_ndRu9ca*!6%f zMlGaSs4XBH5sFm%B)8x?VVT-BX-EdGw4>pKWU>(`1QVHtVgUU;gxr zp9Mo6+PZ19zm&9Iji%P5E9DDe7NdfLW_sv)`8bZcRAir8CNCev;t@J8)}kV|*z?Gn znZI~SC#8U;_A#MVp)joFvb%+j>D?mOg}aS07KBUC@Ph#o9pSM8w_XG>%V1J@!P%g& zj1Kte97xq@uz11Ft{f3H!HRCwj z3Uha8u_IGE4M^Fs?l^06bSj-;Cx0#dDNs)6?Zwk}QYLR|Wap%e4nO2cU8bRIJjbDn z5XmI$&_b-ffb*?(PGxgc>}BRj9RfR1X&_5rsc4RlPMezC&0lLYR`j+`X}5+%6S|AG zpD6rJh$3`Cgv?3tpAp?X;n}1QWT~k?AKIXk4k7p=~xHI<}pL5%$ZgpIxZ;_ zpUMrDHBKz8oq;{9E)7s0OtW(Tzzn6fs51o*N%9O>3t<-_u!0@NUv9u|*;!b*E3`dG z{c9xS`5+p1SWoYtSa)HO0@)k|j6m_;wZb1{2fAX%0*FPONKExUHh(Qd?&7fffF z=7MP=R_vOtD;q*`;4YcYs|T!~`iJwoUrHlRz)-rwT*-tP;7}(dGvRk8P`jl+-FQJ0 zVo2L{sp73gSWr|%oyA#Uy=LewLg0P}lhbTA9-58=y9J{Q6SJ5ycxlX95~DJFWL#JP zhEhGOvv@TKcPrbPim}3SO|g(rssb`a&dp(Px)v!haa*Sp5)~-`U!>j)$GS?_q!keq zNr{JW{h3^6^KdH&m)UY64ai~*fwiBe`i?ysxxgfsgmGP|#oJ5<%kYEAoGdK8veubR zPOuxfR4kJp_LXX)mWqcI3%!(kx1>|+9cwJ5ZgNOQjT^)HE1or8j?xDhHWv=!;`u0U z+k}!CO-QJ~LDFd~iqpv~Fr85ZWi02m=@B9&bveY^g$4S_U$8c7YIXqO-hmiNpIuoAMm5P~jTI z#aZ|3a}(n=95ZY+aAObGN7b-1z0{oJt-s0A`GfBK;bgTQ{DAwTh>Y+7?AYl6MVy7Q zM-@x<{=adaU_xQ%e4*@_4@itJLZW<#aqdw8!K4qwF`*Xbc1Z%%Te(8x?PWQzmF}Op zV-ZR^a))lf8%HKua@5!OCWmrdWmH;BS-0>`muhpzs}(E+={u0fi8dawk`YE@5W|M5 zj~zJ8-NhKc1C$-RLYoS+)J;xG#2vff1lsE}7PKr*4Bp(|m zaS{>+Y(d82*Z>X1^wLzT&6gHy8>Ly=aoe2Glu&V~G*odO?{m$l+Q46DgKR7w5!`8* zN`*CdDtM&PZqq&quzGDi4QQHR5->az;AR)$^+mm$Pro$J26eXa1FKN%Ov|z3nT9b|GivuyiV~azfjBwlJTr}x zhWk4wK<_&0riPPVxDJZbsr54nR6V((gsDx=RUR%?n>fl|;@b#5o`weOCPR0_6H6@) zIp!PL>pdbj4RL5iq`6QGgs()A@tl9ASzVAwy@uKv!4&}<(z07M6gSRq3zU=W;ihaHwi~4}2&W;UI#`OFC>o-hSv0aX96~u;#l1*olUh@N zp*WPuA4hVY;?kvsw~+AEMS|CdTBZ%-oO`rG?=2GoF2W;Dab!5L8bj4@A8&Dd0-6)` z0SA^*RBITghxxe2!3L&IJ;W#1b9wP&I^lh_bn0;!1R*8Q;yAX;W)moYSFZU;gTY%O zNrKfYPaY-NOtnVEzMR5SEZj5H48lxNw}T-qY`&E*aCH+`pWTrRw0&04CC@RihSPZN z$v;sg-Io!g&*GFL+7X;yBiCARFEQluryaeSMz@YA$}aSTi@SKCg zT!0Owwog;zif@sUN8+&Mkr*VBsx<){4GtyO%a9PF1}a5?rYpR74#lgAJ*fIT(HVde z(zl0F)$D`18rPxgdQfGWO0Wmlg#x<`#dk3bxQD{NEI~!Ccf5GCg!2%(7gTnK5Yc

@K`eybXE~*`&}e)#KRO}BdPN-CCZjg7;|;NII)0mt(KE+o{wX`VcQ(}otT@b z>-pNDHOk8fqtMzlau`>`0q8Dv8pQN`&ItBI953MfG@fjLIJAd-TZX6GKm|Sw>#coA zB+-{?qBtvn!tq%389dA(Pe0ipE{ouznj9UMElPv;SekgvXn7>TnT0bmjj;xAZ-EAF zt^WR!79gut595OjexE#S&pRGTMZ+E^a}(af;sZ`CgokT2^|}nCaC<(2UI%t>JMk_7 z&X&hf@`6s%#FQ@Y?toe5s^>*`d#trlk_(J1$17UKfcpHq8w?A5ddN~$yB$s~>ggzSO=sms8vP3~{;c#9}-*$6FBr@$!R1lS}Tr=Qam}<#ZF1l8gf&CaZ6pAGNQQxF)khc`0_#vyZk~Bw2@s}n;!2`@ zKyxo7Ix3`Vj+2Ilq=F1#303>Dv(c{XY>Y2D6Qx~Acf*wZZ7dn(1itP(Zuy6&iu!m z6uXU9|& z*(B-cR20)rv}ljwvk+zm@ zQK5!RY^V@7$9(zlyGBp6LT&?ro77S~pOymqWwe^Z9C6m3O|vGnQbY!b8xUCRfN4nKn}OPh!LQ& zbPPQ^b8xFUd&Ha_W1n30f*@PB(3tZRae7SCZ6%4Ql#9d;!ZdC!^#w9n1~_Dk&5Zj{ zs*Y@QXGxh9uDz*p{5r$8icJkOG20kIj6059twW%y=19=D1Rq@^n1fe?mw^e~uatyw zc*qx?Y41?C0<)>2(lU|0aJ+KZrPWbZ?3~mZ=MKO?dJdF{mx7?G=(E~FBz6U0K$Bd1 zShER5Ld%pn=_Tj+`dc+6h#?DQ2OkP8-}IZ~V?U~2rnnN)P@m1^41nTTM@gT*6^Pf# zQgU`=nS$IZN%Yz_MYcBLe!OeDII7)a92F^#91>yCa`J-~5NlCjjSeX+Ee^9@8<#>9 z({+P0J=Upfpr5(cj@{1-{X`pI8)+h)hV%d~{dPqN<-k)olq=#CgJ54hZt?v;kx0mZ zohX@IAUBvF7C$^6oH7Q5Vgc?{bB8Wq*vimn_c37k4!7O#wKg`+Z#BzX&G|vIJZKu_ zat%*{H}x538>(msRswwz2+N-4nc>!yO&e}y2!yxJvH9epD)rf4HyUm`KrQ88u6Jth`VqYBpA6Ga(UqhwG18Hu8b!t6YfdwbC0x2!t4thj0~J=Jvht2KgWC%+=ekXH?TkV~ z#KxtOK00CZ78b1_T(StnTp>6+l9Vyk#k1=nyi9`w8Wt~&irlc- z2Za-RK;gm4P;BaKGsY|6DKk=0oCxu_mupvA<3}FsWbGed9@ne11~N|0Z1uKvMBYTpDRhF$ zsO`e%Q8+ssCG4VPp}HjN62S@{)Yh|X>m}4-hhXQ|xtCn#AUc{nb#y6R)zs9sH236vaE>*bQ)MpD#dkrkda27bVwJ}ftAfp7;n zfxC_RM!AEW%s?J=cO*3l&Id^A@L)1}GJL*@?H9b&0~-oQQsdk~I~=JMgklg{c({;T zxp8J}{^Hvj(SaBq{X^Fz5B<_fhq!5+VgP5E>2o+tNExNdAR2)!37#~-8wUobfq8tW z;@&13X`J^nQHzZouHi#Hsdy|~=kWF*L>Zp`;Yk_mpTz^7*iSB**;8h=Y-ZJhIV`fy zzBeWQF*AzKd0|luO;m6|zaMr#)Esfwh0ZRGFDydTJcv^}(qk3?D#O7$5b1Gz2dstt zeq8H=iwk{lAC!vK_?wo^`q}WIgM~a+>_!yC|6~Lxjc{-H8MDE{?voKG5a0bw10_ch^bx@{22PBQSXIfmS@Jh|>^wAKraz zOU+&ARsaw=DL@>+9Y1$wz#T5}M2+!>p3A?YCaJH~V+dH$wN$f?3Z0%hVr5ocC zT%?kVR$vo!FWkRD$jO_>@_8@OfV}1#e16Bhj0nGIGXj%Oz(765v!?poiro1D$<691 z0v3gDQbga4v2XefgM!GH6LPWP}ofa7== zLW>jRa59M3lcbP+3C{h3KyhANpPVA#a1DD9dVTbMJOH>LPbH>O1#pxWc5qA;sdNg8 z(?CLWBq1b9aS|q>bP9pk6sh(`Z4C|b^#_p6+tI#M+a^=(l90`nZcp46yF9_c7W9B^ zQJ*9+p?0kY^hWGpn!SI)XeqMA4@&eQlw+h%Ns}<=mz+MpL`v-LrAm~km%?>_P9C?z zQx9Aei{HO2;98)m{ZTcTYIMpVLHK5BA_~e5keeB)Ht|jAI)1 z8!ybF)|Lnekw;pk$h0h@pF^?}iBfZg_n>U2oyeW4vppeXkLx=?3nfDF!<&c}iJ4 zlT>1$;dzy6M2aPK|)U5kysCRC}cCb z1F@M0K$iXWHoXVdB?0@^aeIt}*8$SO*CkrewWnaQ(j&pP(J(;hcNU}DVomvcpUUDW z-k!_t%(&!kR`5;-)ho0+or>^|{3Vb9-zTwiS^GJ}MI)zm_g6T`~(d26Z%9@419>-Yp1OOL9QL~-~?soL`Q3LR;rE9cb= zOmKLw3cYKEMyKIYatEj*XkXN`Bclabm>XvWhOdX&uwA@S3@BvcFw}i%lswswxmV7F zOTbR>nCvwzQIM`$+S&n%Qn|*&$vlkdLi;316lAP#n?!~X<7`7E#`y^kZI-Ag*wM@m zeBsNv77^6Zi35l%(QnXwd(l9#Fj;yTjPX#jk`@#NY?8=QRpac()ihwgNEZ!s_pG)L z-AWbubYE;Ew>v+(>dKe=KCng|E~8H;&#!AkS+Kswo}wr>Qkn=4uP-(0vg?nJq}ZD> zwr^f7)ujHWfCkyt?zyGqYeX@ZFIN(V&>C6XB?#PJ)9=D{ycj%tc5CJ-VZyS>3FRBZ zvuE+WCwZti6h&CK9D{bz9+3n4peuO+N-yGY>~~j86ld=CfepDUP#TnV2%kTU`I0Lm zfk`bP2@Xoq7@#>tg;6gD-7b6SRpkZ*eWs0xYqEid5|f~xiPGk+*0hf#?bD5lmc(9S zzL1Bre3Z5#1I?!6y+eFHO$-L1JhdONVd~Sp^AN9Lsl9Hm zs;v!*s6?{i4kAVQfcHQ1_l=X75OVF%Z_i|my@cZ>u-T84+@s?#xbY2fHK1|lL=nu*F@D{N-6K?bCLTg?e2V0N9|7T)_RiJ` zo0tBRA-~3H4oN1Z3KSM%mLnN#8TxZFwhC%d@rPa`@{6p8Qdk^jTT|I2MH&*PPscd3 zykEp>JNDa~Ea7{=M!qS~1rD=Q7brl`KFLcipABkq8)zz@39gi#EbD15y!oz&g#1Dp zc3*zlAX}kNf%3a$>)J}6X*xl!CKjM=zg%o|sf4C$`BtXS7}}#fiX!5UMqrPaY+=Z; z$W0`tzK>M(RsL*meO@^wexZ1~>3E?e*%rA{wNIh4P*`Wo)LP>L+f7&01AdVXZw zOzy=D^JAsR<;LGqkSpE?yY$9`vRmG_U}cOL9D4B-JO zeawAVg#6qIbCJ_HsD>TO@>WwGw9hbb)9Bn*b8gTqZ8b}S=G0bm3g1-NYMO&)S}7d@ z0aoE5RG8Up#}U3%?U@8@Wk(ur_knltyP34E~)AKKx^AoNRwHTxt}vx)D+0|va|fGFMk$6iNF?^l$=W036t;Nr9YQ#u&*N-bt8jq zqGy$V7j1o$s8hF&%`7uYcoHUJRu51E*F?EV145S_R&u2E;`j=5 z0vImHhp8aRQ@BnJZpaW;ppH1Rj=kgv18Iv8{91pg1Otp62#P2fDC@Ur z1&$QD5#Z+6l+@ieCOe_=!`d-gy{P4qQEqF;vD?NVF50Eg)HpI^l|-CSDc|`~p$_pJ z=h`;rm8FXn>l0$9S?&ZYk|C;HUB2K3PUP?vcsH(GJ>fR?Qpa0#`1paJ$Z<1!o_|oP z#nu2cM>D=Igi;_`dBtlhzCaeM5Qf+6Q>2Y&6@$>tXeC}e$Ej$M4s*70SE|f4=p2Q) z&Z|Zfbw*eR_D9HneQ4YH$sFp}6`1oA?haYWTFD0(BU^e}ko9_~79&tS)dTxMy`=}d zG)D@+d=bDd149-p|M10RY(nz61l-NhE22taxD>5D%HY*TWMBUta^1*g(T=PE?^06K z>MjqDN3q$w4*3q*u2H&eio;K3e5>Z9KC|yI7Z>QhGUuPDAr{@%J4PM2@= z{C%meZ-JiW#~^ut)qb9O{)ESQ49<#p7a%2gofEJPgIXu@`wE8sO zAXsX<)qP^B6@EKU*jBzg1`DSDxHi5$9)-3sp?r(NoHAw8HWj`(0Bx+|E~M75!)8j& zdAvh|ea`rV6;U+U3D{;Dcu1&Zzy1piu*B1c1~1w!!~QNy3@{s-P%&q)&x+dwqUx2y zN&;h}kCx3swsm|9cJ>j-JUN*IaT&5ir*!u0-&*A1Fs!YxWWw>c1%8(k zmpgzcs|j;}h-+=HEKc=Uxp;Ad2FJc}tb~~6X*dM1b;16j6(-?|izp`EZG&_}7}wwJ z9y!L`eOF16!PrZpYwEZ8pdh&XEwcctFV?S^K6seIR7~R6kl2-|5atFMi9siL0u)zt zIXCGz;UWv#nq7x^7SRP6Rw;)|O{DF@SDFInNO4oaf1M=DeqD0Tpg}mH1BHkyyorSc z?9G71aq1V_`aH?INJEPuRpC(?5mNRmXxRp1eWWUg!FksTk<^AQZ&2KAcC1W9lwh<# zq1%8Z!B(KRhQ4mw5CQLzC{G_%{O7>j34;;_2SZ&ti*HHubtRD%INMvQiLcD>V}QP3 z_7v|Cd0wDm8X$6hHWZ&1#30mB2sVGpdc@uh+n}#|o0-!^xdazEI%3k9PslrE{>rpq45S8<=hYRC zVz@5TmQP3!=5ICni2;0zM&dxQo@!bg!Id?h?gHm=@6w#Awij@GmrSqU@0PM*2v?E7 zri%?rz+JCOTCw9VYv?9sC)Dn8T5#7}`iR@+Kk(r0Wk8&^Z6l}k^{_fF);09bySrW{ z25LFwS`C-Iah9BWu5vlM>aRdo(^sJJP$7m8Ukk>ue@GJ{M9={7Op*<=qfGQ9HFuSU zb>fa?#lG<4uMpZng2)M%tLt+7YHH5nh;jbrBp?0JM}kBJ_65$I#=RN75eePZ`8mWE zF`;E~gXE5V8E0UQcv5i$uobkVq<|;zFtwI=+lA#h0%=1yyUTuphY8H94kB0eY(Vef z)f$x(TS3y5lj5ErOIA(}x|?@#|CJ)Z`RGsTW|Jife?>3OBvKp~v7DJJ3;;30*U)ew zC~=+VEsXf0b_;UM9*fm$bm=fmG?=Z_=wsW}sMtHKWxZp@B)ls)J*~-zd)_tE&bW~6 z0S1^CKT?+gse5$XBxA17BhZ<<_9EOBVnScp7}@90JBxC0aR&3OyGE$sxI4D_((A~d z&J;zgk=I$vqLis3T>RozlF8yA-H}lo;}{(@_6-cqseD5OjXnq7!nueBV&w5i{4&;H z#}L|xxX{WNfO5y_ZBTzOM?vV~!0#OQxY`W}ap6{-2~m^Gh}#f@IjzCp?UEE^hzyt; z;BGfMYn`yaC+#mTd~&Whp+6_}=RtFx7dy4|7ONmUV30p}1XEGD-KrYee#EjH7Tb^wvU#IFBe?Otc)CP{ zU>jLxZty40d+@=G~7;T^UoU$rGI-h_vdzTTdi z8{BH}Wp9v#E?-1Pgt=dgm{y|$Qn70S;|EqZ$@y}!C_1^?8~ADy1e`P)I%&9#V0FiZ zMw>79V2*2H?$Dj6YW*088+To$NK%H(!)@I6hL(aW_|idV+W;!`O9!H8iPV~?Lx{*t zKk8nprcKnHe8S7Zt-lfY-9?B-J)?%p$_q? z*HS{E=p%1VXCwTXh-?%@TP13sjD@|(7+{zR7qE<;YXlIcNzn|(sxpG5 z@D)zqeT%`6$KeGJv14yc&>JG{;(V-Hny+JDwOVfBc=V~I`FW}YA(_H3D!eG+za;Jk zjf8~4n|`&c09jh%g@Mv}@wGy6HY1ZEO23gCV*Mf30HRJ9Z<4tczdd*`1Y!4Z>A|3;7TaJ*1^)HQ8=!k>IXdXt*mk)Z>q~Z&~~X>Z*jdyFQN3MO}XL^#i+Tb8h0*2bp28sP(dxU$O#g*g3MtM|wmr?_=I1HtSc z-04WiXZ`QTB;w!0(RkgE$J>E{y$&_-WdgfJ5};O^;A46NnBpHcC&n5uouY07;{jeK zI6)o)13{U^Rm}+u9bb!4usH$Q%&~y}bi!R*CV^r0gB_+7j`jm%fhF*Oa1=7AIy47& zXmF6U?&cUCMH_1@;F_X}E3g16Bf~HzFpUa38b#``XyZP59Od(Wo?b z9F`tbBtQI|YBWI*nSel(@$)hoZ)b*yR)ae^6>i{^c!m?x1aL$~mpvU&Qi{bbTZN(^ z!RL6NMrkuh4N5OaI!B`+g3Xzb+rcnRaT>+dL|E;`$c~8_Ryw;e>hM8~Vd~LW+t4<5 zV|J8QM39gDrr7?3mq4Ludk<@}R@(ieIACdS|HNlA@Klou1uLpKPy>(|ylM)O!({}- z2bz`4<6*mr78D44-+=|IX+SNP!&Fs(F)`iZ<3GBqdT9{8B#n0gCDCVjQ|aE*XP3bY{mwPgbK)f!e=0ipAKTd4^Q zWZOvG>SvVfE~Hp_b<=Nha8R^}$!*&t7jPxENam4+6K76}DOaudhn(carYYxdk(9FX zq3(jwb>E0qWq`sMf_LcR-+K0}$c%$#NG~-j<2ov{+Lqrr7@fX#XzzWqxE{fmbB61U z`tkyf20(?t7KAgDLMnu^c9=`bbFZP$1&yDjIjI?_8%&9H5$-FXrva*AQ6+?SpyGlZ zb%EKAO@CXbx6-_H0@Fj=utr)4Lp$4!0hB{;TPB_m2w>blzY~y z=#wyx!@7i9!1~JysEA={D+BLTc&9z0e}Y%De+gT7BnyZQ?W(+NA_NHLcB8{70ru*S zp#L;n7dXE6)di{q+YvGDKl;`YLE{R)>(&7d-vjH2kco(yvX%SqgZV5((Ns-UePI$Y z_2{cw*6Tj_<@3-!M~z;Ein|y#(UKWfABNCNyK>T?McqZ!MGTqF?leG&7GSjo|8$lf zgVv29VLUNgb7XX1LYZ9sCqWa`_i7;_djoR7q8N?iZYEaI(7iDKsDYaC2f2ZwVo$t7 zf&$sv)32iJt<28u^h&5KJKQ%q{KFIj_Q{+9r>i2_Q1&qotbFm3$be3F!owo0_ab|| z3be92OnI%i+>XRUd$-NbmY4889n|nHIXhd1dGWhx8L{D3q+LpP{Y9ymW-u_W2@{-A z8=@l*s5gQBGB}H!XevoVduy}!?2f!fqA%ma9CwlO-8hKj_yv*ovJFp|Sw9>ohV2j-5f& z4%e5Vb#kLCnuB&-S_?{Xp52$0=Tw~MzDvtfHi}&lj3Vaon6UpOjh;U_UaHy!HH{1= z3J$q7cvJ`xvkSYPX06EGYsR3>(1CQhhPAE+k|w;Y6OUj*NtW$ED6Zq6d8}%nmRU~0 zM?wa4`_S1Z$Q6*s)$%fA8lIx%RSJOgEP%+(D23~ZPTXrP47#TB76j%UmP-Md)d?)) z9v`VHh%P>fj`Qw%?w-#Q$w255!0wK+xiDBr2W+48`xgSyc}8-@VN9D++CHcXk5F%g zN)8_-PKSL5GQ;x-Z9N^)r(`3`A~73n8FBY4&P`)o*D9xWb|DIR7=#S#_n$3Ho+fuV zP3eFoop8C;5lo5lB8aslieHz)k~H!HF?{AkQoxkJkJZvvC1KpblAZCxI4*;82wF?z zKiV$SEQVPznhV1OsXm#g!i*$^2uw9_F;r4O&*0s(n$yiMN%b6*vbgUOeA{&4$MMs) zX9oZpbLWs@!At$vj|oqG%=4(j493B3Hq+w7-2<#5hM;A(qIc$1y!lR~mT_{bAfij_ zCB1S1MN*CZ6RiVyj1JsqjsAKqPt6ca8yCmMY0NO+V52!r)tV^iy}FW#f}-qj#T&F9 zRuDo%)9FuAwAjt9)SqSertl1)tal+VN|mX4Em~;X(aG z1FR{$Tf-*|sm#kN94mD%P~F`G8Z=;V;z}-ft-?!_E@}^OXf7n0$-y1^yTkr&(_dZ9 zh5^Bn8%Li)Sn>)?837-{0tvV;BX{Q3nv_!}2X!Gkxy^>{!qzQ-nO6O70gO#(wiM~* zH`FTYUy-9+<4Qw9D3ZF8FU0Im+V&wzV8r@p_xC0X2KH5Phe>ak%akkY2w05q?w{@v zM`DG|vQWHNjfDjlE^aHC{RxpFzm%o5L`5;R0#!s!ZnxvI-C_&2f2Nrn+^)ad?C*B{ zRm|b>K^SS#Pccfed6r*fF~e;IN-nNf#k8$U5K0#oy+)K}Do1S0+-%fZ131630FC%8 z2+WrQjNz8GlxDpw)E;``%2?i6v&TGnh?`T2+Wgo8tmP!V6aa&V2DDvn_2QcfBQy-C z+#XPo;JWBndVaIkLHypu6c$-HQNk~6>KUtGQ1hp9L>BT(gM99Tny>?E)oTm1G_H%fTxbruxLf*otXciO|WvJz!$f?0`XR=ZaL z-fVG6=zf)|+=FAnLNsnQ zt7RclZ1@Dt2oF{Av@1SH#@!EmZw(uToIFKr^Lfl_t+n^jvGHBo$94_xxO?ZlJBRPy zaqqUlyLazKaM#Z5+sAiq-7&IrbmSFgR$eoxmPK=-{zz`8jc5;q_^r1th<$DA`Fpo+ z-Fk0n+ueh1zg3MNbPYII)mSj~pXo`LKt3K~{7$E4_d9iBC+y^r{=^Un7Jcc|0a}{VrQ~|w(F_N4v z;ch6euafw?#0cS7Bjy+|>p$RO3xm|eZ5Svn9Ytl}u6B1dq$7PNSn9>+cS@(Qje^@? z?uk@+VhEve<&5+1W6MM*zW02G0BNEDj_!~vOd1rJ~VycV>`vx0K5%}mJcQMY5p zG>TICu&crAayC78RIrQQ(u@`;ts2HBQ0mKazb$F`)GQ&T`pZn9%seG$q*Xh&{H-9> zuPn&jkxQj>KwP?!i*^Ayao9CaV5%qWr=p9ic^YEt{4r|=Qtig4l9uXnxXRyJ10~q1 zp|@JH3IM?aRjg9eHBjG7PQy-y>wbYY*{BY@K@)b&3})$AP~XSnb|AeY~ZGm@n_A-nRd$8pzJ;SOIm=^V%X7EOm+tw^K1jAN$bNz*_jOb zH&&R|Mu7Dn*Ay-}Hk-2PcgB|zu>Qg}1CH4PZP;vs24!#WBg|4@Fpyh=YzEdAb|SS? z&48N&WV#!85qJC5$f6rC1h^zXo7=0G0Y5skZ#U%?H)C5oQlXkilw8(=dcDO#r5-QV z13`emg!MpMP|M^SKdPhQ$RlR6IwsMIC~s(miglfPaB`!JN8KB9ZQSQygi#!?A*doe zaQyJTf%$=^f3)<%De+o*f-@id$fX{hYh7~IP$#xOQHt-Lj^(8nMD@2;T5b)**C_wZ zh1k-*`~FzH8k|1x-Df8C3~*+d$Br5gq7Iy2s2TpZ@|Tll$>0W>>Blv-1TGH1N~mfU z@DDeXOcjT7ar?>C%rfFjW==v)_!oF=SAHA3zXV?y7h~#DUK8c=+FMm11BkF{bzF{*0 z_(8lRV(#dcV#*vv%2c{5A2nOe-DW#V?YVlZc^=yEJhKgd+l{&YQPjT#Z1WNkTg={| zcAIAx^W4llOuqwv_o8Raza4)&@wdyE8;61SMd>@S>99P3GR+;&L5qnWmhEB=qmOuM zMS6-YKXa!sw_H4x*)(dV%wdciv9cf7m@(#tM`avw^$ERb1F{UC;P0~Ys1tMr+;SXC zXbt-|&)(&?O3#m?1yx{@- zXbrhy04X@8Ow0b`st$781DrJABdy*8dT+s%d#K294`>qfxn%;mU?jGE)zKoglB-~l zL$ArB#2xWzN|W$));)<5@EKFILVcsCwJy0DsCfVsec0^7FX5~|_>LgNK9CbEe{2~8 zYz`$Vk1)?7u)-G1qfc#PrrBcBl5!>a5BEHL8)I2OuBC)oKxwh8SwyKVlt?N)i~7uE zGeU1>WtGJF2nOsd{*Ht6#>{RE%ux{kIaGVr974iV=0*62cfHLq^8gw?j&%2<^GjgZ zIs82cCftowvq;eZJC#w^Df}J)gB(H`M-j$tVf>v#`FL0o?n#tFLLp%(v3ha0h9C_m`0 z0nSklS_A2dGb<^9&?a(I%9-syU|tNCzZ(Lf1osj15JrWgarYYVTTRb)O1HFb(N?7(qfWM`r<(2!Tdz`2OQK{YRkG)7JN20dQ3huWiaRW41rMa>1maC)t@e>UbGjLN zwDOlTKnYc)lJKGHG`X0{P(KP{@lK&i56{H~aS-X01gdPYRBa5W51p7;Lj!QvRaYN} zf>N~~s9~EpX|YTWF$tZWbx;lyWeEuZSKbjq2iFt*u(V4mv+|hhZf8d*G&|{sdIy_F z%F*V<&B{`U8w<`u{Xi>cHKj$4SHCn>XDXJ7#%*$=#_5Bi5jxM!}V{@>0=lu1?D_bNM9V8E5j)BJ$ht zw;i&8s3o5eH>5iAitlBjNOP}p_-v#_aKdCQ_?#blOP-j9&*>_VP2=&T!YM82rP;i* zkREmPnYg6>LkUd0nLXcKDTgdqp3o`mh6#(!m!YLfZl{FU%mbY=eg-vi3`xKocg|IZ z@k^}YgE=x?2F)nj1G7KIm`58y|g~1sf3b~bBI~~_bET!3mvJnPGTPV z_o;aX_=3hieeu$dV?0j@O@&#%lbcjaP@UeKacegn4OQ}Ve(KCOj4_KTNGX=<%}bPA z_g#8j+EXvthA%zm5#WlG2u=op8k*pIN*eRP+T2WD@8thW;PC6y)aTneIRh!dDQp_$ zlIJNGJ8?OUnDpv@R;0C)n4bSn{@Y5!>ywaC)Gy{xJLeV3EzVWM4d+7hJ(L`m!+x`T z&d$U<*7#GGK3bi4ClykUikB8<|G&Mw6b*b2?IO=`#z>Vned+Du+(CW7&5l#R85die zPf}%W>`ZBH>4dnpD4i2m=BCaxarxb1Nf(?kz!~?chT-N!rGic60W5!qL5=rgZFZ7t0j!Ir0UH5q3QP52%=U)} zN7{$M7o6#JO-0yI!Bh%I*LBsdF5_zJ`LLnA0`@VkxPpHh{dtszxPBLh8QNJQXt4-7 z7L`9f+Q~9mIM;*_NBQ(K{oiKByYA!S?m>X!}qEgnhE6d?g&eOw0AGtBJN|O22x}b@H+$$z+Z;Bn$1U;9O}ZZ9P*S8)`96+P z@!kZ*>do0$s{P(%w#ki9l;=7JOQpP%N;2zUn;h20P+v?7j5BwUGAK-R`LPc^l55xY z-F>mNsWzN+Ejx~SbO{@lz^4UITx}A^Tx!(7di}B-B9*!J5T+RA%8ytA9c*D@WGQAc*=KE$R!JSwF))*=CsO}Vsn=%SDFA>nC8Of$EVs7hj%K&Bz% zlZ7co*lpCfGxW3{t&Zz)YgM*}?8&u&3J$aK=5#|T190wHaLdU|8%a8eB?pbi{eoJW zv$Ke#8HVOxQr^YT<#^}&s5WdP?al;+rX*lO#3P)eQ6(W5bH&1pQ#I!L6 zkxo%g<5Iupj(+nT5$`$$(7bb}q~a!wxyubsn!ZRjH0!f{6x5_t<2f=`;>-kGnEVsuj7f8Fa z4Jk=9cxibesk-tePN!~d%w}JlTmz~dSq8n0QXvf75G=lqfxbH#VkU!r5D%_S{wisR zxU3ek9Z;1Goa`wZKzb{GN3#=|Uh%EwaL$Jm2UMqZ%a-;w%4TPnqKHYSAcA5nQwosN z;zn|O6%m{zX|`k@mF^UIEHkD#$IHy)<^=Ks#UeZD@|4j|@?YE{E;gy6^<(=J^nP`^ z>*k(xcmVT85Pm`P@$+_vIsQB(g_z?f)rid&QB@;e9D0MIr&<_W9=5GxjjA7#X$-CG zxp6#ILP|1I478)2f@Pfa4E=DYKV=SaEn<7n#?%Y^}_Pn{k)x;i=Qq~)f)t!(LiocCE$ zV6V`o&YscK@3pC`Rl=)64;g-QI!rjnkiR11?HIfCE*?|igmg7M7b_pKG7@5J#O7S? zL@>KZ(jdABQ)Fv;5{vGC>U_^(;QXw_%~Fma1t(jQ2g@W{^;86veA;F2!5WAILWbfb zpu5N%f{X9uz5w~ighV1$J`U(T@au5ZPzH(N9-oSn6(@K+Xop;|S+A`AM^&HRI*yz0 z#{Y;WP~8l+cap2B`5af`L>B^4vzGqtqcQ-onI3@wStx}1$9?_NLJ_2wd9=dpnSd|Q zWp~S3$UT{Ay%|23>LpcY?)Xt*Beex_wq^^1BXz?*z^M683%3))i#nX8?aaHS zTdGt!H*w6@%#VH65Sz+(Bk`m1DpTwAAugQOZDYoYmBl!U4i#?=hiXK4W3#Mm1;g><5LA?uAn01{rVZ z7B_-89z!DWn2lsncAskpGPt?v2m}sIY+VnmUEf`Zm@VA4;^f35Tw2l;THyR3@#~KQ zoeA2grauZ25|FuR8hL0<;si$Fxeu*TTNZNN#0|<|zoHf&1fRJ%9h>RPbzF~8OXUF0 zVEUrL(QM+@-7s*Am)H?zo#twtBAsF1To>!XBv7i<6KMrGAS z)J+wIeOs0^EH&8W{3u2+PZM_%$GU=L+a}Npasx3yOQ5cEgg=m5gNavHa$L3U$3Jc>?8oRnioEQP@};9?tR`g3 zK!15a%iQ&-$TW_Ws^}y5Wxpyo44_=Bb!i@1Jz~>>GLjN0j+500%HP3qlkY_}QAy&q zT_`K4!0T8CixI}{W**2;3{u98;g5Kl7Yc#|!GFK_=dJ(w;IS?HUh|7f+rLDz&ygFSr*F1xO8qNi`=>-e4Q z*|>ThzW}fPmHqt(BwOz3TUd8p-^yxF-z$IWs{VY>#+Ao5uDk*N=X%!_3aC8SyP?37 zuGdVXRbhL&W%9j!M+?1utEcJoU*3D&#+5fB`hH-B-|M8-PihgLB;Hq^&>T-l;OiRrx{}8y5eu4P{hwsv zPtf_gAoY_(@X8b7GQlhRS@J9UIa(VS0_G)@>)X+{quAfGu5ZT`#L%Y**vcY51F9M- zGW~{Llj|GWuwk7h*s!5s0KB2Ux5trB-^$bL`<}T$aXpp?seWH)EJnaaTZ;MPJZOb2 zepPve{2)qGyur@$_o%sSv=6R^rq-vNgD4j@Fr-_Uo{ zx}krb{nhc&qu;*{ocjImoH;SP?kBE!`S`bPeAVzeLmI-+zylZlD?mqJ@AVu#1G>uh zZhT3B@}ue;I+16n@@ z6aV$Cye4;*xy<`FgIs#hW~Bc~@B@X(>nH~$(={rl)jGpz;+dUto3fB*+-G!;=<5Wx zj4d;W{%54+=>+CFT4X!G?u_p>JR24%+8%h!{Nef6N4zSZ>`Hm+{GqQ7W6w3*zodYzQ9dY!O} z&Iv28f#ljuQMj44T*szRw8Jah^BRc3%~yB?a85ycA@Md8o&z6fr^qb7F9P7*J$+XJ z!oOPqedYThidJtxNanViK>0m=8#k_QVKeZ9W^7!&O#`=)6rU+n2^ZDhNx)SCfD3W{ z5db#6oPdolXUD;QBFp)^{%W8SxVoFrjjMy}uMx2l!jclayMDct_1G2QECjDXav3V& zYvH!9Ujw*IkYsw#4WEbzVAsxyD{q!aH*cfeMJ)g&v89j}Z@#wwGM#hLgdD1P z1OKkTF2OLL%RpZk< zeVNGpzKu$~$RvQL1Ar+ut{Mk`mjKKeHVeG$YTw4bjYT$UBk?%V3mo7_Xnj%xlM;A9 z0}qf;SC2A)9|@e)z)2=s`IaPG`Ib_{%9E1!Ag73;3*FJk(DhqDKnWi{b+l0B{TjP92up6S3eeZ;p7eR@iH zuH(6md4=)mI~N_-xPsgj6BNKLo%9k88{!wcS%kKCp2|W|-410@e%)5+g+@#v_c;;z z-vNsNQyah(L>RSYj>qQ&^(&tf zZ#{p7sNN;i^sWMKbD6?}z(nCgbT%M}>ZnJd5zjQxMxFGAW(5gODSXX()wz%YU8U-- ztY~#HX};-MxBe=Fs&Ak`Mam5(FY*=5V;Spi`078u^14qyxR*?K6-5JFG!S@$JXpPo zQ|{^lbm7&9bDR5Cuf2})=To`OfG!27GTG|2y<2;rqsdHpjg)l_Cjn{s>a{k}W-0g@ z3R)ZCCXrQW6;7pE-E2kjDl{^xrt9*(n+!xU9F%O>+@GZLIyx_xBHj)BpQmqinZ9E0 zO_&YV_1+|kJhk!F*GTLu5c{8GjuP>Kr6nnJ^|aE{8{}v8L)1)GSAn_zlq1a|5eexH zB#7s*EG~IgcSG?6DSQX0d7gMzchf5r{~alHx448LpBDWbmiPa+_Z|RI9ozr-UD_@y zAS|M&plh$_Vu`&g_AZtvD(YGy3IZ04BpxDLUyAj*Y z?{ntvT^7Vd<9jdv_x-;u_f9?M%$YN1&Xjv6>;s2dn_nvvY=FIs7GdT3o-r$G6Sja2 zXj+wfey(FgH>nvytudBar7KN61S$nCl`fLvCetOF*MKHJ%v(f+eEr9S3a>H3o;I*1|r(PtiIpLWvFa9biAf?W79^;6Vz41TVFIx+{C)(Wma% z*6AS_2}Gbu*UCh#79JwB1}#B6igm0o50~RH_POpJVJ&B`@zCB@bs~ zeX&P0g%PN69AK~rFc==tOCH>~r?lvSRfe>52`0h@(WNv8I*wn1aiuJDEp4SFIUIyb zL6QH?B+1NKP{uq>ixY>w9j0I;^QKZh5Ju9Q|X z#T^Q%Q8$keZH9{^0#>my+rT?!X5bw&1?viD2kQzGF=0O!6kB*Y>9hG%qr7pV6UCH} zZk(e^x6si7wv;m44m)OY>I(D9ZU>VqTBTcLVWT9%1I+ohkV1Oe!I(sctWbb`7LICL zlgCN7L}5X!q6pp)76PkSIt#QX(L_BaxpajKP|ecBiaD`hD5snobGb{x6<%06mBxj0 z@uLLBP$ZyE$pRm4WGa>UNKcb+;0GL3os#;5Q|x^xj^s0eE=gp@LrO@sllek_CO;5TO;l)Amb zLM%U5*aZX&5svwl#x)WGDubP}|?(EK~^#Ig7o)Ss>snUMTW_ zM-X5zShPD5I9C?(<_=j>>6SW)tb~hm4|8Nzs3ftbmWp7OVpu2X zxwN8PV?~`sU4Hkv`g5ZaAlyl}8#E_zx+RCBLUI*G3dx-vs!;H0NR*QXTT~G+j1)>( zH()5gij8EeXi8Cok;aE;9-`ZxT%x7LEhz5fE}j(Q9ja?H{T*K(uDoxH!Q+)zAG|9fWX>y%0xw1^IG){-!IA;+i&YU#I%p!UmOxDnl zm^9@>5yeA70lvLdY@c*>b-<6$8d+Vl!4PV0+m0W~H&QmXT2g?c54(k2NG9^_B^CQ2 zFC*ro++j$&+oLU^sZj(*I4WH{;Hz|rm>(6FHfWxm=K&NN{eb%dR~3TWpKT@}P}^|P z+tJ05lfI3YP`8addONYWcHHAAdK@_}ny5iMzdBNGK0yW>+eu%WF7+u4Q}-%8CiIa~ zG}!c|xu>!Si5uDa+T=kl#2}mKsn3&X#AF)osUdo5aExT*sr1|mM@E=H`uaRX!>=_6 zE!q6~o-~bz+Sm8tFt|OBDDLSg0_@4{ES^T378H{cd~WyadvfE7hZ0CPp4m;z%x~ff z24bk(WS-(m(c~f0V3m^L2}u*IXsm2yOBbYV&eJv*(>CX6n@a?jH<497o2>FCQp(%# zf?*i%r0*{$!=^Qs5`dIDINbgs-2QU1Ul7aT_opK8CZ+cii{OWF1QDPKbP3~`Cy1FR za8H=%3F8p>1e`uhqH~;yPS`#odX;{hiB1eI#0r=}h$H9{Wy&!lJI4$lLcB;)1ouRV zo+uNn8JyAxevOjg&Ne}toegcaDbH-e*onjIB*N>&^LHW(T_3E{yNcr`IHYkCLd9{D zK0u`}AVn82MF$`nP122KH{9J+?iQj%@S%pD4^{L597h1x8p*VR%3Ues0zJC@q((8} zkt%A5W8?yxXpup`Bzs7$Ut$VfZWanRjr4#TMjvbyay$~t=1PE36r*(V5j@Hu4bAmS zjAL~Dayv(=E2ykunCF9@RFfrwUIjl#dm0$iiX!?dd!j4BQl(G8i18#5pCJ(ywlABg zuzeJDmoDjap>-^M5>j&W6AOX@7C9n_;rm&vKuWs>`r=)Ohnd!qZE zgi-e>8>8+KRjTfpnB*BGSN94bxKfDmrqaC;<3I45o7}BIwedHW<$5w&{`S%UAi{$6s+jQLoy-p{fs*nKMt8xY;4`> zS0>j!H|j-{Ezn?n>Z@PE{pTKf-LliIxqSv* zcm1u!m6yXSR#LT$-K(wiYOliDCr0G_2;4BpYe8lWx-b5NC|Yt`rG#l zBz%$hvy#hHj$}WG_Egx<3b_?VAn-z#EF2U@5u0z#*CTk&OPIsNfDvNt34HDj?v@tr z4obN-t_pWccT04wSm3h6s-H18wj6*i2XwNCu$I#Tm_6h^dx4&mjFUbRlL8o+;f_eY zj$c}CnIoMPo+A-S3Qr9ZX&Ib~7|RKbg#$l@97bL&wJ$l%f68fDUm>^Q#*n>(9Ok2O zO$82^X%HDF{m;Zg{T!_G!z&6d_DpbQz?3qMCGBYmlZ+C+EbLB8x8&6?MN3iXjdj9F z(JxZr$M*}U^szJ}1o?|6xVX8&P{R#tewp}j=;%%=-tkDxoFH-=GrMW?;zl9JN*yECy-=Q@1m#H50w@|rc_~~!)en|far9=?!2&xRs zs>Z+rkid;KepPcRIif{!q{NM7LUrk_p{93ZcEh2vK~?Z>N`Jh4I)q-aJ4kw0r15A6 zd5tO>`qJXKpbF=6SPr;zSvwDw(E2Y|woc);3YkEv0Z&iMW%l^f#uNo_4hn^wczl@} z0W9oWJo_z+VnTjUiE7MV{a0I{>Krjy#v>futQ}=&w^mA7F_}d%83srS2M4F{!cKB) zV**lS#n8{7tCG2^!pqnJQ8*kPoD1-oj0(q{hjYzl-q3$(>S=bVs=zXnYDaUA6Ca7O_g`KAwQ z0mcAoDelHJkPLKAVM|CDu|{r#w(90+K^-O<6q*%!#IS{2Fm8$SwDt($8nE@gSE-FpLc4948TPobGF;hWWgM=9k8$6*aD$KgL z+@1)Gky%qBcWYI+uLK(t-4@)oh#|W94ukMvd?pnvfD0^yu>#E*KEfDEE($d^kuVq} zq)w4rsRo&&&?C6JRgo(>LWCmi68x}yA>|aCOV|=ApSv5EfYH1%v9OPx8yf{w;iIWi z!bfv)*16cq1S>j60h<|Rf1Pgm;LcSBv6zfFYLo||$Glp=GoEo$6)-_)xw|1w+ElOtm@v_kT zM0Ru8o!wk^gDcc*On0bwo|STdNr+kmbwRTb_Fyv>z2@UaG>~BFVU^mNlB?|8RK`lS zLzJoxm%YiH03wD+q%}4xOsh&{7m!;?PJ2_aXd*6r5q^{-e33JHX(^F(r&bZZ6zwE@ z1@YPq_xu9(3Q0YeN-uU9;VXEJgk^S>2_63YeZ}G{cB`13+tGTE*=w;)@4=SN;uM6s zGNI;Y!NmKF=_n1nz8CK!ro%zRfqQs73;>cgxwXO;+ZUj!EEP}y3QHHVKMW7=|0FmI!;&_pc#7S zCH!>9jsn~<5h31b|A5%Cq6^8X86X7&NX4BBE*jdR2kakd_%j+pfWpi!-#dpZehMB)eSO$Vu9w7M)74gP2}_i|oZt^wVYipd74GN^$P#tH zb`&e>37o>ysc~DPs@<>&N&&5hLfj;s<6wtLKO{I0+lZErY1dq)g9R9lM44_b^8A1< z8j5_O-NDV>Qh``|GN#Z*3A-hR3##zTfRf2O+VIQpDbd5hN)Es5Zdp$zeDhfn+YX1P z(J@PAB8&P57_@%iacdzH8h;@m=~x>xkd0(Q-7kVd$03>Jw?XHO3ZZ(2VFoc0EorHa zaJQG+Lc%1jHIWHzFaSK5)f!nso51SqHkd6w4$442m zlbiCH9LB296)-kJT>-vKL`(ny80Z%ub|Dl7zY!c@qsBAfsqIhsi)MrnR-ecwpCD1 znSD1Ii8?pf7CKkXGMXWeK-ozXVQmWGe7}Pf5&>(;xN$)o@mNp^bR0kxOo`5JJD$2(<(40 zb)~6aleS0@CsYx9Orx6&iwDuPd4h8kcbFvPHEsZ*Na#8AE7)C8n&yro>O{Izn+4`LXPb2st8-L8Ynvr?R2G`_#7E3&BSD?F$^hz3IuUCjrO=5rz?#}5s?@P zw=>^?#Mf{51e8-mVX-7G;?2Dtb$CQ2jCqy2igu1rwTU>0B)BCWz{&X{p~JQc7(kG6 zF?&8Uw-c{tvjB?%sBcp#cq~N49z&&U08j+(d}7QgqC_nyNFoaKfTE9}sq`7kRUMjUrP0(WVh7G3*+_?i>2)FG1-MQ*^CNKlJ%r=K1y#erXQ9pua}ej1E#lOa9Oi zP7xLO9^(iPg@RN@geUlqC|ZU@9Q-Oo)s(x_K!rq?J|-7zLzVs}pdu+>(+xJiy6__9 z-V#DG(T)#ZObS=rD?%DnbctHUY#WIw#-wz`gnWP$QIkUhHtqs=vz&ae6j8^R!il?b zrJ#whW0)MluO;;z`*X&_$JMxqF_$kdfPjYaqu7Mas;@t90{wY+1LpU41}G2GA7*<% z5C%PwGmMICmPFDir1ZE>87CI80WTtCHll%8yZw1Mq?znhQI>hF_a7n81yUpxS1!9^ zBJzDqi>O)hxEe_@!!D^UE`)u|_^^<~@Ge>8SkQ)5tA7ZuQICZkBk`1Ww>VQr4OT5w z=@vQ-K-@k$K;|?iG2*%ZGpi! zOl2!o#4uDXm6s}5T#Uv%jp#70P1~DE#5@{Cp{%6!c!keHtwBo@Z>W3YqkX4{QDTLS zhAoZ`qXovXVlJ@*#8^e4@)pzAlIP3r2F;~42kXrvL^sK*{;63TnrGH-=DE_ef{Daz zQJ-f+1?SxsC#5hA37~%QBPpSsJL4Qh24`o7g(Wsr5i`6ZWYO#B$Zd`J=wWD{ub3>K zGMgK^dh)8U7Ya*Ru+NCLi2#epJY!qJo+aHpiG^SXeE6AVGI!=^JW_hgQy2EQhHYwj`CC^7@GN0YIx2G8^o*Xk)+}cbi zPR$Hrj!wTYtObfBp*Q`w>R*cS4NdN0J_<_^l4;9L4PUZ9bbRIrxBPNB5vq#N(MBTO z3VXS=sN883evD^`6t#0CtW&7x7Dh#Y0iCtVn}5S2RpG`&WZbAC=7>2KanDlG^K)sr z9hiqLGP|X{SV;<1M6@d6XH~>}xPGQs8ztYICEgNB$%|4T@f@rXnUedC8711GMMa{i zJTPPhSASF(XSJhoD~>cq#$7H4E4d$cUad4$VujHt0{JW;s#%WqUtR7jvfiBtkp9Nn z12G6BFgap*bP{{ZhuTGsZda%HRx4JX#9_P15RF<$7{aMW`w}5I>*?=n-K!FbWFAIy#6m+gRumRQ6uNsrEx3$!P9&}aao0=eAEUg3_xH17B) zv9760q=_`zNE1%OHPp0+Q$#u>*zhzI9I8=}cZqf>!c!X@ubN#Yq&zsiS zj5D?Qj3*A#IeXn4zGklVuP3TH;b79i{(&QK3?Lon$+4{-l)DcE3TvQTvh*(;u*I=Usq<>Wfm4W*y)W)XiU2g9_IIz z?CfbqwLK=|vl(ShaGeR&+C~A*FcoGHv|$ zI>rH2;e^r;%%Z%3ix!SJp^|1Q)Z zQHsr&U?U3V-vuZxs^$0;2$(_#oe4ZMR_~zLIQ=PKU98U)iGE5Gcad6-_roIMb) z|K%e*Y<|M-5Z{5p7~MK?<7CL_K)yAGwo<7-G8$VOnP(&^?1o5#O_PDNou=Q{5KuK2 z?5Zub!MS9jn*-(`0{lWmY(xId*rYb9bNTX7l$6)l8CYTt#mJ+e{}9zi%wE1+-SVw= z`EyZaE}>tp&%$2F1eD9du1QeH$bp@FgR%2(q|8*#|C_Q9b~1;+cmG#crr6czl=Hs- z9wd@5=IFRR3S7aBP#uUVXC%4D?G(`@r-|Fd>e8VA*%mZZZAx z>{QE*sZ4i1&FxCNW%a>$@CA$19{^+?ZN+ipJIO>pB6R#QLUN=~ib8m00S|OWN*;)J zLF)FqaexIlzyNnQ8*E_0#$0+fgI2(?lSbua0iVjr-t6(e@JEy@+zLx}G$)RQH-P5* zzxSC)58EdNNp~zA;VBcEuuvM8aKrWk2j_xq_G5Z_TPe`qEYMyGbTSL%Pfkb5XiX;4 znqO`C;)lBtsuOmd+re#m8j-JiT&8Wmy368^hh*}QOgvVI9}l_3LvG>WLi~8hJsxsT zrK6vzz`94K0_z@$ShMfqj&j`_T3U#t^+n_qH+OPcMe1F6Y++;C4}AZ}d{v}7aTt$0 z(t5~c=`llbJKHTWt=^ii!}DFFg=srSrU=`3ogm)x)6&jm*p=9MOq+l><`QIU0tY?O z8d(O8>^+G58Oca@TE`IcU`L;wogFqC+u0SywpgbLSgkZYO2Aic;pb2*xX|Wp!jk>$ z836%XupS-hA-(8C69_2tJG8C5^AM1b{NjO|=UJ^3^ zGDJzH#7YoeeaQFLnW`C!G!S|I{3$(+irwu-AA}*>gFSE3=5}MWE2@ZgT^P5#8$(s$ z3Kwt@D}!5k9PYF)ES%o)=t_$~sn{Z-P=!0XyCH->ToPFmD`xK2^uz}qDQH5Q*&;nv zVR7^%On3pT6sfw=g+B%y*#yj0C@`>Sn?2O(J}d}3>AMDx9yH9qN{d0mg8c*WP?t71 z7&G8O;^ty)pedj$LjAN}Sl?)=9SOS_sTH35883RuiyrogY=NJXU`>0$v8h`X*_xgK zzKoYnxw)D79q~qm+yQR13mh4+PKF#tIZf2cgbGzUwCLs)2=jHUf8g-S-L-*1Fijhb z!Q*9>jms?!n)waG0FRzQC}2v7xx@fJ-w?8UixUX7DMnpGEoM*~^B0i`E=^H5HM;8{ zb&pP7YM9Qn$yyM?;$%YDnr=h2YO@5xMh@~H8-(213%zPD|Is5cLIY{)@_5|H0}We*wdHsnAX;k};RBJ~LrAg93>Jh#H zn1LFi){YC%27&_vwKxO`FMP8#)iBOKlnGV##HdXnper!IUmO!uQ8)4PQwI)%j{H)=M^cj1*$jrPV-nt^ruV6HYO z0DScI>w_ugK4L}nX%#%e&%0+IW3>eJ0f+mH@$7^8G6wbWAMjnDE?PVl5~S^8Dr^<1 zP`VgX@lEpqg9Z>y|6lz)4YV?m<`4w8+T_jYptu~LeyG~!etzwJhm90Q1P$~L)M~2? z@`DiL!^!}TV~*tir#+S!%LqbwG++nZ18}FpN8yf}*$103;9G)lO1~9%;%XZ1up@-K zxYH{#&=kVxEg7!3ll*IN$Ia{m;r>w&TICUr7@>b2;goqCMdtX30a2d_pZAII)t?C8 z`ibyEp9s(RMEKoLgl8e#b&{2EmzXGhrdSE(&C-{jY9*{DrWrqJv#f-n#9ZU2Hl80` zT}JW=!nK|7n@MWa38Xg@^{1!d&rU8V^i~2rCMkXFtZTs8UFeFV$-Cp7fnDHgjguNW z@WatN;0&3LJZZAk6N9MZh}i6ZBO@R}XzClPMo@PQX2^Y`akj`RJgAVB| zjBKjaXhY&@7j(iYVHQugptDcJbEN6iPr^#)MP#3|NUtKNb6M!@Ryu0#>*)~BP072A z;vsnfz(yy1h-cxbc^%L}mLtI(%1tMk&=GuestTPdB=L$)P!i9*5KqXVbm#@~sUav$ z{HBu&N8&6N=>_K$|M7VnR2K!2N0JUY9fJ;$l1_aU-@QwD^RBB-$eEkZ&^KgVnP7GY zOgiZ&8Nr4tavyMR)bMEcgCmrm#i#GOvx$)@~cx~rHZMsnq>>ncVmr~=q@>J1bl z@L}E_@ag0aKQ0?N&)yS+7?kB>Tw?hG!E-v*CtKF4AT^ywM3P1P8iIPGch-}SxG0|H zL3K#A<{Zu}Z1=1JvDUZJz|Hk;^VRKyZ$*tJLP+Y_KPY4Sm z7ykHC5H7oS??wpYKY=lF;g2r`;o_a^*JHdn~v;0W?ye)H&1~0^gN@} zkt`i)y)!299DS}vMp06qo-Eq?n0H3h^k|laB;G#LUq_`!u@6z{jAcZ6`;6-u#X?zD zl+Wm%(|^oL_r4l^m7R+Y^_dm!6T{ll22W zgiTLB7d1U9GP>tgPla=JlzbSUUy>=jCZ@_6^miUhsjdgydq zBD2zw-{(j2w~tVrO@AWUFc zMragq*4w*h6vgv8Ksf&(0C8e8Qusg|{?QM~IhhS={3SULgFEj}7zsBCws^x8&M%U4 zNxX?I^yR__htDL`(bY(>?8EfvaZ%|$(XTV2GBRHIM15dUkc%D}lUUS`S&==XqeG+5 zMZfBqnD+6-l6CLH_odE%)D)8|J)nE0=sSgw) zEGsjRGPvoF&kA9Yu+n<5uuAcpuu8r}SWSQ1B|?n-QekcW<-!`r--WeK%Y}8S<-*!R zxEEX@tSh`+h%L5K*id-25LYZlSYL9L5LYrrh%dWF*jRR*u(AAFVN-=zA)zAv9_xio z8r-X`7ZPi(7dCsw30rE!30rG!6gJn#y z$!m*{)Oxd!+7z9HP)eqFe=^M-JH$4%jO@=f9HuG_-h6#Vz!5gr`8C)_`D zS9o~%f$;D+{%H?{$0r{OPtQIUo@G1{o?Un^*AV1QZtzt8`#Ie=b4ko}+k*yhhwM5RlP zfc$>FE7)d-*wzZ_rqp`5Sj)t(Ojc`r=b^=@=g>Cgs*3Sm)!LV{rSeg{NWZtOtaC^sS<$}jn|Zjn zc(kY{E7)^<2+G%$$WxCGr37Qj*_N!=zOP@9zqX#zr<{Ac%BK9Gl%T0cxgfuuP0NAt zGRuaeeBAR5HR30#`l1q*E|xN?25VcHwM)N{cJ2+EiTEjjUpd6sx|D0$O*^WcwTrcN z%aBpcY}`Tg73T6>NOZJ(W=_{SqDUO6UosJnI95V3xY!DjKO z|InaH)^*xZ`HG4_&GL66{)UE>wC4C_YH!r83I6zg)s)r^ha(`!T@)ZxLBpZr#r#7X zIa*U8txNU{2^|Wz@ncca+oR-gucDIQ+FIt=bU3d+1kpR;aWzJg+ya7yg>^n-eq%h{ z@IgX;wEz&K1@O46E$SzqXtaV;4tS_=k*x-)8dbJQ= za*YsQ#%O<3fc;Tvosg(mFKnqECv5u$_C=!vVMpUcVMohEA-M(YiB_;BU`OnP9kII$ zY>3WD!k+HQ!k%8q!oFU+gabY)!U5ks!XfQG;qdSS!m&}Q!qL%(gcIWr3nxO42x$|J z3a50(h4hKA2PU6_O>jy$JL8mS2h4^YFz>8zVc|L9;#}AP^Un*H7M>R_EIlV&UV2fq z307VfuE$>$ZfwXDZp2>`ZfwpJZf$`*u=TodC;1k)1Mcj`9k#&zy?2HC2k<9bAoYRp z;OKqW1NVjJSDvB2ez%T~&-u3o(v{H&7FuC&Sq2O4RLYsk+U z%8OTO+|sp}U6Zoh&s{`kuTHLe&3o6X1b09;l!64-zHe?=p~Kz}O7pSjKBKPUa?q%nv2rS8vx zZ=S{+zIpi9xXodHsawKJ`Tm>#R1T>uf95vl&*!B7oHXVzztsIX@Xgbh!#5BA8n-#j zFLg_JDc^tdpUNSX<ppOeNM=9juZ2fle4bNJ@rU*k51`K4|NFXj7h{!=-m zvizCboIjtF{&Uip!~9aW1mDE_rgFB$zX^-=F3wgqvHG{v$*QK-EWTGswtIX>7UQMh zIQYG>>~G_fc)rRjA4^|9$M87wyy5JId2H*5#)dWR3m8^57VQdi{zzq)@|wrxcEeA$ zi6O3snqA(u%<$s&Rl~j0`&n$KLWT|9+}ZU#>kTIt|7h4ct*=k=_AGw;qo@?6?=H$xFJzngT=JTZ&=yH;*)S!d)XQ`_9@2>Oc`XjzAxVJ;?6bp z?)4vrlnGr7yF=QWVCJA7^+6x9*6IHC3;Bxswk+Ep zHGo~*yp%n^eU*K9_m+6g^V0?Nvt8rbF$3xqGTp=*lwpZ{qd(=8u=`;H*)G zV+(&^Z?j$-KpXMZaPX($jOuG=NGHRii>KJzSI>xjCO&cxyzk#+8Fr2909h%+j?W)! z*x}#Au)eDs&%3(0oSptX!tmtE8SwoX=Rf5m`ge?IXt=s#g@O2x_4J|P-pRd&q!IN^ zbs_QJoc_#%TMYNlA2Y1)QG&(y^DsQRbkgwP+!5lv;qIw@CisNoOiVQCDFeyM+gH!C z;|Sl2Cx(aTj~mcl*|E8!iC#Xwh-sP6uw_UsL(-_`47BsGRglLGU5gkFPSLU(2NDf$ zo?e(-?sy?y=4aAcbHBl;!zA^u-Kw3XNW`NYK}>nu5>Bik9;mF=50oY%W~ z9dr5{Td} zf7trYuI%Eb1?<4&fh?|jaUQlEJU%?#k8MQTzOsEe2{1;xFNdNA7#^KJ3ZA~<{3rS) zdUMMUwZ{X~{S0r={_$Z?fH!eyZ9{CgV$>#im=Qg{N%Y6G%4bL#-3sk`qJirF@uidO z_0tC=x2Cr6x%!9n=*tJU4A+uYvN-QzhL{!#1J%R9$%72HQnwloM)dxOeo20~4r;Do zr`OJ8@84!I>I1-cwjOeDXl5XzI-zn&A4z`pP3%wfiaN(EUP?!I(m$j>rH_&Sye~$7 zCIy@BukPPq+rO*Bj?M~Tho=o;n|haKYoHfVo=?gT(NA@aCpnqPOszBm@?)FPWNQor(=kj05XRd!h1KL)a;q1!EhIq7*Ps)#xev01! zeSZ7IPA&uJhgs^(0IpLnZ2g^=iSYcV=m#p!kGC(M7!IMG=ceBzKd`OVbaExV%KD^C#g?4ALU16{6PvEj5$%G>JXI7>N2I z>K9%;x?^~L^Ag!Z?8d=FL&o}F3{o6OxKd_hguCrT* zx3jacv)PfE0c`j8oggj8BEo5B#^uQJgC`?-VRBH5YqLk!zSG~)Kpx{fY< z{6)N>JjQ$1>52&llhV;WPAzKu>^CLKG+d8teU%%&Vm+BpTE;~BY zpWCQ3o;h{(Or6rn*2G&=(kBFB?{SDNXJABi^DckQI_`!zQ2dED7!N z@JxThxeap|^gh{l20s2G-2mMNx(ODC2bnSK8r>4@`w-e6Y|dBD4G+#7Vtd1S7-Bo9 z45%wp9p=XSSM*Eec!ROYxw!d;c<4}qu?pjmjeRSyXXZ33OAVTV8A z<1gwDsQ<`4eka{|W&1M29*mFCo;f@!%O;GWuWW;@g7F@geU#&R$~r@0--;j6FV(Y= zesi(;q?_tDZAm!wL2MUnOBz4Eesa&GzdxDL7?H#NM8E#}@jZ4SZXVHa158>KhTpJV)Dv>!gaf6E@8J8Ia2{#lX}vj0ymoItwg zFUK#RD?daFeg4(-OXVYbBW=Mrwg!D6$tTU9T#TP<$ijTo-_<_^JNM^H?9beJbI4Dw z@e5eP?b-C@Q7A(`E-xFp6lRw(CO;VQ?Vrj|=Ke&^Tf)a31kC7`?o#+y@&EiW(u<$8 zKM5DX})*y5z0%;8IJ>d#Kh4Q8vGS%1_A65W#Sk?sg%>o7*y^+PvyamQ*#;})_D zjMYG3O`p$^ADVljejoM^yRh+B%sY2x8@!9<=<5=FJ=o!&N3c65c5_|B^{iO!953mn z{ra9c@<{ZW^FN0hI&4)7C2Rx_!-?N??9QnJd`?B;J>CCIeu$rB2VB{?mK~Tn#DKXV zZkI}RE#WfVF&3cym*!3`B`h)+ZD|P|+17?#!7aXM4q3v*>!eE&!|oq?u#4zx$gbq$ z`dssG(0_(3%$wXgvV&27yLs?8)VG=BQ=*mNN^a?%BMfEP3>)s)FF`cV4!h?G&4m~q zV-9&U>_9WRK9V1T_h)~a+uhjTgQYEv!2H%=-ha{f<<^ny?DXnr2AbKLwoad{>pz42 zQ5^b4v{|-$Oe;PQ_XP7wH2;%3om3tQ|1-CFyfGb5AJf{A#w~xEm(rW(m)z3*Q}I&x z%0{RYj0@trxtZ`tadiJ2w>hrQN&h)%%wc}1`*Yx%r!j|b9{x3MbC_T1CcM%0qIrm@QhSFxmNt=Q_pm_z*xnOHT@hQ$m~vVC)V!6wdR8Od|mIzMN2 z=gbb4wst(*G_D+5H2`}yJ_Af~^{ab)8&!30_=qNtU{7 z1iO7EiJgjzVCjib-2T3}dm)P*S%|%Uc8{+wym|SAT|2az#g1@cF!~%8sL~ zk1|iOg9`_-wck0h=l3p~#s*o>AF|!k+p#-mcd=uug4l)ttcBz%)0T*O?ADoNE(5o~ zyDNuc*vW)xCLH_b_hmbxnqtiHn!}~Bz{|%s*{xIC+3pz~Sj;d77C*KuiyvKr!%i4q zo}Jq81ABJo9C-17?U~t$z5PR6r_0znEl>P!UcW^7qgmXTvTRFa6ZYcabzVNY>|Zc| zZ4Rr!uBOJY<7>vUt>JZ9+~|^QYeapv1>r|m2CzS#++ydG=AiynEc0+Ic;$=wFUyi9 zHDO!BYGUpC0jK@Kj+r0fj~!K<<9qx1Iomm-BilWz3zq|l0K&g&keqFs*buk^*|o## zAaBc?p|UE zKh)%PkAVs&f$(ofIo`hJdkG}6_?_xMFZq)aQT^{io4UAb9!s9wl&u|x`Qlvl&;7nK zcJTKRG{4Snp4!GXey?Eci7QWmp>(CS>4KLf-JNruHY%N9C9BQ&?X0zd5`fyLxm3Tk~Ch zUeD>={^^;u2pWaGmw@>e22Nv|_?eEI|Wh`lO6Sg^21NooIlBas{`u`OFsr-bW zKEzvzhLyfn?C|nYY}e17xc+(hK9g< z>G*{471*tln>qi82MHnN*`dW+c6{ZikMifn&uM@>Kgvvl&S{k0FQaTEA92BIwllg7 zcr%in+c68eJBiC&dg4^hi%sLo^E@%=M@bKp?tS^-Iy(;izi#-)?LRO45)Gu2lB3%} z*2<&KH?S8Eu5mq-*Zh;z|2?~No}JzpfwqtzbjVl=+Q+M>ci0ERd#KTYm85{3iXI_54Ae?f>6_U!v>fqg!m}RIKknR`$*9&CbMQ zeZWj^$epOGg|;rv=S%s_?|)T((tTJ6VHrDSbN%` zkln0rQh+kKsa-kiQ38bhz9IZ$|7EV zqV?hB!?1sfe3UkKUhem`hJ8^NJekXFf^Crv*nP-T+WH?^;tv||@?)HN!@)ktz+&v^ ziV+A0}Z!*ApZ*#`7qHBip`fjn`T^YBmHt6|UPW&eE*%&*CtYdYXR?#=n!uA1X- zZ1pi269!jc|Ly;zss3_lF5%)*9iKAC3u96xsc^j`Mc^g&2d(UdNFycb(B*PoqD zOJ=L*2eRvz)7a+KQ7r7coUneM<;M=~ieX3gZeTaBonf=|o!J%aVSN3^3wGk*Mz(fw z2>a>#R_xgR4eaIf$LwJ8GM2J=z6nptmPKs)h8gVep0!*xEtulNHm{k&wy&ST!_S{e z;rK6|J;1iCh0VQaEK5J0WXd1mUz=UOa++;kJC)<4^1Qiyq&CO%H9uw#7!X#Xk*TQNaya=#Yvm6!k*oKDu`uTfbxiJCYKU zjUV~xLohC%JH)1pZNk!D4^=p3Mktjk-C)c5eFRqx>8QE|iwa zZ~h_vQGHTfM29rzJdxVXs`)|eA@)xae)^c_CpecgQrT?C#5L3f@s#jK_}4VyCpbS0 ztHPH4Jd~xMNM=iC4rMnp&$4anr*m8q9+J&@6T5RB?A^XNM}8^I_u9{E&r*B%SR;IC z2wqGpsMU^`4He%&X(2c|iavV(q$T2Lrc}Y-K52zG(MRu|v=%gYCKZi#+2|O zjog@0&EGm{eDA=QlJ>v!|9K7s;60$gs;>T@NBuvH|2zkl6afu5xm%+zGQ-BU;>1=H zU)#&%7EAO+bO;K?J5W6HX>4t*D>+zN6oCS0XQQlSBeRm}Ygx#wmNeAV*Ay}f$*-}+ zqxDOyezyn{G$qXPSrr)hu=%p8+g(G>l&G84UMbr=bM$D<61~fKjoxa9MsK-ni6y;8 z#hJvg*V&+Boqu{-azAHJFO9v4Fqt(-7|SWL^tQ5bw(#!i>8x?Gfk)x2?BN?U6fgD; z_8;l#sBxe`xwE{BcF+j_k%K&oY1}A8>Fi>9&$anWy**24ic`F$vuk!dog3xRHQ0AV zfVxw&CYoY}>^*B}YF4Z6Ss7N_ZI9};YSr?n-K5qxo@F$p#FDt> zSrX%+MH;=Vq&a70)`F#8mLGy3Q(EX{GU0$g#AKu?NZI0S9Nvr<*F$dR-jaktn*#G z0+f#$zZ>&zQ>D1QH8$sFzTGr$2R9*6cmk(F88h{D*e|`Bs^-2-Za#J@;=mC}?D8+{Rzv_QS#-r~bNW)3s&?96)xM3p zdM@;vULth+8-sJFF8$}!?Y*t%ieTR+F|)75mhI4P>D++U<@!z-a=2r$Q4wBA?rk?; z&%ggbxm5Y>@yZp2gu?9tTGaN?C3IS|f5^$VAxZm>E)87pvP_M6S>3Lx>eN8jU{n)PiUgvycp2^=FZMp7URC<>c#mc{J z;Bn$a#Jq{4v`!}?Q*E11%=Et#|9)NL<||^RmTIJLy(s;cUY(qKxdyRjcCnSt{HSR> zL{d!s!KprZHB?J8ZB@MQb)Qbr-6!sBQ~!k3-BptkkL(K9bf(7bWCeY(+)LBkGgtjo z*LadBSvyxmCs(Itr2#dndDb56S>5BC!2^9gYShsT_NX(kMlFx(g9p~ES!>YXfi-Gq zawxzfPInKVN+{S{3j9{mPf&p!G*E()A1bh+5yfAqz)!#q&ed|cz8l-;!MUFs983N_{Cs3g zT(d<%6AGo~fAr18gNc=k_I=mQx^DQW#yZ>Iw~Q*=_iX59zj~=_`uSM8R&+1-gZ$op zZSlkt_FK9gEMNQEs5{@M6yDsu+V<;5kIcHbVPt-v=C97gJt>;rA!UQZ6ZL}UnTB#c zclR^jKMJ2JuPnLf>ahU*V%NZoQb)&EZuXen-+k@2`yHnD~2KwD=->Yo+vppN5dd#XROz2c8sn>gh zTZP*C(^tC8ZBfCs!!NxTZSPlf*|Tz;?#t)g9Z|!+c8^Q7%GaDzxAwv_kG_laaVY83 z_j`@rItlu2xv1}yzSYZ;0VxQcxtOKt#|<;3?aZ>1XFabxNLIL@B|10H!elR+1=^bW zK2Hx#B~gWy&Q@Vv{QZN~&Cpj38$1jLk!sa+Dye_qu;37GjcGKst9wF!)u~<$%B-5v zTaCQ`q@MjN(`sX2uRet}gLb+9+Fz}1I)6-8zlKH6`X4>=?EY}W+=7nRuGS3>FS4cT zl4=jxl|4;6lu8d2F4pX!oP2n_y7kMaL)W!$8@(bqr0u8$E#((Jl)1WSbkvD8LCt?W zr@Qzf`S~}?Q~R{Iv>~>^wemyf7Fo3-FsS>pLbGpvs5v`u$=Naeij8d%9$C9!T2OE6 z?L)dmuh=-O>V?Aj3^Ri(Tpv@l+vNh9URkH22Yfh^+Rw|g)3$QXHydkC1Xge?U-DqB z4h@!6YcS*3(%LqWeL8g4m#=7DZA;s89S7byD{BrI=C3Ktf-JTVCp|lyE<0sT=Dhy(R(txdte=$O zp($)iRKUW@u9y;MON_=F;+qLga_BOLb^88|yO*1LtBmveikZr;b9&ueuIVJ|veufG znifl%Eom~b(dX+jle`B)v)mEupDlNPe!WB1w55md zIlbN4D82->^Pa( z{chU0UtIg7)-2fX@+|k(KY8qotJo2bo=+N!JTB?`+@%4x3-*nj+ zUA>^Tn8TFIj#mb~^gr%(=5(QZA^WTnPQR;swfL09>y+=D%QcR@`6e^wN3R|7{w=lr z8+V9n`mn>JO=Chblr?NexP^HZzwXfO@~x%sZnbob9W;-1Dp+O0F6$EGug_^xZrI*g z)90i{XDleO-oDSmr@ybCI5gbuJC7Y>h70b$#6BhOnbYoP5 zbHWb;TAn-}mAcjStwUgR%CZI1)ya0T!5X#G19^J4IWDbd7i~Io{k%S!vKNHmcfU`5I9ZShh5!RM*4NZ(E$OP3yZMEv~86?{8N6 z%^Gs9{3WlhaTC*SmG`PrZr#L=-d*f&T2_Ad-HaKUk&|BZ(ky!W!`Zo;?v|MQL)Izh z7m6)iM|4SOG2^#ZLYtO@oyt`hyn61<(>A&`zrTrC<n@JkqVDtaLLpy6CV1d8yx}1DE^$+szBTV@Pbl zrEQk1h;0|t^QGLmiuS)o>wnhJ9lUm&J7sSl%jVx)zLyX?_Tur7&h2IKRf0$L9%1La z_V~{4r*ExtM)mu&5d*gNusG5|?c8bp$a=dW&=?y`yNc8q&IHSJ+N+2iXw zrz@=wMYp>Cw5!YIj%#P$yc7LhdRWTs+0SjNMq1wcxnk*(0q_2Je{m>#&|ZU6qxVO{eT86Qt5nk zkJ9(2r{}g7deC9&kNay@>bq>$gQU=WO}{_WHL%2E&EXy6w0(NZ3MmUXoVrk8-mCiC z2KU_LQT5K7$caZgcfY$RV7A}7I_=K<5wdHI>-Yf`p8UR`LJga-MFylcC^n+F{%O90 zm3N$Iw&~WJhoOl#mah)3xwXUoQKeL6$KG7BnyB6qE%5~cu|6PO0OUL*oj9luxa@U%cPgVXOrd0FWXt>(>(6myigOeAzPf`uC zXyCD-*YvG7OWaC~J3KI9TsP}8O{#QSH#=^{xV4*>{4%=8`I(cPN0+QxZM9{{|9;&6$x4~lh6{q=F{Yp-Qm|H=764-GqXd*uC9bB}vgU=I6x_sM8qbZN%hs*4*{ z@h&(#)p^+mPrcP5Okd2$9Ipn=?Vp>M5NCaJPn%>}CUea=Ic;m{X=gU&Y=wE< z>?!Gdo(>xGSQjz|rHoddFa|rs)Hzps*HFi;5we>FzL{9S^Wph>7@THw{3*`);r%l{6^_C@AliBMN4)5ro!0~)vb%PFOl^| zU!qPA%MSzI7LMCf=F-6r_BCJBZ*gi$T4>c8XUbn&cPV|}f{c`AwJK@nx>g@K|8(P# zk6IlZ@wlm~(2K;xL5ZE( zy`x*;?OB=5hP2tis<8G$f9^ZWYV*FzsoI6lUXP8RTRqCFvt6-YC-t%!b*72^QoTia zjozYkcCFZW>MdLllcZCJWl91-!~#?(8{9vE9SC-$yJh-@ZiQ9)nUGs=e(>Pw6c}H z->fb-vxe04Iq;kJ*x8#6YbW%}h@PggwtL)R;ti*&eK^}8$I z2X=Xo)wsV!@xUrYjugN0VE8vfA{K7DQMBQ=EoMADv+&t>D>@wertjiH))g~Zdz+Hy zS|l&_O4SuCeadxBMBUln44z)&jbr5wtj*lx2M>Dc&$a2krO)^6w}p;q*LQhu=cN&|j%7Nwzb3a_I$=jr^`7sF7P7t8>#Z#A M;%#-+QDm3?KdWteh5!Hn literal 0 HcmV?d00001 diff --git a/packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.xml b/packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.xml new file mode 100644 index 0000000..ebae1f2 --- /dev/null +++ b/packages/Microsoft.Maps.MapControl.WPF.1.0.0.3/lib/net40-Client/Microsoft.Maps.MapControl.WPF.xml @@ -0,0 +1,1509 @@ + + + + Microsoft.Maps.MapControl.WPF + + + +

The Microsoft.Maps.MapControl.WPF namespace contains the most commonly used classes of the wpf_product_name. + + + Represents Aerial and Aerial with labels map modes. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + A bool indicating whether or not to display map labels. + + + Gets or sets whether to show map labels. + Returns . + + + Represents the starting plane of the altitude measurement. + + + The altitude is measured from the ellipsoid. + + + The altitude is measured from the ground. + + + The altitude is measured from sea level. + + + The altitude is measured from the surface. + + + Determines when map navigation is animated. + + + Map navigation is always animated. + + + The map navigates to a new view by snapping to it instead of using animation. + + + Map navigation is only animated in response to user input. + + + Provides credentials in the form of an application ID (a maps_ticket). + + + Initializes a new instance of the class. + + + Initializes a new instance of the class using the specified application ID. + The application ID, or Bing Maps Key, to use. + + + Occurs when a property of this class changes. + + + Retrieves the credentials for the map control. This method can be used to pass your Bing Maps Key to other Bing Maps APIs, such as the Bing Maps REST Serviceshttp://msdn.microsoft.com/en-us/library/ff701713.aspx. + The function to call when credentials are retrieved. + + + Enables the ability to provide custom handling when a property of this class changes. + The name of the property that changed. + + + Gets or sets the application ID. The application ID is your Bing Maps Key. Information about getting a Bing Maps Key is found in Getting a Bing Maps Keyhttp://msdn.microsoft.com/en-us/library/ff428642.aspx. + Returns . + + + Contains information used to authenticate requests. + + + Initializes a new instance of the class. + + + Determines whether the credentials are equal to the specified object. + Returns . + The object to compare to. + + + Retrieves the hash code for the credentials. + Returns . + + + Determines whether two credentials are equal. + Returns . + The second credentials object to compare. + The first credentials object to compare. + + + Determines whether two credentials are not equal. + Returns . + The second credentials object to compare. + The first credentials object to compare. + + + Converts the credentials to a string. + Returns . + + + Gets or sets the application ID, or Bing Maps Key, for these credentials. + Returns . + + + The wpf_product_name does not support the use of tokens for authentication. + Returns . + + + Provides error data when the map does not load. + + + Initializes a new instance of the class. + The exception that that causes the map to not load correctly. + + + Gets the exception that caused the map loading error. + Returns . + + + Contains the altitude and coordinate values of a location on the map. + + + Initializes a new instance of the structure. + + + Initializes a new instance of the structure using the given location. + The location to use. + + + Initializes a new instance of the structure using the given latitude and longitude values. + The latitude of the location. + The longitude of the location. + + + Initializes a new instance of the structure using the given latitude, longitude and altitude values. + The latitude of the location. + The altitude of the location. + The longitude of the location. + + + Initializes a new instance of the structure using the given latitude, longitude, altitude and altitude reference values. + The latitude of the location. + The reference plane used to measure the altitude. + The altitude of the location. + The longitude of the location. + + + Specifies the maximum latitude in degrees. + + + Specifies the maximum longitude in degrees. + + + Specifies the minimum latitude in degrees. + + + Specifies the minimum longitude in degrees. + + + Determines whether this location is the same as the given object. + Returns . + The object to use. + + + Retrieves the hash code for this location. + Returns . + + + Converts an invalid longitude value to be within the valid range, which is -180 to 180. + Returns . + The longitude value to normalize. + + + Determines whether two instances of are equal. + Returns . + The second location to compare. + The first location to compare. + + + Determines whether two instances of are not equal. + Returns . + The second location to compare. + The first location to compare. + + + Converts the location to a formatted string containing the latitude, longitude, and altitude values. + Returns . + + + Converts the location to a formatted string containing the latitude, longitude, and altitude values using the specified format provider. + Returns . + An implementation that supplies culture-specific formatting information. + + + Gets or sets altitude for a location. + Returns . + + + Gets or sets the reference plane used to measure the altitude. + Returns . + + + Gets or sets the latitude of the location. + Returns . + + + Gets or sets the longitude of the location. + Returns . + + + Contains a collection of items. + + + Initializes a new instance of the class. + + + Adds a to the location collection. + The location to add. + + + Represents a rectangle on the map. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class using the specified locations as northwest and southeast corners of the rectangle. + The location of the northwest corner of the rectangle. + The location of the southeast corner of the rectangle. + + + Initializes a new instance of the class, centered on the specified location. + The width of the rectangle. + The height of the rectangle. + The location of the center of the rectangle. + + + Initializes a new instance of the class. + The location rectangle to use. + + + Initializes a new instance of the class using the specified collection of locations. + A location collection containing the corners of the rectangle. + + + Initializes a new instance of the class using the specified borders. + The latitude of the eastern border of the rectangle. + The latitude of the western border of the rectangle. + The latitude of the southern border of the rectangle. + The latitude of the northern border of the rectangle. + + + Determines whether this location rectangle is equal to the specified object. + Returns . + The object to use. + + + Retrieves the hash code for this location rectangle. + Returns . + + + Retrieves the intersection rectangle of this location rectangle and the specified location rectangle. + Returns . + The location rectangle to use. + + + Determines whether this location rectangle intersects with the specified location rectangle. + Returns . + The location rectangle to use. + + + Determines whether two location rectangle instances are equal. + Returns . + The second location rectangle to compare. + The first location rectangle to compare. + + + Determines whether two location rectangle instances are not equal. + Returns . + The second location rectangle to compare. + The first location rectangle to compare. + + + Converts the location rectangle to a formatted string containing the latitude, longitude, and altitude values of its corners. + Returns . + + + Converts the location rectangle to a formatted string containing the latitude, longitude, and altitude values of its corners using a given format provider. + Returns . + An implementation that supplies culture-specific formatting information. + + + Gets the location of the center of the rectangle. + Returns . + + + Gets or sets the longitude of the eastern border of the rectangle. + Returns . + + + Gets the height of the location rectangle. + Returns . + + + Gets or sets the latitude of the northern border of the rectangle. + Returns . + + + Gets or sets the location of the northeast corner of the rectangle. + Returns . + + + Gets the location or the northwest corner of the rectangle. + Returns . + + + Gets or sets the latitude of the southern border of the rectangle. + Returns . + + + Gets the location of the southeast corner of the rectangle. + Returns . + + + Gets or sets the location of the southwest corner of the rectangle. + Returns . + + + Gets or sets the longitude of the western border of the rectangle. + Returns . + + + Gets or sets the width of the rectangle. + Returns . + + + Represents the default map class. + + + Initializes a new instance of the class. + + + Occurs when a key is pressed while focus is on the map. + + + Occurs when there is an error loading the map. + + + Occurs when the map mode changes. + + + Occurs when the mouse is used to double click the map. + + + Occurs when the left mouse button is pressed down over the map. + + + Occurs when the left mouse button is released. + + + Occurs when the mouse moves over the map.( + + + Occurs when the mouse wheel is used. + + + Occurs when the view towards which the map is animating changes. + + + Occurs when the screen is touched over the map. + + + Occurs when the screen is touched and dragged to move the map. + + + Occurs when the touch of the map on the screen finishes. + + + Occurs when the view is done changing. + + + Occurs for every frame of a view change. + + + Occurs when the view starts changing. + + + Deconstructs the map. + + + Builds the visual tree for the when a new template is applied. + + + Enables the ability to provide custom handling when the credentials provider changes. + The event arguments. + + + Enables the ability to provide custom handling when a keyboard key is pressed. + The event arguments. + + + Enables the ability to provide custom handling when the mouse is used to double-click the map. + The event arguments. + + + Enables the ability to provide custom handling when the left mouse button is pressed. + The event arguments. + + + Enables the ability to provide custom handling when the left mouse button is released. + The event arguments. + + + Enables the ability to provide custom handling when the mouse cursor is over the map. + The event arguments. + + + Enables the ability to provide custom handling when the mouse wheel moves at the same time the mouse cursor is over the map. + The event arguments. + + + Enables the ability to provide custom handling when a finger touches the screen while it is over the map. + The event arguments. + + + Enables the ability to provide custom handling when a finger moves on the screen while it is over the map. + The event arguments. + + + Enables the ability to provide custom handling when a finger is raised off the screen while it is over the map. + The event arguments. + + + Gets or sets the map foreground style. + Returns . + + + Gets or sets the current set of supported two-dimensional (2-D) manipulationshttp://msdn.microsoft.com/en-us/library/system.windows.input.manipulations.manipulations2d.aspx. + Returns System.Windows.Input.Manipulations.Manipulations2Dhttp://msdn.microsoft.com/en-us/library/system.windows.input.manipulations.manipulations2d.aspx. + + + Gets the protocol (http or https) that is used to request the map. + Returns . + + + Gets or sets whether to use HTTPS protocol when requesting a map. + Returns . + + + Gets or sets whether to use the inertial animation effect during map navigation. + Returns . + + + Represents the map. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency + + + Identifies the dependency property. + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. Additionally, halts any pending downloads of map imagery and allows existing map imagery resources to be freed. This method requires that the control is no longer in the visual tree and therefore has no parent. Once disposed, the control may not be added to the visual tree again. + + + Releases unmanaged and managed resources + Set to true to release both managed and unmanaged resources. Set to false to release only unmanaged resources. + + + Converts a location to a viewport point. + Returns . + The location to convert. + + + When overridden in a derived class, is invoked whenever application code or internal processes call ApplyTemplatehttp://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.applytemplate.aspx + + + Occurs when the user presses and holds down a key or keys on the keyboard. + The event data to use. + + + Occurs when the ScaleVisibility property is changed. + The event data to use. + + + Invoked when the parent of this element in the visual tree is changed. Overrides System.Windows.UIElement.OnVisualParentChangedhttp://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onvisualparentchanged.aspx. + The old parent element. May be nullNothingnullptra null reference (Nothing in Visual Basic) to indicate that the element did not have a visual parent previously. (Type: System.Windows.DependencyObjecthttp://msdn.microsoft.com/en-us/library/system.windows.dependencyobject.aspx) + + + Sets the map view to the specified center location and zoom level. + The zoom level of the map view. + The location of the center of the map view. + + + Sets the map view to the specified center location, zoom level, and directional heading. + The zoom level of the map view. + The location of the center of the map view. + The directional heading of the map view. + + + Sets the map view to the specified zoom level and heading. + The zoom level of the map view. + The heading of the map view. + + + Sets the map view using the specified location rectangle. + The rectangle that defines the boundaries of the map view. + + + Sets the map view to the specified center location, margin, and heading. + The margin in viewport pixels. This value must be non-negative. + The location of the center of the map view. + The heading of the map view. + + + Sets the map view to the specified center location, margin, heading, and zoom level. + The maximum zoom level of the map view. + The margin in viewport pixels. This value must be non-negative. + The location of the center of the map view. + The heading of the map view. + + + Determines the location on the map associated with a point on the viewport. + Returns . + The viewport point. + The location on the map. + + + Attempts to convert a viewport point to a location on a map. + Returns if the point was successfully converted to a point on the map. + A viewport coordinate. + Location on the map the corresponds to the viewport point. + + + Determines the location associated with the viewport point. + Returns . + The viewport point. + + + Gets or sets the animation level of the map. + Returns . + + + Gets the rectangle that defines the boundaries of the map view. + Returns . + + + Gets the center location of the map view. + Returns . + + + Gets the child elements of the map. + Returns . + + + Gets or sets the credentials (maps_ticket). + Returns . + + + Gets or sets the culture used by the map. + Returns . + + + Gets or sets the directional heading of the map. + Returns . + + + Gets or sets the map mode. + Returns . + + + Gets or sets the duration in milliseconds that it takes to cross-fade to a new map mode when a new map mode is set. The default value is 500 milliseconds. + Returns . + + + Gets or sets the visibility of all objects on the map. + Returns . + + + Gets the pitch of the map view towards which the map is animating. + Returns . + + + Gets the heading of the map view towards which the map is animating. + Returns . + + + Gets the zoom level of the map view towards which the map is animating. + Returns . + + + Gets the size of the viewport. + Returns . + + + Gets or sets the zoom level. + Returns . + + + Provides data for events. + + + Initializes a new instance of the class. + + + Gets or sets whether the map event is handled. + Returns . + + + Represents the class that uses a as an ItemsPanel. This enables data binding using an ItemsSource and an ItemTemplate. This class inherits from the ItemsControl class. + + + Initializes a new instance of the class. + + + Represents a map layer, which positions its child objects using geographic coordinates. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Adds a UIElement to the map layer at the specified location. + The location at which to add the UIElement. + The UIElement to add. + + + Adds a UIElement to the map layer at the specified location using the given pixel offset. + The pixel offset to use. + The location at which to add the UIElement. + The UIElement to add. + + + Adds a UIElement to the map layer at the specified location using the given position origin. + The position origin to use. + The location at which to add the UIElement. + The UIElement to add. + + + Adds a UIElement to the map layer at the specified location rectangle. + The location rectangle at which to add the UIElement. + The UIElement to add. + + + Arranges the child elements so that they fit into the map layer. + Returns the actual used.. + The final size of the map layer. + + + Retrieves the map layer’s position. + Returns . + The dependency field. + + + Retrieves the offset of a layer from the position calculated by the map projection, in pixels. + Returns . + The dependency fieldt + + + Retrieves the map layer’s position origin. + Returns . + The dependency field. + + + Retrieves a that objects of the layer are fit into (also known as “arranging”). + Returns . + The dependency field. + + + Measures the elements that need to fit into the map layer. + Returns . + The available size of the map layer. + + + Enables the ability to provide custom handling when the of the layer changes. + The dependency field. + The event arguments. + + + Enables the ability to provide custom handling when the of the layer changes. + The dependency field. + The event arguments. + + + Enables the ability to provide custom handling when the of the layer changes. + The dependency field. + The event arguments. + + + Enables the ability to provide custom handling when the of the layer changes. + The dependency field. + The event arguments. + + + Sets the position of the map layer. + The dependency field. + The location at which to position the map layer. + + + Sets the position offset of the map layer. + The dependency field. + The pixel offset to use. + + + Sets the position of the origin of the map layer. + The position origin of the map layer. + The dependency field. + + + Sets the position rectangle of the map layer. + The dependency field. + The boundaries of the map layer. + + + The child element should not have its Width and Height properties defined, instead its HorizontalAlign and VerticalAlign should both be set to Stretch. + Returns . + + + Gets the offset of a layer from the position calculated by the map projection, in pixels. + Returns . + + + Gets the position origin of the map layer. + Returns . + + + Gets a that objects are fit into (also known as “arranging”). + Returns . + + + Defines the base class for a map mode. This class must be inherited. + + + Initializes a new instance of the class. + + + Arranges the elements so they fit the given size. + Returns . + The size in which to fit the elements. + + + Gets whether the map mode typically has a light or a dark background. You can use this value to choose the overlay color. Most of the map modes have dark backgrounds. + Returns . + + + Represents a polygon on the map. + + + Initializes a new instance of the class. + + + Gets or sets the fill rule for the polygon. + Returns . + + + Gets or sets the vertices of the polygon. + Returns . + + + Represents a polyline on the map. + + + Initializes a new instance of the class. + + + Gets or set the fill rule for the polygon. + Returns . + + + Gets or sets vertices of the polygon. + Returns . + + + Represents the base class for a shape on the map. This class must be inherited. + + + Initializes a new instance of the class. + The shape to initialize on the map. + + + Arranges the shape to fit on the map. + Returns the actual . + The final size of the shape to fit. + + + Measures the shape to fit the available size. + Returns the actual needed by the shape and its children.. + The available size of the shape. + + + Gets the shape. + Returns . + + + Gets or sets the fill of the shape. + Returns . + + + Gets or sets the locations that define the vertices of the shape. + Returns . + + + Gets or sets the opacity of the shape. + Returns . + + + Gets or sets the opacity mask for the shape. + Returns . + + + When overridden in a derived class, gets or sets the projected points of the shape. Use this property to arrange the points of derived classes. + Returns . + + + Gets or sets the stroke color of the shape. + Returns . + + + Gets or sets the StrokeDashArray value of the shape. + Returns . + + + Gets or sets the StrokeDashCap value for the shape. + Returns . + + + Gets or sets the StrokeDashOffset value for the shape. + Returns . + + + Gets or sets the StrokeEndLineCap value for the shape. + Returns . + + + Gets or sets the StrokeLineJoin value for the shape. + Returns . + + + Gets or sets the StrokeMiterLimit value for the shape. + Returns . + + + Gets or sets the StrokeStartLineCap value for the shape. + Returns . + + + Gets or sets the StrokeThickness value for the shape. + Returns . + + + Represents a layer of image tiles on the map. + + + Initializes a new instance of the class. + + + Returns . + + + Gets or sets the height, in pixels, of a tile in the map tile layer. + Returns . + + + Gets or sets the tile source associated with the map tile layer. + Returns . + + + Gets or sets the width, in pixels, of a tile in the map tile layer. + Returns . + + + Represents the Mercator map mode. + + + Initializes a new instance of the class.When you instantiate your Map to use the MercatorMode, you can add tile overlays, shapes, images or videos to one or more MapLayer objects. + + + Specifies whether the background is light or dark. + Returns . + + + Represents the anchor point of UIElement, such as an image, at a on a . + + + Initializes a new instance of the class. + The position of the origin along the x-axis. + The position of the origin along the y-axis. + + + Specifies the bottom center of the position. + + + Specifies the bottom left of the position. + + + Specifies the bottom right of the position. + + + Specifies the center of the position. + + + Specifies the center left of the position. + + + Specifies the center right of the position. + + + Specifies the top center of the position. + + + Specifies the top left of the position. + + + Specifies the top right of the position. + + + Determines whether the specified object is equal to this position origin. + Returns . + The object to compare to. + + + Determines whether the specified position origin is equal to this position origin. + Returns . + The position origin to compare to. + + + Retrieves the hash code for this position origin. + Returns . + + + Determines whether two position origin objects are equal. + Returns . + The second position origin to compare. + The first position origin to compare. + + + Determines whether two position origins are not equal. + Returns . + Gets or sets the y-axis position of the position origin. + Gets or sets the x-axis position of the position origin. + + + Gets or sets the x-axis position of the position origin. + Returns . + + + Gets or sets the y-axis position of the position origin. + Returns . + + + Represents a pushpin on the map. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + ??? + + + Gets or sets the heading of the pushpin on the map. + Returns . + + + Gets or sets the location of the pushpin on the map. + Returns . + + + Gets or sets the position origin of the pushpin, which defines the position on the pushpin to anchor to the map. + Returns . + + + Represents the Road map mode. + + + Represents the Road map mode. + + + Gets the background style of the mode. + Returns . + + + Retrieves the URI for a tile based on its zoom level and tile position. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + The format used to create the URI. + + + Occurs when a property of the tile source changes. + + + Specifies the piece of the URI that is the quad key. + + + Specifies the piece of the URI that is the sub-domain. + + + Specifies the pieces of the URI that specify the URI scheme. + + + Retrieves the sub-domain for the tile identified by the specified quad key. + Returns . + + + Retrieves the URI for the tile specified by the given x, y coordinates and zoom level. + Returns a for the tile. + The zoom level of the tile. + The horizontal position of the tile. + The vertical position of the tile. + + + Enables the ability to provide custom handling when a property of the tile source changes. + The name of the changed property. + + + Sets a matrix that represents sub-domains. + A string matrix that specifies the sub-domains. + + + Gets or sets the format used to create the URI. + Returns .The following markers may be present in the string. {quadkey} The string in the UriFormat that will be replaced with a quad key.{UriScheme} The string in the UriFormat that will be replaced with a URI scheme.{subdomain} The string in the UriFormat that will be replaced with the sub domain. + + + Gets or sets the visibility of the tile. + Returns . + + + The Microsoft.Maps.MapControl.WPF.Core namespace contains core classes of the map control. More advanced users can override these classes to implement their own features. + + + Represents the exception that is thrown when a configuration has not loaded. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + The error message that explains the reason for the exception. + + + Initializes a new instance of the class. + The error type that is the cause of the current exception or null. + The error message that explains the reason for the exception. + + + The exception that is thrown when the specified credentials are invalid. + + + Initializes a new instance of the class. + + + Initializes a new instance of the class. + The error message. + + + Initializes a new instance of the class. + The inner exception. + The error message. + + + Provides credentials used to authenticate requests. This class must be inherited. + + + Initializes a new instance of the class. + + + When overridden in a derived class, retrieves the credentials used by the map control. + The function to call when the credentials are retrieved. + + + Contains asynchronous configuration settings. The configuration settings are loaded when an event handler is added to AsynchronousConfigurationLoaded. + + + Occurs when the configuration is loaded. + + + Loads the configuration. If configuration is already loaded, this method calls the callback function without trying to load the configuration. + The version string of the configuration. + The callback function to call after the configuration is loaded. + The name of the configuration section to load. + The culture of the configuration. + + + Loads the configuration. If configuration is already loaded, this method calls the callback function without trying to load the configuration. + The version string of the configuration. + The callback function to call after the configuration is loaded. + The name of the configuration section. + An object that stores user defined information. This object is returned in the callback function. + The culture of the configuration. + + + Loads the configuration using the xml provided. + The configuration xml to use. + + + Loads the configuration from the configuration service. + The URI that contains the configuration. + + + Sets the URI of the configuration service. + The URI of the configuration service. + + + Represents the callback function to call when the map configuration has loaded. + + + Provides data for the event. + + + Initializes a new instance of the class. + The error that occurred when the configuration was loaded. + + + Gets the error that occurred when the configuration was loaded. + Returns . + + + Represents a section of the map configuration. + + + Returns a bool indicating if the configuration setting identified by the specified key is in the map configuration. + Returns . + The key to use. + + + Gets the configuration setting identified by the specified key. + Returns . + The configuration setting key. + + + Contains background styles that allow the foreground controls to choose appropriate foreground styles. + + + The background is more typically dark (black). + + + The background is more typically light (white). + + + Represents a Bing Maps quadkey. + + + Initializes a new instance of the class specifying the quadkey. + The zoom level of the tile. + The x-axis position of the tile. + The y-axis position of the tile. + + + Initializes a new instance of the class, specifying the position and zoom level of the tile. + A string containing the quadkey of a tile. + + + Determines whether this quadkey is equal to the specified object. + Returns . + The object to compare. + + + Retrieves the hash code for this quad key. + Returns . + + + Determines whether two tiles are equal. + Returns . + The first tile to compare. + The second tile to compare. + + + Determines whether two tiles are not equal. + Returns . + The first time to compare. + The second tile to compare. + + + Gets the quadkey string of the tile. + Returns . + + + Gets the x-axis position of the tile. + Returns . + + + Gets the y-axis position of the tile. + Returns . + + + Gets or sets the zoom level of the tile. + Returns . + + + The Microsoft.Maps.MapControl.WPF.Design namespace contains classes such as type converters. + + + Contains methods that parse a string into an . + + + Initializes a new instance of the class. + + + Determines whether the given type can be converted to a . + Returns . + The type of the object to convert. + The context of the conversion. + + + Converts the specified object to an . + Returns . + The context to use in the conversion. + The object to convert. + The culture to use in the conversion. + + + Contains methods that parse a string containing locations into a . + + + Initializes a new instance of the class. + + + Determines whether the given type can be converted to a . + Returns . + The object type from which to convert. + The format context provider of the type. + + + Converts the given object to a . + Returns . + The format context provider of the type. + The object to convert. + The culture to use in the conversion. + + + Contains methods that parse a string into a . + + + Initializes a new instance of the class. + + + Determines whether or not the given type can be converted to a . + Returns . + The object type from which to convert. + The format context provider of the type. + + + Converts a given object to a . + Returns . + The format context provider of the type. + The object to convert. + The culture to use in the conversion. + + + Contains methods that parse a string into a . + + + Initializes a new instance of the class. + + + Determines whether the given type can be converted to a . + Returns . + The object type from which to convert. + The format context provider of the type. + + + Converts the given object to a . + Returns . + The format context provider of the type. + The object to convert. + The culture to use in the conversion. + + + Contains methods that parse a string into a . + + + Initializes a new instance of the class. + + + Determines whether the given type can be converted to a . + Returns . + The object type from which to convert. + The format context provider of the type. + + + Converts the given object to a . + Returns . + The format context provider of the type. + The object to convert. + The culture to use in the conversion. + + + Contains methods that parse a string into a . + + + Initializes a new instance of the class. + + + Determines whether the specified object can be converted to a . + Returns . + The type of the object to convert. + The context to use in the conversion. + + + Converts the specified object to a . + Returns . + The context to use in the conversion. + The object to convert. + The culture to use in the conversion. + + + The Microsoft.Maps.MapControl.WPF.Overlays namespace contains classes that represent default overlays, such as the map copyright overlay. + + + Represents the compass control. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Initialize the compass. + + + Gets or sets the compass heading. + Returns . + + + Represents the copyright control on the map. + + + Initializes a new instance of the class. + + + Initializes the copyright control. + + + Enables derived classes to provide custom handling when the property changes. + The old attributions values. + The new attributions values. + + + Represents the units of distance used by the scale bar. + + + The scale bar uses the default unit of distance of the current country or region. + + + The scale bar uses kilometers for long distances and meters for shorter distances. + + + The scale bar uses miles for long distances and feet for short distances. + + + The scale bar uses miles for long distances and yards for short distances. + + + Represents a Windows Presentation Foundation control that shows an error message. + + + Initializes a new instance of the class. + + + Initializes the error message control. + + + Displays a configuration loading error. + The culture to use to localize the error message or null to use the default culture. + + + Displays an error if credentials are invalid. + The culture in which to display the error message. + + + Displays an error for a bad URL. + The culture to use to localize the error message or null to use the default culture. + + + Represents the Bing Maps WPF Control logo. + + + Initializes a new instance of the class. + + + Initializes the logo overlay. + + + Represents the control that displays map overlays such as the logo, scale bar and the copyright information. + + + Initializes a new instance of the class + The map to use. + + + Enables the ability to provide custom handling when a new template is applied to the map foreground. + + + Represents the scale bar control on a map. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Initializes the scale bar control. + + + Enables derived classes to provide custom handling when the culture of the scale bar changes. + + + Enables derived classes to provide custom handling when the value of the scale bar changes. + + + Enables derived classes to provide custom handling when the units used by the scale bar changes. + + + Gets or sets the culture of the scale bar, which determines the language and default units used by the scale bar. + Returns . + + + Gets or sets the distance unit used by the scale bar. + Returns . + + + Gets or sets the meters per pixel to display on the scale bar. + Returns . + + + Represents a shadowed text label that is easier to see on the map that text of a single color. The text is displayed by offsetting text in one color on top of another color. + + + Initializes a new instance of the class. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Identifies the dependency property. + + + Initializes the shadow text control. + + + Gets or sets the color of the shadow behind the text. + Returns . + + + Gets or sets the color of the text. + Returns . + + + Gets or sets the text of the shadow text control on the map. + Returns . + + + \ No newline at end of file diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..53173609a3d769817c605718ea9cabc58a92be00 GIT binary patch literal 22016 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.xml b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.xml new file mode 100644 index 0000000..38d2dcd --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.Extras.xml @@ -0,0 +1,621 @@ + + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..ffae8f93cbd5911f73d89e3857b722f2fd988681 GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..91cb145 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/GalaSoft.MvvmLight.xml @@ -0,0 +1,1681 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Use this class to send a message requesting to display a message box with features + corresponding to this message's properties. The Callback property should be used + to notify the message's sender about the user's choice in the message box. + Typically, you can use this message typ's recipient will be an element of the View, + and the sender will possibly be a ViewModel. + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + Initializes a new instance of the DialogMessage class. + + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Utility method, checks if the property is + null, and if it is not null, executes it. + + The result that must be passed + to the dialog message caller. + + + + Gets or sets the buttons displayed by the message box. + + + + + Gets a callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + + Gets or sets the caption for the message box. + + + + + Gets or sets which result is the default in the message box. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..b6e514758f3375b4e049f14adbea4ce4007c0782 GIT binary patch literal 37376 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.xml b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.xml new file mode 100644 index 0000000..9feeaaf --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/SL4/System.Windows.Interactivity.xml @@ -0,0 +1,1025 @@ + + + + System.Windows.Interactivity + + + + + Represents a collection of IAttachedObject with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + An interface for an object that can be attached to another object. + + + + + Attaches to the specified object. + + The object to attach to. + + + + Detaches this instance from its associated object. + + + + + Gets the associated object. + + The associated object. + Represents the object the instance is attached to. + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + Cannot add the instance to a collection more than once. + + + + Attaches to the specified object. + + The object to attach to. + The IAttachedObject is already attached to a different object. + + + + Detaches this instance from its associated object. + + + + + The object on which the collection is hosted. + + + + + Gets the associated object. + + The associated object. + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + The type the can be attached to. + + Behavior is the base class for providing attachable state and commands to an object. + The types the Behavior can be attached to can be controlled by the generic parameter. + Override OnAttached() and OnDetaching() methods to hook and unhook any necessary handlers + from the AssociatedObject. + + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + This is an infrastructure class. Behavior authors should derive from Behavior<T> instead of from this class. + + + + Called after the behavior is attached to an AssociatedObject. + + Override this to hook up functionality to the AssociatedObject. + + + + Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. + + Override this to unhook functionality from the AssociatedObject. + + + + Attaches to the specified object. + + The object to attach to. + The Behavior is already hosted on a different element. + dependencyObject does not satisfy the Behavior type constraint. + + + + Detaches this instance from its associated object. + + + + + The type to which this behavior can be attached. + + + + + Gets the object to which this behavior is attached. + + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + + + + Represents a collection of behaviors with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Enumerates possible values for reusable property value editors. + + + + + Uses the element picker, if supported, to edit this property at design time. + + + + + Uses the storyboard picker, if supported, to edit this property at design time. + + + + + Uses the state picker, if supported, to edit this property at design time. + + + + + Uses the element-binding picker, if supported, to edit this property at design time. + + + + + Uses the property-binding picker, if supported, to edit this property at design time. + + + + + Associates the given editor type with the property on which the CustomPropertyValueEditor is applied. + + Use this attribute to get improved design-time editing for properties that denote element (by name), storyboards, or states (by name). + + + + Initializes a new instance of the class. + + The custom property value editor. + + + + Gets or sets the custom property value editor. + + The custom property value editor. + + + + Provides design tools information about what to instantiate for a given action or command. + + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + A single argument for the specified . + is not derived from TriggerBase. + This constructor is useful if the specifed has a single argument. The + resulting code will be CLS compliant. + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + The constructor arguments for the specified . + is not derived from TriggerBase. + + + + Instantiates this instance. + + The specified by the DefaultTriggerAttribute. + + + + Gets the type that this DefaultTriggerAttribute applies to. + + The type this DefaultTriggerAttribute applies to. + + + + Gets the type of the to instantiate. + + The type of the to instantiate. + + + + Gets the parameters to pass to the constructor. + + The parameters to pass to the constructor. + + + + This method will use the VisualTreeHelper.GetParent method to do a depth first walk up + the visual tree and return all ancestors of the specified object, including the object itself. + + The object in the visual tree to find ancestors of. + Returns itself an all ancestors in the visual tree. + + + + EventObserver is designed to help manage event handlers by detatching when disposed. Creating this object will also attach in the constructor. + + + + + Creates an instance of EventObserver and attaches to the supplied event on the supplied target. Call dispose to detach. + + The event to attach and detach from. + The target object the event is defined on. Null if the method is static. + The delegate to attach to the event. + + + + Detaches the handler from the event. + + + + + A trigger that listens for a specified event on its source and fires when that event is fired. + + + + + Represents a trigger that can listen to an element other than its AssociatedObject. + + The type that this trigger can be associated with. + + EventTriggerBase extends TriggerBase to add knowledge of another object than the one it is attached to. + This allows a user to attach a Trigger/Action pair to one element and invoke the Action in response to a + change in another object somewhere else. Override OnSourceChanged to hook or unhook handlers on the source + element, and OnAttached/OnDetaching for the associated element. The type of the Source element can be + constrained by the generic type parameter. If you need control over the type of the + AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents a trigger that can listen to an object other than its AssociatedObject. + + This is an infrastructure class. Trigger authors should derive from EventTriggerBase<T> instead of this class. + + + + Represents an object that can invoke Actions conditionally. + + This is an infrastructure class. Trigger authors should derive from Trigger<T> instead of this class. + + + + Invoke all actions associated with this trigger. + + Derived classes should call this to fire the trigger. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same trigger on more than one object at a time. + dependencyObject does not satisfy the trigger type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Gets the actions associated with this trigger. + + The actions associated with this trigger. + + + + Event handler for registering to PreviewInvoke. + + + + + Gets the associated object. + + The associated object. + + + + Specifies the name of the Event this EventTriggerBase is listening for. + + + + + + Called when the event associated with this EventTriggerBase is fired. By default, this will invoke all actions on the trigger. + + The instance containing the event data. + Override this to provide more granular control over when actions associated with this trigger will be invoked. + + + + Called when the source changes. + + The old source. + The new source. + This function should be overridden in derived classes to hook functionality to and unhook functionality from the changing source objects. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + Could not find eventName on the Target. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the source type constraint. + + The source type constraint. + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the element this EventTriggerBase listens for as a source. If the name is not set or cannot be resolved, the AssociatedObject will be used. This is a dependency property. + + The name of the source element. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + The element pointed to by does not satisify the type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the source property changes. + + Override this to hook functionality to and unhook functionality from the specified source, rather than the AssociatedObject. + The old source. + The new source. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the event. + + + + Gets or sets the name of the event to listen for. This is a dependency property. + + The name of the event. + + + + Static class that owns the Triggers and Behaviors attached properties. Handles propagation of AssociatedObject change notifications. + + + + + This property is used as the internal backing store for the public Triggers attached property. + + + + + This property is used as the internal backing store for the public Behaviors attached property. + + + + + Gets the TriggerCollection containing the triggers associated with the specified object. + + The object from which to retrieve the triggers. + A TriggerCollection containing the triggers associated with the specified object. + + + + Gets the associated with a specified object. + + The object from which to retrieve the . + A containing the behaviors associated with the specified object. + + + Cannot host the same BehaviorCollection on more than one object at a time. + + + Cannot host the same TriggerCollection on more than one object at a time. + + + + A helper function to take the place of FrameworkElement.IsLoaded, as this property is not available in Silverlight. + + The element of interest. + True if the element has been loaded; otherwise, False. + + + + Executes a specified ICommand when invoked. + + + + + Represents an attachable object that encapsulates a unit of functionality. + + The type to which this action can be attached. + + + + Represents an attachable object that encapsulates a unit of functionality. + + This is an infrastructure class. Action authors should derive from TriggerAction<T> instead of this class. + + + + Attempts to invoke the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same TriggerAction on more than one object at a time. + dependencyObject does not satisfy the TriggerAction type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets or sets a value indicating whether this action will run when invoked. This is a dependency property. + + + True if this action will be run when invoked; otherwise, False. + + + + + Gets the object to which this action is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Gets or sets a value indicating whether this instance is attached. + + True if this instance is attached; otherwise, False. + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Gets or sets the name of the command this action should invoke. + + The name of the command this action should invoke. + This property will be superseded by the Command property if both are set. + + + + Gets or sets the command this action should invoke. This is a dependency property. + + The command to execute. + This property will take precedence over the CommandName property if both are set. + + + + Gets or sets the command parameter. This is a dependency property. + + The command parameter. + This is the value passed to ICommand.CanExecute and ICommand.Execute. + + + + Provides data about which objects were affected when resolving a name change. + + + + + Helper class to handle the logic of resolving a TargetName into a Target element + based on the context provided by a host element. + + + + + Attempts to update the resolved object from the name within the context of the namescope reference element. + + The old resolved object. + + Resets the existing target and attempts to resolve the current TargetName from the + context of the current Host. If it cannot resolve from the context of the Host, it will + continue up the visual tree until it resolves. If it has not resolved it when it reaches + the root, it will set the Target to null and write a warning message to Debug output. + + + + + Occurs when the resolved element has changed. + + + + + Gets or sets the name of the element to attempt to resolve. + + The name to attempt to resolve. + + + + The resolved object. Will return the reference element if TargetName is null or empty, or if a resolve has not been attempted. + + + + + Gets or sets the reference element from which to perform the name resolution. + + The reference element. + + + + Gets or sets a value indicating whether the reference element load is pending. + + + True if [pending reference element load]; otherwise, False. + + + If the Host has not been loaded, the name will not be resolved. + In that case, delay the resolution and track that fact with this property. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + The type constraint on the target. + + TargetedTriggerAction extends TriggerAction to add knowledge of another element than the one it is attached to. + This allows a user to invoke the action on an element other than the one it is attached to in response to a + trigger firing. Override OnTargetChanged to hook or unhook handlers on the target element, and OnAttached/OnDetaching + for the associated element. The type of the Target element can be constrained by the generic type parameter. If + you need control over the type of the AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + This is an infrastructure class. Action authors should derive from TargetedTriggerAction<T> instead of this class. + + + + Called when the target changes. + + The old target. + The new target. + This function should be overriden in derived classes to hook and unhook functionality from the changing source objects. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the object this action targets. If Target is set, this property is ignored. If Target is not set and TargetName is not set or cannot be resolved, the target will default to the AssociatedObject. This is a dependency property. + + The name of the target object. + + + + Gets the target object. If TargetObject is set, returns TargetObject. Else, if TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target object. + In general, this property should be used in place of AssociatedObject in derived classes. + The Target element does not satisfy the type constraint. + + + + Gets the associated object type constraint. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the target type constraint. + + The target type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the target property changes. + + Override this to hook and unhook functionality on the specified Target, rather than the AssociatedObject. + The old target. + The new target. + + + + Gets the target object. If TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Represents a collection of actions with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Represents an object that can invoke actions conditionally. + + The type to which this trigger can be attached. + + TriggerBase is the base class for controlling actions. Override OnAttached() and + OnDetaching() to hook and unhook handlers on the AssociatedObject. You may + constrain the types that a derived TriggerBase may be attached to by specifying + the generic parameter. Call InvokeActions() to fire all Actions associated with + this TriggerBase. + + + + + Initializes a new instance of the class. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Argument passed to PreviewInvoke event. Assigning Cancelling to True will cancel the invoking of the trigger. + + This is an infrastructure class. Behavior attached to a trigger base object can add its behavior as a listener to TriggerBase.PreviewInvoke. + + + + Represents a collection of triggers with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Specifies type constraints on the AssociatedObject of TargetedTriggerAction and EventTriggerBase. + + + + + Initializes a new instance of the class. + + The constraint type. + + + + Gets the constraint type. + + The constraint type. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot set the same BehaviorCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a Behavior cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to Cannot host an instance of a TriggerAction in multiple TriggerCollections simultaneously. Remove it from one TriggerCollection before adding it to another.. + + + + + Looks up a localized string similar to Cannot set the same TriggerCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a trigger cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to The command "{0}" does not exist or is not publicly exposed on {1}.. + + + + + Looks up a localized string similar to "{0}" is not a valid type for the TriggerType parameter. Make sure "{0}" derives from TriggerBase.. + + + + + Looks up a localized string similar to Cannot add the same instance of "{0}" to a "{1}" more than once.. + + + + + Looks up a localized string similar to The event "{0}" on type "{1}" has an incompatible signature. Make sure the event is public and satisfies the EventHandler delegate.. + + + + + Looks up a localized string similar to Cannot find an event named "{0}" on type "{1}".. + + + + + Looks up a localized string similar to An object of type "{0}" cannot have a {3} property of type "{1}". Instances of type "{0}" can have only a {3} property of type "{2}".. + + + + + Looks up a localized string similar to Cannot attach type "{0}" to type "{1}". Instances of type "{0}" can only be attached to objects of type "{2}".. + + + + + Looks up a localized string similar to Unable to resolve TargetName "{0}".. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..a460aecabc32c64b2ecc385af73408e8d12c403b GIT binary patch literal 22016 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL5/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..b680bc488b3ac17bf92869715963e4f3d451b5d2 GIT binary patch literal 29184 zcmeHwd7M<$mH&B5y;^#qtE#&JX|UL|=&o)S!2txNp;=nlyIDjc6x{`sRM%^(s=*e~ z#vsPTM4cEnjKM96(HQef+!6^fN=8i#X4Q-sNk(UMlAk7V63s;Xeb2e?RlV+pEc5&Q z@teXVi9wcz(h zKdvqQ{^<6t>3pm^XK%?RyJ8*5Y}PKsHl<>@o@^|gjkPRmi*?zZsiumG&^Sl*^7%xI zHG}^2o3mEAt-VhA=rXO0Xe%fIMLoC|X$;@}_!3n~URQcEf%TWq>wutNQKO+>bFN}m z{;!leD3kEn3b}2Z*-y0G$C&}2Lqz2uO@gGl0Y!fijTKcFwgB)&o(fHc)FlPr&uj)j zne-KUdp|LvjZL|Ht^-8TZ9g&=z8B%^`OLv^HRVzn8;qr*#%pscVK_$B% z{pSzsrjw7}n@u!pAyH7MC9ph3)K@}Jn(O}K(_eq=(emG4e)J0)Zah7+>bDP$oOSz! zA5OSFHtD;kZX5gg&9}|I{k%OZp8sU|%5}bZe_XzJ_@Bey*?mRF=`Y%~>wmfIk^Swr z_vqjI<@;aRd${+#L)q>3`?p^G=(9h#AUNZq$v+!)(aihCUby+my3lP`wO@HCG4`gB zOW(<@zTml48?XPv>0P(l2fulmZdAw7cdPzsJsu_s8I5H*4W`IPfLy8@d5og93l!5# zl}icr{oGe$dPH%a|JQ$HCGNvixWKq8|Jw zt5^Fs)EkQWXua58qTJFi2Qg$11E_yq-^scq;wrU=gVbj@NLBWg~8d>WxIe=wUn&QRT+HjH$xfdiI9{XcsXlY=n$N!m!7q zT1j@(DMrr}_){Wcl!(>w)4&wct@!EOa#r8TrcP{DX>s(Js77zG)i}LWy{IoUL^P$Z z-;M)AmziiOB~L;brSHU?H|xjf#xBXgZj&@xjDGM(--#ZY3D}WS8$%wl8N`a$yj7$&qFMq7w_SZ)t39s4(MPEX zUcXZ3@vxbvL8~_6a8nCopwqL^8zDWc_#EAuSkzG6+{LmCsAuFSf)vNhvg#e4Nz9Wl zMP#B;r80!}WRx_H@KP|2p~fKOv7!x&Jr)RAIRv0?`wW&=YvpQ+NRfS{uJ}2`Sjcl9 zlsfQjtDkDWQ@w8t>2X8`t5L7Tu*#U!DhgYgOYEr-0`qvWb#A366tHTvO%?si(W0}gqQXA!RZjkKFF!p)ppKs3OMx^oYV(lP8QPNoFe{j zFy}yzn+ZwKm3{8fqR$~9TLXQL8~95;H_}LqRl!1eTCIZ=os9eUcQ~1_{~b=I`oP;I ziJ8T)7msrfqmz8H^}rxHW59D#`edKQ4E-HrzT+4Z9LE@KB`{?pQzQ(E7rIaKTh$IZV8wlg)a1G2tP6x!hIUtETl7W8BEgDv5p?Un#a`~9*Jdt)vvfOe}`WQd(p32P`O|5n$H9$u8J<0ZLA{C zwgsF@@Dc-KwlRgx#%U>dl`uppRf(gNklo<5P-HQgb1HbjPdI*ULCWi|YMA4fjN>Bk zfxQ(8;@7!I5;N6+v2U^zMCwFTk(~G?%O+wNcbWysxQn3TGF#8ljC+biI$s?Zqg3zW zR^gmnr@ntIJCDUdKTiAk7nWQp;M7|XU%~}26sKPQf^}I4TX!j^VqFmr>oSEaaayu& z2^$#8mVs|jEL#rZK%e6VJU+LA>-}9m$Nl>|d`{SlKDQE;`}tfO6C9rtT}~Ry+F4VM zWxenbgdb-NIF?DD>{ZO5$5$hPldM6KI8RwU(WJ-MGJcws7^_GpiDmazBCf${WH2F_ zQ$tCP=*MfgGypTp+{WTB@wOD(SjB5a0tYy*i-eWan4$nRG9hI+#U8>^-n`o(S9D!S_ z?m9FsHdXOvL-jR&DUY4%uH@@QhHbJ8WXR^?=BPPJmvOBh zRjtxf;@esK>=4??oljIb8QH+9!vv3AB{n5x91j|``r4>ZA0M?MJ~4FuBG?D9U>lOC zfBL5|$YH;o0ag~#;$28D$Hv2K3|Akw`p{H93sN7GgwE&jhPWS~JYZkUG6D^?kw83$ zY=t8rXy<{Q25JFm}h0H6v&S!ibZqmMpv zhRv@kSvCwDiUu1Zkzjl$XH6ZWjj=>a!T2tujc=f(;PG0_DyJog@L}XFHS#>>Q+dog zY3$X6n8f)Q-Eq(z{~yw+zjf(;`je)WGY`+hqey{-jTt;E3^72+vf_xj4RK6RWs)+# zGKo3;MsP(;u}XPFm!ax`C+HQy#AObyjvQGR!@ygKjb@_JOOTVA*)-f7M6~P??q(??)w9v zSFkT7%H(uT6gFU%Lv~kfA28vWnGkIwm_i3Or3r zQecym2XM#=*w__YXJFQ25wO4}o^u2$T3!_)cQ5KUegOr(xxIGd$$j`P?y z)6^b!JSR}`!7=_2u88yd5HfA1A zU9rdKRkuqs>9qmfc4FGuwB=s6ujA?ZudBZDnXU~0W2GFA#|EPbQiPLU+RQ7%uve-Sdy((#bQU3S~R(j?q^3?8D=~R4kbd|#E}-_ zX@gN{h+}3oVD88S_c!FQ$nXR&udc8HO%eFSwZIyK0n6?~Ced1psV{s<(-Bb<~ITN@1l%OX12p5))jEox+r-`y5T2u&;^#cGAo{+}LyuU2)JI)1Oo8SQVR^^1Ny4<4r;Rxw;^H zt!X;$M$(y4H!zLP5&_Gh3iZn+w(a@ZVo=NkAn`#R7rbV4BBVtgZf4hi>+%8kmF2dB{ zb_dpzc28Ch?XoP@u1;`hf{M69MGk8d8#UBegAMoXoGH(J4BlwuF*Hv&xXg=r@8GlVMLxl&af4Ur2Gh5j>A>I#4MXcs%KRYQv&8%mu+nY!7+f)Y9Td#$ z`2S)zHsVh(dP@8;PHwxR5u+FXB3f=762A{g{(gWyrm7hZ@}EI&-dhM!{r#(=PVhIvBgA3${+Lz&02;aLs!k1D4~ROK`cCQAV*e?UiB z_ewK?3vZuc!;c!2kC=3ZJ6^1#1%sPl8|RKMdxJk;95zRS-;uy)_gScqEo=BM+FOPp zRJ5d}#--BaO$6-!x5$y9IH??XFyx$a`9!uHP92hdk{n9mOOJz0$-;N+Nw6X@htT`eeA+jtt}|K2ly>zD4UzHH!(9lVAa-~ z`e-nSs7QYre+Ex{ZoLg(^qXKcI)bkSq8};x#?Ni!*%Ox=_?q})4$1S``AEm&%QBeG zDSVg3;uCUuX3_onoqC9Vq#x8RdK39d8g3YdMe~h2L0KvAe1R_s{JFr{W`k)_m&tWM zZ#@k7Wk8E&1x5!fY7KDRrILR^;2Q$33$pwjA;YMow*VvbblC%C7DdXL|DE!e%Pl%C z`Ra<7%R{uI;=+m$JqKvfdzH-d^pN|9SoF_Bxb@!&98$&kCV>kDZWOpv;7tNwta`Z0 zqF+|Ag!hFqE*uVjiKfF?7HtVH3|n-yz4HOD4f%`P~W5wX_Y;kDWbZdmSty_3i@ZLs?X? zhky;kOc^WKlTubm4T3!j%mUw8BIO9Z0$DXQPs)Bx??XxrwFp+Dy-x|m((?p64Oj?L zmrK2=z<4gKm$Gw!`G9SuGF(Ho!o4fd_LWk$UZjk7ux?;2bQ)bPW!D2+M5oiWf<541 z*9&$SSS8ACq}{N~tH2Tzr(31$kHFSqX5ArJmHrA^Z=idHb2PAx)JR_wJtyjC!^#us zkYH;Z>@e+yo)_Uo1Ru(tht($;qX1_ZV<2&}F;gfjg|g0}XjEf<3i*)&-!i|3yyklx zaE!nj^F=9Tc(w0e0Y5EJaemLkd9^R7aVf(_>ukXJ0xz?cBY&3vOMq?uhXK3%j{)xW zKdDWo|L~u!g-H*@_0bd!aIIB=gsxFu;LU+^^f1kc9=AAJjKT=d3NlY;@G)&P-4gsN zI61G;4+TyRaa-pJ{A_5kp^;T~ff1&W<&PlWSRRM8-&Ul|BQXp!?H#t*n1CMryogOi zj4U6`Wp4&AG0sL*YjLp80Q1phg6*aIj27tf1y!aUG!_B-pb z&#Q}A7w$3_38q>oBfg&E_PB*|dR%cz3l;RLDw7r}sGWl?sTMed^XG8IG2?PR70c(a z@7HL(gdK;T*y*-W2T3Aop)5eJI$Tz{@6M)i{uGtauJGhf=SDac_sxe!&h0xDP|=eFsxAr=2eK zWK@RI;v)7_M1U$BWL%l2P@;$(!=CFN!QRx^x+CaY4#w@((N6?Z_N=3$4#xJZqc;Up zmKaIp6SxIs-I3HO*q*?xzB_0nWgP5FzPo|-I2c=Z6zy^_w(cm}t1z+Wsq`7a*w5af zQ|X=}_5sCcGjD7hdyb*I1=|~7dyb(e1=|yN%E#D`RT=DQYGY_&1J~P2+`loD5lq>0 z3_asuY)?d$gm9wuDC!L>Vy9|j=~ab6WvF26Hw4=g7-}s6_P?Dn?t26M!6_Sq zvIhD{m7#@Wh{ct>fsuLJtToc8BDP4IND~zn=(J323jKp%djj3oG3*@Y6gkh=&YhZ?ot!2YcSS64+G^_7m$9+HCr?V7mjqv~B=)lT-GNbsL>c zcR1L8TKlxK={^VZ`}b?-(8CTk+}~%NTH(P)=qo+gXq|VR{5kA<8@jAgh+s#xHFQL@ zzA5mjz)XD|#d&Lr$j4f*qp3ygeQiC>DPl*p4Yat3y{&Dc#gkM$)_OCoDPraN7TQ+C zqWV_a?qIC-MRa`;8=-HbeMM}vo}n)mv6r+gJyOJuYTfh`!ET}l19SB}9d)p81{UcB zdPA_i^mL$w3KW>kn%zLJ1Qw%gEgwCA{XVc>@1gcH6m~q2(R*p?R2SQ&@1)o?#`aPq z*g{v(ItSyqas^!`*lrpfyh*=;=pTerX3mxLYia!k8WVlrx{}_*83^qSyT5vo{&9*H zIrnKFr!htBUVRTuDPmvJ_tHFt1?C2Cqig6q!FC7Qg8Q^ee~$jCh#k{!rXLltxAfcSb%n_qa0k6p zEc=~)2Ypb)KGgSH8zp zBbe&@BXqf7dtmE(^{>)rirAO*uhAEZ*gows`m$hq17Cp!AE!rES>W5S;N$cyRR$?d z#uM~%5u0v2Meh``X5$cr>>6O-r(23;7a1?oGsUutj33aug55|zDC;$j&@!A} z(E|OV>=VXIbXgI*-S{yb5R6y67Wx@I(hqyGh&^unjGj|iU{3h~dYO(0c2l6O{GjnN z{ZX(zflT?+zyf@YfgW91{y4C(V23rHRj*J?uxGSe%D-#8Lh~H#nzEOSSE*3MUNv5) zuL;Ilzia#p{ke$w%ztC?_#F1VSAL55YlR3l&V09s1u7<*?|HCO%s+UrGtEC0u@T_> z$i*t^D{dofd*yT3H@gDooFdjzu}|}23r$^Xna!*>1+J`EVw&1{g541KY{g1oZK{m! zsaR|Jv_4fvPgE?@E$yIFcC_L`)6$MO*qbQxYi~Ii$2vb+*Ql=2g*uIs{6r6&CV2(_ zc1~|CuQZiEM`SJl)Jf$BQ~t7qB_0VXKbYc`uu}LL>cs78RPt&2Z zR=U(OoLW!Q(7k*xg0n^$A1C~5>b-`^9Maw1P)y6XvVi~OX(|C)sVS}ipfl=rd( zjZ`0*V)W~^*LxMG>aXGt3@O!BoQk5Lm$L?(28{y5{gKpSiY^qxp_JyML0oD|sn03( z&Xkkoy{)VK>C)Cfh-Bui>)x-mE50R zYSE>$hTQHzIm#Q`Mb0`vlTv^h?GXOK^b)^2r~VR;LAyleb$~ucvRA@>X^Wvw%1@LX z)Z9O(lHckw@b&YZ1a1a~&~%)_!+0VTr?-e#_um5U(>@TWX`BxV3=14CaJ0Y)0w)Wc z0eGp|EU;B5D*&%BlYo28G++zbV|cNYjzj((+`xS!e1@-Adp$hMcPqV%{BBK)tntkt ze`LLH9PwSoIO0?9I5{OJP^*ik0(RikILTOvCn0ZY4gkep}<#&xiaa z$bSRUdP%{5LjDQupCkA9&KKRz7yb#*xdoj5$V0xVxY>IVt?)e_Yx`5&=KCYZsGax* zuU+o++T~8KU0QD^zSC=$+rM`3e}FvSJG2wuXtWdGPqfqB<{f~1bFm)MOs$>x9szZs zXQ$i&c0zJcD;JsN!ruvLr-H(kFBh5RBC}j%c8Yy6kTw}SEUjFml}jt-au-oYeAccb zzEONm#;zLDj=^^p8_gQSMcQT3yO*@%k&jz1X=e13*0s{&wG@mVux@nnHPJ^wA0C~o z-44o6aT{9`Jw^{o>DOpiH0J*%eJW~d&(O`$1op9ujW+*V+T+pl0S`ud{5OKSqG4&~??%LC!wNnV>H=#szPsBh@eJ?ClM~I`AK(KNFwXINvOAk@jb~M>RD*Czu+a zButHOQ?Wk;oB=uev}V8-_*+%YwqP$c)N}_|fYJ~=UrGlYbf4AnKQ4Osyg4)fnRUPt8*kc>D2j~WobAvvi z_CJC*=u>O|GZ>_^YHy=kg&v_EBX35i7f`2N#wExfko-f)H_=YYmNikHQh;NrBh-X@ zp5FjoAn@a~1N0~bKpBDC;wI{#4WOJszeoNoq0FOtP|gGYXze^Li+I8?De!LXSNgj? zO=rqzfz1Lp3hWbjr@%u3zb)`}fyV@r!F4r(F@d86HVaIuyvaOw3OpuI^GS;Wn+0wZ z*eCFHfyV@r#hfvLa|FH~Ug&Q>nr|K16_g72aW{Z4onWV2G<041os4Q2;LODJ^1C|zXsn8>LDF# zoPkwm7$6}Mk1WE^hWJLxDqDrM5YGm{gPVHX&zH*zRE8&)<)~GGHE0NKVZ$^Ex6-GA z8pBQUXq1da$$0oo98rj`S}V;f0cZQZ3E1NMHsCVfvw#}}rhU&NpA)D!FZD6M;#721 zS8*!(zk4Kj>wYk(?#FPG9Bqc;5gLNF`tKnKLMyyBSwVZ4jc(M5j8ZL1gO(wjG2bJ+0n?KiP}1@ z#Kr?o$KA1xc|HMf79{Dk5Hd78vtxKJWa!i?a4BSHv`k<-;)9N7 ztr2)W%>aEJppK`8X8~SCvq9MlsMF1K4)V7M{5&;-ayy_#ci}mujwg8x@22^n+ykiN zc4{Hu1JH$k&vqW*W3&XNPe3Cbw?_;Q?P%6tXT=X{Z%wOhD&0PW!u(C$0|?T#|8TZIwkk43KvPo}Pr3aMGuo^jl8)Z72N>QkMH2`lawc>(HNb(ifcc z`%d};C;gF={=`Xt=A^GU=|4N^QKT&Ys3ZRu4*ge7`i7JKtCPOvq`!C4KRW4$PWmxT z*=K{3CY`jyNmEX`!%2Icbf=TMRvbE6EnaR+~R3_Ow&+h6B81! zn=VRq6i!rmQ7Y4&%H>bM-JI=QnacNM3bZDb+}7MtNZVOY7A-J+K~J{Bo1H?f^D?Pq zwx|09t6R@bZK&X zdW-bj&+KZUC>K>NMTKD(%DWM z&Gbi`TC?3f1-O9Yt?ktA_|WQPrYF_j+nu6z*V4;o0f?C~nHkB<%Z_xuD zz1{(aq75nK*R%nDqQ&uXaz?1BqhROA@yYqyA!-pOO$JTOEAl#HLCMa}4TGt4!{<>f!MUN@8B~{qap3EU}Sv*s6Niw%>ft_nfWl}Q19L5bvHQzSm z3mC!{1w8rYx$ba;YqwhYOYH z5{>H)q%mKAjuOUYt@$=lQv|l=n=|R{Ug1ukW+^?+-nL=GTue0h*n)H_(@C=iG&h)` z*xH~XrGrm$rK_Q0buGRbk&GOB^TRcbsJEmL6T>w@6+bz+V(R zOSLvg`&ll>iAtpD!3F(V8dU6b%ax08qI%G;7JO|>8nH4*?e1d3_NR7d@K$AWF2g)T zSvJ998!OI+PSx+$EM_~;%MC7{6c?jo#+mi`CTDrXswiO~nd{v+g(SKzh5`sZkkFCt zPGh|D%Qm<5Z0g7)v0&zv$9qfp#n_I5L-&jUZAj-GuXKBr>ZE1cQ@LEaGv#y}9mXIj z*o>VD)+UcWPIcA@+ly>ZS1QM=8nk1pwA)fpvdMy+jZII!kcYgBds6v=J1G>mvf;9v z^wMo#t@5n4cl{NI>qnU7#Rd(ow~#mzW7)(Ybhs`%Z)>V!TXE>QHFr&tn96?Ik1)%N z4QkC>D6?m2YKN?jN^KY6W|n0-OC?2QmRn(v=vgk$pc1zVxf}zxCjAymS4HnqIgsWo zlmp3L>p0cjCAc3eqW{U8s@0Vfi>$TpFk#ha})BY}i^bPqr7&DEW5VrY>hV zvN(XaUPBp)(L0J~!n}Lh%Den3R7;@FdJbR&6|o3lNg~<$H|KK6-sS=ppiMZY;I ztR%C>b|W8}Rw2+WE=@MtEZav`QXK#{6+O0)E@V;!vDl%s^PehAZpN~_2rE}HjAJ2# z`zaReb~dMTUBc;5cpc6Nq1$ma$CEIkg>+Y{31Nk2KSv+c-vxY{*oJN6b9o47WO+Ph*`g$(pygjgNMjbTWH_#vMbJ z*qs(|&fSu=^EmzFu_$lq*|LRWVu?-BV1Evb#e=9jJltR!2S2Z3Ajqubi;_zumoJHP zDsnv(ZAxd-1+R4-*X7V$3Rz&@l+G3xhEi}5tKctMZo>*95_2ik+RB#z*xm36lVtU4 z&fzyn^SinWy$BE-SU6y?d-3E^%K~>r?u=UZb> z%dRA^N!#K6I0%atQqQ%K>?X10=`2}e3H&ydE1oOWN+!Rda*mvG7oikc-m@u_R>!5* z{8DV(Qk@P7Iuw#=tdO|VuyMfkjNTGV9X_kiXaB(}kS?&s!p(8LxwBKkax33F%<}9c z&)&3Q!!$}Wd0yMNS!d7KfD;6+G&-BJcDA?6?#ZjOpu3GblORq^wLF>5VVCUgMA5if zt(~1IE5rS9)(^?6$m94UFZ)o}-Nw=y+@oNnQrlRMkR=%1r5tl)MX~ejwX)jSxb%`1 zY>ctwxTlWvd3JGk?^O{-VdnNETm#2eY&f=LSs;4@&A+%OnaOhpOSN6Od9u4V2m|~W z^QSvw_j2szEH4k)j$Y?NhgB*qUF2Ei(4u>EShks(I^=Q%2L^`Hey{)|EG#L8!9lbMotsi}*}Sx9wb(%3y)ww4OvLzraCa%x(@Z{-F}TybG( zZ$+3ovY3=+qsuBDj<`^oVf{){ouz`s$*xVENzanv$+BJM+MT^{c%BObN)%BI0W9oH za&{@Mwgv1JqE8>;#V^i?w}-oEt#QBNIURL zFq%AX03}9Upx})R%94%RG4Q4Y>yer?emUh((hX`39jM3rtVw4Q{2+T^t4mRXTcZ`+I@_#8bm#`X z0BbWXhi7Lg*il(;U|(1=x1L6g4B(~U?Zops>bt=mroS$<36H@Bi;3eQ9yiBbYDV+j z(g1gzo8!UQfQMq(H9^G!2A~^!afh=BL&sgqKox8?Aqgst?0$a1%6T8m|3>W-o1cDQ z@hcR#?AKTQ?BIR9pRsBpF)gb3Y9f=gN+6T8C>d5{m?Z_eFNQaEYC{X=Y5*>j1PmKltlVH-L1Uj^~;|P-`NiL8?M+m8*%2=OWasGw`q(73=CCu*Qs0 zWP(VYfU-(P8wG6ys#~aE7pVc`1biFKIG9l#e^~)+$mrZQH^gezsVvuy5*G|ds&wI; z!@^m#f)a4BPEoB)^i}zCB}gI6r&(+yJpJW@I^C)hozOtc0L~VJyg1~s{7P0KJh_a^ zoP2oo zvPqiL_fb?nNn@>8@F=R7gqK~Qvcgo6gIJR^4II`aofAJx7)5nHrq-d1dkT9`uYieW z=#kkqk!CGC2M^67({=oL3xZ=z$3t~(2y!)%`9+Q)RcH~f7(`mZ9+_QNMWR_r#4u)X z_4CROvf`r%b<6--5o1?cVq)|=vV@IZ8CfDmM;cH@jVyto>PFUyMh;Jn!&Bq(hzrYL zM5#0|QSuB-lvsY0Dy1$`RTr5cHv}JHk^v56LNOn@AX#X(f`=-y0;3jL0d$q1s~BBX z$>ywyoR9Bt^sTZAqgz6w=rKmaEv*`b_X9#qtCTEz_zDKAFdf4m)6{fitLrR$x??bi zMI}?KE;2jP_ma=A!?j=?z0&X_D#!FX_&2h3 zki&tF8AdXKsKl~4oCTEZsD_LRTzXXV`wcKgwZ2bk)VD|e{|R!_9K-)e0Z0EBt`_hl zkoTLN_&+IhBzy9ySh^5Hl8-reJ-FCW_x-UQThkp|-I`l$yOaN~3#*spn__LLRBUUZ z&^>eF#2q_!G;P6i@;pB$@7OvqKe1Du3_Dj9Sc{|&;mLSSNvo^UO+vIW{W_MB5ax%D z@Z}8&m`N}es&MRK%W|j&S_j^V{t!o{QeaVBsxUk!JO@I(#rh}>UaE)Z@ESE9sV;Ic z3>>R!!hOFf#;_pA<-XsdwTPts3M=|y7*mlY(P~(2m4Vp) zWYqw518nce?BRa+JX^fjLX{(;j19BfhcSt26_Rro1}+Kj4mu^Ab4w=p{jl+zNENj7 z43?M0k&c&h5L{w@i}}?!4yXfjh3EJXaCTR41nfd2;ZVbKt!7B5{~+?*oIOK13ER%q z2O_y|x?_%hN_iBNAhmnA#JEZ{AQP?~qXn;7kA%gq;HkfY|1q|Tu~qypq>-;>{@hgy zIqqQ^vzoidvy{ke6(4ptGP24+CNr`E(;5o~!xfc2^ltYIhJCLDK-oPT0^n=A*?)q> zqtFZ`P@gSMK3N__vr%{h6n?fId;!0cf%s7*B3nh3Rs% zR6W)M&D+XKZm2cV=jLZqJr1&c3lZCkbD8#}Ge$D&EY+o<0ye zsf;O;Ce3J^GHEh?u8J1XWvz)^~N5t8~mqxD4 zl`OrfbOKT=-nMw!g!T5Oi`L`DEroY}PQcXE-MNWX|Nr}Q{oay(U*>$QgnM)QJ$#Ce z$L_h7OlAqL!PFZysg%6b#ibvOhny;J{r}1T-&lbEW{&(FwZ8sRWVYb#RvJWSzD4-1 z-B0ws$(Z`QZ%##KHMQX&yc%znu0*aCZ;mbn-U_$?dHy_QzH^*6k^KK2y6Oi0&5laX zky5oO<$31)v;g6^VEJ&p0LSeN&h>mq=lc@=j6+B#{3;{|jw}w?8Kmy9To~vp=3205 z(5Z9-F<8=6;hBVftAA5*cLN(x48K;_@YXCI@5l`W->l?8Z-z7SJ;N5(~!Z}2YfT4ZfRn8+m`QF_-3OK{Y*=(Qm#}QL(fih`M@_i z>T+TY{=(1#yssR?o5D=#gybD^vk zm%7J6EXN1G-Y?pRZ)>u+)hgcRpnM@{JSJ^uVKcOd;kQ9aT#~RZY|9wU1-1owb(IpM zIiRsk3+U}kydgaiec*ph;8L=1TPw2oN@XkBSdJxED|$x@BU7BF~ z?fBOPo!rp_8{XY6_sClme9yo;*;7E_Kc}!9Z$)e3oqThcL!VgR zk~Id};zaE?Vbu7Rkw1ITcmBWf;38Zku@`p3zT7kAcO;(KpBBTL@3H@a-KU7>&wv+l zZZi7BpS9AbWlo#yRoo|c{xBx@c7xjcYkgZJW40V}+53AiUImY(2K&v4 + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Use this class to send a message requesting to display a message box with features + corresponding to this message's properties. The Callback property should be used + to notify the message's sender about the user's choice in the message box. + Typically, you can use this message typ's recipient will be an element of the View, + and the sender will possibly be a ViewModel. + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + Initializes a new instance of the DialogMessage class. + + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Utility method, checks if the property is + null, and if it is not null, executes it. + + The result that must be passed + to the dialog message caller. + + + + Gets or sets the buttons displayed by the message box. + + + + + Gets a callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + + Gets or sets the caption for the message box. + + + + + Gets or sets which result is the default in the message box. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanging event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanging event if needed. + + The type of the property that + changes. + An expression identifying the property + that changes. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + Occurs before a property value changes. + + + + + Provides access to the PropertyChanging event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/SL5/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/SL5/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..8faaff74a066e05dc06a63ffc01ec625c53fc32f GIT binary patch literal 53856 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.XML b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.XML new file mode 100644 index 0000000..ff36ba0 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.XML @@ -0,0 +1,460 @@ + + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Platform + + + + + Base class for bindings in Xamarin.iOS and Xamarin.Android. + + + + + The source at the "top" of the property chain. + + + + + The target at the "top" of the property chain. + + + + + Instructs the Binding instance to stop listening to value changes and to + remove all listeneners. + + + + + Forces the Binding's value to be reevaluated. The target value will + be set to the source value. + + + + + Forces the Binding's value to be reevaluated. The source value will + be set to the target value. + + + + + Occurs when the value of the databound property changes. + + + + + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + + Gets the source object for the binding. + + + + + Gets the target object for the binding. + + + + + Creates a binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + + + + Initializes a new instance of the Binding class for which the source and target properties + are located in different objects. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property for the binding. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + The name of the target property for the binding. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + Initializes a new instance of the Binding class for which the source and target properties + are located in different objects. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + Defines a custom conversion method for a binding. To be used when the + binding's source property is of a different type than the binding's + target property, and the conversion cannot be done automatically (simple + values). + + A func that will be called with the source + property's value, and will return the target property's value. + The Binding instance. + + + + Defines a custom conversion method for a two-way binding. To be used when the + binding's target property is of a different type than the binding's + source property, and the conversion cannot be done automatically (simple + values). + + A func that will be called with the source + property's value, and will return the target property's value. + The Binding instance. + This method is inactive on OneTime or OneWay bindings. + + + + Instructs the Binding instance to stop listening to value changes and to + remove all listeneners. + + + + + Forces the Binding's value to be reevaluated. The target value will + be set to the source value. + + + + + Forces the Binding's value to be reevaluated. The source value will + be set to the target value. + + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + source control. + + + + Define that the binding should be evaluated when the bound control's source property changes. + Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to specify that the binding must be updated when the property changes. + + This method should only be used with the following items: + - an EditText control and its Text property (TextChanged event). + - a CompoundButton control and its Checked property (CheckedChange event). + + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Defines the binding's update mode. Use + to update the binding when + the source control loses the focus. You can also use + to update the binding + when the source control's property changes. + The PropertyChanged mode should only be used with the following items: + - an EditText control and its Text property (TextChanged event). + - a CompoundButton control and its Checked property (CheckedChange event). + + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Use this method when the event requires a specific EventArgs type + instead of the standard EventHandler. + The type of the EventArgs used by this control's event. + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + source control. + + + + Define that the binding should be evaluated when the bound control's target property changes. + Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to specify that the binding must be updated when the property changes. + + This method should only be used with the following items: + - an EditText control and its Text property (TextChanged event). + - a CompoundButton control and its Checked property (CheckedChange event). + + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the target object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Defines the binding's update mode. Use + to update the binding when + the source control loses the focus. You can also use + to update the binding + when the source control's property changes. + The PropertyChanged mode should only be used with the following items: + - an EditText control and its Text property (TextChanged event). + - a CompoundButton control and its Checked property (CheckedChange event). + + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + target control. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Use this method when the event requires a specific EventArgs type + instead of the standard EventHandler. + The type of the EventArgs used by this control's event. + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime or OneWay binding. This exception can + also be thrown when the target object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + target control. + + + + Defines an action that will be executed every time that the binding value + changes. + + The action that will be executed when the binding changes. + The Binding instance. + When WhenSourceChanges is called on + a binding which already has a target property set. + + + + Occurs when the value of the databound property changes. + + + + + Gets the current value of the binding. + + + + + Provides event listening support for classes that expect to receive events + through the WeakEvent pattern and a WeakEventManager. + + + + + Receives events from the centralized event manager. + + The type of the WeakEventManager calling this method. + Object that originated the event. + Event data. + true if the listener handled the event. It is considered an error by the + WeakEventManager handling in WPF to register a listener for an event that the + listener does not handle. Regardless, the method should return false if it receives + an event that it does not recognize or handle. + + + + + The mode of the . + + + + + A default binding is a one way binding. + + + + + A one time binding. The binding's value will be set when the + binding is created but subsequent changes will be ignored/ + + + + + A one way binding, where the changes to the source + property will update the target property, but changes to the + target property don't affect the source property. + + + + + A two way binding, where the changes to the source + property will update the target property, and vice versa. + + + + + Defines extension methods used to add data bindings and commands between Xamarin + Android and iOS elements. + + + + + Sets a data binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + This class allows for a different TSource and TTarget and is able to perform simple + type conversions automatically. This is useful if the source property and the target + property are of different type. + If the type conversion is complex, please use the + and methods to configure the binding. + It is very possible that TSource and TTarget are the same type in which case no conversion occurs. + The type of the property that is being databound before conversion. + The type of the property that is being databound after conversion. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Creates a with a source property but without a target. + This type of bindings is useful for the + and methods, to use as CommandParameter + binding. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The type of the bound property. + The created binding instance. + + + + Sets a data binding between two properties of the same object. If the source implements INotifyPropertyChanged, has observable properties + and the BindingMode is OneWay or TwoWay, the target property will be notified of changes to the source property. If + the target implements INotifyPropertyChanged, has observable properties and the BindingMode is + TwoWay, the source will also be notified of changes to the target's properties. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a data binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + The name of the target property. This must be a simple name, without dots. + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property. This must be a simple name, without dots. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a data binding between two properties of the same object. If the source implements INotifyPropertyChanged, has observable properties + and the BindingMode is OneWay or TwoWay, the target property will be notified of changes to the source property. If + the target implements INotifyPropertyChanged, has observable properties and the BindingMode is + TwoWay, the source will also be notified of changes to the target's properties. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + The name of the target property. This must be a simple name, without dots. + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property. This must be a simple name, without dots. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method + should be used when the event uses an EventHandler<TEventArgs>. + + The type of the CommandParameter that will be passed to the RelayCommand. + The type of the event's arguments. + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + A Binding instance subscribed to + the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + will be observed and changes will be passed to the command, for example to update the CanExecute. + + + + Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method + can only be used when the event uses a standard EventHandler. + + The type of the CommandParameter that will be passed to the RelayCommand. + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + A Binding instance subscribed to + the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + will be observed and changes will be passed to the command, for example to update the CanExecute. + + + + Sets a non-generic RelayCommand to an object and actuate the command when a specific event is raised. This method + can only be used when the event uses a standard EventHandler. + + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + + + + Creates a new for a given . + + The type of the items contained in the . + The collection that the adapter will be created for. + A method taking an item's position in the list, the item itself, + and a recycled Android View, and returning an adapted View for this item. Note that the recycled + view might be null, in which case a new View must be inflated by this method. + A View adapted for the item passed as parameter. + + + + Creates a new for a given . + + The type of the items contained in the . + The list that the adapter will be created for. + A method taking an item's position in the list, the item itself, + and a recycled Android , and returning an adapted View for this item. Note that the recycled + View might be null, in which case a new View must be inflated by this method. + An adapter adapted to the collection passed in parameter.. + + + + A that can be used with an Android ListView. After setting + the and the properties, the adapter is + suitable for a list control. If the DataSource is an , + changes to the collection will be observed and the UI will automatically be updated. + + The type of the items contained in the . + + + + Returns a unique ID for the item corresponding to the position parameter. + In this implementation, the method always returns the position itself. + + The position of the item for which the ID needs to be returned. + A unique ID for the item corresponding to the position parameter. + + + + Prepares the view (template) for the item corresponding to the position + in the DataSource. This method calls the method so that the caller + can create (if necessary) and adapt the template for the corresponding item. + + The position of the item in the DataSource. + A recycled view. If this parameter is null, + a new view must be inflated. + The view's parent. + A view adapted for the item at the corresponding position. + + + + Gets the number of items in the DataSource. + + + + + Gets or sets the list containing the items to be represented in the list control. + + + + + Gets and sets a method taking an item's position in the list, the item itself, + and a recycled Android View, and returning an adapted View for this item. Note that the recycled + view might be null, in which case a new View must be inflated by this method. + + + + + Gets the item corresponding to the index in the DataSource. + + The index of the item that needs to be returned. + The item corresponding to the index in the DataSource + + + + Provides an implementation so that you can use the + "weak event listener" pattern to attach listeners + for the event. + + + + + Adds the specified listener to the list of listeners on the specified source. + + The object with the event. + The object to add as a listener. + The name of the property that exists on + source upon which to listen for changes. + + + + Removes the specified listener from the list of listeners on the + specified source. + + The object to remove as a listener. + + + + Begin listening for the event on + the provided source. + + The object on which to start listening + for . + + + + Stop listening for the event on the + provided source. + + The object on which to start listening for + . + + + + The method that handles the event. + + The source of the event. + A that + contains the event data. + + + + Private method to add the specified listener to the list of listeners + on the specified source. + + The object with the event. + The object to add as a listener. + The name of the property that exists + on source upon which to listen for changes. + + + + Private method to remove the specified listener from the list of listeners + on the specified source. + + The object to remove as a listener. + + + + Get the current instance of + + + + + Defines how a is updated by a source control. + + + + + Defines that the binding should be updated when the control + loses the focus. + + + + + Defines that the binding should be updated when the control's + bound property changes. + + + + + Helper class for dispatcher operations on the UI thread in Android. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + + The action that will be executed on the UI + thread. + + + + This method is only here for compatibility with + other platforms but it doesn't do anything. + + + + + This method is only here for compatibility with + other platforms but it doesn't do anything. + + + + + A base class for Activities that allow the + to keep track of the navigation journal. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Overrides . If you override + this method in your own Activities, make sure to call + base.OnResume to allow the + to work properly. + + + + + The activity that is currently in the foreground. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Android dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Xamarin Android implementation of . + This implementation can be used in Xamarin Android applications (not Xamarin Forms). + + For this navigation service to work properly, your Activities + should derive from the class. + + + + The key that is returned by the property + when the current Activiy is the root activity. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + For this navigation service to work properly, your Activities + should derive from the class. + The key that will be used later + in the or methods. + The type of the activity (page) corresponding to the key. + + + + Allows a caller to get the navigation parameter corresponding + to the Intent parameter. + + The + of the navigated page. + The navigation parameter. If no parameter is found, + returns null. + + + + Allows a caller to get the navigation parameter corresponding + to the Intent parameter. + + The type of the retrieved parameter. + The + of the navigated page. + The navigation parameter casted to the proper type. + If no parameter is found, returns default(T). + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..d04e54bfbcd544f0a1ed4f99f27c678eaaf2f585 GIT binary patch literal 36352 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 aIPiax|GPbKoBI3P3wdGtpU?ky9{4|nkJ7mS literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.XML b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.XML new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.XML @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/monoandroid1/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..03a63f3d694d99ac947ad7c2a892d436e7f8f91c GIT binary patch literal 22016 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight version. + + The FrameworkElement to which this trigger + is attached. + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..639823cee9584b769233d9138c389523b3fa1885 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..502ec35 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/net35/GalaSoft.MvvmLight.xml @@ -0,0 +1,1678 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Use this class to send a message requesting to display a message box with features + corresponding to this message's properties. The Callback property should be used + to notify the message's sender about the user's choice in the message box. + Typically, you can use this message typ's recipient will be an element of the View, + and the sender will possibly be a ViewModel. + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + Initializes a new instance of the DialogMessage class. + + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Utility method, checks if the property is + null, and if it is not null, executes it. + + The result that must be passed + to the dialog message caller. + + + + Gets or sets the buttons displayed by the message box. + + + + + Gets a callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + + Gets or sets the caption for the message box. + + + + + Gets or sets which result is the default in the message box. + + + + + Gets or sets the icon for the message box. + + + + + Gets or sets the options for the message box. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanging event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanging event if needed. + + The type of the property that + changes. + An expression identifying the property + that changes. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + Occurs before a property value changes. + + + + + Provides access to the PropertyChanging event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..cb380a918344cb9d1c22a5d850bb7cd7052fddbf GIT binary patch literal 45056 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 NQyQ4k!2ePW{9lR-_TT^j literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.xml b/packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.xml new file mode 100644 index 0000000..7b31b08 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/net35/System.Windows.Interactivity.xml @@ -0,0 +1,1011 @@ + + + + System.Windows.Interactivity + + + + + Represents a collection of IAttachedObject with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + An interface for an object that can be attached to another object. + + + + + Attaches to the specified object. + + The object to attach to. + + + + Detaches this instance from its associated object. + + + + + Gets the associated object. + + The associated object. + Represents the object the instance is attached to. + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + Cannot add the instance to a collection more than once. + + + + Attaches to the specified object. + + The object to attach to. + The IAttachedObject is already attached to a different object. + + + + Detaches this instance from its associated object. + + + + + The object on which the collection is hosted. + + + + + Gets the associated object. + + The associated object. + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + The type the can be attached to. + + Behavior is the base class for providing attachable state and commands to an object. + The types the Behavior can be attached to can be controlled by the generic parameter. + Override OnAttached() and OnDetaching() methods to hook and unhook any necessary handlers + from the AssociatedObject. + + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + This is an infrastructure class. Behavior authors should derive from Behavior<T> instead of from this class. + + + + Called after the behavior is attached to an AssociatedObject. + + Override this to hook up functionality to the AssociatedObject. + + + + Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. + + Override this to unhook functionality from the AssociatedObject. + + + + Attaches to the specified object. + + The object to attach to. + The Behavior is already hosted on a different element. + dependencyObject does not satisfy the Behavior type constraint. + + + + Detaches this instance from its associated object. + + + + + The type to which this behavior can be attached. + + + + + Gets the object to which this behavior is attached. + + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + + + + Represents a collection of behaviors with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the BehaviorCollection. + + The new instance. + + + + Enumerates possible values for reusable property value editors. + + + + + Uses the element picker, if supported, to edit this property at design time. + + + + + Uses the storyboard picker, if supported, to edit this property at design time. + + + + + Uses the state picker, if supported, to edit this property at design time. + + + + + Associates the given editor type with the property on which the CustomPropertyValueEditor is applied. + + Use this attribute to get improved design-time editing for properties that denote element (by name), storyboards, or states (by name). + + + + Initializes a new instance of the class. + + The custom property value editor. + + + + Gets or sets the custom property value editor. + + The custom property value editor. + + + + Provides design tools information about what to instantiate for a given action or command. + + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + A single argument for the specified . + is not derived from TriggerBase. + This constructor is useful if the specifed has a single argument. The + resulting code will be CLS compliant. + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + The constructor arguments for the specified . + is not derived from TriggerBase. + + + + Instantiates this instance. + + The specified by the DefaultTriggerAttribute. + + + + Gets the type that this DefaultTriggerAttribute applies to. + + The type this DefaultTriggerAttribute applies to. + + + + Gets the type of the to instantiate. + + The type of the to instantiate. + + + + Gets the parameters to pass to the constructor. + + The parameters to pass to the constructor. + + + + A trigger that listens for a specified event on its source and fires when that event is fired. + + + + + Represents a trigger that can listen to an element other than its AssociatedObject. + + The type that this trigger can be associated with. + + EventTriggerBase extends TriggerBase to add knowledge of another element than the one it is attached to. + This allows a user to attach a Trigger/Action pair to one element and invoke the Action in response to a + change in another element somewhere else. Override OnSourceChanged to hook or unhook handlers on the source + element, and OnAttached/OnDetaching for the associated element. The type of the Source element can be + constrained by the generic type parameter. If you need control over the type of the + AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents a trigger that can listen to an element other than its AssociatedObject. + + This is an infrastructure class. Trigger authors should derive from EventTriggerBase<T> instead of this class. + + + + Represents an object that can invoke Actions conditionally. + + This is an infrastructure class. Trigger authors should derive from Trigger<T> instead of this class. + + + + Invoke all Actions associated with this trigger. + + Derived classes should call this to fire the trigger. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Creates a new instance of the TriggerBase derived class. + + The new instance. + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same Trigger on more than one object at a time. + dependencyObject does not satisfy the Trigger type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Gets the actions associated with this trigger. + + The actions associated with this trigger. + + + + Gets the associated object. + + The associated object. + + + + Specifies the name of the Event this EventTriggerBase is listening for. + + + + + + Called when the event associated with this EventTriggerBase is fired. By default, this will invoke all actions on the trigger. + + The instance containing the event data. + Override this to provide more granular control over when actions associated with this trigger will be invoked. + + + + Called when the source changes. + + The old source. + The new source. + This function should be overridden in derived classes to hook functionality to and unhook functionality from the changing source objects. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + Could not find eventName on the Target. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the source type constraint. + + The source type constraint. + + + + Gets or sets the name of the element this EventTriggerBase listens for as a source. If the name is unset or cannot be resolved, the AssociatedObject will be used. This is a dependency property. + + The name of the source element. + + + + Gets the resolved source. If is unset or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + The element pointed to by does not satisify the type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the source property changes. + + Override this to hook functionality to and unhook functionality from the specified Source, rather than the AssociatedObject. + The old source. + The new source. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the event. + + + + Gets or sets the name of the event to listen for. This is a dependency property. + + The name of the event. + + + + Static class that owns the Triggers and Behaviors attached properties. Handles propagation of AssociatedObject change notifications. + + + + + This property is used as the internal backing store for the public Triggers attached property. + + + This property is not exposed publicly. This forces clients to use the GetTriggers and SetTriggers methods to access the + collection, ensuring the collection exists and is set before it is used. + + + + + This property is used as the internal backing store for the public Behaviors attached property. + + + This property is not exposed publicly. This forces clients to use the GetBehaviors and SetBehaviors methods to access the + collection, ensuring the collection exists and is set before it is used. + + + + + Gets the TriggerCollection containing the triggers associated with the specified object. + + The object from which to retrieve the triggers. + A TriggerCollection containing the triggers associated with the specified object. + + + + Gets the associated with a specified object. + + The object from which to retrieve the . + A containing the behaviors associated with the specified object. + + + Cannot host the same BehaviorCollection on more than one object at a time. + + + Cannot host the same TriggerCollection on more than one object at a time. + + + + A helper function to take the place of FrameworkElement.IsLoaded, as Silverlight doesn't have a property like that. + + The element of interest. + True if the element has been loaded; otherwise, false + + + + Gets or sets a value indicating whether to run as if in design mode. + + + true if [should run in design mode]; otherwise, false. + + Not to be used outside unit tests. + + + + Executes a specified Action on the host Behavior when invoked. + + + + + Represents an attachable object that encapsulates a unit of functionality. + + The type to which this action can be attached. + + + + Represents an attachable object that encapsulates a unit of functionality. + + This is an infrastructure class. Action authors should derive from TriggerAction<T> instead of this class. + + + + Attempts to invoke the action. + + The parameter to the action. If the Action does not require a parameter, the parameter may be set to a null reference. + + + + Invokes the action. + + The parameter to the action. If the Action does not require a parameter, the parameter may be set to a null reference. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + When implemented in a derived class, creates a new instance of the derived class. + + The new instance. + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same TriggerAction on more than one object at a time. + dependencyObject does not satisfy the TriggerAction type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets or sets a value indicating whether this action will run when invoked. This is a dependency property. + + + true if this action will be run when invoked; otherwise, false. + + + + + Gets the object to which this Action is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Gets or sets a value indicating whether this instance is attached. + + true if this instance is attached; otherwise, false. + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Invokes the action. + + The parameter to the action. If the Action does not require a parameter, the parameter may be set to a null reference. + + + + Called after the collection is attached to an AssociatedObject. + + InvokeActionCommand must be hosted on a Behavior. + + + + Gets or sets the name of the command this action should invoke. + + The name of the command this action should invoke. + + + + Gets or sets the command parameter. + + The command parameter. + This is the value passed to ICommand.CanExecute and ICommand.Execute. + + + + Provides data about which objects were affected when resolving a name change. + + + + + Helper class to handle the logic of resolving a TargetName into a Target element + based on the context provided by a host element. + + + + + Attempts to update the resolved object from the name within the context of the namescope reference element. + + The old resolved object. + + Resets the existing target and attempts to resolve the current TargetName from the + context of the current Host. If it cannot resolve from the context of Host, it will + continue up the visual tree until it resolves. If it has not resolved it when it reaches + the root, it will set the Target to null and write a warning message to Debug output. + + + + + Occurs when the resolved element has changed. + + + + + Gets or sets the name of the element to attempt to resolve. + + The name to attempt to resolve. + + + + The resolved object. Will return the reference element is TargetName is null or empty, or if a resolve has not been attempted. + + + + + Gets or sets the reference element from which to perform the name resolution. + + The reference element. + + + + Gets or sets a value indicating whether the reference element load is pending. + + + true if [pending reference element load]; otherwise, false. + + + If the Host has not been loaded, the name will not be resolved. + In that case, delay the resolution and track that fact with this property. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + The type constraint on the target. + + TargetedTriggerAction extends TriggerAction to add knowledge of another element than the one it is attached to. + This allows a user to invoke the Action on an element other than the one it is attached to in response to a + Trigger firing. Override OnTargetChanged to hook or unhook handlers on the target element, and OnAttached/OnDetaching + for the associated element. The type of the Target element can be constrained by the generic type parameter. If + you need control over the type of the AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + This is an infrastructure class. Action authors should derive from TargetedTriggerAction<T> instead of this class. + + + + Called when the target changes. + + The old target. + The new target. + This function should be overriden in derived classes to hook and unhook functionality from the changing source objects. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Gets or sets the name of the target. If TargetName is unset or cannot be resolved, the target will default to the AssociatedObject. This is a dependency property. + + The name of the target. + + + + Gets the target object. If TargetName is unset or cannot be resolved, defaults to the AssociatedObject. + + The target. + In general, this property should be used in place of AssociatedObject in derived classes. + The Target element does not satisfy the type constraint. + + + + Gets the associated object type constraint. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the target type constraint. + + The target type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the target property changes. + + Override this to hook and unhook functionality on the specified Target, rather than the AssociatedObject. + The old target. + The new target. + + + + Gets the target object. If TargetName is unset or cannot be resolved, defaults to the AssociatedObject. + + The target. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Represents a collection of actions with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the TriggerActionCollection. + + The new instance. + + + + Represents an object that can invoke Actions conditionally. + + The type to which this trigger can be attached. + + TriggerBase is the base class for controlling Actions. Override OnAttached() and + OnDetaching() to hook and unhook handlers on the AssociatedObject. You may + constrain the types that a derived TriggerBase may be attached to by specifying + the generic parameter. Call InvokeActions() to fire all Actions associated with + this TriggerBase. + + + + + Initializes a new instance of the class. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Represents a collection of triggers with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the . + + The new instance. + + + + Specify type constraints on the AssociatedObject of TargetedTriggerAction and EventTriggerBase. + + + + + Initializes a new instance of the class. + + The constraint type. + + + + Gets the constraint type. + + The constraint type. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot set the same BehaviorCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a Behavior cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to Cannot host an instance of a TriggerAction in multiple TriggerCollections simultaneously. Remove it from one TriggerCollection before adding it to another.. + + + + + Looks up a localized string similar to Cannot set the same TriggerCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a trigger cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to The command "{0}" does not exist or is not publicly exposed on {1}.. + + + + + Looks up a localized string similar to "{0}" is not a valid type for the TriggerType parameter. Make sure "{0}" derives from TriggerBase.. + + + + + Looks up a localized string similar to Cannot add the same instance of "{0}" to a "{1}" more than once.. + + + + + Looks up a localized string similar to Cannot find an event named "{0}" on type "{1}.". + + + + + Looks up a localized string similar to InvokeCommandAction must be attached to a Behavior. This can be done by adding it to the Actions collection of a Trigger in the Triggers collection of a Behavior object.. + + + + + Looks up a localized string similar to An object of type "{0}" cannot have a {3} property of type "{1}". Instances of type "{0}" can have only a {3} property of type "{2}".. + + + + + Looks up a localized string similar to Cannot attach type "{0}" to type "{1}". Instances of type "{0}" can only be attached to objects of type "{2}".. + + + + + Looks up a localized string similar to Unable to resolve TargetName "{0}.". + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..f2fb0fd717f102e268fbb9a2ae0169508c6166b4 GIT binary patch literal 22528 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight version. + + The FrameworkElement to which this trigger + is attached. + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..305ae9575814ecf97177c1a0ff28cccf11563e8b GIT binary patch literal 29696 zcmeHwdwf*Ywf{PgIrGSa%;dqtfWu3NWD?#A2ucWuQNk+$M4>Pw1B@hd;>-k$6eX2H zt@xm=wrZ`Y*s8U*zO}WAwQB1VudOYuRjk@uX>D(&8?z+Lf_4WD=dxwnRE@=c4P9(M)$bno39KE^3K(+U?2ul9JFENA==)L<=;79((tc zWo~VUNFQ0G6%m~WN}CSnFRw#@pwDj7(5~5^Wl{cDNF9_( zc@wH709=d+Xx!<|$k5|7u=F&5=nOEQ4 zGG_6_^3Lh|W1nvM{V5M7_Pm>(KIzDvr!L4R%jF5faH+tRYrjk*&K1c;7{VZsQ-#&QjnN;*PEDw$*1CxBXG z!~;e*2sK=4mg?+D zdpz{jY86HdVX)9{195A0M!k}BDxLtr_+Z`K#(E#FtaJoE}3jw?ev#=83v^wIYU&5sD90n&M$AUaA;Yg?$n@C)8}#E2Py( zqlZuBDOUg3aSi`|?08J` z5-VdmKP+R?pUWrsXcc%^TAh~1G5tt=_H?$dud`3?dBBPZGxUmWT%jJrY-ORNZ=Jyv^LUaB#sL<+kTVVtC&oBV zoc4(m76)gfLCGv2qC_$voaz!JbFA@n8cX$$2`^OrW5Tt2Vltb{x#Ot;NT2aEhY8Ne z6G?O=R=^#pky9B@(lB%+rto;;v@o6u7zU0i!~;jj?s%Fjx|qy4&v;r1-y0HRsRZMR zQ+pl&gil9;@iZSvJg&#skIs04n^;r4%8HjOhBKaIPOQn#momDzWf)!3*ov4qp<)}? z!=vjAR)eT<+9zsFOpy5zPGK%P2WRVBLr5}0R=%{cx3s^N$;v6PO39IHzsPM(kWlE_d10|Svlv$Di0gYD# z$$)^Jp(02IgesRH84w1$1j&GaRZbO=%yRLS#r+RHvkV(^rp(>P!Pl6j2rGa1qG2dg zS63Cf2#c#ZwkSfe)euwUQ1%iO+|DAeg{-*ck9`WfSA~g~X>h5IUH!-!3PBy!W1n1Q z+L*FyYdCNE@_Dn$$sdRP@GFoFpzf-2zrOW2uC_c7@k_l2pi=G2LcVylzO|aIE7G%T zQ13QI6sf3on7$RehysrhMJlQ)xBO$vgAq$K`Yn4c3fGlo6G)2vR={3|Ol<&+Hl`S* zX0{!fl8Em}CATQz3vP=-UBqYduG9?s%FRI7w385etr&~6KO9t!0Oki4P?#Ru&K&@L zfuTB`L+9SFj!rsevHee|d=30k5yPxjTeDC%4j|a7xekrlred!*R9j;gaqv{zBwr&s zY?E~$YgXj56{gBwfga}+z#3UA7&|YUWc&aQ`lFfVLCQtqF286m=cdn2%-h!#sBy$GiO zvo2h5#M*(Xvgd)cok>FHvqfzTU9z?~V0W^PKy6hd5KALl;wT8(Hn0;w?Lu1j#%raK zz>z9+&*SX#L3q^>vop*sv4CcgvvUA2r5nkN)F+>O;)Knw3R(7MFv^3qkw`GMg|nuP zXkUQb383^Kt$Q0a1&>sruR1kBg%6RpROC74Q#j`BG#5g`6P{2w7GP&Gwki4+PwhfzS^_V?>>WU$WQ}WdC00g5d)t)4SJopC&%t74#WrP0UNtH zYcgg4O#K$bq!%54ftJ@m=*6@bs=E;k-;t^jg`gJ&5p%N;^BBjufu?l3u^mUrE8KjT zF8>-g3B}RA$B`oFVb27o$18mCu+QeE#)Cd*p5iw93T+0NXDQV(D_hXXcV@m146GO~UmXSJ=mgvO-M%9%@t?q>DJpFs^E2h(K)&p2wAn z8tDGoEm&-Lpchw^SOL}bBj^;L1F0?;uvDLKs=_=V+Ie*{r2{HFAQAEA`;FET%noK@ zT`+=J|KX2XR4cQ|c6iwDolR7W1C6wSEBovTix9Z$G%eVv+OYObo!@_AxAZxXPh5o8-L-OdTWu#NgW zBIw;l3GUrS2?3iG^f|Rzk<4;zqtG)fGj=6+0h2F)Oq{l{{X$2ve2VN-O zs6@WhDS&eq7c^|t62iShU0DWWy(EKPo3oQxBa~gv$PB$o zPK2>5fSvF!6hQCeeh=sHc`>Z317*l^50sXpiT8@Aj`xbFD5Um^sD$^5LO4?zh8D?Q zQAqIARV>RJPRV$-s5h~-Uf&9#5DP(}V65wE$*j|{<%!*Zvan;1s{IRG#W^tJMkX7I zY{rCq9*ipW#lFTIpW>jru%P>ku5pq9;Y%(-GJJ124t^<<`2d~G3|U2f=iU<=S-$sV zYQP`E(5?+x{>iV`h(C{B4n7X$j#Un|vo3FWL?81IEb!Kg{W90fRMd-*4Xn3+IjQ$p zulL2AP$onK-f^cW|Lcm6EQTNO&Q{jo1lDU~>ZgFL>*btVMf*xG!p>4HA zmhShclR8-zA%m=nf7~luP%CG^m5_y-vA-fD#J&z$^L#k(IG_CuzhoW9TKuo#vpJ|FN|_jI%qehyy@+>G4@GwQ})bUTue zb>JMdL)}f^0fPNa26qD7x*Ck^w~*V;rBu{9b;A#z1r??qz;g*(~@t|({ z3>z`6g&}B|jdA+~_aJ{ZA8JQ~-_gK#4l_|6TaNHQjE)2?l=r)( zqF8F$Xc40IujrA$9a9e?0zJbninHr*LXz}RKI_C@LbGBo0N79wiu-kY3VU8i&U(S# z!JVzdcM{rz^)W2`x|+-u_ToL@hb;SE7PB%x2Fbop^7j2mvJU`USo5huRbIU{Ul3LC zh%y2lD`Ym&$rGnD#V4Pa9KfnL z`XZv4V~F;l>7!e6nN)g1mL(1$Ad7X-mbK7?)70miqvtPcnhV}+;8#KE=s6vHmX;Sp zwH3!d5Da1#r;o-?=FY&iuf=;f-k9j*+#dwdk33B0`&+sHhoAVKPd;xABSpuhCcI&m z=&+DNKh@(6Gw}*JEwku0{U$v`Kh^i^7X23aQaaA?85YeqZUUuM;JE@13;eUdh2~7t zqKnL%^awp~J!(bhHG${)Ilm3iqW1#_0~TpP)?)=Ze~G{w1kMj}UE_;nOA6(Xtx>pDSZ~-V{h- z&L1yun!qIjI|S|$xHrtD?hCV?XN2d_8h?Bt!=y z?4|m0rkp2mi@=KoURTbg?l0%se=P8qLVvgXYS33yum{!yR?)tSuT-2xk6?BH!PN^b8rE7{t|1^%M)&9Fs(1T3ZFtJr(3fEHz|W}2n6 zTPQaR<@u_=R#^1wD)#gHLN6W6em-&Vy5cIDCU60uMH>en3`FR2;0~kf2Xh3U1RO@M z2!)1lG{+BNI~NUU9AeQ0lK;YxtKlux!x-{k8I43Q^X0K7!A#s%Va1`dX%nD@Jsx8_ z9V{Z{ZU*K9uUxQi0ULr|I$E&r3a<$LnrnCx80$Div>c#=&{al_!uvga04-%SSFlR$ z1BzqEaF$>v01H9?VktKT7|-Hsg?Ab-AFvK8!lfLalS(KG3%R~kqGgnWbpe|TyDk&n zRlv@`IJ-))I~?pwf;|PS6uhrcFSNW0EKXzT2I2h;*x7Uf-7Hv{eh{_C=ys7D32ZIZ zV1%=m#_OkI=*H=Xf~|0{XQ&r;o`;W^ec-)71~3E_TI%Shh`}V|M8H!F_Si05#MTA02YSgDVsXOY*aB)D4Fs8-;jV3!`I2^Ew4 zJnx){=)NChnd;Ch+DKX)dJ~eI*XZ*C-wAQOMiIlainbXVJzBKe2-8oCe~tXx#Veuh z{?cnO4xbzJigq9hH`2}_3yn!=*DvzeG|Y*`BboP`;Kjy#%$}_db~P{`eO0iXbeGW# zi*8Xo?MY(^uvY|oN;_aI$820WinVYJ9q8#p^4MnF?KTOfYAB+W4#qVUQ%Xrn4JFj2 zcv3?N{Z=ql11|~udaC3jW0!oQCYaA>F85%A&1Up7^?C}tD}miSn(-ZhmF8C{Om{d~ zyLkh!dj)$cXq&fSj2v`$yUlL^d&9x@ns)*_>|pnSS5EIa*bl%fr@srfGjPDX2YcQi zFFCXWo@fRZ7EF1*f_O)!yz~HezMm89so<|rZZJJ5*l&W|zQOdWU^@cun2f!z%FzMn z987272nH?0tsP7$!JZ0m8wS&r4yJTIrz9mRgXyh2_Bv*kxhE(staBKx&0~jw{YbFi zXzbnN=uHRX`l{(Y!IVF%=_3bYe^wJZE?Xv^7*1iqly`^I$%5?&?DKsCtNCdT_JHqB zU}rcOdv^pab};tt2wJHy@#pcB5RCo#0Ub{lI4H0!?9WjY7i>r1 zM?S{pDjxhtO89QB;E?nu=dF%FWJWF>N&MRTy+m)yC2z zd29x-DZIrc_UDzD@md8_@e`B5d&)P+YNivZP4T3)C(@=owj4YhzwqL=H{iu&7v8C_2P4!>wq;nyyN}1(5ZBmgVp-?X{S=FgPrWZT|13dIarhbE?`Lq+vLAb zn@yb#mh(RhY_o%1>3>XXpo<*rdjAiB?NS(h16t;A1MqsvcS%6k8xPFvAOzr zbh?AF)g81pk1fzUX;U6ss;6ml9@F(M>dj-NdWLQl>>6qhX7z6RmV@PjJ^E(4U$C8Y zVX&Dt)6WIlLwkbTz>AG%JNM8xgO}@DXu<@AJrKM>-%4c@UF8+|O;PI?AfdTBBr zr7&ai80)20!FuUn@M*o54)L*5dTTT7phukghE~M=JLo6E+cRWeWsm+@`g2}#pY~bO zaduPXUeR|_B#*tSe~v~gEbvkA7VMI01?vqIh4yKe(UiR8f9kvG%slo7{R&FtvA^nj zXsckn{(YifO_vI`ht3K4jBDs?dC4N<%XC{Fix}6^y?Jby@m1QdFj+hH(u;ZCXk#xO z%wzS&&Gc3tn_=8a@8`=M#;$DWRJXPBjXP*u9$RSKNi*`;a^u_7tT1W&y|hd))%JVo zQ-bl@_=OdfmQc!mBZ7_S!1I3Ik{2Mfpvo_X&W2Whav0v{CLL%*P?VAlkSO8#j4f--{b z2#hKDGq6h>Y(~jDz;+Avl*Xg#m-JP^eyA-j`M~%kJ?3Byc$W1w`ma1zV*Z*Y%-|NW z)g#T{&;@zyB=ayc@OsL3XUSRS9~2_kGV{GWw!dVp`Bx8imid7P+hBg2$6kgcHpudN zs^r%tx8RiEV7|YUG<&d*OZI66-p3^un5MR0EW0Lfdg(=`r9Ca!p1_LIOMtzoc(k$f zQq!;DAcof-+E&`52eeZKyM}Hmz0wS5%N^_v@PZmYenfN)@mv?wK2-fhVieRgr-w|c zx;Dsn92y1r3ZuX%w#g$xxyha766YJ54HF%+y?#9Afi`Now-doqPlI9Qd&OO%f2_cNPs6`gN{tKElUajCs*OxB`n1~Hla-`uuabYxQ&veTih^FrgQEG@ zfF^DVxJIVv#1zA!6vn0@TvNC{hkLA1N2Fe^T@(F%DJBm0?))&& z&gTY|mFcjstjvIgWo0IniagiCbZ(Jqsh3`;(UoTlx!(SIRBs#tod%5nG-;gZKLt>y zf%JmBJEs1Tj6n^evjx!SX!dGom%140r22{Sup0Xco>j%q(iwRBaq|(x{lg%dhO>Sc z_j)noj($?! zOiQ5cpzkH^C*^PWrr_rAXJXImv;f@0`1FBq5nJWXuvIj-65koN%8g(zH6;rk6 zK;Py6Q2Tbp<$(8B-0uGpWFGeaL}b2%KJY8+C-ij1JrvYmt!Rd}w<@0X|B(Iw4R?y> zu+H2&rPQlZ>Mbets+9UrtE`+D_)t5pa%SLCidH_3=*KIY13{WqxrBC$w%xR}vNP~| zXxJ5aUo^ZgWyk5!%4Y-P#KL!IUFAjQJ9Js)d(iV`Xqc`qG?oT$r{^j^(YZgb3|2$( zFnvsXlH>fD0+(nX%iXN0@#(?T_(YpQ0VW_wL`uY(hMFW_>{}o zXGW+OP^ZrtwL zA#l6EUV%3W+%NEPfrkXXA&?BIQD9WyEdt*V*kCfZSKv(o9~bzBz_mW+ZWq`q@Q^^V zm>v~4Ti~GpQz$5OfwKkf7kEhE+K^}yxL4qQfrkWAk(3oUTi{xO+Xe0wxL;AqL^8~9 zw!nRnBD&FBTQ2$qQiaF}+$(Uuz(WG5lDUT}?==~I)4U?Mf2dFdUhaF)_p_qc2z=ggi0hjrn0bJ{Q0kBKpg}#@OzeJ#tyv)b)N>b5PStY6H zfAwhamNl*ZWj6{%Y2It$xd>VucpGp<;4t9Y0Nb-M@Mq*V2R;DY8u)L(-v?jPiDrbD ztKe;tA6~>7P7ru~@z3G9dy0PrcuonoB2_ZSB)X{NbU=S8mwmbPI&7g#_%I;e=I@uM#)}r8RiE2$W%n zhK`&2L4X_)oubgEBN~-}V^B_`IAnFigJB(_qvKQ3;h;}I37y6ZoQODTGzn0rlTccx zlMziFJDL*#PoZ&uGoeGL`Ou-^Q^-2xn^0P#GX*Z9iJ&YL*n+u6!}`i_IZXw9nZOm$ zs^ODJhUd_9&{qO#Sd~vf{#=2pX%;A-0_1Oro(6a+HGuMYfnUYUrPK8S_tHGjZvxcm zR@kM{*8z3<2JF)4Hb9-eNoN7xMa_WUrA2_>!yZGU?_<`}=@Eg?z&ahDYOVnNMZj`+ zHAg z`FjFi473L~1z!xF99j~}hRp4}yF_QA4SUda=n?ZEAUa6?g-<`3-G>&UZx5iMl>=xY zy3Oie7TzxIPYY2M?k@N<>p_V65YD2Hy(aofowSS&36AF~bhb3&;6ogKjNTJ|jf2-a z>Ep!Tz$1FXNuPAmr=9f2PWmiT*8417C-Tob^p~9UWhecqlm5&}f9a&Za?;nG^bIF{ z(@Eb(%KG1S^#7+r|DBV*>!g2l(my%r-<|XmC-rHnJxNXZXM>ZboOF|ub~@?BPTK3F zmpJKXopcw{I=awzh<;?5+K;UNLV5)6pV2=5LA?Kh_unKnf`6m(;6c1U0>6$j!8+O= zoUZ*iI1BHMDBF(rdc1!`7ltlE`Wd{p6Qg+&tMGZ_py*u6J%}%1G#*Snn-Q9JR+Ne31%_cS^ z=OnVpqp<508xKX%{A4r-tBw%sjz6dJpzG11YnF44B>Xl0znAEl(?z`mpKKwX@%;oV$MO61x$ zCNnDPM+-sg#!NEN&LQZ`w%M7E)H-VE$>x%suuJ;T;!F~r&xztjJCk(S^(#{8c6&>< zzA4?+okJ&Z`fDq-I=yIlqN6+6+S8S!R@c{y6Zn;pWDZeOb=0F&mz{=sX)oHq@$2d5 zDq53NJ)73x2TGh?PEL&K+j96qlG7{aZHB5dFl;(d#hOg={O)9?r=@$th9p|lzQArv zbWozbeNAItjT0!!Bs=ZR$)hlqCQ{ktK=}fNT!RWES82Yph2_vrvLh)Y&kIMqrYa76FTIp$FKV_Is-PY!;YxpX%DJ;At7}Q7+tG8mE>G62K#>M$o~if)=#B=~+i0hA7#X72&Chf) z1IoDq-hqEQkJ~MFW|KQ`ozai(rzUv&0%z102y?n~Ido92-^p^jJXCj9P-eN)vDlmF zlFrQq8l61T=O))Dus}IgF}E+JPh1%K2{H8v!w&6j$s2Bjz?WH$aPqsN=RDowry#0LkcruhFTqe z5O)@8b$Z&ebjB5E#OlDIz}&fs*0d}CH>EKt@$`WyRw)v8eopUjCZ}w@v#et^m)Rw7#W#U0X*23w>4%OfQ!oo^H!IbWdNPHL0vKgxppo z+iB6}WG0hpPdYxp9DvX&*nk}t)>Mx@PI0yf+oE)LXEMX9F|1>+wA#Wb_~i7Ajm=s% zmxVqoFxi|tf|a!L;i8PR(yd?ZPS|YkzCpTWAHqy8HXzboChgCc9pzs8c-(_k5(zu2h<9pTkUde zfD3yciI{9Y`kO-osp#?f!B^O!El8!$ub+28R|eA= z=ZOMo4!+vX&1&qCHGDElMwIA|ZN86|#$PaFMB=mUgEbvOU-ZHKkKI9K%u< zCTXTu^?*_9WsYS@*=4b>-ExEt7WIbBH9E zhy?-56UpJFA(Kh;G~}=tt;10p-``T_JsCl^I}4&}H66O_!oZ{Tvg2hV)gg9WzW3%* zxsD`3Ep|<<{8NL8^;n|Mz$%uX(y^$aD=LvjJH0-Y=@dza!fSGe5W1Xh=kz2*G?(g3 z)?*#4^+Xs>{A+%*uGHeDi zr2!kdRi`@|yR$2i_W0VZ3zJlPH?{)#Ah?W1yQ?R|wr?M&R01Cp53tIT7+L216kD}diYeC%cAx`ca(smZdw=9}^ z%&a?wyTRfLQ#i=xU9Si-M)~UJ0?B0y>YRcs2G+V%M=IxapVN_f(k@J95MGx`=MVLT zsYc@7fn6Wg7SWhVqSQvd)*!oUO;Z|sA50Co9_I2*RdXVZPM4AOP&P)MlQ(use7ts- z#Q|(gP|($m-OK=%(zW}Z5I4Gu!M$!Tv$ z+v%Q8yF06DcXxp&5!8tX7AH~}Y_i>rEGk!vy|b}pV?67Vqw4U>S%AY^M?bkiEs)Fw;6(B#&E5hUNRRJE)1x3Io>7SF|*l%3(O>scMKd2o*(i`G+p zn_MeFA7+{bi5|P#Gwc<97Vf`jZcjSVnQBuDEJwB-E2f=JbQDIV8sr$pxnviHm)*T# zV}UvI)V4Ki*haqb<)hD}{2t7mI}xv$m|*&C4Y_|z$S*%Q)^hjs6lu!xIA4^R*V%=3 zqO;4jr1W2m4j0D=>CWctPVW7l!Y;c&@;JLtJcT*S?PfBm#{zE6++-JTL(*;eE69F(O4nM-FP!r_lDs`QO3{M%AZ>T%i@F&M-~^_;gjm%F zaZZiO%sDoultfzX+#1^WPQo2bvec_SKc_p@!LwOI7qZTl03b#=LpYL_hI;3s*jwMZO>_>@GCn!A>r8Lq3;^+Gq*a&OVzfHgtiWgSVNM!DqNh_)&SUe_L2H*PcR&4!{c` z+m6qTY5OH^nEtuadVB;sP)!UUCUbS%ByJv?$IW5WQZO!x4|==s7e$^!qng?cEC)Qp zMi4zVr2evbBepI0^0b%7e*cTdl~CZp3s)^4I_1!%fr*bzTmG$+7EZM)BT=nf^HoMB zXr(|VXys&Bks+2abYE1{B9)=24p)~#x>2^B;Q;OsHzi$NdjFJ%+L6N{MVn*Bl9XF zO+Ufn@9 zd<3D489*%(lu}DV0Z&Ahad1i_%Op5R1Iqc4WpG{f@M^Khk*RcKDqR`r>Jq1NDg>~c zJOL~x)?ZGgQWmKyi%gI!LSJH%0SRP6Q6HKhSy;A`gBMweI7U_iT`lNpMpu`zJ1Zjz zyoaJ~rDf;^1+*M3Ml@V**$6z$5@K4ZWD#0u1z3$?8%}C!*s|AkRzA&f7}TPWsg-hZ z9Xd@;H(ibrqHcKm$x_$yz!`)h|PmS4XwyXCd)x0n3k_1p>9)khN3&)f3R zeN*>Ujyk9Ju6Hkf?5cMvrX1S*?nBq59)0pwvUh&C;kK_n`-LrcgdhF-#hQNhyV1m7nXeSxxh0|-T(3%4dYf9 z-Tl)$(P&JEa8P6!{}q>M#t4%5jKB{yX_4W6(uF5J7#{E&k>UJ@aZ`-mf`lhfzcYVg zQu4z;^TOL-!uNS(x{Ayb4f7)N@JMxab!1*-`>%X{9okX|N6>hGh$p7P+@houGdw#y8%n)weT0S}>EYSDoQ*}Qi(W*7 zr>n~F_P^w(u^><3+dqU`Ba-%Emh{08TG1sF){v?)4MS}StaIU5G)YI>!m}|qVrVwy zd0a`jSC%wM!?Uq42Ku1fJL(=W8f)R1~pedP@+Ka;-#i?%KedaBtY*aL(n7^ZViB*^x3>=?Rus z#Lqw8Q3Gbq$Id^|AcO;_E6z2;g1W!x%V zs$-(Z98X?msNRt>!Ih!{8EUPX^utw1Sp7;K=_~n!i?nI}rl_d$1W660nSiU#0zmGL_nR1Go~41@=ZGPkiu zn%)CbP_jozy-AJ6)i0danm_r)ool~Y{Nqn?oa)x&?r2tH2Y;A}rzuM-@{-O0pD&G$ zXBE*rCpsmn3Phdq<1`vGWx~|S$&(U^y7old#JVZ#rkzwbeagwx>ZVMYeDcJp>nBWX zpNg-n4#uyu419o$X#3|dZGNU9+QB!WTapZ;>)nsIteWPnIhdpB|4oA4No4aD9|4po=%+;hlK2CDnmzHmNWkJv)JW)>ImkrjJ)q zI!U96uAR{Z30$?NbJ0278`8KZiOxR86ihTlqw)C*-RKW)j~-LUqzMzI*G-x*5nozH zji?jP7V@Gj8F_w@MliiquUe5wbS<>;2$Azy4&TRY$%>gcqd5Pc5tpq7t!o$FDPGy< zwzRwu`~Lj8gJ<6Of^p5cpB{W27ipWZD*xQxsusID)0SN28d-Rv?=TS0qJ35+i3#y(vOD5&P zN9KMq7CP`vuK#`gYaZa=ppxHh+um1RMgpE0rvY@9I|J{t_Y!?zGNxW1nEbN_{EHiF z0O!$C{z$!N%g>7sN-^*-~i;PW>jxY=icuqw$#J-oAK8Po80I@4Bv$) z_UKzKp2*)HfPe@1M2p42jud=;hw8F8vCg8rW}+rjPBLDY5FSr+>tb6|dP+wgJ5*3m;E71+OB?c^pN~+$^R(J|JT_62Oju8z2ZxY literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..6c2f0b0 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/net40/GalaSoft.MvvmLight.xml @@ -0,0 +1,1800 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Use this class to send a message requesting to display a message box with features + corresponding to this message's properties. The Callback property should be used + to notify the message's sender about the user's choice in the message box. + Typically, you can use this message typ's recipient will be an element of the View, + and the sender will possibly be a ViewModel. + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + Initializes a new instance of the DialogMessage class. + + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Utility method, checks if the property is + null, and if it is not null, executes it. + + The result that must be passed + to the dialog message caller. + + + + Gets or sets the buttons displayed by the message box. + + + + + Gets a callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + + Gets or sets the caption for the message box. + + + + + Gets or sets which result is the default in the message box. + + + + + Gets or sets the icon for the message box. + + + + + Gets or sets the options for the message box. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanging event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanging event if needed. + + The type of the property that + changes. + An expression identifying the property + that changes. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + Occurs before a property value changes. + + + + + Provides access to the PropertyChanging event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..0419e95f0913fa6873b58a225747057ee571a715 GIT binary patch literal 39936 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.xml b/packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.xml new file mode 100644 index 0000000..10cdad6 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/net40/System.Windows.Interactivity.xml @@ -0,0 +1,1072 @@ + + + + System.Windows.Interactivity + + + + + Represents a collection of IAttachedObject with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + An interface for an object that can be attached to another object. + + + + + Attaches to the specified object. + + The object to attach to. + + + + Detaches this instance from its associated object. + + + + + Gets the associated object. + + The associated object. + Represents the object the instance is attached to. + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + Cannot add the instance to a collection more than once. + + + + Attaches to the specified object. + + The object to attach to. + The IAttachedObject is already attached to a different object. + + + + Detaches this instance from its associated object. + + + + + The object on which the collection is hosted. + + + + + Gets the associated object. + + The associated object. + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + The type the can be attached to. + + Behavior is the base class for providing attachable state and commands to an object. + The types the Behavior can be attached to can be controlled by the generic parameter. + Override OnAttached() and OnDetaching() methods to hook and unhook any necessary handlers + from the AssociatedObject. + + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + This is an infrastructure class. Behavior authors should derive from Behavior<T> instead of from this class. + + + + Called after the behavior is attached to an AssociatedObject. + + Override this to hook up functionality to the AssociatedObject. + + + + Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. + + Override this to unhook functionality from the AssociatedObject. + + + + Attaches to the specified object. + + The object to attach to. + The Behavior is already hosted on a different element. + dependencyObject does not satisfy the Behavior type constraint. + + + + Detaches this instance from its associated object. + + + + + The type to which this behavior can be attached. + + + + + Gets the object to which this behavior is attached. + + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + + + + Represents a collection of behaviors with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the BehaviorCollection. + + The new instance. + + + + Enumerates possible values for reusable property value editors. + + + + + Uses the element picker, if supported, to edit this property at design time. + + + + + Uses the storyboard picker, if supported, to edit this property at design time. + + + + + Uses the state picker, if supported, to edit this property at design time. + + + + + Uses the element-binding picker, if supported, to edit this property at design time. + + + + + Uses the property-binding picker, if supported, to edit this property at design time. + + + + + Associates the given editor type with the property on which the CustomPropertyValueEditor is applied. + + Use this attribute to get improved design-time editing for properties that denote element (by name), storyboards, or states (by name). + + + + Initializes a new instance of the class. + + The custom property value editor. + + + + Gets or sets the custom property value editor. + + The custom property value editor. + + + + Provides design tools information about what to instantiate for a given action or command. + + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + A single argument for the specified . + is not derived from TriggerBase. + This constructor is useful if the specifed has a single argument. The + resulting code will be CLS compliant. + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + The constructor arguments for the specified . + is not derived from TriggerBase. + + + + Instantiates this instance. + + The specified by the DefaultTriggerAttribute. + + + + Gets the type that this DefaultTriggerAttribute applies to. + + The type this DefaultTriggerAttribute applies to. + + + + Gets the type of the to instantiate. + + The type of the to instantiate. + + + + Gets the parameters to pass to the constructor. + + The parameters to pass to the constructor. + + + + This method will use the VisualTreeHelper.GetParent method to do a depth first walk up + the visual tree and return all ancestors of the specified object, including the object itself. + + The object in the visual tree to find ancestors of. + Returns itself an all ancestors in the visual tree. + + + + EventObserver is designed to help manage event handlers by detatching when disposed. Creating this object will also attach in the constructor. + + + + + Creates an instance of EventObserver and attaches to the supplied event on the supplied target. Call dispose to detach. + + The event to attach and detach from. + The target object the event is defined on. Null if the method is static. + The delegate to attach to the event. + + + + Detaches the handler from the event. + + + + + A trigger that listens for a specified event on its source and fires when that event is fired. + + + + + Represents a trigger that can listen to an element other than its AssociatedObject. + + The type that this trigger can be associated with. + + EventTriggerBase extends TriggerBase to add knowledge of another object than the one it is attached to. + This allows a user to attach a Trigger/Action pair to one element and invoke the Action in response to a + change in another object somewhere else. Override OnSourceChanged to hook or unhook handlers on the source + element, and OnAttached/OnDetaching for the associated element. The type of the Source element can be + constrained by the generic type parameter. If you need control over the type of the + AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents a trigger that can listen to an object other than its AssociatedObject. + + This is an infrastructure class. Trigger authors should derive from EventTriggerBase<T> instead of this class. + + + + Represents an object that can invoke Actions conditionally. + + This is an infrastructure class. Trigger authors should derive from Trigger<T> instead of this class. + + + + Invoke all actions associated with this trigger. + + Derived classes should call this to fire the trigger. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Creates a new instance of the TriggerBase derived class. + + The new instance. + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same trigger on more than one object at a time. + dependencyObject does not satisfy the trigger type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Gets the actions associated with this trigger. + + The actions associated with this trigger. + + + + Event handler for registering to PreviewInvoke. + + + + + Gets the associated object. + + The associated object. + + + + Specifies the name of the Event this EventTriggerBase is listening for. + + + + + + Called when the event associated with this EventTriggerBase is fired. By default, this will invoke all actions on the trigger. + + The instance containing the event data. + Override this to provide more granular control over when actions associated with this trigger will be invoked. + + + + Called when the source changes. + + The old source. + The new source. + This function should be overridden in derived classes to hook functionality to and unhook functionality from the changing source objects. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + Could not find eventName on the Target. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the source type constraint. + + The source type constraint. + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the element this EventTriggerBase listens for as a source. If the name is not set or cannot be resolved, the AssociatedObject will be used. This is a dependency property. + + The name of the source element. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + The element pointed to by does not satisify the type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the source property changes. + + Override this to hook functionality to and unhook functionality from the specified source, rather than the AssociatedObject. + The old source. + The new source. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the event. + + + + Gets or sets the name of the event to listen for. This is a dependency property. + + The name of the event. + + + + Static class that owns the Triggers and Behaviors attached properties. Handles propagation of AssociatedObject change notifications. + + + + + This property is used as the internal backing store for the public Triggers attached property. + + + This property is not exposed publicly. This forces clients to use the GetTriggers and SetTriggers methods to access the + collection, ensuring the collection exists and is set before it is used. + + + + + This property is used as the internal backing store for the public Behaviors attached property. + + + This property is not exposed publicly. This forces clients to use the GetBehaviors and SetBehaviors methods to access the + collection, ensuring the collection exists and is set before it is used. + + + + + Gets the TriggerCollection containing the triggers associated with the specified object. + + The object from which to retrieve the triggers. + A TriggerCollection containing the triggers associated with the specified object. + + + + Gets the associated with a specified object. + + The object from which to retrieve the . + A containing the behaviors associated with the specified object. + + + Cannot host the same BehaviorCollection on more than one object at a time. + + + Cannot host the same TriggerCollection on more than one object at a time. + + + + A helper function to take the place of FrameworkElement.IsLoaded, as this property is not available in Silverlight. + + The element of interest. + True if the element has been loaded; otherwise, False. + + + + Gets or sets a value indicating whether to run as if in design mode. + + + True if [should run in design mode]; otherwise, False. + + Not to be used outside unit tests. + + + + Executes a specified ICommand when invoked. + + + + + Represents an attachable object that encapsulates a unit of functionality. + + The type to which this action can be attached. + + + + Represents an attachable object that encapsulates a unit of functionality. + + This is an infrastructure class. Action authors should derive from TriggerAction<T> instead of this class. + + + + Attempts to invoke the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + When implemented in a derived class, creates a new instance of the derived class. + + The new instance. + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same TriggerAction on more than one object at a time. + dependencyObject does not satisfy the TriggerAction type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets or sets a value indicating whether this action will run when invoked. This is a dependency property. + + + True if this action will be run when invoked; otherwise, False. + + + + + Gets the object to which this action is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Gets or sets a value indicating whether this instance is attached. + + True if this instance is attached; otherwise, False. + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Gets or sets the name of the command this action should invoke. + + The name of the command this action should invoke. + This property will be superseded by the Command property if both are set. + + + + Gets or sets the command this action should invoke. This is a dependency property. + + The command to execute. + This property will take precedence over the CommandName property if both are set. + + + + Gets or sets the command parameter. This is a dependency property. + + The command parameter. + This is the value passed to ICommand.CanExecute and ICommand.Execute. + + + + Provides data about which objects were affected when resolving a name change. + + + + + Helper class to handle the logic of resolving a TargetName into a Target element + based on the context provided by a host element. + + + + + Attempts to update the resolved object from the name within the context of the namescope reference element. + + The old resolved object. + + Resets the existing target and attempts to resolve the current TargetName from the + context of the current Host. If it cannot resolve from the context of the Host, it will + continue up the visual tree until it resolves. If it has not resolved it when it reaches + the root, it will set the Target to null and write a warning message to Debug output. + + + + + Occurs when the resolved element has changed. + + + + + Gets or sets the name of the element to attempt to resolve. + + The name to attempt to resolve. + + + + The resolved object. Will return the reference element if TargetName is null or empty, or if a resolve has not been attempted. + + + + + Gets or sets the reference element from which to perform the name resolution. + + The reference element. + + + + Gets or sets a value indicating whether the reference element load is pending. + + + True if [pending reference element load]; otherwise, False. + + + If the Host has not been loaded, the name will not be resolved. + In that case, delay the resolution and track that fact with this property. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + The type constraint on the target. + + TargetedTriggerAction extends TriggerAction to add knowledge of another element than the one it is attached to. + This allows a user to invoke the action on an element other than the one it is attached to in response to a + trigger firing. Override OnTargetChanged to hook or unhook handlers on the target element, and OnAttached/OnDetaching + for the associated element. The type of the Target element can be constrained by the generic type parameter. If + you need control over the type of the AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + This is an infrastructure class. Action authors should derive from TargetedTriggerAction<T> instead of this class. + + + + Called when the target changes. + + The old target. + The new target. + This function should be overriden in derived classes to hook and unhook functionality from the changing source objects. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the object this action targets. If Target is set, this property is ignored. If Target is not set and TargetName is not set or cannot be resolved, the target will default to the AssociatedObject. This is a dependency property. + + The name of the target object. + + + + Gets the target object. If TargetObject is set, returns TargetObject. Else, if TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target object. + In general, this property should be used in place of AssociatedObject in derived classes. + The Target element does not satisfy the type constraint. + + + + Gets the associated object type constraint. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the target type constraint. + + The target type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the target property changes. + + Override this to hook and unhook functionality on the specified Target, rather than the AssociatedObject. + The old target. + The new target. + + + + Gets the target object. If TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Represents a collection of actions with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the TriggerActionCollection. + + The new instance. + + + + Represents an object that can invoke actions conditionally. + + The type to which this trigger can be attached. + + TriggerBase is the base class for controlling actions. Override OnAttached() and + OnDetaching() to hook and unhook handlers on the AssociatedObject. You may + constrain the types that a derived TriggerBase may be attached to by specifying + the generic parameter. Call InvokeActions() to fire all Actions associated with + this TriggerBase. + + + + + Initializes a new instance of the class. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Argument passed to PreviewInvoke event. Assigning Cancelling to True will cancel the invoking of the trigger. + + This is an infrastructure class. Behavior attached to a trigger base object can add its behavior as a listener to TriggerBase.PreviewInvoke. + + + + Represents a collection of triggers with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Creates a new instance of the . + + The new instance. + + + + Specifies type constraints on the AssociatedObject of TargetedTriggerAction and EventTriggerBase. + + + + + Initializes a new instance of the class. + + The constraint type. + + + + Gets the constraint type. + + The constraint type. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot set the same BehaviorCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a Behavior cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to Cannot host an instance of a TriggerAction in multiple TriggerCollections simultaneously. Remove it from one TriggerCollection before adding it to another.. + + + + + Looks up a localized string similar to Cannot set the same TriggerCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a trigger cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to The command "{0}" does not exist or is not publicly exposed on {1}.. + + + + + Looks up a localized string similar to "{0}" is not a valid type for the TriggerType parameter. Make sure "{0}" derives from TriggerBase.. + + + + + Looks up a localized string similar to Cannot add the same instance of "{0}" to a "{1}" more than once.. + + + + + Looks up a localized string similar to The event "{0}" on type "{1}" has an incompatible signature. Make sure the event is public and satisfies the EventHandler delegate.. + + + + + Looks up a localized string similar to Cannot find an event named "{0}" on type "{1}".. + + + + + Looks up a localized string similar to An object of type "{0}" cannot have a {3} property of type "{1}". Instances of type "{0}" can have only a {3} property of type "{2}".. + + + + + Looks up a localized string similar to Cannot attach type "{0}" to type "{1}". Instances of type "{0}" can only be attached to objects of type "{2}".. + + + + + Looks up a localized string similar to Unable to resolve TargetName "{0}".. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..41f85136ec1b0e752915a86acbd073629a390fcb GIT binary patch literal 14336 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 + + + GalaSoft.MvvmLight.Platform + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight version. + + The FrameworkElement to which this trigger + is attached. + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/net45/GalaSoft.MvvmLight.xml @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/net45/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/net45/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..931c744c87a5bafbfa9471ee90b082c752b12dfc GIT binary patch literal 55904 zcmeFa2Yi&p_BTGyvo)JSvMIEXY^X~}!fqM~J){vxAdt|Mw#jZ_CCP@}1PC>uDGDk! zP*4G}-7AWMid`;vRczQhBBG+$%k^5o|M$#1&+ev(Uhlo{@Be<@-$Kqa=giERGiT16 zsrzi%d6zQ{V@!*`Uw>un0G{+2&EdI03!)^y(g)q9cOY{P`UUSzm7Rmnyo(ig@ZUNu%6n>ns z+eiuOXFFqaM*=y{SQs8-?_w-ojr$`{i(hn}+6a7XP`^l4feMU1jCJ5!hy`)!sNH&@2 zSjt4yb1q{cM8v0|fUyTmjFnp$Yazn#eCEA${|KjH!q9zt$G;jkqHao$zrXg?+hv#U ze(!JBKYV=lO$UByJu>={Er*}!vM27M`M)$wf9_1~yNg{_>sOYo*fKfSQk%OqD*fJf zU;pN=ckLBdZ24~4Z27(N`iFiv{L=L~Z{Cr;;Frtqs<a=4Z>+SjJ59vN*tG#-eQ+)*mv%Dxzd-SBf&}<+J*32>H4LczO`c z*As9B8d%LkHUSkPPXfg+qbN@zz*)(pPsxZ29n@boSS=uIgrW8n2@IYjm5`>1GbJ0k zP7gH*4(Tr@Llzw?1z+^HD3L+q>5U92BdmS!uzrBn?Y0RGj3VNW5?d>}iOJIsV3)qD zY(+&>%sK#JpA}$fa!=GT48p>EqqLrZphfGW^o2T6ZPpcacOrZW&kOLEto1-KCeI*B zXc%OVGI&xDyqO9#$$D!l5Lxd@!{b?nurP&MTA9#p@=ZGh=9o95IH8Hq2*FZR(UXlDMt2z$71hNvgo0Wb%|t2yf!F$@V_{KUkgbc7 zEntnZHHUIU4(e`>wB}M!Cr9Z-eWP@|!iX4(h}2`pBFvFz zAR@wcmgi;Y9~8cdrTt9}f6F2@l9J{m%j+j8X^JKL5;c6ClyE@e?nP#=Oa0GC5yU4! zwhlw-$r_u?#t{J@ji9BC7S9yDZ#a@HwbsJEQ_b?q5x}hQt)`pvU^uDKvUL;?S+j!r ztZW@k(1R#b@&&SI45#q~F+mAn4!m!}+TpdRKLKh@`cQ+$nvX1vkW>njmlM@!u)K?_s*5C@Lc))js?9}o9xHX=d{T~Wor?Msae4z^~w6=Xq&{MAsc!#dRE*1;qR1`#;D1e?5`biA6dCmpl>EhZ@Bq^&=#;3#E(0!tDWTSPK@mPclX9MH zH3QXns4UMofYf5)Rz3!~yXscjIFYVO>V8PQOW#d!P~1(BgYmZyRaR*qD;%g^_P|c` z$*W}#T28Mdi&@b=S#psa@Mcz+nLasP)PegPs_}TLc~967ItYV1fzC=n3LO+=(t+hp{$HZu(mzPnL6~&rN$29$q zF+KG(IhpiCnvaQN8rZxPt+Ztb@>*w5otG6LV@9mJEFaIrvl*ds+zJZHra^`{-&f#` zHeOZ)$_jKuEosO439l*fng;GB(gn|M(idX9Lvdp6G-#w8%Xtk-mE~oWdj;HvR_@A) zU6YkqCC+*tSn)DM+SF&_s0Ano8t!~VF6B+b2{p2HCP}Xmvhu2|pqiioNUkV|Ky^$! zt5#tJRe`sU2IF!$;^`yUXkx6hz%3=z3v+4k&8D(+si9tUBLzc2&?L14I8#fYQ)}gA zoVJWeI?o*BO0Ei~$;&8}XD&scESmFJ@WgE|{UUn=_fAMoL@Pk0uzH2LXWkWm8};TDKE>}ud52tR!slz^Y6 z(fQx=)0{(_Ud$(gem_lZsrqSBhsHAx)s|`Yp-;X>_FzsC@Yd}Ud*&l;@(FK0*yK@a zb?#3Bp2g=zy!8Tr7P2F5Or8aVlCcQ;6Mh`NL>c>N=!XkGidnQ^=cxmsiO^6(ioxJ{ zl_WcgP9gEqs6V1;EyjtJNF+=Uw#pHWwH}$tI(w;6ji`}C@kCMLg@4?Dc7Vr%9Mmjg zcA-xR;o8xg26<%bSkP1E$yQjR-m{ew=~Je2RqFLYgK44gq#q$c5AKXZ4ROJPsiCV# zy~}`c6w?*`E<<;37Ie7F5Hyr>$ATe@`+6)t#Mrl6fO6tZShphz)HBL)`FM54fU z(a+HE{3ClxK@@_ZM{&#xSKZLV>LuZdG$|HQ$Dr9pO1P|1GQwf%wQ3S=K!-@8Rg%C3 z>-oCnN|XrahV~)jR9Z>jgeim^s&9fP!6c50Z%FBB;DfBmfaTj{B=-3rj0c(Zg9eKB zOw|}Mzl@QsaL{@hp7qDN^gjj$)V4;?b$}ge1GR>Sq?nBjKXWg$Y0kb#Ct**X=m`V=!QJ_FK&6_}8C zF~2EZm@&nKPJ-no#!+f3G1exqE~!E;ui&6*gvXV+j<^(@q3DkqhOEp?a?|`1OJI-R z+(Wxa)<$SDwTm91CWH(gQeCowrA8W3!u19{HvYGDV?Ren$pFIboGh>m}RYJGw52+6@Xm* zaCp`dAgS@1l*E|R^Su0o-$%fvY`8OSrqr^7M)lXrK=`b#1KWWL9rU{C{x3gKChwqB073p zn;IFBoI4e5+tgZ`j0*p&W6&-Ccww9k0gVP)HRh}ymZJBqMh$#x0IX{PTH?{5URZs@ zQTQa$YHjjVc9Mq%%C_sW@gxY=W#l`>y6hTKI*kvqrU`S&o}8);1U>6eI@Y@Aoa-rs z)eSu{%wQy;VP++~fiit0$!LHkiZVbW8>S`t;Zn%?Z<1pq>qEEfIwyhv# z5vEQf6Et%Hk_pXR2qA=KsI=rBD|^!;L2ltsVeeLGx*OU1N(&-ABax*M9Rr>*)$Dr# ztT0Wc7`=xk8^S&)Pj{Xt$)5*yFY;h8raTlA$RqRle-GqQYsb^8)gvTSZ%DK2QzG=r z3R3U62n8BaddVq0#DIqh6!>$NH^9zXsx5-V&X1x@kg>>hAlk!j{JLYNVBoFD1 ztfoJnf&HQ6ae|`Rm`B!4%@J6&^rbBRHB7%YSRcYB`zOVOa?i{SwFqo5Q{p+s$TR@z zF~n-f`_a^2@iXV#!-4%`yh2Kv|6c>!(4Z|a|0m)wG!m*!K{VenJc8!`=-&V4{GT|S zWByNC5ml8vaP)fGM}yDCOk)&PJ7z^7LGq*CAE}kNZb9arU$j?Ou5jOFAd22Z?b6m~ zVBF(AgX-zu%OT+cZ8Cr|T`XJCDfJrbUm7k#|p5?aX5{wU^G zO5YRhLR#|nqBQ7hivMq)hSWuldMirAa~bN+*C2!FIhC)1s6P-Hdk>rnyB6a!TpQNj zX^0BiUp0!gK2fpOhv|3RUu~bSkZSu|`5;pY$%6V)d&c3J$lDVV!?9{sP%K8#n}8-? zDw8IaB}y0Bx&sKhuk~7rl&#z80fsONb)Sa#;ScsfX^0<1g5NGmdxaolfx@H3LO_m5 z#+XjYtv4$S2NOfu&Eo--U{eV^0D@g5@W5-b^#)`W^Uhll67$YxC;~Ie8$rNhCp~z} zD77QKZ-TrQVUsb|>nR17BxPE#goy&doHoFF3GwdAc|#L^EzwMS8`xmEZHA(V?m^W| zO%hq3zCW^XIrO|Rcrj9Y8m;Mg$hsS7vR7CEIxx2eOb>kMM|xUlh;uWUq0PCTHBhnj z7DT3CiiUzsd>Yj+Rql^YiAJV2hCg9RsAEt9bl6x_)h`|<)nervmwczHF|LR{jE z)*vc7lVpO^$U=kg!GxR!A&S$0zsXjk{M!daQQ{#R`E~dKW&dCiDuYGd?NldpV0xMc zVXe8B2v}p@jc3sQ!CgTA^!@>5ru~Ca=+y1@54c?a_Wp{0$V^9#Y3=h@l<41j;EHL0 z0^4srWKwEac?LbHAMik%EeIMC5J7yEEeOgaTOR-&!z$VKSkwViG4w?moWv+;Qr7$; zp&_Mv&|?1pQUwt@m z8O2&0=FS_n^L6zNvh^M$rG7~Z!}gRpvb6y0GDxZ~MTFi$!= z5|l>7R(95AtDf2R+{4sR514N-a3?a=UH^dYf_ake1W(WKAa088g1L3n9i}KG23M3{p5Svg;)vs$7nC}~ z8bzIXAaL&Xnur&}1MhP(%fJ&e(WsT9ktv2oEmMlcyMl}w-AkCi2P3SBwp5{!7D~qx zV{Ms71z~N;pHr=Gg1`4xWaSYaj1s0~h1yf@jJm8->W7_Dr)fIlaBrv7aBXL4uj-U~ zs#EG1U1uD2bxPIhJ4-vcEfs2J_nH`c{>YcOoyFK@{MA-8`x;$!X_H+(Pm{OW<@1Lo zyBtoJH^oxttM+(n-Bl@;sV=Y2?WrG;nP#JZDVF@E+QufYYec=PsnP4GO|g_WRn@wy z$Ge&haIR8Zl6M zm=Dh}%!SQ)2U~>YxCh%*`GB?f=VH}}C0aczV@;qC*1%&b5voH9A1h=_kj@2qAT7~- z;5ZL-`po_##s2vsMxcoKofT1u+PEPF$>C*r|B?D&;l~<&zp($T5>wEYGk?F(Kd-|1 zC}1kdT!(*TB2HESj2dzRo{hYj-M|{zM8vi?nQ6%51>KFmc`%k>12_QIYo!9vYLH5p zQTv8z1Yc^ZD#SM;WeNB!Lh4%3oUCo?O4bZxbFm5ztC6Axe=el^JySdbNhTMd2(n=} ztihoaMn%@~LOW}=-(%}Q=bBy!d0mjYv7NMIP>2sPZEF-r{d>%B0`u8{KA7E%c5U1*w=QqSAoixgB$Bb$mRxe1}d-`D+l zD5Ug1$?yaiPM88&9IzU4R+W&4YT@H@QEOBN)kjsvxh!=uJf$=&UtBEqxf(5v^IaC7 zqt0a+P8F`7W}Wn0O4+^by+-B7l7(ZlP2cTRb*eIqrMu{8jHi9 zGw8muqp{IZJ>TWDGZ?5guDa#`GsmKv|8jtkHs7w%WrkcbYa(_KH0 z(n4qlE?&=fdDEn!o$0D0k4{xJp@XU#MP>e^rt&M%Sk<1oI!C?J(tDY0MQ@AKNDtX2@d}z|qiqfFcfPn=YjgW!#3|@BB zBiKl)!C{R=b#*Or)i)}oL4GczNI&1<6Q%-nG&maFRWMPXdtSYRrZd5!l6?y{sIgEA zGCE=Njc#9!8{$)nLMmu1=(R4d#p$Yb&2uzDior@fYTU>H%M^_2p%7L7ZKO(*)=6k` z(N(B#C<0SMRf{f%J_bv(EX!CyxBMGi-p1yjgwRBqr9|mmzMu$&gN0}J)T3E{lSevu zNcCz1@O~I92Xr1#1Q)!JS!g13{wk^7>4vcTf|6yBG7&T2!*q;hpDdoItLH zw>I`U*_euPV@XG;eJapt>gV|= z#aH7P+l@J1pD7jWs!8H|2z`pDloTLtH}EA9h#OPusiMUAU|^A^&ABf$gckWf^~<1* zH7b2J{w(+_!rxc;TZ2DLs~PrixLjlKq;x2r&LsFBR#$wF#EoYt{s^Zu5Qjh2Fs0Yw zk2n&IQrs=?l1=PY4o#ZVas=zANzg>FWDYYq9L8ZWhr2cFG-ftRYtcrq@3fTCs7t`D zz-78!$osf{k3NF+HG~)<*mOe?pwB?De>Loq_3RbE2-e?7x!yMx8T8C&+9k)a0inBO zGn*cfA7NslQIsYoRudb+3S(`6VLd7RnVui?j9_u`#50w{aU522xSYc+9PS0|!M==t zGrkAY_Ifiug7xY}+(vP@s@L3J5$wud#PjK1w<9bidcT8eM!#`0-D*ked{b{CikOKO8Zf+RsBe}`}>i!Uvl^ppq^R#6aAw8 zMFunbxc>|NBiPygRMwyYL>WJT_&5P0*oFbkWO$18P=DD8Y!Jf+0>Tn&#eJXY!1M@f zIpzTt4l9l1*b-ooh>d3wHc-|8GXYBg#&F6u47YFe*zuycy})8&@dA69W8tv+R>YkK z)*XCOc}iIlSQ;-O5?DBHsn|Fc56p(M;E^0l1(u1E2M45!WTSya0CRDkWx%>K3;H?L zVFs{p>^U}aY#y)zl)aXhw-}fi*oCNaB)bGy5=*A_F0h@zy0aAAzb7tt@_gy+c8(ne zHXV1MALFIJ11t{MAs+V~FdML^d7La0&mrttUS4-#Jy;HVfn$S!#R7YkwV=Fwd9vJ{ z<+3+8*1)l$z{vl!!o_rFqk(CVa&r=4W7sDs;ciVi;Deg!fIn*8{&1|W4qK-Ob=%q0 zmZx<$0=~%MI~;z*;rDB@0*X>L8r-<4eb5jk zWwVbBv7l!e698{C5{Lc9JcOS&765)`9E&uXkXXQOfD*eeG!Nm~VX=~(9pUh8z$i8> zoN_JUFi=W1YYnGdUxc4PuAdOjW~KuKNw!=wQ7X&@;8SHLZi@jWHa&*u*T=Y_rNc2Nq^T{haQGI7$2t6nLlOHW!cnYm z?8R~vn-qJgEU~oSRN||>w*wvr)U!i9rUP2~Oh^0C=kMW@G{X@qK7ZHMX!3%vI!!S~ zk)sxhU2CM2GCR((HQk=!aTJ4*O7~(L?42O&kl~bOCXGe>bI9-wFb#`=tuWZ-S)|mm zS_O;K&IEQ?!RBhKFqVw&ODW$EY19tKUg%hkeI${b26lsjk(@^MFvr#yQ*{f0eWze0 zz(UwSY{F6<=Ia*29}H12s*#Bma*S%U99SjC4og&{P&QS;s79e|y1>{v-D+TqIo8Uy z>L~6CjtMzK*>;WzIYU`Ne=7YWiR27pE{?6`8VqBL1qSVIMBG}A3GIfljT}47NR}{m zT){||FlOUk@{oK=a}BT}1^WhAIGf6`!(7e?Hj88HjXM3q@J23}m{(P?jd)SX1gI|odQf=3>xAmu392-86uxnVl z;TvExIkq0<8Kti50LMO()*6c8e_r93Xonv7o*Cs6R@ak7aO`l%4~E68CyVFUdSee` zcc~|{DOkR-Kd|`;j`r>czU@U>erS+ctsqP%zSG0*eF z39Nu)qBRrPHws3rnaH}~U>SRn-LCC>i7t^Z_eOsl2A>;nbM3Ecp{9bzXgt*jVWITP^ym4*FM$81_Irae~y^LgIICfadHQghPW(6W8@BL#~sUNG9#<24R zW^4#6m-1Pif~^dz1h$N0hZ(g>0b9ed&5-OtV7Cd3+h7sbQfv_q)$HSFndn>2}n_#D=~0&Fsi<#D1FkVx{m3!hP~t-Q>JS$%Fyo{yl6)SkRIplL=d%q8 zc5#<-X(qc$!LIC53G6-v+umh3o5kKzuv@!?%Cp!>1$&~)25A=VvvH}7A0Tcv8>C={ z$l+LvW++&X$UI=f6)ZJ!wls$oC|Fr!6|gb|t3%veHbueKB5p35Eikq%a)abxS1H(| z;912|akfV~dpR;vu4bhQ_CaJf*~OM9*sqa^at-^7g7u8*C(mQAaZG5}&5jAoc(J)u zalVDVV;eYgA`1To&hXF!D6E+ZkU2)L{|YT;F$2!do?z%k*IJ?yZ8 zQSb1u_))w(?vp(%SHWD-#cUySDA+QNZRFTyc4hQZX(4-9!EOiUV;?IiABkQqH8JgI z;wfx!F>B_S=sAnoB?5ycHsTCxE5|-yB7+03DT8_~yC`Vq#wky~-z?QRpN=llotzZvwOvti=Ju5KYi&wBWIVM_V1$&=k z>y1NWW=kvBCkj>)Qw8iBf$<)Qz)U(Il;htHKpN9+~y zYBoy2nqs#AD^jr5*zLe3DA=ahUGf^{RIq0_wp77><=Ev4mJ>%QZ&9!&jyIrxYx)E9E<@U}YSODG+k5>*dF1;c!+HCcAi(np5iHM^~7N@poYmkDSa?y4d`m=RR&5~ z3#h?*m*^Wg3@%Y{=qO2Wnj4Lj*TTz629#N5hj4JcM)EXcc$(mFaGGKsE1*a-gHuRm zi3L-F!-9j5q?(t~z;peURD!3di^waa5)|Sr%2G@0C^LOoLt??&5IPik6Y#gRCt_d6 z-l~k1eS1E^JUfQh@p37z#I_+Uvzs~PE)JjMFj$`*IrKHR&l{XxXtiT~gVO|;8ypU{ zYEf=S${Sol5&LRy4OZ1!{DtDSa~Pgc__JWY$AU?T1-r=>_C5Z3vG*CxM?L|pl)mQh zM-C;4C?On1aoC;1Bn}4xZj7`xQ8QxnEzC}p&Va4lk&Xm(0x5>{#|6*}!t-41#sUP)n1ydHFdVJtmyC&B^_ zOT0_-CM!tXBF|v%#CtUlNHhzwv-OFK*+J>%#78tQat@Q&$;4+hli2r(FKHIC2+JFq zPo#KDsZ`2nKcke<{s&6290O;Yt#Pt= z3+)F)Sk7o_dAOEQu2M#O7F2FAljLhGu~G=zW68%3+oP6ZoY+1KSjtDrQoi!qz}~Tx zXrp8)X|i?$_?KwAa}9KtdnVOs^LW^Sxus8kB#0YuPh>FVk&i z@ATcSYn9{r?bL0M(-Uvk5uXFPgHqpqPavG$FJF5ty`e-pD9!43MCX7cOEh;gSHDu} zZsr9n;FN2@bBX2w?CN}_dw^XJID`GQ-w%KX`<;QD&-7c2yS>Nz>GeeEslQz|_D|B^ zEywj=%x*`$a`X>y4$UN+{#rJ={{;PRteWq^o&@QQWUkW3aQS0+T{3w%lZPK*CH-eh zyk5vV6?rLagUs{#e{blE7TL%SvZnq&8xFFT{x-DT)%|tGgYr!%{h+kJe;0)JSh^Ye z^0FRa5A~m7EZ~}afF15XoZZ1_o|VF5Q+WGk^6-AH=ZCqTGdcZXuI;B$`ZnoBstdET zo&zF6X0XfwF(EG^R}a9v0RuwbM{HWi*F238yYDw~?{FJnU$zI(%I*P7VfSO#=_D(_ zX}~E~0r(l43iuV90r(vc|C2cp{)PGE0qlI;Z7hv#V+X?1utB4`N#p&fwu;Y#+ko**Aa{Ok+x8=d(h;wPB`UF1xt&u`;<+YDISz4_pm}S^4haz^3W{rG{ z@t}s%e4rTw$v;rSeRR(mHCm$QaoED)4gqz<`F$P5N_v7x9KO$?WFX20LxnCYaF?={b>CK zdXK(Qzf8}JiN;~Za^rbMhjE^<-sm%~GG1rw9iqj!7=}?X7IPbXe^f`CHrTZX9NMKf z==2UY8DowX`@jZBV8l*t2y%pBk24Z>)SY#~zF{ORBMKI0W=XJ!KKO2Je{i&7w{bAe zDTg3c4pI$8iecD=8;&t*JW6QP1mJyI3g4r<&`%eXM$KkWu3=9Ceype1Z#X=w|J~TJV@>VF(zYN_8`Y)k30~*3891(UqU{ctffWtT(&!HiV%Gwx4DXYSd z0lpnhX@s1D=ZBmUESsR;6G6Eijra=i?-5jrp$ow%4sVU3*i2sEJEAgVq~Y+RD5~}M zQB+Elnc#ELll%;Ccve#BvP4~os_u#v-U9A@_+$=CPUiBqR2Scnle zAS?C~$+BQCMwSUkwxdJb)v#S7PR#V6gu{|#*h&asH0Clg>?0ho7i>v}uZn`z_2XOz zAYO(Y#R3k5CDHq@x&x-e-sskEFTkO&C>c9`Nr0nZdoml1+&I1BFrN(oWekS};34Cx z)*!$lI#*=HfHE#=4n}w!c+0p$Mz9LJC0y9dLUK8l zHJF)5Yzv^ww!(+X>{>PjlN8C}TvZ2D}p|qcXb-wUluh>ju0V-dSS%P*)k_1;NL$Qz5e>*praiGw|9H zdkz=;WSm?Qd=<5q*lU0?dlNd4aa(p7C~pJG>>aH8W%e#x1$YcQKr(v|Ye1PDhi)*N zhgM{E0-BK72hf3xacL9ahwL)IkDw2keT?x&W~X35GDfN`fL}rr8u$~kt#rUJv;}{U zk0dh-dqtWC_>%Njz}KW|z&E5lfNx260lp)-0FPn3Ho?M@U>9j<-=R{9ybyODZqa@R54bMZu@4@q&;0EXI_IId@Z<7JunQwv`!@V*M3rr_y#ZeVjT z7cJ3kVChB)wUW>`>D`f3L%mWV0weA-s!5ZZWa|7>#D`gD8?^kO|0^{yo-PZ zT`&_d=ORFOo?A)7{5td0tBk~j!nPQ)mDDf7&G&q9$xcZ_mzd~+JFYc3Iomw%JX{(M zP$3<^?c{Q*b>p`cJEx+MHmQQN8&oBvD)+h;xm}BeM1gXZM8Vl`Q7_+vYhzxAyS_1? z*U92;zH;lImAR|E9-pVCF|BY(1FmV&R{_$-)I#+Y1>>2Lit};QH{#a&l4@52-2)XD zuqw%9m|}!<&99xAp>^A~B35&#fe#n!aMjLJpN~71tjOzfE$v`??F_uk<#apJ^6K4n zJR=h!UcCBM2BmCPSl?7f7OfbVV*e!tZXYf^@*DxZ;WpZwJfF`~?Z(|cr;-$TaZwer z^GAnhMY4ddeQ6>i`lhRv1?XrlU%jKjH{XLB#_bD9tELVzv0fDBav~@S#Jx6Ff-i66 zIh~+VNL*NTQfs(tnky8RWWMvf=5STFTVr)o6&8n!He`;Da-e|U@Yp5Om4zx#&+$i78Ia!F1T3Rw71p}y&bC_kC7n4$MG1B2BqxSPgn`{O$=1zH7I$xdXd-%A4}KA8>t^E zE|N1<92*Y@rS8Z(t=LtM{!txV20CD|tFgjWTa#Ds%){Muj8k5pYSEKjHOi%SF)ozU z*WjBUbm^CeME&6f#Km8RzCt&FneZdQCMkM9i5PIWL7q=-KYW3TiNV7cObWP2mD)ZP zS5?4}IxUX0sW2C{QF=%FA%jt`Xfuc~r7yH4iUCID_&bHG$;6k<+9|^AtKi>3Q+mW? z*F0QGcX{ECMDjL6W|^yTzQ-A838fZ6WWh}6z^^btBu;)3DMXOl$rFeWOn8q8=E~I_ z;20FoduJejyM)SY0N*4*(IvlK>vP5i=cVHC-8qF{smFl(AzDx|ulc6do$LoL#%^S!b7(uJC`qj@SZoH3vDsLX^u)r=~Ya~;CLwH{vLYu`#8ysfBtJ5v=z#Y_dlTU7*EfTC)L{kGYuF~oq3s-sN8Z%}-j zPQ09@fCWOlN6hy$)jBb`EWtE}zH~v8A<=a@jZyr%-xKniYZaE zlJ@*azN5BQxL9Rz5#WrFQke3s9C4#nl1SA3L8k%4XN(%03 z)G!IGhJ(2JM`2!BB|(6wn4+3dc?Q=3Gi3g4r9d7}tvdCtcP&=Tol2bOrxP~89~Ynp zX!WpLMxde^U!lR+jv)pke!v4LOEod^QmuqWLq%d|JJ+HNi@y=e1)?HJOT2bmV6oO# zBRdyG&Cz)*<;8f~2jTy+gJ z@^B6EY@LuN*8irwsjgngRP1W}t?Hv^_{(6EJ=i@6T6uR? zzS{NMDyBo9AASxkbWGf_?j6$biupxtuY8)`owIq{ip$O+9qTAe(7ZipHtP0?iMpa? zb-aT|6VqI!NOjLbG>PA*h`dxGKZ%S(kb?}c4Iz+%tAngQz=t~;fd&QJ4S&R;L=l{8 zQ<)2ie14IGlXa{gm8&x87>jX(FLRU_KANk_X%iDP4`@qQIkdH6l}chOyfJLG%_%TN zeFEW{62YKFP*6LnHBr?e()v}QMt7_zDGA^It9I4a(wdUA5`+#9ggY2>AW9h>)IBA^ z#J|PFh6m*A$Rv;qYYA6fRc*6>2g-2)HbTnW^?+lV+*o-|#ugXtL($5fCoOWkFVE4^ZT`;WFj#MY7Weha?HP!lUOUc>ebx$49_F+`P> zu%c3Yv6jYbb$SxmKq*5y`kHhlzR~RSZ=983j}3APUGndL2Iu})@+dPNvH1EE8ULK5 zN~wRKJTb}_;LFI^cPgZ>A_rC&(;VJ<*kQ0Teq$pTvm}~~E5(wB;5%CQmael?ofb4T z;AJJWL4#qdBxpaY)6{$ttMI1%OQkeU{@o1d8EE_>Y}5GX!ky-sjEzM4-Ya&3+w2ic zb$evc2-_WE74d&l=Au%r;nV}>P#67p1Cz|ax#h93WBt-3tm8Tsgo zj9jH0LEZr3Qub_-f)BrK))@>`W#C38CFHJmV?(pH!vwIV{r*ICV0cu=H*rjprVM*D zW(%hNy^TPv)nT&I-B|1DNXB}++Uw@0HXS3;2^t*rK`K<4VW#J7st!6hQX}#`4b9l) zo!?26B5cP}f(GzFq*BxAj=EZPpjHnV${gMWO$}^%U2Q$~16(!kC4p?5i2lfx>!I@# z<)CMRcwdz|eEUjqxY2~6HjrWp24tKc`Cm*`gjIMI_Pk3y7%*tU(N6jNq{7osfx|{O zHjioHIu$b$>|O_W=9gBG4r|@mybe&?F`^Wh!+8CiIOlpttxw@s>FJQS!d2Zw$2)1| zE^nQiAIxFvS|J8#LHU$8F(FXvQs8#XtH=DrUG2l3bXC*5d9?c;$R%hr7GuMPR}qqO zZA^C6I+pMdtpOD!E60c2Z19E+cP%6g#1<}Tbk)<;EkL3dj-d%1nDV*Kc>tvz=al@$ zDHY$j4h#kAtQwO}oHe6JM{S@`J~i{83-M_d%>>YPICI47M#RLc$&1~AMs+|`Dn*`7 zNJ0BegwZNhp_E}J>hkhQqY{Y|8+r)^D=G4LVO8ibi`?YI1WNllG;x`TQ){k7|J2~O zw4k&b$*u%TN-=5T0%ME(wPa!qo;WCPWMz2Y%>?>o zOiDAc)+tztW5r;OI4lTasMs(yHD1zF-zbhZ#qOTVtE>d^vJ@=KgE#&BOGJo=ebgow z8{_fRx*YXv8q66hNW~Te2Fn!Qi8@!6yWW3-Tsa>J`S};`EBG1C1z4?eyYsrB%lUM4 z$xliaIY=38PvsyJ{1v_X1!hOB7&s7~LeuYnsrW;}y{bLH<>lu|G(GdDz|Z{6!|_!; zCbP;ZI2(>iwm)AQ>6|mirgp!8!TQt_sx-9?A=+?7$*SWE?6!+_;Yef(Ze)L(sHe2J z`Vlx&YnOQV$n-gL;6%vO|A;(L;fuDgHGYo)PuC)BkgnM z;P4Lzf5S)C&Y7c(n!*4|Iz7}@>rABt3p9LW#+*4FW*D7_sT>yimG_6L{s*hACKI03 z5=XsWFZm@w`Q@Hvj^e}!9ULn7aaBGjH8=nxfZ7f-9^ z*BShi6E!Ig?i@}>qr-oQ?I)d%7Bp@R%bBi=Kit+9gF;+pG@9} z>Nn9_Sl56$6MGuoYlSPC0*9!0CE>k=Lvi~s_$$6e^|vAeH4r?eK!WxhRc+A*va-#n zY#1vTgyK46%CUV>tphVpP{mm$FC|#XR8Pf;`H!4MQhu+-zge!1Kz@Q4(flaqqiRnX zB+`S*^vK`Cz#Rz+i#gOv`wO_1J>Sc99KtP8z}lwM;1~CqE4`UA@cP3N+z+J}J+g4(z6dE7P@e9=946v6?FFFHi%wZ=aE$uCKo%X~ z=%@9n;4e&dg6Cq~fW`t(KgWqn*x(8!zYZV;huff2MFNLfCXQ~Ok!ISccw<8H`m9= zWz9>8p30eABbBGkp@CcL4k;eO%&Yapk^Y{i`tT{)D z2X(Au)``dh@vvzv%&gN{Bt&Q|Oww9`8W7hHY&3ci1%?(`iZ>4gAr*gip59JbQ+Y6z zf?1T8Leco~5da>8-?B4m^ilEr+P{`A;A`p1y_W9oYl(>TQSp=%X{-op^u6MVTdvWf zk<6*))c6o3Am}zKB^Ph{i#3mc%#d1d&Xe`XXD;Mf^5V^fKuYjeMvUfCZ6-mqHw8+F$6o}c0brn7m`s?=E0m-oRm2O0BpH|tA);mow4A4y z#ZyG!D+01PkHQfV8Y`IM$GNG@N(5vB$kEUdzS|?kN74JyWi3Myct4=I7EOdlH|U;N z%+lbC2C|;Z;@|~1h>Zin&QhvY?yp)oNj!_VlWO!9$vn#pd5Db=(IskJPAn)wG8b@Y zi^$|(>quiZJZ((QV6u&wG7(H?c6=8tB7@V__&5~}q@XAW<;GtfTGs3)P=`85<~md` zLTe-%KpkonK{7@}wd{n9QdG;m;_(RS+1RoJ-)Lgm7KSfB;Z>YuFTf{PA|;IpiAj{UM`n*6mPY7}}3FbT<;+-0~b~ z)Ms=CATOHm6_J9%F;j~10t5@*1ZqKyQAWow$TDFF8qmh6Q7vzVFinKH<--V=w?XQK zuE3&NJ_j_ne9htaNNyB85RVWGi#50W2zCbLNtCFTGn^ux8HOmbE%hJRnOnX$_i6`} z>`Gn~5^pYprI`!qUs$B1Nnnu)c*R%(egR7|+l>Z|*-rn^pz-MDs3!G&*_?`shrrnw zI45&ts6jSIDq-HLt+D+jhQ`F#Wh&+HyxLmNV)a-GgpiVYytElRPfkfk?tyie@IFau z=JtstbT*XSD_&#ZzKpuRP=Z;fss-+VLEY2_E!2s~KNut|;y1t?w$V_I`b1oj>(Q zWz^QKg-{hbWUM*W02Kjk;6<0k>kM){S|6P~!pJnnh={1xk`RLy!bh5C$p-MJCsLU+ zxtN)xR^)Njs@kU7s5RHN+>LMgDeFab zOJquka(siIsK5#fI~07Qm2Tw!iJ!H|uvgV&TE%Mmn8$=oO$7z5C-4j2NA2r)1s*jGGkz--W)9q2fS#eaGj zRYNaV4ZWNjx&oJKyL9MLAK!L}sc!5MxECj6aGt zMQa_+e5WKyV)5$uVEEYn<9z^MFvc5H{YP~cYxO`&rwP+6@Rt^T zp68?2bkq0hoN0KAt;9kz@FMO^Te>|b4X+f;!~0t2H#Rm59X!~FxA@mNd}($5?~YY_ z>IUPT^2kqzKZDb4cH3Zg@K+KgH-5<2!Dd(DuntjuheJ=>XE?M%IW;!B%WikLz`QC0QfAZ)sm@M!xEwY|HFDHcYQrVkW72#kRf&q0M*VM2Wsrh z$Z%xXv#VXUbhKhkO?6I9O}4}C%E--dX5>1d^IUtb!&Xz3o10_L1;gxgTb3;+$B|uC zlRl&-E7O*1uLk$*EPHjeqdGU;R+H^=WTa=I@rKy4osL|WBg>KDwC7|)psbpVtRd)T z_92d3rz2_yk7Mj6cQ&p8)om=B@ zR=XVbAz6+pys8tP$H;p^0`-JSIc}QQ(STi3|K21H8L;muwcL;{*V5KRIF4fM^-FwH^4JuTU8v#^Vu4kc34kK1!HXJLl*(cP58Idmp{l~r6ePM^tbZ6?0VDnirBi+GqW8qVb26u;X*UpkwK z<8Bv*;F+cFDzC$ft?ZfS^1bJbOlxpfk;wmJpWF5Zihh*BmH-|c+Urk;oBrN{+S)Q4 zku&~@1nP~&CZ7@tZDh$B`8YR{a8?@Kh9V= z&1sZRxt3m3I~8x9m;+eICL>gWH&aXiUIJKzFnu1;etDKwIO10-dR(tQ`AaE571Jb2 z8Tb?+i1)Db9e3J1qmu~#`2^zn@?5l)M<*3N#M5seiJwUmT=r`B(&_{<1$NXsa@xq# z*idirFB3cN&;j<|dm*p7&nnJGuzCWwW|Ss=swxd{*r1(yaRTAPh5<<^P6izOG{cP( z4>u^yTqL|}%+Ird%iRnuiSqVCs1f}joChZ{jp!&Offpwz1cPhn10q z&r3fI7p#YWN8TK~H$y@z3hhtjCmudv^gC4a>3mNFJ`Zorkb-nUXDqcrHT|!7-;IwXuvkN&(J1?ylYw}En$<$-3JxWxtA)1TEd z#KRkysO{VGZf^m<)&4mc@9FJ2^z(!ClWuf|)eL>L&);?nj!OOC&woV&7+1r<_$WEH z|NZe(8!W3M`u8s>k~E&xbwibZ{)yJ0JDYr1(R?NU~A?QX{KoP z(ejiEd$cV|55yR4n&$A$$2CW6YuO`h5kxdZ8z#G)b+~wGPq4)k#T4E7HiW&8Es5ea z(LMYNL2OevU6u;m%>!3Ud48TPp=-E3-Ii<1Ot)v^c^**w{+A!MwXXTE$QEu3CD}rw zwPh2_C#zM_{6$UAyA84tvH?^;6@( zJ)891Us^c5`^B@Tg}bZjvv*85)4Tb2uP1vrF8%43o1*%~J@xqX6#K;&-I<_eB0*!Yy;%J^>|X*&5!wPoOqx!>kh<|I@)NAF+zmmzn4%Ql_}|7qtv zU3%Yp>+N^G*7X6~S8^XqDc6w9zt>890EI5ZMsi-u}@_0xvgOnM_sTc7u1?L1XR zNzzWRmDDd6f$O#B;@uc*GU#S78HpwD{^5(q5A|QVrmDx1?dLyn z=Cjztw=Ri(v1^4jG>nZImD6RzJI?NFvsR6L;DysmH|%_F;_b&D`n)*uY}dCg+z|O< zY3z=#qJDkrnirfew4TYh_0Wc2>rZ@2$FOcyVE`JC9uQDh1>b%)&=iK|~@}dum?>aku(B@SazEhMq z>FQ?>Rqed@$vLN=cF$b6`SwjyEh$4MTzO`j{<1w6|8xGzVGlNsxiYup`=hfzYuGfV z>50`-F7J8o6bGEsgK$o}gmW@EXz3hgpPP@Oa7tpAIzN> zHCQSOd*j8T!I7hnh3+n&Y`!Qoe`)HdFUHo_Jh}NJ&5`=gns2|L&$j2PZg}p3-J?Ff zDgW21;+^{+EcofY(FfO6t~|Bl)|C7{+a@QbXMK0}x~VsAs$RUzc7rKnoww(aaZf$l z@42^UMWsEtcjMQW<&Q1a-MiEh`r)@<9(?e-eQ!LMbJ@>He;Hw_Ti5mIk&oAF9?w{F zZ@j0liXD{F zq%Lj6L{G8)wxg^Pg`{E^07+KKkcHKkpl~ z_fXcpF1AYHtl+9_a8)}B*XRFB&Pu$MjqH+}CA=1QRnt}11Xl$|WgDyFa8<+qn5*iP zb7N;7+t{u{a_{B)bw%3s&uzMB(DD@@%#L07$^5FXjQ8bFJv?(<>ijo;92>Ry+oMN0OnRbP)z2;0_j!fdh( zwLflXns@xC%TNgRtiSciEcHL&)SC`di-cKoS z_e*_X*4+uZkMpe~x9b)y{<_~WU2*riV^K+AKz1n44t$P^WYq#pXGWz4E3-GbG zQJ!p45?F(QS7Onx|LoUee;YHQ&#PYccGfi0h9h@c zO1}GQ{vBoGH{JY5^Z13^iVbg_>G$6CO&7iJ7hl1u*IVEI_K|P0cRxL|@SVH%j5uzc zzoo~mH+y|kzwUa~$un73d3U_FXimc7!Zqu1;*R>x*F89I@}`^baSwj0d+6CK8V8R~M}oll%2Hvpz&w zJH$#_9cPT;z)zEDx^?D7`-GSKUwrlZTjvhD&F;Bn_``3c+PeD_#mL&Q1QT}Jny_<_ z&+^(hw}?Ad&mBE=z?KjDMgNlgzNzBs87Ft!%7t?)u@&12cjWKLTR-ZLJ2$_*dtutu zux#$wDpf}Y$2QhhWGhf{IJTUB#j#O`q5cA{9cN#%#Af7 z^|zJ$aC%PD=cU6^U(eqYdiI%5QtdbOd3JgE)|RAMcZ?WZ`rxkHrf&bB;h_Wj|Ji(R ziT8(*pXRMP@_txX_cJ$dx1|0QT7G!ybEzMUd+FhZk8ca#rMY?P@dFo+pZ3kwW43?& z?U!GCus$(!_<^a{eO1wCUGnbL@mHR>%FyeZ6BGWqap#d!(Km0N@Kn#2F7sZUys&Ot zkAKF0Rq@)qXM6uTv)6OGHa;@op62SQ1-m9a_v0rwO`rPiHo351@SN}7y7QIQ>Gi+t zzB>BkY4^vs?@D>}sX>tuu1l|d`}Sv>ms5jj95N!>~`;q-_{;E_*uhE z)2^7d;;KzMdXCkc_rnV}%`-LLoc(#~;I2=7b%e9xwgI9Ec%#qUNQ zbAIP}zUY;gyMEGqSiAq_pHtpTy!eJYOg~2t7`^A@kMG~Us^}rZ++x?<(G&KL`E0`H z`xZ67Vag1ti*K_^0>6+kLi+@p13-1fcwyumtFnzrZ=`F z-5EY}`&YZ}Tt9zJ*afK%En2{OU9;z#xMlx{ThsS}i(a_kwqpC>>)!cb;fUAS%BtcQ zpTFqo1Koa#@NPPI(}=s|(HH#c-geE2$lD_K4=Fdkc4&lcwcY^#{iW)^)v#n)dHo}Z|-^jbJO47^WHb^tiAiax5r+QynI1g_xB$;@xc?< zPU=&>=lOTLP3YU@ix+Qwv2;(P%@TFm@M`7Nu_aga9CO8;TW8w(zr_}uTK33i8w_23 zh|q5RYQwXM&t&wy@cM7Qn-`z*%d(Fz>hjhuusL2O+OXB5OQ?(T}Sth(eC>3 zmf9=ly>5M{sABK>qaRv}(gxhIe&UqLVJ9^yKVNY9<+l0@znx*b{->3%ZP|A!Y0Jug zz7+kf@&1as$@>d0zi})ZS6mY{U|`K{TTZ^LZymSm$F;Xc6~~0EzH#m6Q|>UZ?qFb8_F_4L|?m zmy=7bO$-0QaH8SiZWFG*bb-lx^?{wa+vlY|F)8BHs+ptWwq9Zxb;8gi{l{nR;}+RR z4DyCP^=ZS1U)PzU-}{@%ap_mDALx2|!X>Mo$Qm^JrpHb{ydreWvR5j+NnhBGJha3$ z^L(kRDJJ5jw_>(_Km383>HAU#fBfUR_0LY4dg}Uyt7`AaEq&!5&5!-1+tR9mU+&sA zFjK#{N7d6K66z9He--*<%0n;Y@B8q_&sN;~!S34{vkpvnVqqV1|3#t0CvRMMUQvF` z!~6E_Et~h$jbnaoX-;anA=XxNYK(bykEd?vopdz+lR=+6^xfEJQ(k!^y`{8&^4Pv} z&ii!gm$w|d_WC13J&&{wXw*l2u_)=WZL1FssJ!p)3r1|%xyZ4vx>LvEO4mzFd1G>9x}d6Q92Bi<09%NG{KY&=pU)pZci& z(_6PZZy)$;#1rSwe50)A&NqGquU9BPlS1;@tHWKhkhwPP~)e#r&-mr7sUDgSMY zq&+qB+5@`xnry8X2k{8AFSjk-F{WkopFVt54$XFEwxla_x1j4`zGl2ju`X>fz7a_8 zu5WWuj4mAn55(AJ)vlIUVwv~h9cMnQXOg z7Z0r&v+IfVDNFycByPz2CvF?it>=@k4Qu|)_5W3O-BD2_dzYCZBSE5o81}8Xd;6T9fdN?An z;KciKKNx=!5EO*NMNa)RUh}D~7hy}HRgnQ6$Y{YJE^_xyt#5}2D667}h(Qf&uPJp* zRg)6YWKE};Z^dT=4vpT}RTBdJ0euXAS&a+!L;79I{{2Cl6M7|O2$mNXlt~-#w-V`L zq6~;=G2Z3Ml#N$oXOt`S?$QXBRv38{Jr%CZ>0qn9;+W?|_`qwK;BE46ua(9JLU{4p zZ6}44-rlrjW9}BFs-pLb%GW@;q@H~{bm?=l#-7Yc6oe$QxPiAlsXvFZTYpbTb0K9> zwD%){kqU)=EVQ_3HgiHYV5-)pK;~1++3n#_q5k=Emzm_~N^0lm+ByQ+s^;As4CS>iEQSF=!rGN5qM021%KZ#*g7N#Boz zY$i(c`waX$j3xjt>C)e#vT_3KAj1OHQiiW8%a5KEBj^ple>bK?L6Q!@!3^cT3=C#F z51RiY##FkV$K99$e$1|NDH9o<_F8jsan((t3x=0o-s8rnb&@cRjG|`4?$NgL9Q`dl z#0aU=CleYhfmJymcdb0&xk_{!sfM-M2%~j$gQDb{ogo)19BmB2^hJ_zJ=B=);BaMz z^kxHYa12yA$t$9>$Q_aE#z8!}Te)%vjfbQ*)X5 zx=J%0x1zMz`x?G`6(!pgz=;sK9FO~{t_fV}(d?aFh(=9nepq_V68EX%xHS>!qm!## zbGo-=y9ADL;7k|TA`5f!)-Z;5#QW1BRqi>$m`XnN4;q4dIUVi7*Ty_!$eKg?lm=y8 zM$Jfg57;^n$ksW(NE>Wulj%TUfWZz&z9uf@8|}qf22(~iu7Z!KYgNI`mdFf8UK#5< zX++i8ZdwGrdW(1c&>zJKT-xwv}l`&8giJhZ3KW6u)(gBK9x1;qB{ z5$l7i1?3SVzyQ!YXoK>|feZHQ6a3^-{d@{fkTo2rP~gU_Zx>i_D#B18T}Ithpm#K{ zv?JEv?4N0KiM&R&eWg`*t97cCbIa51oeqb>l^j~F4f{|lYl&CJ53)8c5%XtC6)Opv zSKjjK9kW`__SLq?Bne=dcwg?;?3OR%|o zY}{BuqDy7w<;ClL+Z343j-TIDg)C|d3=?X$JU+TcY)>4L`{YIIUFog$H`fO@HETOp zYh#*vAoG`15orSWQF|>uQ}?J&cdwiP9*BD1+ID%(Fxq3Lp#PC4p?FRO%X-tJ{P`RA zd$xi}(C4^G*q^Oe)Rrt0XLzcGm%DYQ105-2q)kUMaaTGA%Y#*|uP0=^3$9Qe6fQp} zvp0nq>P~s|QgSDY0uA*N!zpKylUST$h=M17g_6BMBP--knsuN=1Mqw!~0X^u#$vm#ubeJ)mL!gcy~0HJ2O=DVZuR43k1D_wmPWRd6LFV81^ znmRudUnpcnzh1k^?e$b_t%ooEs)$e#36EN?6>yZ1=GxI@c8tAAJ5&Olq!V_(yM=rXIS*}IFHc~?SY+5Ui~M!P%U#uTwKf-CKq(6SfC|p?E*jYd6MAe5 zKX4JZ zIZ#fBV*2*iZP*Wk1we-VEekiOZhu+0xxOykzm~_pF5z%+#TEkt+K4Y2i^zTxH22UN z%Rdb$O#)RpnJT155+$r5V_prri zFxBdUT944b5_Nn;Iz+G{){=r<{si$HLJpVj4=41syLu_!iuFQSrds-(gGJw1nn5K# zPixt5;fYc|ys{UGrq8Tsu;%Q&-U{fmlk(3N;p%o*Dc&_7ddLU6SmdzQ?zARumQA^? zTsJOeSL|#j?315mOU&CZdt+WiT$%h4u^ss`EtBaK-^Ht`&bTK%zmiUCS*np@rd#@%OG#~PJW+Ll|6 z8;@R&T+mVj3W}n}7Ea$R+kI7TKiQmw^j{oY)R zGqu+f%j=c1E+qGj4~AVol$sVn@R|dDR*SwyD*h0R{zT*dPKNr)f%rCy;m#`#g~uq= zl4EI4%ojX{_p*cwftd*qEf_FCBm#7@w6Zip)&9Bz08U?U-hv`M=w%%uktHB#DIl;9 zb`}TV27;YFpbKapv_Y_w|7%{rpY-nuAa9~Co)Ht71R&!9WbB~^#|HyB9UyaXIw*uv z@Xt<%25&nTTMsa00zOyJ-PhLDgU`X!36MSP0161v3oz1s6PvZ%j}~9p4<7r1v2Ap; z867i5$2Px&p7|K*eppcV(f90XXkPNTp)UlzImi3{kX(Kx;)DSu7B zr+m+GN*afcD{V%KHgBMs&O074IcN7&QOd`UWsNK_KgRQNqq`L55a=W0Nawyj`a=e^W!?Kf-T$R8l%!IXp@crl({gCg8?F6I8LzvGtlq zobg<8rD?c>vrEBU&sJG1?0g6}r!-22Ov|32sY+{OB0A`}3q_z(f!DMw_nDklbA6l8 zRytdeq|mXEwXIdk>{O14&b*|aC39Q3sna;=SEaGNv3s#AE;5imu(qyVdHIMI^TC+h zVW-B+Ct|jH+X{eH<1T*wtaJ5yW<;f^{(+fZ9yLIcPpC9u_ z)dYs39Tk?~jm)h^$GaLylkYD2&@9Z0ruZJy_&iv};&5@M?BnjWcLc%n=OoH@fkjNs zsIjq&PPVa9y%{I9bsB?>nX`S43NZOC%i&kZ?A-3iHE+%iOEY#msjaHiB>yzc>ok6_ zs^gyT&E^Itr}IzsJ;(_CbUWcFN=yJniLqbrC;ZdE^+mDzgZk~8vM>vb#(^rmjlEr^m%i>|enK2nZ$|t&9OwX6+w>n1A=+`Y(9bftBegE$5jq(d>&Ca8e z|Lv+)!nVPh@1EkIP{7JI9}`1!2+^CR^Fw3;^qP^n(xw;Mqw3DJ71fVWYz1IuH_A|; z%#m+JEvUWH3wc~RGWm|5VX(srzUgNE&_!d;& zGN(O9rJJj;TWS<{VWq`GQJvxL_>W!kqU!ErUz?4l6me(oIA3kAZNp&;pYIwz$Z=1aHbDmh8Bv&k6f22y&E{u>EzqU)WlZFS&{^18!6*CmHxP z%Z4be6sp#q%st~P%zG0UzOpPA-lPOyd0tNbY@J5B&j#{(E>m@O$<}6o3oB1;I^{=R0qWgwsT=TpxM&yu>+Fh!JU*oEubRG9C1Gf1r% zUo38jkk^vc>m^RdmOdM_Vc!HxRJ^p@qp{~ao%*ce_NpH@K73_F8#}fp3|IKA&++oP zlupT6e#N?i^_O-HxsYZ?yc<59yY)>^70oRu(;-+o%vuMM%nW#^CjXSxKDQM&i-5PHzs_o(e>mA5{q~lbjYF?ge9Y+=U8%<&{<{g|L)M9wZvb9E zgjYatpV9sY62`yi8)UOt`)n2+A3`Po$T$EQ{T-o20#b*36haCAC85>TQ2WAW6?6^w z?Y_L0_b<>{U2redS2~N{`}ddVEY3`r9^vGp@njjK8%!!AC!5Ko>Ro=v2K+%c)@0$Q zkH${aKvhed{nPVf8?!4u4UcbUvQ2H*FFG0;X4O{OM7WX z_1SFOf=W1<^`wU9vOLL?vc{lCL93#Hr(}+=rueGI>SL6N5mRmO`y$T_7gjsIdEE8k znIDFW2B65wEZMyX%S((l<*KjQ!<=xvDWJ}=XH>@jsb)G#@V<>@>Zq~o-21K+`oEMX6~8HjB7nou1oLI@O}bgY!;4_dqaHljEc|Ot=pO(Qh#R z{Ur%5jBW~|oBx}j|1a^WL3G1bDc&aLzNqSH-%wwlGu<`L5H4x1$a{BhQExL&wW_^S zT{>00w@PgAUU_@;QVg^>f#1|1$QWn%$yi&vrr$# zWX~wgv*IhnVL@CItW-*$Ju!VRy`^!TiRi3tRAoeL8H`z+&9KLhN@RA@poTjA{7L4| ziXZv(lvEuAJSS5uP~}P=rj#iOPqZKD*H)A36R@h2ltkd?w;Zp$;<`5QVPa!qUqXyxTP+g&gzEC8J>{UXk<7aIXwQ;ZbT`O)7WhDFPTC<>gzRekJ6H zNc2TGl=z$3UC|t?yN7LgfKRmGouc~25m=!e8)_R)rCUzz*t@v4yt;Tz(&{@$;1A*I z-`utW5)3c`j^4KN1yn#!0REo>m0$GzqZ#n80yX;%0l2fpnK6SuIxV8lJvqKuS3=l=MVWcBWj+?(f$q6K~st;K-{C4$Kkf!a?MXv#~-OPn5igbaEn z5ulQ2cdx8mXm=utx)}noe(M8!IaW)K-A=J9O0wjtlNxc7EPR^uaZ_T;YFc2&*8Spa6wDWtZmrQ(E^;dSf4DBV z#fA_54PX6y7zOw^zcPJ0FLO#_#|gXOJIkrt4+vgnAzJ`sV=l5DK-T^(jQd}1iP1JR z*xwQ(4+x0zDu^hH@xm3s2k4vtxV|uT=I@z0rgmoO&^AL_Dj|*d;ko1U_fD%Q&!mrpK-Fk1IdGJ zWhRT>md7zT^DqKCu+(=}5)iypDmr>z3y;srLGU7GcJafc$v3!SwPjXst(0<@XHlhiqERMpOBA7&33CA=juXw?z;TE zE2}FJsqw{AEAJ-LCn=b*;ZR&_*~s5XxK zvP(UN>OssAwYQ-~Nz?4flMcNJL;bwlaVf7ZZq!yV(#`~IHRxrBwZh~i-@CMGja<76 z24beb$v3t?`6B+=3J^@id`D=$SH-vhny*S03{Lo+fC2oda&2N~-7&KXQuALoZ(Odn ziRH(5SZ(Typ{%)QRmbYeSPdYDzv%#a1deS8D!aA_SfDsrsPH);J%~MmD>v#4`?iN|MV$`Ju0m zdlseTaXsagP3eeoQA$tzPzTCYsli~N)L;3g=gxF*;utE(?S%eSxs*P4|BHdeFQJJq z%A6>Oc`+B_q|YTNq#3gpe>7n@%3ki;Ky0Zsqn=^GqdvE+PdUkdM%VOS)3n@fN=vSq zFKhx9g4hb1WvuUJuM!mxm|gBYw`?_#IU4s#;xgWRT5>DfohI+j1jEcU)@dC)-7qhQ z%kEF`+U9bU7&D||$?>}m!QUZlG~7tG@)Bm9&+%hK icF~$l7!ZGY?^C + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/portable-net45+wp8+wpa81+netcore45+monoandroid1+xamarin.ios10/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 zcmeHwdwg6~wf{P2&N=hQqnSt2S6ZgDDbr*U`h>QY(zFe2q>s>~Erm*$CX;k%GAEsx z^g$`4QV^sf)dGSjm4}LgA_DRj6e~rzBFIlrC>FhVQTTxhmxl_!?^^qunMu-exqj{+ z_x?V2%Iv+@+H0@9_S$Q${WvGX@-wa=4-pyoe)u8LJ;?d9K+=y+22fpo%zfo_r~kF(O$bV*-%y%nB=f-X(C#t zdFa8{Ke5{F?YE>)DA7uYdVujM?D)?jkK(%@U!n>r>q>4$u>A7*EmGh;T^h!<;36jF z{|dPSG76t3E+tyYh5bY=CKrZ$9wsUUYTqS9)kCU25{%|W7cw8;Euz?05F zf;t&11xO%du$N0tn@Ix%!@lH`Ya$?SOlsf z>lGiCO(&D8Pa@iODv@8Xg`_1)G*AGKT54EytN)nKpY#2PM|hT4jbFPX`^uV|{vmi|S@%R@7`s*bBRv)(3V7;EG8$1|HVoig-IJ|B zBVMW-*$B`((ZHys@Kg^?!N^b<)OWxujDS_*^~5Scl7k&;rTTe{^?73;sS8-%886j> z{%Gw+evEdY;i<~^7caH+^GBhfJsL^vN{A6@l7hvPYWZ}w47$upL8@qm@1?xLA-Vh5C+6ZOZ9#f%(WLlHX{b> z4%Cl`As$*;NEjGktg5PGR&2`}O^3_~g~3b^eiMtMB4EY!(Y2X?=D;Q1I5e3F>JD7$ zi|eCcePhlq1H)RY_J;GzQK%0_KCs|-RT(7Ok=+J^D*M+xS1JR5}Zk-D*y zW%0n>J=r-x#bEMQt*(e-a9c|^gsG~HGNPFBFG`sDfF6UzTlIPs>_&!Jr7++uHTGN{ zDcqz8I>T)ganYY(BA{V;;KgVz*@BjM*o1MwxEvjFl;Y0pdE8ECJG272vi1o|tMSo_ zM?7f7%N5F<#@a1)WHdyamNwbr9b;*mTs_;r#VWV;wX87 z6^H$^HCrP;$No^_t@7-_gpIwyt9(adflly4>0bpm4r0>%Ts^XrJJVx`8|+Iv7I3HR zLsEe4Hv-|UJBy%QANr*5Vl0O2lKC~QJe6k*6J@T9~k9d_84=a@8L$Wy3<`)j}C>|3$ zN`@JU$?zjPxd-;B70d=bb3SOkRsx~s3+munR!0lxq7G>Xbufn2!FfR)1!(9Lo(4Kh z;gC681?*6t;vS0T5K1b{AtLDDImDSFKZinj6rX}C1!~!+Iw6B!bS@)-Pf36FTInWs zIx;AI9kTcddW@A3Z_s0Ba6Z|JPgJO*_|(mCrm?jl{ewy__|TtD5gs%8EBF_SvPUS{ z$+&ktb|%vN3Nlx%57_2GX;$rg6hMXeAHxX67qLrJ>yQ-SMq^!s6ukA>`5DJTHh&&S5lsIRXIoIehQnvxL3&O(hs2eRjZ z)c}(m!ZyP4#@bQ$f>dI{d0p0_@d>reil_nm_bS8IvA?e6vSH@SMwL_My}Q1>pP+>U5TDO8~yHNK%q+N#>l>{P&Yy9I4!9PTi%+m zKV%6Zn^6^nCQ0GGh3?@+ODL1l76v{&82bGvoJ!JZK)__sSG9OrRhtNwk>*WkO^DcFy(_tkK|5%l4p_fPu zR#R8ILiap{{?u?C99J8vy33=+8rur4DD&8)Tq`_mM3*`)8j*Z4VyNQf9>a7Rn4l7f zl^0{k5p%pQ^IAJTqVh4ZEK8prK|6Tx@d~FP3q5awM%MD&m1}ZN4eIq;ZB^LRYr-1&c+j`_2T_tN{CCP#ht!#{!+o9Uou&hJq2hyntZ z74xw+5X_WHO1w%X#_X?wDrAUON<+F#RX@n|GXI>5xk{nb?rfV2#h~u^IY#`%VuX!J z2pA0$4LL0ht5IjD^Fb4zib{5bdXE_&<&@)Noq}m!z%-?PeGmICAAKzd$P+ZTm6cr{ zGK%Mjbp=A5j-xw&qjbW0_!fkR;(~g-ME2MNXwN2A=BWuAA&*#?$KD03{b?j&v+i`* z-GwLyJj#)khOD~d;P`AbusTssj@5%h&IsLS<8W@xKm>rvSRfNCdI}O+#S((=ZnUqz z9u?*XRfvA>q?h=f28e4$U#XN04J-2o?o6JsvUR zLDS};#{H%fr+Ca}Vaz~xqFxQotUCk36%VdI4E7k@LJW>)dBz+gKFV2jPe41L4e_nm zMcl=BPke+2O5v$=Ce2ZiUB~(`l|H_rhF$QgLqmq`#JBm>eX~2(8oJ^xHCA_S^^OU1D>Gi2$Np|NfY1LLUV6-W8lfO?-|!#-k|2$Dh4)W zaR3ht@a6*>TLJi*%Ftt%0>6{Zz&Yy|c0Ta>L0cz*i+4VPz|QA5=E^%CDXhV!39$+X zJxmX_TstA6frBu1Oanle3T-NM7tm%5Gi;SR^yN+i9FMr6$G!{#)~?d)D>8TB`Xciv zlI$Mf&gJVkgJXy#>$A!3XVp$;j$j58wrc0aAc@dGO?#P^)g*H*?T08X4yf8|+pX5Bk z{l<7H4S0BPf%-AZ;XU>>43%d79d_Z#LRByf6$h~jQDu?5@iM3+`(;qr*CD~#!b9)@ zf*AQR#c|z)^`oxD(!E8bB1bD|AvgA9C7EhZ{<_@$3YhhO5;_Q2Fw%vnQPm=gWq*~c zn^0ZiMRn)kYOgvcUKP6@RK{jr+D&^u%5fYO4RaSGbdQa!Ze;C$MD=w{?MV273AaGt zt;-*Wj>Q@FJE(*|#BNoVaW{iwVz+a4?F9``w|l|(J)qPDBV$$7bVwv;v1!l&^crL( zSpjR*3@i41W?_w<5sck|5(a6-?vz5UH4@ca#c7yuabk+_~z$lKIa7toXwmoO@Zt_?`meqi}Tj z#p8$&cdrSqA@(4{Jk%Xz*iM6eQ^$IoH4z? zUEhSJ5&LGOC7FQXUJ7S|rc*5Q#XWx2^aBh+EovFdLQ~9ZfFIPsuxz9siCk-i zt)Nwpg{<_@c1MUP3&Cy{_6EJG>Z~Akq_F>aEGKBwHBA zRmRlf%Hb{`bo*>Zb3BL75{?u>4$9eYVHmhAU=qtlRH>`ITLqMOMW!BNX7(acVFZ51 z9#syN>xSvE5liaW?wBXrnZ%74<`s@mZ-8u)8#_4C6on6mgV*7}cPO*a9>WVB+3zI| z1oG~0slZTf*ys{*KxFu*c|aXU;o*^f4SPRy#PLVL0gs`=P`P0#jA`e2ENuPcLXBqx zpHh6c%xsw2Fk|YBX>%B3$|KuR*j-G-zHB#gA4V{-HJ3@HyR%HO2cC7S7r51}G<$)1 z?mThH>gL6$TMBq8_Jb1__ShQ$^GC268?E~#lS<${U{6&AHsFrRY-b5+HK6*tni5L+#}w}Lr8FX=m= z8AFvpmT-2E>6?*;s5iLZ4ADhMp_x#7d5ETk_M6AjI;0`G5a}4YI>fECFpsMO>10|Q zo*iC7>k*lty)bjTDtxBzWcmp(?>P7ufFDE0MY!#<2+O%a(jActD{AQ$q#^ocg!_Fv z!dmiHvX-KipD!6t(XaZn1EQY11Il7+NNEi?tTb1hibB zUO)@Lu}vt?2ShZE)=Ax^LOG6-R065Lh?*eP;8`s9{&i`0oCDnlsEuN@Tk3ud=ybdT zaH&9VInd_>s?b}s0P6PAE^wI)XaUvIRZ`aoXd~4@TinAL`ZUN{Pd5nVCP01A_iZBQ zcKs5#`84{WKwop9pO6P~z5)9%QFjotb*5(&(oPR+Y_DggV3rA{&A|le6k{g>{RPHn zY0bcAjL#wcyrf^0^ctko=n>;)jQz#n&yoJh_&(Zx!TdSWv#fWKZn6H3^lC}JV1_h} z-nQzHs@j>}Lhakua^SD@ej4d*lK$SiPn$-^`#!A&X`b&bZ2~PvS)&_#?;?E|=>%M* zTe?P-{t@3qHnW(S3fVeA)jQeF9YlJ_{NyYt$0p^t*w5s68lYuw;@aNH3MJ zGas^Cuj;f{JqrOnEzkk&Ezc5oL;z7;_3$ZpL?jP&XQKT2(jdU~rT^ zf>t|}PYJ|VpoD1qws9XQzv}%lkeM=<6hS-C z&e@F80n|MXNU!0RyL}Iu&%mw%4)mD$9H6j32mH^Nhp-aOaq8YQUk23ZK!)`PK%aD= zQP#^8rd19!8FgVgQ=p4|Gp*MVDN?FVq>j*LRVVWvp-b}6pAkj=O`rq*MzkAAHM|VM z3V3`YX`Vp4eakI|+620o-hw7Z(#;OUqa8^<7U+PF$1sv!bs)ua@^Q?QHTWsi&C5e$ zv{7`Of`sQ7x+f3SXk(}vCw|DHv3AGOi4Mg5RnsW~DScMc3I}3+R?}L6lqL|-1X9`^ zN0&L2n)hYIzArjZ*!u@S*EtYtcRbzXK&;*Iben=ipU2Q$0`Z7uXvfeKdFUi9O7STy zwbJLYloIG-AM5j28W3o=ug1&JmsB0bzEnGw-fSpi1m3aZ4-!l zUyF8EiFh}}c(i-#7B;OKRR0RD&TU-Rat~C`wU(uEnLAPkl zG+U&;%IEh7^ksB~KnFCIdKq1phaS~d&^PnYE!t^xXCAs6Ywn%62H`l!QlCyg%tOy< z>*$$0^pbW49daO+dOf|HhyI{_iaa>SGnYxe*R`{#JP&Kbdo?K6O!_KznJezZ!K9^OhMgd9y#Rchh4yc`|gKf1bXHzR6p1 zftKsNbgN9^#dHO@Y^I1z;l;!@xS3`Ow2Q9ycj=qyshQkPMd2K^IsN@ORBz?zQK{Q2 zalW7aZ=SMW@27v{p>y>uR3>J@Tn6-QG+sfzhy90W2Tc}em+u$;eticWpQpTBKaZO7 z(3Sf6v_21gMc+kR1me}{>-t5sTcEuZ4cw|wwujSj-XxC8i1XoM{SHG4fu7o&`iFi! zH7Q8Oej_axNR9nQS|iYIXz5)2ChE#V1Nzr#YaZ&?Z=s6?y4cqcIE1s+<*Lqia-d)T z7G16Cz{T=>n{LlT6`t?XPxH`d&mHu#f_ysyOSK=+9|hXwyChHp=&w%Qm8iRi{^r!( zfVz9gIFU#Dihn{$%yTczbD&v(?xW2D?e;AzY4F@n=LvK%b(i$(_tTvMJ*u4x=mB~z z56$pANQQ)peROBZLeE3gA<%AmwB$6;59!i8l=S?FzMF^oJU^lP1XA|-82xAv^s_uP z;CYOGtstLX`a1TlhXuOIS6O-=AfKF*_fmsEOC6|5pl>=*yFjDn^4RxMR-k=+a79$S zsPtmbLAu$2zFay0=sN-((AcXUrw0UjRQq1(WuC|BB?mgU*2{rHr{t%|v+GQaMr(M3pgQsv>8kLIwah=VE* z#}sqeEA*V|(yvCvQhlkYwz$j^dPrdu{eIz~q*di_3C(cK?Z6w(=oBSmJPzh@lr<`( zcnU2TrqrmA7UNxA9j)JD8H)Ql8oiRdSk8hxO19$O|MOBkEn|5pKT@6k6=e^-kJKm{ zuTF|)sGNp_XQ^~)<#Ad)8)7Y$mUF7+w79HhO<~lmaapI)L+Cw&Fojll+9j07N~+5L z9EX3dm9ks5I-Ey~WM+(K5T;4Nf#3eBOp2CXzIq&nRSjOtg>490LR%TQ6_%5aBpP`wP6Q1wz# zp+h#N=T-(iknfT4ZeN4(1sPmCYk(yg%7-zoJP!zerK_)0^0<_h9*|z1Kx)vhkZSa* za2t*<&>y{RfyP5`2u}@%Z`0visMRPWmvEfwr0l0A!tcj<@GZq{ZaMC%!n73U!b+U+ z=Fu;RSA*vzJ&d$pe^t^yOZuLqn#Op)q(MnXOFBW)DM-f}(g<20nl8S9YF zN8g+#q_!I68QLvW7W}1=(k297#O=g1ls9W%rgx1-S{VF?QB8bquO>d>Rm+KR5?XcR z#*a_UlW@DW4EKF};+up!t~Ox!j%yd48JuYD(k>6ynU`wU244papYdu(uue;WXfeixlAZ8)s6|BZC;}-40f4c)A~dG z<}KRgp+j^F@tN)#jb+{p`XxwN^38&uh7rw2?|eVT@{hsUWnr*JTQ9d{>*dC5J@HM* zdg2?i^>UxK9+W46hR@sUiBIzDiO=QhiO=KfiBIgE;IkAoe12XpJ@$axa;;Rjl?r7K z_;din`Y#o3rNXULxb=vBa^TYs8s<|fd`g9XDe-AILVUW65Z~8*PrE*JkNG|A=Fkt# zJ;HMjeJgax+~<_<4*d!E`$GNNb-;|#_R-y;8tqo8y_3d=S6dHIJiJtU6#DGbo&dhh zJgBVz6{a4_0x={3UgVU#I7_^TP9KAMFkwupXt$!Qocnd|2b! zTcyIG?aP`e=<_a4-~89veL$1E@PUaH*|UXJoZ;f1tExb2~5!fEeo;Bble zE#dH%w0%$eUHA#Frn7{5X>R1NXnS&Gv~MqH*7^LvpXIxSdLv)g*{YMi2*y&Q{hj!{ z#N~^iv8|px!0^qaq46Hw(0CVbXna3uXna388hrZo2}tMDd)k4>)xJx$!;$NJ(|}3( z=1A@LFgxG$HR|&!@AsXiuc>^*SE~8_&mny%{IYL~o~!JFP42IJ9Ts?hrO$t<_Dtmn z|7PGHr%ScpS62BW8tbhZaT{t=umsNnQ$NpGqs!Hf)qq*l^sSZE}DSkm80N)g6K zCEXwSzOl!*KXSiu7404w28V}7a_#R&arvgvoEp`fzG0Z=40E=5s@ZFvXMV=K-F(!1 z-+akx^WNZn+WR-}F}_W{3w<~GZui~g`>F4bzBheK{9FA4ejTfr2lHQz6sIi@Uv;ZA zSh5c5oQC^v9k<@R));sd&qOpS!@m(&bw=XWcQkHy$71zSYtLxhBaXp4CSxfI%&}OF zCIaHC(r)7-qz@S1K|0sOLwmZ+Jb-j9KY*e;EEDO2mLKVplK#r#H-djFsiOQhi|G}m z!mGB5QsG;@1rEh+6W*b1e0I#8;IGF4b2517v;eo3{N8Cj(#3cxtm7&2G|-#|57(&$ zsRrMjh4Lz-8l4WVI<1v73Emna#3z9Hw50p!Bw(&Ys?#;-L8EJt>hx9gpwab`ehraA zM|9%!CiJG$cWDXI+o>7pU5FhT-HlYIpWq2!0OS7`BY+n>MwwA_zIlc@V1CZrXMWkd z$-K?{7xNe9@6ErOwbndqk=1TxtO4sG>v8L8>s;?XZ=Y|g?qsX z%aa|)PKWn&g^xyea`h10FOGn_S(*)QyWbq%_DtV!+;d03eZFKk-8`I#hRQM<&jp9# zu81(s2dj#}Mxyxg2bRXJ4Lei$81f5T4VXt??ZC%6^;2oA)K7Qd6P*0}R4($~<>Wtb z@_U{9ekXqrIrDvxs)hcC4*thZ{u3wvsgoac@+Y1A=T80$C&$a3!sl5h{}poP|0{?8 z^A7$+Cx6Mw4?Fqqocwhs#|!hq?;R&!sVTjj=H#tTzS_yxI{9WN&pLU(lW%qM?M}V} zc|HBnc$yBH|Bmm=_`Zqn^K`xS8+_lv_dUrC-+L7C{RZFHP+w2y`&zVv<_dh<@cj)% z{jFNme;=j&eSmZLX7I((=PkE8`+Jh}X-T3d(Q0?)8kTR_(z`6xy)oC&+0#R-l0Av- zi|pRsM7r}xG;UQf-PzMl}OWA1%)YYSkdEBC&L^ey!P1}+k{ki1YRBq$S4d;O72&l$% z=c;73zb8j)lZj1@ie;e)$r(7MKiyGWoKDS)dXkBBf8P-XLd%ocY@$24Fp*6jp}Ij; znAk#^0CQ;8nCyA?F4jw9-g=`pJ-5?fN;GIE!;b$d3K>}^=ppU$OvlcYfOCsXcJ zDoDC>2pZO=(w+9!Y(sOpuOFu28g3gkrTcrS%`uBLiJtys+xEUBwYjQnN#N&3V1F5x z6Potf>0~;m_&1Bvwhz$+wI`K5QagUB#Ia3srl6rChrjG`%&ch(SS^Kr^`MJId0I!= zl<4eiACAo=d+jaBBUG$Pq_WB3^aTtJmIYHKa!jZ0WUgKLRI+oJ|0Z*b`ZE~_>bfbd z=>!KPI1pdGndHq<)g9P!rE?cr`73AX?rUSJqgE5rB~&sHPy2vnd#v;r!{#ruGlR@Sxy(l;>Ph>WoVrLd7dy*2^+7d$8p3TA9I~+rCZ9O0K z5Ga^+bGpkG_D)Y(jJ&8*Ra^nHm3RgvBr$jJGnPoPF5tNBP#n_@rYJyM*PLw?F&$kt z_N2BHGk3-^PsuTVQ+xYD#3W4JDXC;nC(Rqu-Ee|@Z^NpJhBkx?FAdHx^WrsUm1v4| zu!`C2MSd<6+Oj$ZV|c)faYr?%c9?*JYQ?vlcJ30w>{^rQPIx=_RaA64P^e*?=c)Q( zc!vY?g*)Wnq{7%O&vOdH+PMU)lHDnU)C{$`iwkq4Hb5NOT2p-7By3EE31F!E& zU@2`*!(`dG+Fd%Sc1(AX-Q%p+S=W(^Pz}zSNQ+al7Gtk)_H>f?y9_dMY{?`$Qhg~5 zD!a0)wSPkgFZRi-n$Y4}elxZs=ir^r^C1IWr#m)g>~!i}8GsBOzmU}4!3slxmA6=p zhY&rSxpFmwps^C+D3j{MPDBO`W5eXBv=RFxtY<|7aGLWFunEEXlFT@vk~Q0AOGQDi zr(|qwd$PGK_-*b_W^=BoC~7qiD>I@Nw|})WV6ltWY?=5$h}5egj|ZD+nGV@uPb8l>N^zYti40gEcOtbyQ;6jzOO64LlD);Iz5Ekb&zGL z^yY@9ZG9PR58-WDtR8L|99HwH=KE=WvQD7 zQw>Ks!G17Z3szIMY8s3#UbzR?AarN!A=JF$bAKFpWdEBNjBRT;c45X&bao`zuLcV} z7<2?4-oACCy|pQm!S1VRTSu}_R$j(2B{uQ0seq1)Pz&vCBB8tg0oAEVoM>!b(#YAK zCfjTpLf~%yI`TU@lI;%l<@b{bb^geymA{MEBPf9v1_?`u&S4k2+cRNRf5vRcw*Sk}f)BP(A`cHiR!kUy^-rV z-k3wI-GH+e{^moS48#y^*JmMva$a})qPFS{ym3xpm+S20v)JuoamXxB_HIaKn8k3$ z1Iv8HR zdIZtu%Re2h~nJB1GgTkXuIg3OJOtan4t_BIx0I2wM~kx7Zk4X+fLy8AP- zIvuIHw=a<{QoP$29KW+4%U*s)+=@kZ-}Ve|pNChqWfGmqUTi;yS1rPNj^lQrVu%`= zv07rv3lnJfu1RH6hysNsi&sUH8~VGuIkptY z6b}05KnBYZQxa|Q)x$O^Weeoa>5$1#wIS7$$`xzRF={@;6ygAgH>A>tXFN#!+~FoH z`@$fT1kpx5`(lCSa~H{)(U`#>;xwnXz%$9|j~z(`Uk=j@@!IZSz&B%O`_%14(>83> zRCH%D+0Z*p@|*kSthkYQCkM%;35Ae&q&&=NLJb{qq@1Vn`5W5Xr_!RR-}_uBngwS#sS`)Q6UlNs5HVfpVYXc62OC$ZzoaIBFdjmqQ*@0v#bY=R{# zKPE>X*j78czoI&DRcvIS%KP(UmPoQ3p2jESCY}jI>Qs&odbva@o#oiu*y$YNa1TK9 ziZ)w3?pc&#^v4?f2?Tbc$d*JZgPo_lSwrV)rFAxMEDXBScCMJia0+FmA4COTfl(n8ALaJI$@xtf*;o zf1)SLV<>E?T_)IV%b$vo-PbO3Z~&S&zoWgK`{heL-bint4t25R?3?Ee-hi?`=TJNG zK6GWK1@4&-s0=_NcSpXmi~B<)T9(*u_ZRuSf=|We3oYKBPV}Za9FM_-cBXj!P4pBD zZg?P$Ab5_b>kEQ5RC5lPyHzh~;8 ze##-Ifp=PIJ7opv#RJ<#ge?a3Ax)z?4g7MHJ5laI?PBCvg1Azf!2_NQYWslAfHEbu zaXdyC%yTVj(%@m!RGiVxy-i7CItcVk!f=-lAz|+1Ya=a!z zuy^q6G~gjyAO0!576x!MD{%2VoWY#bEb`#l&^T?w9I>sOG=y>$W|HeuusqC6*>a>g z{HY(?9R)jN#(OY~1m<%S{_1Vf5KI*965t&L7aJ|3GTRKX4fPP!47Sr^$}Y6v-qBM{ zA10|ByebKmP z&@k^}A7hKQc?1)Sv98XWK%Kx?d(boFuRjt8mv*QI{t5f%sbfWP+5vSBWvN8$z~ECD zUJin1#L5So#X^Y8{_)?%{{K2S3=9^w;Rue~B>Hw|n}@-Q_#fr;qd6RLoF6)c6jZ*) zVS;@>fdKK+M=NM3i=hmL2ZsM<7BHIawhKd53(gvpdQe6n>S#j{Qm)I>?S`Z%tUm!C z7#wWeFvYGIMU+noJ%@)h;3SmIKEa`f7hCp`G{Odr?vtr-m(cCB0xh^Vq91-f`Q#-F zt>*hi{P0gteZ8iVe7B$6enIfrz+9^`G*b&}$QEm1@>rp`B`DpDYFcP?AgUv+42{!t z)J+iN1W%MSBdY1uNVIA%=%=Es5BY2zZ-@ASt;9=uVX8oDRjLe4;VQhT5R9NfuwDyB z4E#lRM7Mk%3uOpNhQR54Nj(`i-|iVl;>71g>`Ei$2ls0T3X9{l)K+LEc7Bg1$q zovLvy3xxM_rs5?(G*ytQasX?prh&qms&nRL4&$lXWNbC+xJQh8X&FR4Ne?wvhMKfs z3oy;B;H5f#qKGivOQBu72F%m9JWn;E0=%FtTt;7R$(YM^s~j?{W<`{TR*NE#`=ZPa1x!HoxN4Eip&9MajCN_nK+Dy9 zl`vDMT&j4e3g#cCa%qcPwMD_tM3^^5c|d_eAZns-DMGS!VnFNIme!TCE-OQy!gm}7 zRbGL?6hQn)xd&6>)>e$iYg7Tol^2Rq5{pxOp%7@rQ4%tfNL~T6uXnyD>_k1Q($UMpi`4%1~0%Q7tNizhe@rHJG%f!Cf>h zIB+wUeFOXPQYRS$_&-j-DJ^zSz^hstrxA>Yf4|}R`QN#5*`&+ffBUD?E_|UPcYDe2 z7i=yIUt4~|$k$G~sQZZp|9Iw0pBj;<7X|tz zcK&6=8-KZORKoj8)8C%mGUlvRk3I9yuYOi~e*4uYu8tf$#+ab3dE=44{4DeKIbY~n zwPb%+!z(wP`p*0B9DMMChtk$5^ItlQk<8R|1clIQ{#RO|;fEM#x`e!(z9 zjpfX{k^hNhk1{1n!EQpcVC8x>4A={bXlNFGbOXrHYL6E#sSK0Zjbi{Im_^`_;!`4o zH563v(8C&7fDj>sAbJJDDBRlc>WIJr*rJX&QS5i<9RmPAc5)sq$0mSNL3_M6!0uo0 zUPYxUgDt@pFfFdu$7>j;9&F+8J_Wfhe4!c+2$jKs7xRI_A4QNDIE>yxk`JmZ8w5em z!mFx6gGrwTx!iOL2BTwC!4||FxIk0Bj@btXUIlxv~_3_uRd1q)d*L|h+xa3h>Whlz~#!VX#E`F?tr}jHPjoG7{FHD-T%m*mOrJgM=y)ke8EYi5|QB5>d+GH)7(Q zm^heD4>Im)9sA8X{)eCPG8Z>3T#di!hF$CM8pv76?Lv*pRd&>#Vc3Mqchzt@ z@T`nw3aDXEyXrAPeu5#P#H*^#T4j&LCPO*tu1a3!^w2D2%j}X-8W-9%OS+tc^#BHU z8hb8FI7=D&EU{J4hA{aw6y;B^WZ&v^Qj zM)8IfO>OQ&vAA>3eG-1vX;vKfOI>*IagviypM_sIYb%fBpCLF`a(wq0VJ=aZO%(TQ zcn~%cf4MXK1wCxSFVSe=(~VJiPiAY9ulu82?t_VF&W@&V51-`6H&J<4sh(e|l0?90 zq7T>f>b(;Fe-FV$F%dZ=DY$Teg(ee4`711Bv z5V|8g3}iBl^Vqo4klgLEgor@r-ZNtJY=`eJgCddF4Fj<6Fb6SrHR& zlsf-EC~k{&l5W2Q-*b2+T-F@th)wcLa|>)X>+tfyeOQ`}5YN1^LQ9i*mF84=Qn8 z{)1OiGK+h9mgDZ8db1rcsieGE$^;+QfQS3zFZmY#TloJ~1N`e%@*9`~gGVTyjGIjw zhG)8^_@2I>@YjC~sn5Fx|5U{qYQ@8eHMo#lg;F#APirdxHzPeo{a@GULF0`Ncwfu^ z@3F4E{8x`EcYnu(S*rNqFh;f*UkzOO0`C-@$N3tKFW~q}kUx`ntBgxazH(0E)ZT-f zFDdy-Q+;kXP6vqwnF=TR;hbg)%~XtA{hNs^JLrI-+J$JV?w$F>&zFZ;;2YsAeEr&u z+lL%(5|a6H6tb~2OzqwyM?qtw1z(=>wJqN?C|=Q`tNVJ4ldtEu;x9Gal6y7SgVqVO z9e(M{mzI1_!B@L2(9!U_9KPyTH+||xZ}9aQUyboKE??er+g5Pv!R0AGE+~wUYfhI@ z@l0@kSZDCrjmHA6e)>?K#_dVrc7*U(AAD1j09PA&;cMSzfYbv6)@76y0^&y%YR;mx z065lZ4r85*zg9UO`rv;Jpi;cD4ln-eGb~t;KMWb%IURb#S+IqnvNS;VTkx+JGPyI! zW8z=+D)1Zp7=-Kj0f_rBWCk8qOqYKw$4Ine>*UMy404vYppB2ye*OE4w4H%)z)Q{>C->Pw0KRSpFQ?9+#%^a|e7*mocq$`s8`%F}b>C zNZo_|XUDcw=1kp7cESQWptFLehTF~2=4zhI)nGnDXY6S6wLsc7!k_uByH_sh`R?!I dwigBcPf7;VZ<|Kt7g+u$3I4yb{#R(={{hoOoaq1n literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..b48e0cb85e8f1d033280812ab0416b9677820333 GIT binary patch literal 21504 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 DU=;!4 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.xml b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.xml new file mode 100644 index 0000000..38d2dcd --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.Extras.xml @@ -0,0 +1,621 @@ + + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..8533023a261d5a6e936870536620fffebffe7d5f GIT binary patch literal 28672 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 + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Use this class to send a message requesting to display a message box with features + corresponding to this message's properties. The Callback property should be used + to notify the message's sender about the user's choice in the message box. + Typically, you can use this message typ's recipient will be an element of the View, + and the sender will possibly be a ViewModel. + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + Initializes a new instance of the DialogMessage class. + + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Initializes a new instance of the DialogMessage class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The text displayed by the message box. + A callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + Utility method, checks if the property is + null, and if it is not null, executes it. + + The result that must be passed + to the dialog message caller. + + + + Gets or sets the buttons displayed by the message box. + + + + + Gets a callback method that should be executed to deliver the result + of the message box to the object that sent the message. + + + + + Gets or sets the caption for the message box. + + + + + Gets or sets which result is the default in the message box. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanging event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + The name of the property that + changed. + + + + Raises the PropertyChanging event if needed. + + The type of the property that + changes. + An expression identifying the property + that changes. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + Occurs before a property value changes. + + + + + Provides access to the PropertyChanging event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/Microsoft.Practices.ServiceLocation.dll b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/Microsoft.Practices.ServiceLocation.dll new file mode 100644 index 0000000000000000000000000000000000000000..68ad36e735b8317cf91d98ca3641c5888dc020ae GIT binary patch literal 10752 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 + + + Microsoft.Practices.ServiceLocation + + + + + The standard exception thrown when a ServiceLocator has an error in resolving an object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a specified error message. + + + The message that describes the error. + + + + + Initializes a new instance of the class with a specified error message and a reference to the inner exception that is the cause of this exception. + + + The error message that explains the reason for the exception. + + + The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified. + + + + + The generic Service Locator interface. This interface is used + to retrieve services (instances identified by type and optional + name) from a container. + + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Activation error occured while trying to get all instances of type {0}. + + + + + Looks up a localized string similar to Activation error occured while trying to get instance of type {0}, key "{1}". + + + + + This class provides the ambient container for this application. If your + framework defines such an ambient container, use ServiceLocator.Current + to get it. + + + + + Set the delegate that is used to retrieve the current container. + + Delegate that, when called, will return + the current ambient container. + + + + The current ambient container. + + + + + This class is a helper that provides a default implementation + for most of the methods of . + + + + + Get an instance of the given . + + The requested service. + if there is an error in resolving the service instance. + The requested object. + + + + Get an instance of the given . + + Type of object requested. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is an error resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + Get an instance of the given . + + Type of object requested. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get an instance of the given named . + + Type of object requested. + Name the object was registered with. + if there is are errors resolving + the service instance. + The requested service instance. + + + + Get all instances of the given currently + registered in the container. + + Type of object requested. + if there is are errors resolving + the service instance. + A sequence of instances of the requested . + + + + When implemented by inheriting classes, this method will do the actual work of resolving + the requested service instance. + + Type of instance requested. + Name of registered service you want. May be null. + The requested service instance. + + + + When implemented by inheriting classes, this method will do the actual work of + resolving all the requested service instances. + + Type of service requested. + Sequence of service instance objects. + + + + Format the exception message for use in an + that occurs while resolving a single service. + + The actual exception thrown by the implementation. + Type of service requested. + Name requested. + The formatted exception message string. + + + + Format the exception message for use in an + that occurs while resolving multiple service instances. + + The actual exception thrown by the implementation. + Type of service requested. + The formatted exception message string. + + + + This delegate type is used to provide a method that will + return the current container. Used with the + static accessor class. + + An . + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/sl4-wp71/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..786d6def6fa6cfe09252684fb10d49151413e576 GIT binary patch literal 37888 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 + + + System.Windows.Interactivity + + + + + Represents a collection of IAttachedObject with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + An interface for an object that can be attached to another object. + + + + + Attaches to the specified object. + + The object to attach to. + + + + Detaches this instance from its associated object. + + + + + Gets the associated object. + + The associated object. + Represents the object the instance is attached to. + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + Cannot add the instance to a collection more than once. + + + + Attaches to the specified object. + + The object to attach to. + The IAttachedObject is already attached to a different object. + + + + Detaches this instance from its associated object. + + + + + The object on which the collection is hosted. + + + + + Gets the associated object. + + The associated object. + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + The type the can be attached to. + + Behavior is the base class for providing attachable state and commands to an object. + The types the Behavior can be attached to can be controlled by the generic parameter. + Override OnAttached() and OnDetaching() methods to hook and unhook any necessary handlers + from the AssociatedObject. + + + + + Encapsulates state information and zero or more ICommands into an attachable object. + + This is an infrastructure class. Behavior authors should derive from Behavior<T> instead of from this class. + + + + Called after the behavior is attached to an AssociatedObject. + + Override this to hook up functionality to the AssociatedObject. + + + + Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. + + Override this to unhook functionality from the AssociatedObject. + + + + Attaches to the specified object. + + The object to attach to. + The Behavior is already hosted on a different element. + dependencyObject does not satisfy the Behavior type constraint. + + + + Detaches this instance from its associated object. + + + + + The type to which this behavior can be attached. + + + + + Gets the object to which this behavior is attached. + + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + + + + Represents a collection of behaviors with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Enumerates possible values for reusable property value editors. + + + + + Uses the element picker, if supported, to edit this property at design time. + + + + + Uses the storyboard picker, if supported, to edit this property at design time. + + + + + Uses the state picker, if supported, to edit this property at design time. + + + + + Uses the element-binding picker, if supported, to edit this property at design time. + + + + + Uses the property-binding picker, if supported, to edit this property at design time. + + + + + Associates the given editor type with the property on which the CustomPropertyValueEditor is applied. + + Use this attribute to get improved design-time editing for properties that denote element (by name), storyboards, or states (by name). + + + + Initializes a new instance of the class. + + The custom property value editor. + + + + Gets or sets the custom property value editor. + + The custom property value editor. + + + + Provides design tools information about what to instantiate for a given action or command. + + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + A single argument for the specified . + is not derived from TriggerBase. + This constructor is useful if the specifed has a single argument. The + resulting code will be CLS compliant. + + + + Initializes a new instance of the class. + + The type this attribute applies to. + The type of to instantiate. + The constructor arguments for the specified . + is not derived from TriggerBase. + + + + Instantiates this instance. + + The specified by the DefaultTriggerAttribute. + + + + Gets the type that this DefaultTriggerAttribute applies to. + + The type this DefaultTriggerAttribute applies to. + + + + Gets the type of the to instantiate. + + The type of the to instantiate. + + + + Gets the parameters to pass to the constructor. + + The parameters to pass to the constructor. + + + + This method will use the VisualTreeHelper.GetParent method to do a depth first walk up + the visual tree and return all ancestors of the specified object, including the object itself. + + The object in the visual tree to find ancestors of. + Returns itself an all ancestors in the visual tree. + + + + EventObserver is designed to help manage event handlers by detatching when disposed. Creating this object will also attach in the constructor. + + + + + Creates an instance of EventObserver and attaches to the supplied event on the supplied target. Call dispose to detach. + + The event to attach and detach from. + The target object the event is defined on. Null if the method is static. + The delegate to attach to the event. + + + + Detaches the handler from the event. + + + + + A trigger that listens for a specified event on its source and fires when that event is fired. + + + + + Represents a trigger that can listen to an element other than its AssociatedObject. + + The type that this trigger can be associated with. + + EventTriggerBase extends TriggerBase to add knowledge of another object than the one it is attached to. + This allows a user to attach a Trigger/Action pair to one element and invoke the Action in response to a + change in another object somewhere else. Override OnSourceChanged to hook or unhook handlers on the source + element, and OnAttached/OnDetaching for the associated element. The type of the Source element can be + constrained by the generic type parameter. If you need control over the type of the + AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents a trigger that can listen to an object other than its AssociatedObject. + + This is an infrastructure class. Trigger authors should derive from EventTriggerBase<T> instead of this class. + + + + Represents an object that can invoke Actions conditionally. + + This is an infrastructure class. Trigger authors should derive from Trigger<T> instead of this class. + + + + Invoke all actions associated with this trigger. + + Derived classes should call this to fire the trigger. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same trigger on more than one object at a time. + dependencyObject does not satisfy the trigger type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Gets the actions associated with this trigger. + + The actions associated with this trigger. + + + + Event handler for registering to PreviewInvoke. + + + + + Gets the associated object. + + The associated object. + + + + Specifies the name of the Event this EventTriggerBase is listening for. + + + + + + Called when the event associated with this EventTriggerBase is fired. By default, this will invoke all actions on the trigger. + + The instance containing the event data. + Override this to provide more granular control over when actions associated with this trigger will be invoked. + + + + Called when the source changes. + + The old source. + The new source. + This function should be overridden in derived classes to hook functionality to and unhook functionality from the changing source objects. + + + + Called after the trigger is attached to an AssociatedObject. + + + + + Called when the trigger is being detached from its AssociatedObject, but before it has actually occurred. + + + + Could not find eventName on the Target. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the source type constraint. + + The source type constraint. + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the element this EventTriggerBase listens for as a source. If the name is not set or cannot be resolved, the AssociatedObject will be used. This is a dependency property. + + The name of the source element. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + The element pointed to by does not satisify the type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the source property changes. + + Override this to hook functionality to and unhook functionality from the specified source, rather than the AssociatedObject. + The old source. + The new source. + + + + Gets the resolved source. If is not set or cannot be resolved, defaults to AssociatedObject. + + The resolved source object. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Name of the event. + + + + Gets or sets the name of the event to listen for. This is a dependency property. + + The name of the event. + + + + Static class that owns the Triggers and Behaviors attached properties. Handles propagation of AssociatedObject change notifications. + + + + + This property is used as the internal backing store for the public Triggers attached property. + + + + + This property is used as the internal backing store for the public Behaviors attached property. + + + + + Gets the TriggerCollection containing the triggers associated with the specified object. + + The object from which to retrieve the triggers. + A TriggerCollection containing the triggers associated with the specified object. + + + + Gets the associated with a specified object. + + The object from which to retrieve the . + A containing the behaviors associated with the specified object. + + + Cannot host the same BehaviorCollection on more than one object at a time. + + + Cannot host the same TriggerCollection on more than one object at a time. + + + + A helper function to take the place of FrameworkElement.IsLoaded, as this property is not available in Silverlight. + + The element of interest. + True if the element has been loaded; otherwise, False. + + + + Executes a specified ICommand when invoked. + + + + + Represents an attachable object that encapsulates a unit of functionality. + + The type to which this action can be attached. + + + + Represents an attachable object that encapsulates a unit of functionality. + + This is an infrastructure class. Action authors should derive from TriggerAction<T> instead of this class. + + + + Attempts to invoke the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Attaches to the specified object. + + The object to attach to. + Cannot host the same TriggerAction on more than one object at a time. + dependencyObject does not satisfy the TriggerAction type constraint. + + + + Detaches this instance from its associated object. + + + + + Gets or sets a value indicating whether this action will run when invoked. This is a dependency property. + + + True if this action will be run when invoked; otherwise, False. + + + + + Gets the object to which this action is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Gets or sets a value indicating whether this instance is attached. + + True if this instance is attached; otherwise, False. + + + + Gets the associated object. + + The associated object. + + + + Initializes a new instance of the class. + + + + + Gets the object to which this is attached. + + The associated object. + + + + Gets the associated object type constraint. + + The associated object type constraint. + + + + Invokes the action. + + The parameter to the action. If the action does not require a parameter, the parameter may be set to a null reference. + + + + Gets or sets the name of the command this action should invoke. + + The name of the command this action should invoke. + This property will be superseded by the Command property if both are set. + + + + Gets or sets the command this action should invoke. This is a dependency property. + + The command to execute. + This property will take precedence over the CommandName property if both are set. + + + + Gets or sets the command parameter. This is a dependency property. + + The command parameter. + This is the value passed to ICommand.CanExecute and ICommand.Execute. + + + + Provides data about which objects were affected when resolving a name change. + + + + + Helper class to handle the logic of resolving a TargetName into a Target element + based on the context provided by a host element. + + + + + Attempts to update the resolved object from the name within the context of the namescope reference element. + + The old resolved object. + + Resets the existing target and attempts to resolve the current TargetName from the + context of the current Host. If it cannot resolve from the context of the Host, it will + continue up the visual tree until it resolves. If it has not resolved it when it reaches + the root, it will set the Target to null and write a warning message to Debug output. + + + + + Occurs when the resolved element has changed. + + + + + Gets or sets the name of the element to attempt to resolve. + + The name to attempt to resolve. + + + + The resolved object. Will return the reference element if TargetName is null or empty, or if a resolve has not been attempted. + + + + + Gets or sets the reference element from which to perform the name resolution. + + The reference element. + + + + Gets or sets a value indicating whether the reference element load is pending. + + + True if [pending reference element load]; otherwise, False. + + + If the Host has not been loaded, the name will not be resolved. + In that case, delay the resolution and track that fact with this property. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + The type constraint on the target. + + TargetedTriggerAction extends TriggerAction to add knowledge of another element than the one it is attached to. + This allows a user to invoke the action on an element other than the one it is attached to in response to a + trigger firing. Override OnTargetChanged to hook or unhook handlers on the target element, and OnAttached/OnDetaching + for the associated element. The type of the Target element can be constrained by the generic type parameter. If + you need control over the type of the AssociatedObject, set a TypeConstraintAttribute on your derived type. + + + + + Represents an action that can be targeted to affect an object other than its AssociatedObject. + + This is an infrastructure class. Action authors should derive from TargetedTriggerAction<T> instead of this class. + + + + Called when the target changes. + + The old target. + The new target. + This function should be overriden in derived classes to hook and unhook functionality from the changing source objects. + + + + Called after the action is attached to an AssociatedObject. + + + + + Called when the action is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Gets or sets the target object. If TargetObject is not set, the target will look for the object specified by TargetName. If an element referred to by TargetName cannot be found, the target will default to the AssociatedObject. This is a dependency property. + + The target object. + + + + Gets or sets the name of the object this action targets. If Target is set, this property is ignored. If Target is not set and TargetName is not set or cannot be resolved, the target will default to the AssociatedObject. This is a dependency property. + + The name of the target object. + + + + Gets the target object. If TargetObject is set, returns TargetObject. Else, if TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target object. + In general, this property should be used in place of AssociatedObject in derived classes. + The Target element does not satisfy the type constraint. + + + + Gets the associated object type constraint. + + The associated object type constraint. + Define a TypeConstraintAttribute on a derived type to constrain the types it may be attached to. + + + + Gets the target type constraint. + + The target type constraint. + + + + Initializes a new instance of the class. + + + + + Called when the target property changes. + + Override this to hook and unhook functionality on the specified Target, rather than the AssociatedObject. + The old target. + The new target. + + + + Gets the target object. If TargetName is not set or cannot be resolved, defaults to the AssociatedObject. + + The target. + In general, this property should be used in place of AssociatedObject in derived classes. + + + + Represents a collection of actions with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Represents an object that can invoke actions conditionally. + + The type to which this trigger can be attached. + + TriggerBase is the base class for controlling actions. Override OnAttached() and + OnDetaching() to hook and unhook handlers on the AssociatedObject. You may + constrain the types that a derived TriggerBase may be attached to by specifying + the generic parameter. Call InvokeActions() to fire all Actions associated with + this TriggerBase. + + + + + Initializes a new instance of the class. + + + + + Gets the object to which the trigger is attached. + + The associated object. + + + + Gets the type constraint of the associated object. + + The associated object type constraint. + + + + Argument passed to PreviewInvoke event. Assigning Cancelling to True will cancel the invoking of the trigger. + + This is an infrastructure class. Behavior attached to a trigger base object can add its behavior as a listener to TriggerBase.PreviewInvoke. + + + + Represents a collection of triggers with a shared AssociatedObject and provides change notifications to its contents when that AssociatedObject changes. + + + + + Initializes a new instance of the class. + + Internal, because this should not be inherited outside this assembly. + + + + Called immediately after the collection is attached to an AssociatedObject. + + + + + Called when the collection is being detached from its AssociatedObject, but before it has actually occurred. + + + + + Called when a new item is added to the collection. + + The new item. + + + + Called when an item is removed from the collection. + + The removed item. + + + + Specifies type constraints on the AssociatedObject of TargetedTriggerAction and EventTriggerBase. + + + + + Initializes a new instance of the class. + + The constraint type. + + + + Gets the constraint type. + + The constraint type. + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + + Looks up a localized string similar to Cannot set the same BehaviorCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a Behavior cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to Cannot host an instance of a TriggerAction in multiple TriggerCollections simultaneously. Remove it from one TriggerCollection before adding it to another.. + + + + + Looks up a localized string similar to Cannot set the same TriggerCollection on multiple objects.. + + + + + Looks up a localized string similar to An instance of a trigger cannot be attached to more than one object at a time.. + + + + + Looks up a localized string similar to The command "{0}" does not exist or is not publicly exposed on {1}.. + + + + + Looks up a localized string similar to "{0}" is not a valid type for the TriggerType parameter. Make sure "{0}" derives from TriggerBase.. + + + + + Looks up a localized string similar to Cannot add the same instance of "{0}" to a "{1}" more than once.. + + + + + Looks up a localized string similar to The event "{0}" on type "{1}" has an incompatible signature. Make sure the event is public and satisfies the EventHandler delegate.. + + + + + Looks up a localized string similar to Cannot find an event named "{0}" on type "{1}".. + + + + + Looks up a localized string similar to An object of type "{0}" cannot have a {3} property of type "{1}". Instances of type "{0}" can have only a {3} property of type "{2}".. + + + + + Looks up a localized string similar to Cannot attach type "{0}" to type "{1}". Instances of type "{0}" can only be attached to objects of type "{2}".. + + + + + Looks up a localized string similar to Unable to resolve TargetName "{0}".. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 zcmeHu4RjpUmFBJL>gpd!ZFNhQ4VFv`TTWYlmMk0mgN4<2U}F~IkcDNEA&^YSNd_`; z_Pe*Lx?8dgo;kaFa?Wncb>F-9-S^)8d-uJ1-R`;iGvpy64bLC`K=dt?{8=aP!@(q) zLl=BIM2`iYtNoVJ{akJT?xYnR&zPf`_*ir}o=%(D=#UZ3jOMbk z;6i8U-VH?Eiie(jXZ1FBw%19mEm2B{E&;`FQ%_%wGKyyx9-?xotG3)sVEN^94|%LUc!rC?M1V=#ARL7AP~|P)v>IK%dF|F;R=n`ztIa#N z+}wA$b@<@zZ@>AkcU|{T0Q;SOK63#u^#FQkKGheigVoK2OggQ5AfyFCuvFFk>H)~8#V}@r zr_razVDN@Tr%D2izOWWs1g6(m9|dbx#oyPyPDlhqtSh9=>-r1OFl@2!^w`JH+eGjN z8%r`fA-S~}_5D?)jycLAs#wD{C7ZUf$HmyNwrpbE#$~oHx(RWDO$%*%JY2Ac7S^it z`yg|{6sHDVBeI{H;07^pWszxgRiD{3C93Y5*)&0aqaJWAW80;U{^3muvRxLbo~jsJ z%7)<>_$FvDZP?RPl7WrJtp-T4zY4yVh$xLH(*wfQU#xMdi%qx2B3pm#5KcUl1>9%| z6j|WI^w&K_`e_B%2YrpYf2w}vbo?P(zk1c9RmHG)p&;w`WkOb=g1bnWIof^au82c@_&hQyQT(qQ%jow)4V!V#)n$$&lNrS4x|2&_a*cuU-Hil#$T;z7( znB^urDYV*6ERUUpxXH$r+D)?3Wp!|qjkR&psVNa#Sj!K6#kK=-^fK_(56n_xNX}Sw z7Xco@)-~_6B6@r10q6}u!j%=ebun5id|{vG;0n~LD!gub^GCdAMsty#SG#(0+Ai^h z^`=>2-)Vg%Fl!YLs)zL$mQh0tIi{hss;uDxf52SBErCcNhHW-jp&>1qm!h^PFlR?u zz#oH{4NFg+Dh+#)v8KiCZ2IKg_7?2wxEVU~IO>6Rz}R|#`gtuLdK3C#MM6KX)d3=l z;yKufT2+PS>gS7SAFAKLH2u8LPd}}1z$mtU$k|i%o9A;C^hf+6*qOS$=K5JOLYs?m zMhNQ%SVVgjoi|g&iaj?F_K4($e>tHrL{X^R}ypFF!ykJ!q;u?FEot-s%%XRjN zaqslQH2~5ilY|~C5ne;19py8JqNGB@Tzw3<0#;S1B`MhIQv}{zeC)xbuHS0 zdgjNF&m2U3k#6%#YBqNXCG$>kE01ynhvj*0Yl$b{*Nmgl_N9kb!_LT@VNVX{?0Hyd zOJYN4w#U~+Dt>(lHqMD9gw7-DBBg1dT3^LyYY!o96I>XMer)8sZv~@^w{5#$zq)8B za|Fyg@(qQt%u#93>#tSS7jSY^<-i}?4XTyo2`*C2>rhsnR;sWIAzZI#Y6WuD=P@TD zCafNU2DY=Yh3Hla43kU}dJHGlhC`6e=76BOm1Yhm2|X5O4vb`Tz$Ch5G6$1{&hIV_ zELcNOccUc?i`u!Z#D{e+?)DWedmS=r^jXM=&@4U=PdUE^oO5Rb4#QYh*wb&o%q2cE zgQC=bG}#ov@e_8@Obe9z!85NOWczsJukcn?=nV_P-mrdmg%-e;m<5-LGKVq-FXJez z&)LD-SlD|sx%6dUplG1Gi&J=G#Kk!0ntK51t-TEAtM66Uiar=mLd^y_9XNpPJm#tF`x04QsigZHNW zs0CF|gklGHmL(W<5y&?JX?p!sDB?L?Rl|XQ5QNu?&wZ|TkT7_5U0FBD$E~z*8zBNX zFRL_cxMw8W6lb?XgKY=c@Wbqow@a067d}rrCbEy#Vy!)D;W%k;PBxD%!hy~2@%50)$KS=QXr+}6_8idD>~Ypi4H z$KqK4QJzBiQ!p*)%Vv`4QLF``zk;7QWh~g%NBg4o{n3I=+qyc@_NTy0agbTCK4l`I z$pLGe(tLO{L5!7EpJw!t)({J+Z z_Jrs!JWT&vfzJzkSD;U0dQ{+Qfdc}MYNi&V`?M$MeEJvd71T?;%(=o_=N+bQC>5du z-kn~IEbyPaJmcE}|6O3C{seS0^nU$9`cvJ~L-Y+$Li8M975!2_qEwOJ$7446n0~3i zy*`%tFHv7akNY0>Mdt?6dv`^)X=Y3ig)5y3eA2%VTqa_12;ry``}3<&@21bAdhKV61zXzL&=q z0Q;*8?SAJ&vIsqv$C`mXwZLs#h8cg5$1bHxx@V!=b_HVnp**%7o=DZ%ZLIq|I__Ys z`#idX69nX3t?UMt{g{iHxS7skTO>M67psp`4f*-l1*}s&K~eg=gKbftrv(&k;rQbK5O+m-;hcpU-3O(Z}d}g1x0YuKpg_Ne6odoH4owyCX~X zjQSoerWYLSC2%gL*9E(UUI$iBzs$FJlm_};zRjaFk_@=b=vR$A-!b||@CVv5?CLhA zl>CdfoaQ=MvPAb@M1LmQ9;2bsx4jqB=SAvc^fa&)lohYoQMZzAv@yEH_g!@*?GPW? zZL4UPjnVJWwu(+-1Gl4fm%5tXwK4xc2G)Dl&~F^E3kxveGnMX z*3d%^rUWb0wHQyqsxLskc~!`UQK>UjizqmA6w$fvaavJRU}b8<>ek) zBXe~Kg(dVjQZbK0Jwm@$>Ne%WpsSHPe!&{H{QcOi75Z8cEDJJaA+}f-+Pd5DbI9BZ z*^oI^nkD?_1^N3Dl>*3gemq`00lJDdDsz>%z@)$%1WpJ%Ebumg#{}Lb@Ls?gt3~*F4rpnnZ8h9 zqXW5hnbZ|!Okb}q6#js6hu)27eNf-3zE98U1L}DSYq602S>L603hc&=`&31FTR)`M zDq-Ip>SCqFcU)~1&Q2L~rPFJhFM%w_uv1{8z)ITbV|f@h3hWeEE4uX4ao z=ZH{_$f{c=oN#-u= zrz-+SJ&TpA0;Sp=j+~jm0_{p=f1pKMNz8K?y$tP`^gS*+@^RUb?-I&g%JJYKjo~M? zT3O`}QG@zlw1?<}zysQ2Qh!Y950Mgl8We^PDsPu8#93;ivP*q}I8!`9oIRd#WH?>2 z$@>GTzvNK%2fpm>6di9+DoVfUZKvAO=RJ=qvC<0lQDu4Q-+QZRd+AB`5|55pNDf^c>UsO(&cI%B&uN1gYph^d+3MYXB^ro+w zZl-qtOK6AQj2-bCfb-~Ozy-7e^ai>XuubTz=}y!;gx)7`C(e1zcxQM4(4tp;!}KY7 zS@{xuO7&^q5%`9{T7@a?0^^Td|ZzTTqkgsz)6Ak z*mVD^;JHWOQvzQXI7hu%y+{43`Ym;<=Px`jd*1SNYM<7=seMm-#QPm@gT7VQkVAZO zmij;qE4af5?!*CUR&bZ5@_7+09gtt95Fd+NJJRZ%|)Qf26*t{xE`dxuQdbhVPxFtb6kL&JDv6z zGB#_g;XG;2=LJEh^2qfVK0$_b}DfHFp> za28vwZbo?-o*_KT@T|ad37!!=d#Tbhf#)!uy)<9@DxOF2yh^*gd+A2+tMobVPk`?O z@2m7X?|zgJ=aL>XkxLnCX;VBE?=wfT%{_bejCChRcW0Y7?8|22R&yeiqOQK=*m%n5 z!bRc?j7;v$7$Zg|V%Kb2y$&nrX~dM8Gv#--MMl#+p0Kv2inPq_dFONIBFzb8p7nlS~+S?yb3WHaTWc zL5M9w*BQfEf`Hk0GHrEajCj^aP=7}%Zduf2Z8b)dmNGbQS;t90^0oqXy3Ac0 z(vT+;A4(Z89T;W`6w$6He!bDB?ov%cSGDUgRCrb-0`V}cpn=`T1kXTVVaKaK3?~!WISCoxjPUHoXcPdptT zElL6|18p{P$Yv>*&+3k+M{{5;%;Xx}aZaJZnXEGzA5EJUQWmeRq1@;w2X%qXropG2 zp7LwoNkfvnk|`rotn7F)B_7&pq~iOeW)+5WI;Sls!9Iztw=({&-=ZL_AT z=k~QD&LU?54&BS*=|sxl)xy}uj5+2|5J-|MIltJ~w#bv4bE(vp%m&Ujk`=m;oTbuX z!m)0w_wUB4N^pqxAksNOZs0`YHgCeEZakITFKUw$DUt`U90t46d*T^(xzixSZ^XQt zu}-LKqnR0tBa=88-$sc$rILv)<48BWE;j5NHe`WNdm=#__9e4m$zt~zxAQX$W~6x? zBCkMgncOi!K@h8u{@v7CG_I3u*&+pMN6Lt2uuF`Ydknf{?eO4WXVMx^#U~`au0R@u zIS1mYoY5OkW|00bDeNU{hXw~PqH)kgW#O{-ou#hjx|8V}U`scv()QihvZxzd7e?+k zxgvepXSPSqkRbuiX_F3-IX<}Ih8!#ix3*(*+B40FofGN!SaKLvHm`?Xu++3%&$73+ z;$5PnZ{a0tR}Kzxt~CND(i*{MPxuFy`?;d1kBa;sj2}+o+D{Z(29T^W4qZrnwqt|@ z;fizg@X$vOwGu0MH++zZr>${#Go9^%{MqD4(#W)4e2()BfAl=@a~vw+rh&pakq_!_ zBJ0RmS#vDEj*41%y-sbUKAaG7AVzp0t0FhM88A=4sn}la9L~L_m6YSTAZ{NHRgyH- zVY&z3Lh7+J}0R$#&dM!@IHYJr3ZO*Gsj04=TTGQ4d-XB+Ia}$ zyN5T62VUAjn{vqn_WZq4@@rQ=zC$wber`|{DZ~Pd@(B>P#2*WbZFluT1nP`d9kkDoxm1Qx(Y4C{c z9Ys>u^PElQnMT71vuqi%BI^Wxj&yF?Pwf>I>zsoH_Wqw6JxY6F*(`h)rR!lG_R|4s zwJpE8ANaUf)wMBuCkH#Sr`RLxQT7J=ewFlfyteH>*0&%BkI&wW8+V^^0)rOih+kO+PvKV z$fbjy2)`U$rM2J-8*huEs38r%icq{QxMNqDimHNYkm2meY<&G#(xRwNRV}KAN?R0< zLl3E*C@DJknNKo6D4@@doTo-=BDJa>^5`|yA&0=^P^7M`7_H88*Qk26M~{@_UM*7Y zi+ZXfH6gW(XNuI=;)L|55~+>Ul#&{$ogG;$206146O_Xsxs`5xI z;d}~dehjWCT2xU&3{)^FVS}sw$$R+sKiVYzI||{KE_^Kod~07j?!fp$Q=x6&`&CbD z^TX|blRWzB?f2jNen)a}OV#O$vA@1(=}WJk^u+#r?u!*)H~VkjzGUDR|NVygtMBi9 zXY8t~;KcC2qkFFHdU|qf>wo>bR+0oahBNQAD zs@3QNX(#WD)Lh!s7orjN3Ir8rlyXD@x;zYlZ5CJ%n9~XiR=`x4iGpB+iX2qSd_k5N zfm~h8>Azln~(bnb*%s9~WahTT~2O_~Z zP$r<0EG?(-!tIe-URe+c%TTU-{ZY{}QVUHSau6%16uQ;82B?6|+`4eVUS;efEapfp z&jp9@>QSq;7!1QeL3}CU$?qa8?GMJUhEt>=GWndW+R5iYQoM+}$>$*bc)IbDuK#weU{zmqAGfFzOWgco-PVA zA)Ay%CZCiQVe`y#EaWoH#R3rbLjn#0$29Ym(jX>xxk5sAF*S%dbLOjqw-wErQMrugTi&Q#g*Oc(jlBW{jmF1uUuNH>Tl~L6 zxA$&rjBZb+6L?vR_ThMK6wuz?xKeM7_9byqnMv^#Ut@Gf9QS$2H1=7q#QH@FwYqXf zyW_ah!_4b*qiNioMAt=kXS3t0mMq!3cW?73zD1DB{o&ojKQdpEzc`FO{b2O0V=QfH zS=qF-rFFT?h&h7_d5v@veicYqZoETD1-~r72WEqv)vE28`1t0cYaZMW1ECa2ngW0~+Sc_y9tF2l297h)Jm z$^BG&@iSZ+pgtM|+(27V>!K}qml#C3nKq)%pC`3noaW;k|CVOt82`G)F7ZFEK(a!eNndPKVsEDB`e z_ZNN#8=YaK9m3NBz3snccuV1*npG+X(U*_?WB4=BJBwKeTJDqa_}$!oLmIc%tF^y_yyn+ z=)ix?;IhZEoU!I&&_X_5LdN!Y~lfLbUE(^Mi$*l + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..e7084247d15dbee3dc7102e5788c4cad15797c5c GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.pri b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.pri new file mode 100644 index 0000000000000000000000000000000000000000..d5b0a04543012364e0b077f67920ab6d3934ef3f GIT binary patch literal 1240 zcmeHHu};G<5Pb=4)sYWi$OJ;71Xg|k29S^#K%goLO-d@^BuXmUPvA51Kl}hwK7gI2 zOL%9;X$R=Qh z0y)ABu*+B9)-gjCJ!-3`EXIp+;s^Q=Odt^3({l|~K9LKoA3!B0vW_UuPb=P{%oHH^MwE6tQ?^c>9O?);kkt_&{T}w8lRjEU%wR+Xm@_xy4CGXi6*XeZL literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.xml b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.xml new file mode 100644 index 0000000..2a650e7 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.Platform.xml @@ -0,0 +1,199 @@ + + + + GalaSoft.MvvmLight.Platform + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + The object that provides handlers for the completed async event dispatch. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Android dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Windows 8 and Windows Phone Application 8.1 implementation of . + + + + + The key that is returned by the property + when the current Page is the root page. + + + + + The key that is returned by the property + when the current Page is not found. + This can be the case when the navigation wasn't managed by this NavigationService, + for example when it is directly triggered in the code behind, and the + NavigationService was not configured for this page type. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + The key that will be used later + in the or methods. + The type of the page corresponding to the key. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/windows8/GalaSoft.MvvmLight.xml @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..ea1acacba47b367c3b16e466e4b4f4656dd3f1ca GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.xml b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.xml new file mode 100644 index 0000000..2a650e7 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.Platform.xml @@ -0,0 +1,199 @@ + + + + GalaSoft.MvvmLight.Platform + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + The object that provides handlers for the completed async event dispatch. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Android dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Windows 8 and Windows Phone Application 8.1 implementation of . + + + + + The key that is returned by the property + when the current Page is the root page. + + + + + The key that is returned by the property + when the current Page is not found. + This can be the case when the navigation wasn't managed by this NavigationService, + for example when it is directly triggered in the code behind, and the + NavigationService was not configured for this page type. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + The key that will be used later + in the or methods. + The type of the page corresponding to the key. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/windows81/GalaSoft.MvvmLight.xml @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..f252c953722d8561761deb66b83624ac4a3e881a GIT binary patch literal 17408 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 z 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 J*8g%I_&4Avg>wJ^ literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.xml b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.xml new file mode 100644 index 0000000..5034d7e --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.Platform.xml @@ -0,0 +1,406 @@ + + + + GalaSoft.MvvmLight.Platform + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Windows Phone dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Windows Phone Silverlight implementation of . + This implementation can be used in Windows Phone applications (not Xamarin Forms). + + + + + The key that is returned by the property + when the current Page is the root page. + + + + + Use this key name to retrieve the navigation parameter. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + The key that will be used later + in the or methods. + The URI of the page corresponding to the key. + + + + Allows a caller to get the navigation parameter corresponding + to the NavigationContext parameter. + + The + of the navigated page. + The navigation parameter. If no parameter is found, + returns null. + + + + Allows a caller to get the navigation parameter corresponding + to the NavigationContext parameter. + + The type of the retrieved parameter. + The + of the navigated page. + The navigation parameter casted to the proper type. + If no parameter is found, returns default(T). + + + + Occurs when a page navigation has happened. + + + + + Occurs when a page navigation is going to happen. + + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/GalaSoft.MvvmLight.xml @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp8/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp8/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..0153cf5c43cf6f308a8f89a589fb0b873f8cd027 GIT binary patch literal 53872 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..2d5471b85d7a0a040a625ca1e35a606a47293ae0 GIT binary patch literal 17408 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.xml b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.xml new file mode 100644 index 0000000..29dc077 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.Platform.xml @@ -0,0 +1,406 @@ + + + + GalaSoft.MvvmLight.Platform + + + + + This can be + used to bind any event on any FrameworkElement to an . + Typically, this element is used in XAML to connect the attached element + to a command located in a ViewModel. This trigger can only be attached + to a FrameworkElement or a class deriving from FrameworkElement. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + + + + The dependency property's name. + + + + + The dependency property's name. + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Identifies the dependency property + + + + + Called when this trigger is attached to a FrameworkElement. + + + + + This method is here for compatibility + with the Silverlight 3 version. + + The command that must be executed when + this trigger is invoked. + + + + Identifies the dependency property. + + + + + Identifies the dependency property. + + + + + Provides a simple way to invoke this trigger programatically + without any EventArgs. + + + + + Executes the trigger. + To access the EventArgs of the fired event, use a RelayCommand<EventArgs> + and leave the CommandParameter and CommandParameterValue empty! + + The EventArgs of the fired event. + + + + Gets or sets the ICommand that this trigger is bound to. This + is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This is a DependencyProperty. + + + + + Gets or sets an object that will be passed to the + attached to this trigger. This property is here for compatibility + with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. If this property + is false, the element will not be disabled when the command's + CanExecute method changes. This is a DependencyProperty. + + + + + Gets or sets a value indicating whether the attached element must be + disabled when the property's CanExecuteChanged + event fires. If this property is true, and the command's CanExecute + method returns false, the element will be disabled. This property is here for + compatibility with the Silverlight version. This is NOT a DependencyProperty. + For databinding, use the property. + + + + + Specifies whether the EventArgs of the event that triggered this + action should be passed to the bound RelayCommand. If this is true, + the command should accept arguments of the corresponding + type (for example RelayCommand<MouseButtonEventArgs>). + + + + + Gets or sets a converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. + + + + + Gets or sets a parameters for the converter used to convert the EventArgs when using + . If PassEventArgsToCommand is false, + this property is never used. This is a dependency property. + + + + + Gets or sets a value indicating if the command should be invoked even + if the attached control is disabled. This is a dependency property. + + + + + The definition of the converter used to convert an EventArgs + in the class, if the + property is true. + Set an instance of this class to the + property of the EventToCommand instance. + + + + + The method used to convert the EventArgs instance. + + An instance of EventArgs passed by the + event that the EventToCommand instance is handling. + An optional parameter used for the conversion. Use + the property + to set this value. This may be null. + The converted value. + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + An object, which is returned immediately after BeginInvoke is called, that can be used to interact + with the delegate as it is pending execution in the event queue. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + + Windows Phone Silverlight implementation of . + This implementation can be used in Windows Phone applications (not Xamarin Forms). + + + + + The key that is returned by the property + when the current Page is the root page. + + + + + Use this key name to retrieve the navigation parameter. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + The key that will be used later + in the or methods. + The URI of the page corresponding to the key. + + + + Allows a caller to get the navigation parameter corresponding + to the NavigationContext parameter. + + The + of the navigated page. + The navigation parameter. If no parameter is found, + returns null. + + + + Allows a caller to get the navigation parameter corresponding + to the NavigationContext parameter. + + The type of the retrieved parameter. + The + of the navigated page. + The navigation parameter casted to the proper type. + If no parameter is found, returns default(T). + + + + Occurs when a page navigation has happened. + + + + + Occurs when a page navigation is going to happen. + + + + + The key corresponding to the currently displayed page. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Windows Phone dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Windows Phone is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.xml b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.xml new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/GalaSoft.MvvmLight.xml @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wp81/System.Windows.Interactivity.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wp81/System.Windows.Interactivity.dll new file mode 100644 index 0000000000000000000000000000000000000000..0153cf5c43cf6f308a8f89a589fb0b873f8cd027 GIT binary patch literal 53872 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.XML b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.XML new file mode 100644 index 0000000..ff36ba0 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.XML @@ -0,0 +1,460 @@ + + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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 + + + GalaSoft.MvvmLight.Platform + + + + + Helper class for dispatcher operations on the UI thread. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + Invokes an action asynchronously on the UI thread. + + The action that must be executed. + The object that provides handlers for the completed async event dispatch. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + In a Silverlight application, call this method in the + Application_Startup event handler, after the MainPage is constructed. + In WPF, call this method on the static App() constructor. + + + + + Resets the class by deleting the + + + + + Gets a reference to the UI thread's dispatcher, after the + method has been called on the UI thread. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Android dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Windows 8 and Windows Phone Application 8.1 implementation of . + + + + + The key that is returned by the property + when the current Page is the root page. + + + + + The key that is returned by the property + when the current Page is not found. + This can be the case when the navigation wasn't managed by this NavigationService, + for example when it is directly triggered in the code behind, and the + NavigationService was not configured for this page type. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page. + Make sure to call the + method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + When this method is called for + a key that has not been configured earlier. + + + + Adds a key/page pair to the navigation service. + + The key that will be used later + in the or methods. + The type of the page corresponding to the key. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..bb6f9198e98c3646867b2ed422b6f275eef86437 GIT binary patch literal 16896 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

OrFw1vUcIDj{I>A;QLk483|Dw`3Xk8Z=?Y-T$h za4ue*gvXD$(OZU2kSA2l=hn)`?}5l5u6n;#SvGz@dQPcYbwH=e@c4s_`TqFGzTKCs zdil<>*@_}83#`5c zUVW89Yi8Kn%Zrz&b#k{)5XI~dEO+q~xsm^d+_I3qaWh zOUYtoR<$bB^h->K7ew|>PUcy~zE}lcSXp^W3Ps3D`lmUky;3vAPy4V6o?`+R3BMb4 zDdhLM!u8?t)8Vyn+v*Zs;Y>fvb%(QB8l3Q`i&&zwu~M<{&STB`aPd+IuSV$`et5X6QSq&BAizsagjJwhI*R+D3D&;6@*gF!{C zKSI@=k7B5l!@aOi4IfpiXL;Qaf!Sr;{A#?MMlojV%V9zTVm?{d$ym6>9_Z+>MWJeY zd)7ISNgFuj*4b|qu0FUn+Ne->s3QLY$Ucg1$NQi%dz3E2bg=3Q&6^?6&I?{_O3o=X z{-T5Hah$L)V>)N*xs0CV;}&nXbbcR^s^=0SKu|q4gm)^~H}PSO|Ig8$&P{c?qe2%p zphf`|jq3ESWa^-iP4R0W9fwODThAD_)lt2B053uHSk}~TyALn6;~WObST=7x8Wwg4UZ4t2TlrIk$-KaKXppKsEid2 z4eRPxG~ndJGh)twLLMVsk6%uakH0tJ4;u1)0WDybZnbJpHa4_9lg=Mh`31otQ#5w| zj~0)t24zDxF8msHXV-?VcNeG+mb`RL+k*#Bc)r}Y_j5cTzJ6c+{r$c!d84(@(YEkr ze+E+iWxpQT)48^B*}hEghxXxZk`XhF_hOF@C3@MY|3#lWb`_NQJ#Om-ytw83KP;ji zd>61GmD+}kqCqo`j5Xvt59WS%3C8o!*8Yb+{HrL!Z=Ps;@&uAT*ilcXGvBqi_U)G0$FG_2GfRA)aKCwhcVYa0&ko>gD(8+J zwS3%wR;Jnn+&17+AT@@4^d{_gQ`jZ*(S&#Q{NZ2B5DpPpaHO%jPT|gHAKouppNHHV zpsNC%a^T|AQU45*bm3`$-PYeK>SZ6$8Raa-@+n{te|*@0#X+89HqPX9AQI4nMo0mx29!p;hSR0~a5v_$u4oaP{ zs7_i;NkH-;IgPN*d;&6N?Cr$a!P1t;c0pPSCm%ll@Lc`q;;l}{Uc(Hg{M`H)Xr ze10+HM8jM>3!g#_{IOj;rWbeC**f<)hs2yv2f%At#0OIAgkxexjwD;bel9-auxGQN z#vqkF$zwR$rtq=Gy)u^dW36=jzOECI+loW0{2YlsN-OfQ zg_-)qcIybsma#rMezP|Wzp&oyH=SB=v6pg)&wBih^a}W$|DxcsWSO=s{?;B9o%Z9G zgi1dDHi)Ki=$(WFC$cl?5=Fio#NQz7abgplmWBM^MT151cSC*_z9_7R)zEDPt_EBy z=}NR$0J2^>#&w9DJSHvr7rZmoH}6lMD6$}hKm1-7zEPk%Ud4-KUQt8vKU;2P8p$e~ zOw;KU^qM-iZogW%cwAPIK-9WM_2fAD|X1D)3I T*dMZ%!~bnt{$KlF*aQCwQk=_g literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.pri b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.Platform.pri new file mode 100644 index 0000000000000000000000000000000000000000..242366ef0c541f0d2b46a5c2d98eb2773ea88541 GIT binary patch literal 1248 zcmeHHu};G<5PeBoq;7lwLnc^&!paZ808%9ekWdwcCLxh<5|WDcGx&sjS=5=Gr4kD7 z?3ge>2S&u5?7Q5vFL&p&RjK@odI)#`YK|e=mI8N*3&Log`DqsCGckSAEj5kP zK^Rr@Xw~C_U06J+=1HW2ndi}Bs21UL`^%{ERZ#eTzrQB-;{N=9@h{|PcJ*v6Mt+^? ztfOZ0)@+MgVit0B{>J;jm}mp6E`GM<$AC0BIKUn?8^Qkl>&WT~6^;;~Ag^$S3HhAg zj~v&?5o3X4T;Z9laETNTNVILL*DSaqM@ekLKm2Z|iPFSp;}Usd0bsXRdrk6}r1bfJ zbAEDmLWi!S>(*D!*zLSzR#}((jn+fvv}9$b%rz$#F}qW{{9pdD3djvB-Um-(jCr?& mO)uKJ#wQ6QjvWrsg+xk^itO49(vQ+}&8BVE1mxM0ckKf-?05wL literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.XML b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.XML new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.XML @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + +

+ A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/wpa81/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.XML b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.XML new file mode 100644 index 0000000..ff36ba0 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.XML @@ -0,0 +1,460 @@ + + + + GalaSoft.MvvmLight.Extras + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + When used with the SimpleIoc container, specifies which constructor + should be used to instantiate when GetInstance is called. + If there is only one constructor in the class, this attribute is + not needed. + + + + + A very simple IOC container with basic functionality needed to register and resolve + instances. If needed, this class can be replaced by another more elaborate + IOC container implementing the IServiceLocator interface. + The inspiration for this class is at https://gist.github.com/716137 but it has + been extended with additional features. + + + + + Checks whether at least one instance of a given class is already created in the container. + + The class that is queried. + True if at least on instance of the class is already created, false otherwise. + + + + Checks whether the instance with the given key is already created for a given class + in the container. + + The class that is queried. + The key that is queried. + True if the instance with the given key is already registered for the given class, + false otherwise. + + + + Gets a value indicating whether a given type T is already registered. + + The type that the method checks for. + True if the type is registered, false otherwise. + + + + Gets a value indicating whether a given type T and a give key + are already registered. + + The type that the method checks for. + The key that the method checks for. + True if the type and key are registered, false otherwise. + + + + Registers a given type for a given interface. + + The interface for which instances will be resolved. + The type that must be used to create instances. + + + + Registers a given type for a given interface with the possibility for immediate + creation of the instance. + + The interface for which instances will be resolved. + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given type. + + The type that must be used to create instances. + + + + Registers a given type with the possibility for immediate + creation of the instance. + + The type that must be used to create instances. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + + + + Registers a given instance for a given type with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + If true, forces the creation of the default + instance of the provided class. + + + + Registers a given instance for a given type and a given key. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + + + + Registers a given instance for a given type and a given key with the possibility for immediate + creation of the instance. + + The type that is being registered. + The factory method able to create the instance that + must be returned when the given type is resolved. + The key for which the given instance is registered. + If true, forces the creation of the default + instance of the provided class. + + + + Resets the instance in its original states. This deletes all the + registrations. + + + + + Unregisters a class from the cache and removes all the previously + created instances. + + The class that must be removed. + + + + Removes the given instance from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The instance that must be removed. + + + + Removes the instance corresponding to the given key from the cache. The class itself remains + registered and can be used to create other instances. + + The type of the instance to be removed. + The key corresponding to the instance that must be removed. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Registering a class or a factory does not automatically + create the corresponding instance! To create an instance, either register + the class or the factory with createInstanceImmediately set to true, + or call the GetInstance method before calling GetAllCreatedInstances. + Alternatively, use the GetAllInstances method, which auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the already created instances of the given type. + + + + Gets the service object of the specified type. + + If the type serviceType has not + been registered before calling this method. + + A service object of type . + + An object that specifies the type of service object to get. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get all the created instances of a given type available in the + cache. Calling this method auto-creates default + instances for all registered classes. + + The class of which all instances + must be returned. + All the instances of the given type. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type serviceType has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. If no instance had been instantiated + before, a new instance will be created. If an instance had already + been created, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance + must be returned. + An instance of the given type. + + + + Provides a way to get an instance of a given type corresponding + to a given key. If no instance had been instantiated with this + key before, a new instance will be created. If an instance had already + been created with the same key, that same instance will be returned. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + Provides a way to get an instance of a given type. This method + always returns a new instance and doesn't cache it in the IOC container. + + If the type TService has not + been registered before calling this method. + The class of which an instance must be returned. + The key uniquely identifying this instance. + An instance corresponding to the given type and key. + + + + This class' default instance. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.dll b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Extras.dll new file mode 100644 index 0000000000000000000000000000000000000000..9749219d4b9a7299883592e84bae75811e37c109 GIT binary patch literal 17920 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
+ + + GalaSoft.MvvmLight.Platform + + + + + Base class for bindings in Xamarin.iOS and Xamarin.Android. + + + + + The source at the "top" of the property chain. + + + + + The target at the "top" of the property chain. + + + + + Instructs the Binding instance to stop listening to value changes and to + remove all listeneners. + + + + + Forces the Binding's value to be reevaluated. The target value will + be set to the source value. + + + + + Forces the Binding's value to be reevaluated. The source value will + be set to the target value. + + + + + Occurs when the value of the databound property changes. + + + + + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + + Gets the source object for the binding. + + + + + Gets the target object for the binding. + + + + + Creates a binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + + + + Initializes a new instance of the Binding class for which the source and target properties + are located in different objects. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property for the binding. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + The name of the target property for the binding. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + Initializes a new instance of the Binding class for which the source and target properties + are located in different objects. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + + + + Defines a custom conversion method for a binding. To be used when the + binding's source property is of a different type than the binding's + target property, and the conversion cannot be done automatically (simple + values). + + A func that will be called with the source + property's value, and will return the target property's value. + The Binding instance. + + + + Defines a custom conversion method for a two-way binding. To be used when the + binding's target property is of a different type than the binding's + source property, and the conversion cannot be done automatically (simple + values). + + A func that will be called with the source + property's value, and will return the target property's value. + The Binding instance. + This method is inactive on OneTime or OneWay bindings. + + + + Instructs the Binding instance to stop listening to value changes and to + remove all listeneners. + + + + + Forces the Binding's value to be reevaluated. The target value will + be set to the source value. + + + + + Forces the Binding's value to be reevaluated. The source value will + be set to the target value. + + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + source control. + + + + Define that the binding should be evaluated when the bound control's source property changes. + Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to specify that the binding must be updated when the property changes. + + At this point, this method is inactive on iOS. Use + instead. + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Defines the binding's update mode. Use + to update the binding when + the source control loses the focus. You can also use + to update the binding + when the source control's property changes. + NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + instead. + + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound source object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Use this method when the event requires a specific EventArgs type + instead of the standard EventHandler. + The type of the EventArgs used by this control's event. + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime binding. Such bindings cannot be updated. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + source control. + + + + Define that the binding should be evaluated when the bound control's target property changes. + Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to specify that the binding must be updated when the property changes. + + At this point, this method is inactive on iOS. Use + instead. + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the target object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Defines the binding's update mode. Use + to update the binding when + the source control loses the focus. You can also use + to update the binding + when the source control's property changes. + NOTE: At this time the PropertyChanged mode is inactive on iOS. Use + instead. + + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime or a OneWay binding. This exception can + also be thrown when the source object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + target control. + + + + Define when the binding should be evaluated when the bound target object + is a control. Because Xamarin controls are not DependencyObjects, the + bound property will not automatically update the binding attached to it. Instead, + use this method to define which of the control's events should be observed. + + Use this method when the event requires a specific EventArgs type + instead of the standard EventHandler. + The type of the EventArgs used by this control's event. + The name of the event that should be observed + to update the binding's value. + The Binding instance. + When this method is called + on a OneTime or OneWay binding. This exception can + also be thrown when the target object is null or has already been + garbage collected before this method is called. + When the eventName parameter is null + or is an empty string. + When the requested event does not exist on the + target control. + + + + Defines an action that will be executed every time that the binding value + changes. + + The action that will be executed when the binding changes. + The Binding instance. + When WhenSourceChanges is called on + a binding which already has a target property set. + + + + Occurs when the value of the databound property changes. + + + + + Gets the current value of the binding. + + + + + Provides event listening support for classes that expect to receive events + through the WeakEvent pattern and a WeakEventManager. + + + + + Receives events from the centralized event manager. + + The type of the WeakEventManager calling this method. + Object that originated the event. + Event data. + true if the listener handled the event. It is considered an error by the + WeakEventManager handling in WPF to register a listener for an event that the + listener does not handle. Regardless, the method should return false if it receives + an event that it does not recognize or handle. + + + + + The mode of the . + + + + + A default binding is a one way binding. + + + + + A one time binding. The binding's value will be set when the + binding is created but subsequent changes will be ignored/ + + + + + A one way binding, where the changes to the source + property will update the target property, but changes to the + target property don't affect the source property. + + + + + A two way binding, where the changes to the source + property will update the target property, and vice versa. + + + + + Defines extension methods used to add data bindings and commands between Xamarin + Android and iOS elements. + + + + + Sets a data binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + This class allows for a different TSource and TTarget and is able to perform simple + type conversions automatically. This is useful if the source property and the target + property are of different type. + If the type conversion is complex, please use the + and methods to configure the binding. + It is very possible that TSource and TTarget are the same type in which case no conversion occurs. + The type of the property that is being databound before conversion. + The type of the property that is being databound after conversion. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Creates a with a source property but without a target. + This type of bindings is useful for the + and methods, to use as CommandParameter + binding. + + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The type of the bound property. + The created binding instance. + + + + Sets a data binding between two properties of the same object. If the source implements INotifyPropertyChanged, has observable properties + and the BindingMode is OneWay or TwoWay, the target property will be notified of changes to the source property. If + the target implements INotifyPropertyChanged, has observable properties and the BindingMode is + TwoWay, the source will also be notified of changes to the target's properties. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + An expression pointing to the target property. It can be + a simple expression "() => [target].MyProperty" or a composed expression "() => [target].SomeObject.SomeOtherObject.SomeProperty". + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + An expression pointing to the source property. It can be + a simple expression "() => [source].MyProperty" or a composed expression "() => [source].SomeObject.SomeOtherObject.SomeProperty". + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a data binding between two properties. If the source implements INotifyPropertyChanged, the source property raises the PropertyChanged event + and the BindingMode is OneWay or TwoWay, the target property will be synchronized with the source property. If + the target implements INotifyPropertyChanged, the target property raises the PropertyChanged event and the BindingMode is + TwoWay, the source property will also be synchronized with the target property. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + The target of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is TwoWay, the source will be notified of changes to the source property. + The name of the target property. This must be a simple name, without dots. + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property. This must be a simple name, without dots. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a data binding between two properties of the same object. If the source implements INotifyPropertyChanged, has observable properties + and the BindingMode is OneWay or TwoWay, the target property will be notified of changes to the source property. If + the target implements INotifyPropertyChanged, has observable properties and the BindingMode is + TwoWay, the source will also be notified of changes to the target's properties. + + The type of the source property that is being databound. + The type of the target property that is being databound. If the source type + is not the same as the target type, an automatic conversion will be attempted. However only + simple types can be converted. For more complex conversions, use the + and methods to define custom converters. + The name of the target property. This must be a simple name, without dots. + The source of the binding. If this object implements INotifyPropertyChanged and the + BindingMode is OneWay or TwoWay, the target will be notified of changes to the target property. + The name of the source property. This must be a simple name, without dots. + The mode of the binding. OneTime means that the target property will be set once (when the binding is + created) but that subsequent changes will be ignored. OneWay means that the target property will be set, and + if the PropertyChanged event is raised by the source, the target property will be updated. TwoWay means that the source + property will also be updated if the target raises the PropertyChanged event. Default means OneWay if only the source + implements INPC, and TwoWay if both the source and the target implement INPC. + The new Binding instance. + + + + Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method + should be used when the event uses an EventHandler<TEventArgs>. + + The type of the CommandParameter that will be passed to the RelayCommand. + The type of the event's arguments. + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + A Binding instance subscribed to + the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + will be observed and changes will be passed to the command, for example to update the CanExecute. + + + + Sets a generic RelayCommand to an object and actuate the command when a specific event is raised. This method + can only be used when the event uses a standard EventHandler. + + The type of the CommandParameter that will be passed to the RelayCommand. + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + A Binding instance subscribed to + the CommandParameter that will passed to the RelayCommand. Depending on the Binding, the CommandParameter + will be observed and changes will be passed to the command, for example to update the CanExecute. + + + + Sets a non-generic RelayCommand to an object and actuate the command when a specific event is raised. This method + can only be used when the event uses a standard EventHandler. + + The element to which the command is added. + The name of the event that will be subscribed to to actuate the command. + The command that must be added to the element. + + + + Creates a new for a given . + + The type of the items contained in the collection. + The collection that the adapter will be created for. + A delegate to a method creating or reusing a . + The cell will then be passed to the bindCellDelegate + delegate to set the elements' properties. + A delegate to a method taking a + and setting its elements' properties according to the item + passed as second parameter. + The cell must be created first in the createCellDelegate + delegate. + A controller adapted to the collection passed in parameter. + + + + Creates a new for a given . + + The type of the items contained in the list. + The list that the adapter will be created for. + A delegate to a method creating or reusing a . + The cell will then be passed to the bindCellDelegate + delegate to set the elements' properties. + A delegate to a method taking a + and setting its elements' properties according to the item + passed as second parameter. + The cell must be created first in the createCellDelegate + delegate. + A controller adapted to the collection passed in parameter. + + + + Provides an implementation so that you can use the + "weak event listener" pattern to attach listeners + for the event. + + + + + Adds the specified listener to the list of listeners on the specified source. + + The object with the event. + The object to add as a listener. + The name of the property that exists on + source upon which to listen for changes. + + + + Removes the specified listener from the list of listeners on the + specified source. + + The object to remove as a listener. + + + + Begin listening for the event on + the provided source. + + The object on which to start listening + for . + + + + Stop listening for the event on the + provided source. + + The object on which to start listening for + . + + + + The method that handles the event. + + The source of the event. + A that + contains the event data. + + + + Private method to add the specified listener to the list of listeners + on the specified source. + + The object with the event. + The object to add as a listener. + The name of the property that exists + on source upon which to listen for changes. + + + + Private method to remove the specified listener from the list of listeners + on the specified source. + + The object to remove as a listener. + + + + Get the current instance of + + + + + Defines how a is updated by a source control. + + + + + Defines that the binding should be updated when the control + loses the focus. + + + + + Defines that the binding should be updated when the control's + bound property changes. + + + + + A that can be used as an iOS view. After setting + the and the and + properties, the controller can be loaded. If the DataSource is an , + changes to the collection will be observed and the UI will automatically be updated. + + Credits go to Frank A Krueger for the initial idea and the inspiration + for this class. Frank gracefully accepted to let me add his code (with a few changes) + to MVVM Light. + https://gist.github.com/praeclarum/10024108 + + The type of the items contained in the . + + + + The property's name. + + + + + Initializes a new instance of this class with a plain style. + + + + + Initializes a new instance of this class with a specific style. + + The style that will be used for this controller. + + + + Overrides the method. + + + + + Binds a to an item's properties. + If a is available, this delegate will be used. + If not, a simple text will be shown. + + The cell that will be prepared. + The item that should be used to set the cell up. + The for this cell. + + + + Creates a corresponding to the reuseId. + If it is set, the delegate will be used. + + A reuse identifier for the cell. + The created cell. + + + + Created the ObservableTableSource for this controller. + + The created ObservableTableSource. + + + + Called when a row gets selected. Raises the SelectionChanged event. + + The selected item. + The NSIndexPath for the selected row. + + + + Raises the event. + + The name of the property that changed. + + + + Occurs when a new item gets selected in the list. + + + + + When set, specifies which animation should be used when rows change. + + + + + A delegate to a method taking a + and setting its elements' properties according to the item + passed as second parameter. + The cell must be created first in the + delegate. + + + + + A delegate to a method creating or reusing a . + The cell will then be passed to the + delegate to set the elements' properties. + + + + + The data source of this list controller. + + + + + When set, specifieds which animation should be used when a row is deleted. + + + + + When set, returns the height of the view that will be used for the TableView's footer. + + + + + + When set, returns the height of the view that will be used for the TableView's header. + + + + + + When set, returns a view that can be used as the TableView's footer. + + + + + + When set, returns a view that can be used as the TableView's header. + + + + + + Gets the TableView's selected item. + Changes to that property's value raise the PropertyChanged event. + + + + + The source of the TableView. + + + + + Overrides . + Sets or gets the controllers TableView. If you use a TableView + placed in the UI manually, use this property's setter to assign + your TableView to this controller. + + + + + Occurs when a property of this instance changes. + + + + + A that handles changes to the underlying + data source if this data source is an . + + The type of the items that the data source contains. + In the current implementation, only one section is supported. + + + + Initializes an instance of this class. + + The controller associated to this instance. + + + + Attempts to dequeue or create a cell for the list. + + The TableView that is the cell's parent. + The NSIndexPath for the cell. + The created or recycled cell. + + + + When called, checks if the ObservableTableViewController{T}.GetHeightForFooter + delegate has been set. If yes, calls that delegate to get the TableView's footer height. + + The active TableView. + The section index. + The footer's height. + In the current implementation, only one section is supported. + + + + When called, checks if the ObservableTableViewController{T}.GetHeightForHeader + delegate has been set. If yes, calls that delegate to get the TableView's header height. + + The active TableView. + The section index. + The header's height. + In the current implementation, only one section is supported. + + + + When called, checks if the ObservableTableViewController{T}.GetViewForFooter + delegate has been set. If yes, calls that delegate to get the TableView's footer. + + The active TableView. + The section index. + The UIView that should appear as the section's footer. + In the current implementation, only one section is supported. + + + + When called, checks if the ObservableTableViewController{T}.GetViewForHeader + delegate has been set. If yes, calls that delegate to get the TableView's header. + + The active TableView. + The section index. + The UIView that should appear as the section's header. + In the current implementation, only one section is supported. + + + + Overrides the method. + + The active TableView. + The number of sections of the UITableView. + In the current implementation, only one section is supported. + + + + Overrides the method + and notifies the associated + that a row has been selected, so that the corresponding events can be raised. + + The active TableView. + The row's NSIndexPath. + + + + Overrides the method + and returns the number of rows in the associated data source. + + The active TableView. + The active section. + The number of rows in the data source. + In the current implementation, only one section is supported. + + + + Helper class for dispatcher operations on the UI thread in Android. + + + + + Executes an action on the UI thread. If this method is called + from the UI thread, the action is executed immendiately. If the + method is called from another thread, the action will be enqueued + on the UI thread's dispatcher and executed asynchronously. + For additional operations on the UI thread, you can get a + reference to the UI thread's dispatcher thanks to the property + . + + The action that will be executed on the UI + thread. + + + + This method should be called once on the UI thread to ensure that + the property is initialized. + + + + + Resets the class by deleting the + + + + + Gets a reference to a NSObject running on the UI thread, after the + method has been called on that thread. + + + + + A base class to be used with the when + using Storyboards. + + + + + A constructor used when creating managed representations of unmanaged objects; + Called by the runtime. + + Pointer (handle) to the unmanaged object. + Check the remarks on + + + + A constructor that initializes the object from the data stored in the unarchiver + object. + + The unarchiver object. + Check the remarks on + + + + Constructor to call on derived classes to skip initialization and merely + allocate the object. + + Unused sentinel value, pass NSObjectFlag.Empty. + Check the remarks on + + + + Initializes an instance of this class. + + The NIB name, or null. + This parameter can be null. + The bundle where the search for the NIB takes place, + if you pass null, this searches for the NIB on the main bundle. + This parameter can be null. + Check the remarks on + + + + Initializes an instance of this class. + + + + + The parameter passed to this controller by the + method. + + + + + An implementation of allowing + to display simple dialogs to the user. Note that this class + uses the built in Windows Phone dialogs which may or may not + be sufficient for your needs. Using this class is easy + but feel free to develop your own IDialogService implementation + if needed. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in iOS is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in iOS is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + Displaying dialogs in Android is synchronous. As such, + this method will be executed synchronously even though it can be awaited + for cross-platform compatibility purposes. + + + + Xamarin iOS implementation of . + This implementation can be used in Xamarin iOS applications (not Xamarin Forms). + + For this navigation service to work properly, it should be initialized + using the method, with the application's + . + + + + The key that is returned by the property + when the current UIViewController is the root controller. + + + + + The key that is returned by the property + when the current UIViewController is not found. + This can be the case when the navigation wasn't managed by this NavigationService, + for example when it is directly triggered in the Storyboard. + + + + + If possible, discards the current page and displays the previous page + on the navigation stack. + + + + + Displays a new page corresponding to the given key. + Make sure to call the + or + method first. + + The key corresponding to the page + that should be displayed. + When this method is called for + a key that has not been configured earlier. + + + + Displays a new page corresponding to the given key, + and passes a parameter to the new page's constructor. + Make sure to call the + or + method first. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page's constructor. + When this method is called for + a key that has not been configured earlier. + When this method is called for + a page that doesn't have a suitable constructor (i.e. + a constructor with a parameter corresponding to the + navigation parameter's type). + + + + Adds a key/page pair to the navigation service. + This method will create a new controller on demand, using + reflection. You can use + if you need more fine-grained control over the controller's creation. + + The key that will be used later + in the or methods. + The type of the controller corresponding to the key. + + + + Adds a key/page pair to the navigation service. + This method allows the caller to have fine grained control over the controller's + creation. + + The key that will be used later + in the or methods. + A Func returning the controller corresponding + to the given key. + + + + Adds a key/page pair to the navigation service. + This method should be used when working with Storyboard for the UI. + + The key that will be used later + in the or methods. + The idea of the UIViewController + in the Storyboard. Use the storyboardIdentifier/restorationIdentifier property + in the *.storyboard document. + + + + Initialized the navigation service. This method must be called + before the or + methods are called. + + The application's navigation controller. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Platform.dll b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.Platform.dll new file mode 100644 index 0000000000000000000000000000000000000000..f4e2a7f4818e367600cd71e69c2ea226af54cf8a GIT binary patch literal 40448 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 I|2qr(e>ODg*#H0l literal 0 HcmV?d00001 diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.XML b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.XML new file mode 100644 index 0000000..efec506 --- /dev/null +++ b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.XML @@ -0,0 +1,1703 @@ + + + + GalaSoft.MvvmLight + + + + + A command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class does not allow you to accept command parameters in the + Execute and CanExecute callback methods. + + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + This parameter will always be ignored. + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + This parameter will always be ignored. + + + + Occurs when changes occur that affect whether the command should execute. + + + + + A generic command whose sole purpose is to relay its functionality to other + objects by invoking delegates. The default return value for the CanExecute + method is 'true'. This class allows you to accept command parameters in the + Execute and CanExecute callback methods. + + The type of the command parameter. + If you are using this class in WPF4.5 or above, you need to use the + GalaSoft.MvvmLight.CommandWpf namespace (instead of GalaSoft.MvvmLight.Command). + This will enable (or restore) the CommandManager class which handles + automatic enabling/disabling of controls based on the CanExecute delegate. + + + + Initializes a new instance of the RelayCommand class that + can always execute. + + The execution logic. + If the execute argument is null. + + + + Initializes a new instance of the RelayCommand class. + + The execution logic. + The execution status logic. + If the execute argument is null. + + + + Raises the event. + + + + + Defines the method that determines whether the command can execute in its current state. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + true if this command can be executed; otherwise, false. + + + + Defines the method to be called when the command is invoked. + + Data used by the command. If the command does not require data + to be passed, this object can be set to a null reference + + + + Occurs when changes occur that affect whether the command should execute. + + + + + Helper class for platform detection. + + + + + Helper class used when an async method is required, + but the context is synchronous. + + + + + Gets the empty task. + + + + + Helper class for platform and feature detection. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + + + + Executes an action. + + A parameter passed as an object, + to be casted to the appropriate type. + + + + Deletes all references, which notifies the cleanup method + that this entry must be deleted. + + + + + The target of the WeakAction. + + + + + This interface is meant for the class and can be + useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + + + + Executes a Func and returns the result. + + A parameter passed as an object, + to be casted to the appropriate type. + The result of the operation. + + + + Stores an without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + + + + Initializes an empty instance of the class. + + + + + Initializes a new instance of the class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. + + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakAction's + method passed in the constructor. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets or sets a WeakReference to this WeakAction's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakAction. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the WeakAction is static or not. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Action's owner. This object is stored as a + . + + + + + The target of the weak reference. + + + + + Stores an Action without causing a hard reference + to be created to the Action's owner. The owner can be garbage collected at any time. + + The type of the Action's parameter. + + + + Initializes a new instance of the WeakAction class. + + The action that will be associated to this instance. + + + + Initializes a new instance of the WeakAction class. + + The action's owner. + The action that will be associated to this instance. + + + + Executes the action. This only happens if the action's owner + is still alive. The action's parameter is set to default(T). + + + + + Executes the action. This only happens if the action's owner + is still alive. + + A parameter to be passed to the action. + + + + Executes the action with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakAction{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the action after + being casted to T. + + + + Sets all the actions that this WeakAction contains to null, + which is a signal for containing objects that this WeakAction + should be deleted. + + + + + Gets the name of the method that this WeakAction represents. + + + + + Gets a value indicating whether the Action's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Stores a Func<T> without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the result of the Func that will be stored + by this weak reference. + + + + Initializes an empty instance of the WeakFunc class. + + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the action. This only happens if the Func's owner + is still alive. + + The result of the Func stored as reference. + + + + Sets the reference that this instance stores to null. + + + + + Gets or sets the corresponding to this WeakFunc's + method passed in the constructor. + + + + + Get a value indicating whether the WeakFunc is static or not. + + + + + Gets the name of the method that this WeakFunc represents. + + + + + Gets or sets a WeakReference to this WeakFunc's action's target. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets or sets a WeakReference to the target passed when constructing + the WeakFunc. This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Gets the Func's owner. This object is stored as a + . + + + + + Gets the owner of the Func that was passed as parameter. + This is not necessarily the same as + , for example if the + method is anonymous. + + + + + Stores an Func without causing a hard reference + to be created to the Func's owner. The owner can be garbage collected at any time. + + The type of the Func's parameter. + The type of the Func's return value. + + + + Initializes a new instance of the WeakFunc class. + + The Func that will be associated to this instance. + + + + Initializes a new instance of the WeakFunc class. + + The Func's owner. + The Func that will be associated to this instance. + + + + Executes the Func. This only happens if the Func's owner + is still alive. The Func's parameter is set to default(T). + + The result of the Func stored as reference. + + + + Executes the Func. This only happens if the Func's owner + is still alive. + + A parameter to be passed to the action. + The result of the Func stored as reference. + + + + Executes the Func with a parameter of type object. This parameter + will be casted to T. This method implements + and can be useful if you store multiple WeakFunc{T} instances but don't know in advance + what type T represents. + + The parameter that will be passed to the Func after + being casted to T. + The result of the execution as object, to be casted to T. + + + + Sets all the funcs that this WeakFunc contains to null, + which is a signal for containing objects that this WeakFunc + should be deleted. + + + + + Gets or sets the name of the method that this WeakFunc represents. + + + + + Gets a value indicating whether the Func's owner is still alive, or if it was collected + by the Garbage Collector already. + + + + + Defines a common interface for classes that should be cleaned up, + but without the implications that IDisposable presupposes. An instance + implementing ICleanup can be cleaned up without being + disposed and garbage collected. + + + + + Cleans up the instance, for example by saving its state, + removing resources, etc... + + + + + Passes a generic value (Content) to a recipient. + + The type of the Content property. + + + + Base class for all messages broadcasted by the Messenger. + You can create your own message types by extending this class. + + + + + Initializes a new instance of the MessageBase class. + + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + + + + Initializes a new instance of the MessageBase class. + + The message's original sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + Gets or sets the message's sender. + + + + + Gets or sets the message's intended target. This property can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + + + + + Initializes a new instance of the GenericMessage class. + + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message content. + + + + Initializes a new instance of the GenericMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The message content. + + + + Gets or sets the message's content. + + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + The Messenger is a class allowing objects to exchange messages. + + + + + Registers a recipient for a type of message TMessage. The action + parameter will be executed when a corresponding message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + The action that will be executed when a message + of type TMessage is sent. + + + + Registers a recipient for a type of message TMessage. + The action parameter will be executed when a corresponding + message is sent. See the receiveDerivedMessagesToo parameter + for details on how messages deriving from TMessage (or, if TMessage is an interface, + messages implementing TMessage) can be received too. + Registering a recipient does not create a hard reference to it, + so if this recipient is deleted, no memory leak is caused. + + The type of message that the recipient registers + for. + The recipient that will receive the messages. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + If true, message types deriving from + TMessage will also be transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage derive from OrderMessage, registering for OrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + Also, if TMessage is an interface, message types implementing TMessage will also be + transmitted to the recipient. For example, if a SendOrderMessage + and an ExecuteOrderMessage implement IOrderMessage, registering for IOrderMessage + and setting receiveDerivedMessagesToo to true will send SendOrderMessage + and ExecuteOrderMessage to the recipient that registered. + + The action that will be executed when a message + of type TMessage is sent. + + + + Sends a message to registered recipients. The message will + reach all recipients that registered for this message type + using one of the Register methods. + + The type of message that will be sent. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The type of recipients that will receive + the message. The message won't be sent to recipients of another type. + The message to send to registered recipients. + + + + Sends a message to registered recipients. The message will + reach only recipients that registered for this message type + using one of the Register methods, and that are + of the targetType. + + The type of message that will be sent. + The message to send to registered recipients. + A token for a messaging channel. If a recipient registers + using a token, and a sender sends a message using the same token, then this + message will be delivered to the recipient. Other recipients who did not + use a token when registering (or who used a different token) will not + get the message. Similarly, messages sent without any token, or with a different + token, will not be delivered to that recipient. + + + + Unregisters a messager recipient completely. After this method + is executed, the recipient will not receive any messages anymore. + + The recipient that must be unregistered. + + + + Unregisters a message recipient for a given type of messages only. + After this method is executed, the recipient will not receive messages + of type TMessage anymore, but will still receive other message types (if it + registered for them previously). + + The recipient that must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages only and for a given token. + After this method is executed, the recipient will not receive messages + of type TMessage anymore with the given token, but will still receive other message types + or messages with other tokens (if it registered for them previously). + + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The type of messages that the recipient wants + to unregister from. + + + + Unregisters a message recipient for a given type of messages and for + a given action. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage and for the given recipient (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Unregisters a message recipient for a given type of messages, for + a given action and a given token. Other message types will still be transmitted to the + recipient (if it registered for them previously). Other actions that have + been registered for the message type TMessage, for the given recipient and other tokens (if + available) will also remain available. + + The type of messages that the recipient wants + to unregister from. + The recipient that must be unregistered. + The token for which the recipient must be unregistered. + The action that must be unregistered for + the recipient and for the message type TMessage. + + + + Provides a way to override the Messenger.Default instance with + a custom instance, for example for unit testing purposes. + + The instance that will be used as Messenger.Default. + + + + Sets the Messenger's default (static) instance to null. + + + + + Provides a non-static access to the static method. + Sets the Messenger's default (static) instance to null. + + + + + Notifies the Messenger that the lists of recipients should + be scanned and cleaned up. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Scans the recipients' lists for "dead" instances and removes them. + Since recipients are stored as , + recipients can be garbage collected even though the Messenger keeps + them in a list. During the cleanup operation, all "dead" + recipients are removed from the lists. Since this operation + can take a moment, it is only executed when the application is + idle. For this reason, a user of the Messenger class should use + instead of forcing one with the + method. + + + + + Gets the Messenger's default instance, allowing + to register and send messages in a static manner. + + + + + Passes a string message (Notification) to a recipient. + Typically, notifications are defined as unique strings in a static class. To define + a unique string, you can use Guid.NewGuid().ToString() or any other unique + identifier. + + + + + Initializes a new instance of the NotificationMessage class. + + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + and + . + + + + + Initializes a new instance of the class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message with an + arbitrary number of parameters. + + A number of parameters that will + be passed to the callback method. + The object returned by the callback method. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + + + + Provides a message class with a built-in callback. When the recipient + is done processing the message, it can execute the callback to + notify the sender that it is done. Use the + method to execute the callback. The callback method has one parameter. + . + + The type of the callback method's + only parameter. + + + + Initializes a new instance of the + class. + + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Initializes a new instance of the + class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + An arbitrary string that will be + carried by the message. + The callback method that can be executed + by the recipient to notify the sender that the message has been + processed. + + + + Executes the callback that was provided with the message. + + A parameter requested by the message's + sender and providing additional information on the recipient's + state. + + + + Passes a string message (Notification) and a generic value (Content) to a recipient. + + The type of the Content property. + + + + Initializes a new instance of the NotificationMessage class. + + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Initializes a new instance of the NotificationMessage class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + A value to be passed to recipient(s). + A string containing any arbitrary message to be + passed to recipient(s) + + + + Gets a string containing any arbitrary message to be + passed to recipient(s). + + + + + Passes a string property name (PropertyName) and a generic value + ( and ) to a recipient. + This message type can be used to propagate a PropertyChanged event to + a recipient using the messenging system. + + The type of the OldValue and NewValue property. + + + + Basis class for the class. This + class allows a recipient to register for all PropertyChangedMessages without + having to specify the type T. + + + + + Initializes a new instance of the class. + + The message's sender. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The name of the property that changed. + + + + Gets or sets the name of the property that changed. + + + + + Initializes a new instance of the class. + + The message's sender. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Initializes a new instance of the class. + + The message's sender. + The message's intended target. This parameter can be used + to give an indication as to whom the message was intended for. Of course + this is only an indication, amd may be null. + The property's value before the change occurred. + The property's value after the change occurred. + The name of the property that changed. + + + + Gets the value that the property has after the change. + + + + + Gets the value that the property had before the change. + + + + + A base class for objects of which the properties must be observable. + + + + + Verifies that a property name exists in this ViewModel. This method + can be called before the property is used, for instance before + calling RaisePropertyChanged. It avoids errors when a property name + is changed but some places are missed. + + This method is only active in DEBUG mode. + The name of the property that will be + checked. + + + + Raises the PropertyChanged event if needed. + + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + (optional) The name of the property that + changed. + + + + Raises the PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + + + + Extracts the name of a property from an expression. + + The type of the property. + An expression returning the property's name. + The name of the property returned by the expression. + If the expression is null. + If the expression does not represent a property. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed. + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + (optional) The name of the property that + changed. + True if the PropertyChanged event has been raised, + false otherwise. The event is not raised if the old + value is equal to the new value. + + + + Occurs after a property value changes. + + + + + Provides access to the PropertyChanged event handler to derived classes. + + + + + A base class for the ViewModel classes in the MVVM pattern. + + + + + Initializes a new instance of the ViewModelBase class. + + + + + Initializes a new instance of the ViewModelBase class. + + An instance of a + used to broadcast messages to other objects. If null, this class + will attempt to broadcast using the Messenger's default + instance. + + + + Unregisters this instance from the Messenger class. + To cleanup additional resources, override this method, clean + up and then call base.Cleanup(). + + + + + Broadcasts a PropertyChangedMessage using either the instance of + the Messenger that was passed to this class (if available) + or the Messenger's default instance. + + The type of the property that + changed. + The value of the property before it + changed. + The value of the property after it + changed. + The name of the property that + changed. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + If the propertyName parameter + does not correspond to an existing property on the current class, an + exception is thrown in DEBUG configuration only. + + + + Raises the PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The property's value before the change + occurred. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + An expression identifying the property + that changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The name of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + True if the PropertyChanged event was raised, false otherwise. + + + + Assigns a new value to the property. Then, raises the + PropertyChanged event if needed, and broadcasts a + PropertyChangedMessage using the Messenger instance (or the + static default instance if no Messenger instance is available). + + The type of the property that + changed. + The field storing the property's value. + The property's value after the change + occurred. + If true, a PropertyChangedMessage will + be broadcasted. If false, only the event will be raised. + (optional) The name of the property that + changed. + True if the PropertyChanged event was raised, false otherwise. + + + + Gets a value indicating whether the control is in design mode + (running under Blend or Visual Studio). + + + + + Gets a value indicating whether the control is in design mode + (running in Blend or Visual Studio). + + + + + Gets or sets an instance of a used to + broadcast messages to other objects. If null, this class will + attempt to broadcast using the Messenger's default instance. + + + + + An interface defining how dialogs should + be displayed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + Displays information about an error. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information about an error. + + The exception of which the message must be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button with the text "OK". + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the only button + in the dialog box. If left null, the text "OK" will be used. + A callback that should be executed after + the dialog box is closed by the user. + A Task allowing this async method to be awaited. + + + + Displays information to the user. The dialog box will have only + one button. + + The message to be shown to the user. + The title of the dialog box. This may be null. + The text shown in the "confirm" button + in the dialog box. If left null, the text "OK" will be used. + The text shown in the "cancel" button + in the dialog box. If left null, the text "Cancel" will be used. + A callback that should be executed after + the dialog box is closed by the user. The callback method will get a boolean + parameter indicating if the "confirm" button (true) or the "cancel" button + (false) was pressed by the user. + A Task allowing this async method to be awaited. The task will return + true or false depending on the dialog result. + + + + Displays information to the user in a simple dialog box. The dialog box will have only + one button with the text "OK". This method should be used for debugging purposes. + + The message to be shown to the user. + The title of the dialog box. This may be null. + A Task allowing this async method to be awaited. + + + + An interface defining how navigation between pages should + be performed in various frameworks such as Windows, + Windows Phone, Android, iOS etc. + + + + + If possible, instructs the navigation service + to discard the current page and display the previous page + on the navigation stack. + + + + + Instructs the navigation service to display a new page + corresponding to the given key. Depending on the platforms, + the navigation service might have to be configured with a + key/page list. + + The key corresponding to the page + that should be displayed. + + + + Instructs the navigation service to display a new page + corresponding to the given key, and passes a parameter + to the new page. + Depending on the platforms, the navigation service might + have to be Configure with a key/page list. + + The key corresponding to the page + that should be displayed. + The parameter that should be passed + to the new page. + + + + The key corresponding to the currently displayed page. + + + + diff --git a/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.dll b/packages/MvvmLightLibs.5.2.0.0/lib/xamarin.ios10/GalaSoft.MvvmLight.dll new file mode 100644 index 0000000000000000000000000000000000000000..c347dbc5ed5f206819a7c607b82ab699341b120f GIT binary patch literal 30208 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 literal 0 HcmV?d00001