diff options
| author | Mirta <mirta@twine-s.com> | 2020-11-23 16:13:53 +0200 |
|---|---|---|
| committer | Mirta <mirta@twine-s.com> | 2020-11-23 16:13:53 +0200 |
| commit | 91c007adced573e09b77ab4be4a5aba623a816cc (patch) | |
| tree | 250221fc2def7d59f1393be8394f766faf576656 /Software/Visual_Studio | |
| parent | 4e9af2b852eb3b9eecfa09e9bc76869558e183cb (diff) | |
| parent | 50a3c0b857b4aa88a9e3970d69256f12b5b24eb8 (diff) | |
| download | Tango-91c007adced573e09b77ab4be4a5aba623a816cc.tar.gz Tango-91c007adced573e09b77ab4be4a5aba623a816cc.zip | |
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio')
278 files changed, 13949 insertions, 704 deletions
diff --git a/Software/Visual_Studio/Advanced Installer Projects/FSE Installer.aip b/Software/Visual_Studio/Advanced Installer Projects/FSE Installer.aip index dc6557505..86a02fb0f 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/FSE Installer.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/FSE Installer.aip @@ -63,6 +63,8 @@ <ROW Component="AI_ExePath" ComponentId="{C34670D7-E692-46D3-8154-6A8F253B99E5}" Directory_="APPDIR" Attributes="4" KeyPath="AI_ExePath"/> <ROW Component="APPDIR" ComponentId="{5B123F96-C6BB-44F7-8539-1EF68B1B7EB8}" Directory_="APPDIR" Attributes="0"/> <ROW Component="ColorMine.dll" ComponentId="{2A12535E-52C6-4B4F-9428-6CFB916E8EEF}" Directory_="APPDIR" Attributes="0" KeyPath="ColorMine.dll"/> + <ROW Component="CommandLine.dll" ComponentId="{24319897-21B4-4195-AA8F-D40FBD667C56}" Directory_="APPDIR" Attributes="0" KeyPath="CommandLine.dll"/> + <ROW Component="ConsoleTables.dll" ComponentId="{D1C789E8-946A-4A52-B58E-75B8E859647B}" Directory_="APPDIR" Attributes="0" KeyPath="ConsoleTables.dll"/> <ROW Component="ControlzEx.dll" ComponentId="{9F73B283-098E-4615-8608-2BAFB9347E87}" Directory_="APPDIR" Attributes="0" KeyPath="ControlzEx.dll"/> <ROW Component="D17D1EE3B5447079AEF0A1CF58498F1" ComponentId="{8E526DB3-B68B-4DBF-B262-BF34E040418E}" Directory_="APPDIR" Attributes="4" KeyPath="D17D1EE3B5447079AEF0A1CF58498F1" Options="2"/> <ROW Component="DeviceId.dll" ComponentId="{95686F7C-16B2-46F2-8AF2-E2B3A85ED7AD}" Directory_="APPDIR" Attributes="0" KeyPath="DeviceId.dll"/> @@ -303,8 +305,10 @@ <ROW Component="Tango.Console.dll" ComponentId="{EA15B4D4-5171-4747-8F7D-0D21CF8CAFD3}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Console.dll"/> <ROW Component="Tango.Core.dll" ComponentId="{FEA537DB-7B1F-4B88-940A-9911A4D29057}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Core.dll"/> <ROW Component="Tango.DAL.Remote.dll" ComponentId="{62700DCA-5334-45BB-9B3F-1E60D8E1CB51}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DAL.Remote.dll"/> - <ROW Component="Tango.DataStore.Remote.dll" ComponentId="{DC3934E7-E3F0-4995-A415-117E35345F66}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Remote.dll"/> - <ROW Component="Tango.DataStore.dll" ComponentId="{935AC8A1-F425-4763-B91B-FBD559AA35F0}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.dll"/> + <ROW Component="Tango.DataStore.EF.dll" ComponentId="{5215BDBC-6406-4097-A6A3-399A3C1FF929}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.EF.dll"/> + <ROW Component="Tango.DataStore.Editing.dll" ComponentId="{3004AEDD-C2BF-4ADE-9153-64F6E651F3AE}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Editing.dll"/> + <ROW Component="Tango.DataStore.Remote.dll" ComponentId="{0D39C3C3-A272-4A82-B757-83E6B0D6BB4D}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Remote.dll"/> + <ROW Component="Tango.DataStore.dll" ComponentId="{DA61514D-C2D7-4909-80EA-0CCF2B1DBB97}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.dll"/> <ROW Component="Tango.Documents.dll" ComponentId="{FB9E5160-6481-4879-AFC6-89C3D7E21ED6}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Documents.dll"/> <ROW Component="Tango.DragAndDrop.dll" ComponentId="{E660863F-2225-48FE-B966-E7375A48FBF1}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DragAndDrop.dll"/> <ROW Component="Tango.Emulations.dll" ComponentId="{87B4BB2B-DA02-47A4-B738-F0D388ED5B03}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Emulations.dll"/> @@ -314,6 +318,7 @@ <ROW Component="Tango.FSE.Firmware.dll" ComponentId="{39C1ACAC-0329-4779-BBD7-59921B537853}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.Firmware.dll"/> <ROW Component="Tango.FSE.Insights.dll" ComponentId="{E41D03EC-502F-4FF3-8B6B-A89D02C248B2}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.Insights.dll"/> <ROW Component="Tango.FSE.LogViewer.UI.exe" ComponentId="{C233F6D7-7B11-4EB0-99FA-601176F47BA5}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.LogViewer.UI.exe"/> + <ROW Component="Tango.FSE.MachineConfiguration.dll" ComponentId="{28010BC7-AC6F-4F33-9883-A7A2919A8F36}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.MachineConfiguration.dll"/> <ROW Component="Tango.FSE.PPCConsole.dll" ComponentId="{439D6114-54E3-4FCB-A01E-148ECB966139}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.PPCConsole.dll"/> <ROW Component="Tango.FSE.Procedures.dll" ComponentId="{FDA82EB3-2A9B-4A57-AB30-970433B497BE}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.Procedures.dll"/> <ROW Component="Tango.FSE.UI.exe" ComponentId="{79C3B470-6540-474A-90AE-F0E7C34AEA43}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.FSE.UI.exe"/> @@ -361,6 +366,7 @@ <ROW Component="__3" ComponentId="{D63D43F2-053E-4811-81BC-F11D89795E42}" Directory_="APPDIR" Attributes="4" KeyPath="__3"/> <ROW Component="__4" ComponentId="{D0E846F2-7BDB-4985-A828-405634871827}" Directory_="APPDIR" Attributes="4" KeyPath="__4"/> <ROW Component="__5" ComponentId="{95AD0530-ED57-4222-992A-782C6CFBD980}" Directory_="APPDIR" Attributes="4" KeyPath="__5"/> + <ROW Component="dsUtil.exe" ComponentId="{976E1F19-4FE1-46DF-824B-0DFFDAC3959C}" Directory_="APPDIR" Attributes="0" KeyPath="dsUtil.exe"/> <ROW Component="ffmpeg.exe" ComponentId="{D6862E01-A64B-40FD-847E-A35B561EFD1D}" Directory_="APPDIR" Attributes="0" KeyPath="ffmpeg.exe"/> <ROW Component="log" ComponentId="{A7C3DA27-9188-401A-9CD1-218B0504E461}" Directory_="APPDIR" Attributes="4" KeyPath="log_2"/> <ROW Component="mscoree.dll" ComponentId="{B7304190-8E59-45C3-B972-4611DEB9DE60}" Directory_="APPDIR" Attributes="0" KeyPath="mscoree.dll"/> @@ -372,10 +378,10 @@ <ROW Component="protobufnet.dll" ComponentId="{ED37672F-F343-44FB-8FBD-F9003BD20D52}" Directory_="APPDIR" Attributes="0" KeyPath="protobufnet.dll"/> <ROW Component="shell" ComponentId="{A08B0CB0-9A35-4E7B-B7A3-F0039D92CBE4}" Directory_="APPDIR" Attributes="4" KeyPath="shell"/> <ROW Component="shell_1" ComponentId="{082186C6-1C9B-401A-85E8-3F1DA42DD4C6}" Directory_="APPDIR" Attributes="4" KeyPath="shell_1"/> - <ROW Component="turbojpeg.dll" ComponentId="{E709DEA3-C3B6-4289-A24C-EE7B3C725E3F}" Directory_="win7x64_Dir" Attributes="256" KeyPath="turbojpeg.dll"/> - <ROW Component="turbojpeg.dll.meta" ComponentId="{F3C4814A-27B2-468B-9239-96BCD4B7CB2C}" Directory_="win7x64_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta" Type="0"/> - <ROW Component="turbojpeg.dll.meta_1" ComponentId="{DC08A77B-7BFA-4518-8694-AA5C3FB7306A}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta_1" Type="0"/> - <ROW Component="turbojpeg.dll_1" ComponentId="{C93ECFB0-1796-49CD-9897-B5FDED741327}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll_1"/> + <ROW Component="turbojpeg.dll" ComponentId="{8CDBC3A7-72CF-42B5-A1E2-6A546607DCE0}" Directory_="win7x64_Dir" Attributes="256" KeyPath="turbojpeg.dll"/> + <ROW Component="turbojpeg.dll.meta" ComponentId="{C65078EA-8438-4FF7-BFE1-68D532764AFF}" Directory_="win7x64_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta" Type="0"/> + <ROW Component="turbojpeg.dll.meta_1" ComponentId="{C3B04D4B-D79F-4FBC-881B-C7E1364935B7}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll.meta_1" Type="0"/> + <ROW Component="turbojpeg.dll_1" ComponentId="{7D89438D-86DD-4300-924C-49676B63DDD7}" Directory_="win7x86_Dir" Attributes="0" KeyPath="turbojpeg.dll_1"/> <ROW Component="ucrtbased.dll" ComponentId="{4188BB88-A714-488A-A02D-98710ACC94F5}" Directory_="APPDIR" Attributes="0" KeyPath="ucrtbased.dll"/> <ROW Component="vcruntime140.dll" ComponentId="{078A42AF-E964-4CA3-8A9C-CBE6D0FD76AA}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140.dll"/> <ROW Component="vcruntime140d.dll" ComponentId="{AF42196B-67BB-4EBA-8C3A-38B9527F9775}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140d.dll"/> @@ -755,16 +761,27 @@ <ROW File="Tango.Insights.pdb" Component_="Tango.Insights.dll" FileName="TANGOI~2.PDB|Tango.Insights.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.Insights.pdb" SelfReg="false"/> <ROW File="Tango.FSE.LogViewer.UI.exe.config" Component_="Dragablz.xml" FileName="TANGO~10.CON|Tango.FSE.LogViewer.UI.exe.config" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.FSE.LogViewer.UI.exe.config" SelfReg="false"/> <ROW File="Tango.FSE.LogViewer.UI.pdb" Component_="Tango.FSE.LogViewer.UI.exe" FileName="TANGO~12.PDB|Tango.FSE.LogViewer.UI.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.FSE.LogViewer.UI.pdb" SelfReg="false"/> + <ROW File="DeviceId.dll" Component_="DeviceId.dll" FileName="DeviceId.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\DeviceId.dll" SelfReg="false"/> + <ROW File="CommandLine.dll" Component_="CommandLine.dll" FileName="COMMAN~1.DLL|CommandLine.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\CommandLine.dll" SelfReg="false"/> + <ROW File="ConsoleTables.dll" Component_="ConsoleTables.dll" FileName="CONSOL~1.DLL|ConsoleTables.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\ConsoleTables.dll" SelfReg="false"/> + <ROW File="dsUtil.exe" Component_="dsUtil.exe" FileName="dsUtil.exe" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\dsUtil.exe" SelfReg="false" DigSign="true"/> + <ROW File="dsUtil.exe.config" Component_="Dragablz.xml" FileName="DSUTIL~1.CON|dsUtil.exe.config" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\dsUtil.exe.config" SelfReg="false"/> + <ROW File="Tango.DataStore.dll" Component_="Tango.DataStore.dll" FileName="TANGOD~2.DLL|Tango.DataStore.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.dll" SelfReg="false"/> + <ROW File="Tango.DataStore.Editing.dll" Component_="Tango.DataStore.Editing.dll" FileName="TANGOD~5.DLL|Tango.DataStore.Editing.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Editing.dll" SelfReg="false"/> + <ROW File="Tango.DataStore.Editing.pdb" Component_="Tango.DataStore.Editing.dll" FileName="TANGOD~2.PDB|Tango.DataStore.Editing.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Editing.pdb" SelfReg="false"/> + <ROW File="Tango.DataStore.EF.dll" Component_="Tango.DataStore.EF.dll" FileName="TANGOD~6.DLL|Tango.DataStore.EF.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.EF.dll" SelfReg="false"/> + <ROW File="Tango.DataStore.EF.pdb" Component_="Tango.DataStore.EF.dll" FileName="TANGOD~5.PDB|Tango.DataStore.EF.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.EF.pdb" SelfReg="false"/> + <ROW File="Tango.DataStore.pdb" Component_="Tango.DataStore.dll" FileName="TANGOD~6.PDB|Tango.DataStore.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.pdb" SelfReg="false"/> + <ROW File="Tango.DataStore.Remote.dll" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~7.DLL|Tango.DataStore.Remote.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Remote.dll" SelfReg="false"/> + <ROW File="Tango.DataStore.Remote.pdb" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~7.PDB|Tango.DataStore.Remote.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Remote.pdb" SelfReg="false"/> + <ROW File="Tango.DataStore.xml" Component_="Dragablz.xml" FileName="TANGOD~1.XML|Tango.DataStore.xml" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.xml" SelfReg="false"/> + <ROW File="Tango.FSE.MachineConfiguration.dll" Component_="Tango.FSE.MachineConfiguration.dll" FileName="TANGO~12.DLL|Tango.FSE.MachineConfiguration.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.FSE.MachineConfiguration.dll" SelfReg="false"/> + <ROW File="Tango.FSE.MachineConfiguration.dll.config" Component_="Dragablz.xml" FileName="TANGO~11.CON|Tango.FSE.MachineConfiguration.dll.config" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.FSE.MachineConfiguration.dll.config" SelfReg="false"/> + <ROW File="Tango.FSE.MachineConfiguration.pdb" Component_="Tango.FSE.MachineConfiguration.dll" FileName="TANGO~13.PDB|Tango.FSE.MachineConfiguration.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.FSE.MachineConfiguration.pdb" SelfReg="false"/> <ROW File="turbojpeg.dll" Component_="turbojpeg.dll" FileName="TURBOJ~1.DLL|turbojpeg.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\win7-x64\turbojpeg.dll" SelfReg="false"/> <ROW File="turbojpeg.dll.meta" Component_="turbojpeg.dll.meta" FileName="TURBOJ~1.MET|turbojpeg.dll.meta" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\win7-x64\turbojpeg.dll.meta" SelfReg="false"/> <ROW File="turbojpeg.dll_1" Component_="turbojpeg.dll_1" FileName="TURBOJ~1.DLL|turbojpeg.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\win7-x86\turbojpeg.dll" SelfReg="false"/> <ROW File="turbojpeg.dll.meta_1" Component_="turbojpeg.dll.meta_1" FileName="TURBOJ~1.MET|turbojpeg.dll.meta" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\win7-x86\turbojpeg.dll.meta" SelfReg="false"/> - <ROW File="DeviceId.dll" Component_="DeviceId.dll" FileName="DeviceId.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\DeviceId.dll" SelfReg="false"/> - <ROW File="Tango.DataStore.dll" Component_="Tango.DataStore.dll" FileName="TANGOD~2.DLL|Tango.DataStore.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.dll" SelfReg="false"/> - <ROW File="Tango.DataStore.pdb" Component_="Tango.DataStore.dll" FileName="TANGOD~2.PDB|Tango.DataStore.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.pdb" SelfReg="false"/> - <ROW File="Tango.DataStore.Remote.dll" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~5.DLL|Tango.DataStore.Remote.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Remote.dll" SelfReg="false"/> - <ROW File="Tango.DataStore.Remote.pdb" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~5.PDB|Tango.DataStore.Remote.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.Remote.pdb" SelfReg="false"/> - <ROW File="Tango.DataStore.xml" Component_="Dragablz.xml" FileName="TANGOD~1.XML|Tango.DataStore.xml" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\FSE\Release\Tango.DataStore.xml" SelfReg="false"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.AiRemoveFileComponent"> <ROW RemoveFile="_" Options="3"/> @@ -927,6 +944,9 @@ <ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/> <ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/> </COMPONENT> + <COMPONENT cid="caphyon.advinst.msicomp.MsiEnvComponent"> + <ROW Environment="Path" Name="=-*Path" Value="[~];[APPDIR]" Component_="dsUtil.exe"/> + </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiExtComponent"> <ROW Extension="pproj" Component_="Tango.FSE.UI.exe" ProgId_="[|Manufacturer].[|ProductName].ppro" Feature_="TangoFSE" Options="32"/> <ROW Extension="tdp" Component_="Tango.FSE.UI.exe" ProgId_="[|Manufacturer].[|ProductName].tdp" Feature_="TangoFSE" Options="32"/> @@ -1246,13 +1266,19 @@ <ROW Feature_="TangoFSE" Component_="New_Key_1"/> <ROW Feature_="TangoFSE" Component_="__287"/> <ROW Feature_="TangoFSE" Component_="__288"/> + <ROW Feature_="TangoFSE" Component_="DeviceId.dll"/> <ROW Feature_="TangoFSE" Component_="turbojpeg.dll"/> <ROW Feature_="TangoFSE" Component_="turbojpeg.dll.meta"/> <ROW Feature_="TangoFSE" Component_="turbojpeg.dll_1"/> <ROW Feature_="TangoFSE" Component_="turbojpeg.dll.meta_1"/> - <ROW Feature_="TangoFSE" Component_="DeviceId.dll"/> + <ROW Feature_="TangoFSE" Component_="CommandLine.dll"/> + <ROW Feature_="TangoFSE" Component_="ConsoleTables.dll"/> + <ROW Feature_="TangoFSE" Component_="dsUtil.exe"/> <ROW Feature_="TangoFSE" Component_="Tango.DataStore.dll"/> + <ROW Feature_="TangoFSE" Component_="Tango.DataStore.Editing.dll"/> + <ROW Feature_="TangoFSE" Component_="Tango.DataStore.EF.dll"/> <ROW Feature_="TangoFSE" Component_="Tango.DataStore.Remote.dll"/> + <ROW Feature_="TangoFSE" Component_="Tango.FSE.MachineConfiguration.dll"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent"> <ROW Name="Tango.FSE.LogViewer.UI.exe" SourcePath="..\..\Graphics\FSE\log_viewer_icon.ico" Index="0"/> diff --git a/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip b/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip index a9fca2e1a..b32cfee44 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/Machine Studio Installer.aip @@ -16,10 +16,10 @@ <ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]." ValueLocId="*"/> <ROW Property="ARPNOREPAIR" MultiBuildValue="DefaultBuild:1"/> <ROW Property="Manufacturer" Value="Twine"/> - <ROW Property="ProductCode" Value="1033:{7577BEBE-247C-415C-BE01-3BA0BEF8CBBD} " Type="16"/> + <ROW Property="ProductCode" Value="1033:{A7D1ABE5-6524-4FE9-A6F9-0CF85F760172} " Type="16"/> <ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductName" Value="Machine Studio"/> - <ROW Property="ProductVersion" Value="4.2.1.0" Type="32"/> + <ROW Property="ProductVersion" Value="4.2.3.0" Type="32"/> <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/> <ROW Property="UpgradeCode" Value="{CBEE5CAE-7C5A-4280-98DE-AA98113764E4}"/> <ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/> @@ -873,7 +873,7 @@ <ROW Action="AI_DetectSoftware" Sequence="101"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent"> - <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\Machine Studio\Release" PackageFileName="Machine Studio Installer_v4.2.1" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="Machine Studio Installer_v4.2.1"/> + <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\Machine Studio\Release" PackageFileName="Machine Studio Installer_v4.2.3" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="Machine Studio Installer_v4.2.3"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent"> <ROW Path="<AI_DICTS>ui.ail"/> diff --git a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt Binary files differindex 9453b5c13..5fe5afe5a 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt +++ b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer-cache/cacheIndex.txt diff --git a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip index 76614c76c..4d62fcb0c 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/PPC Installer.aip @@ -18,10 +18,10 @@ <ROW Property="ARPNOREPAIR" Value="1" MultiBuildValue="DefaultBuild:1"/> <ROW Property="ARPSYSTEMCOMPONENT" Value="1"/> <ROW Property="Manufacturer" Value="Twine"/> - <ROW Property="ProductCode" Value="1033:{CE4F6CA8-3FB0-4C08-9948-21DC430EB452} " Type="16"/> + <ROW Property="ProductCode" Value="1033:{7FE57A49-CFA7-4A93-AEAD-64134AF7FC78} " Type="16"/> <ROW Property="ProductLanguage" Value="1033"/> <ROW Property="ProductName" Value="Tango"/> - <ROW Property="ProductVersion" Value="1.2.1.0" Type="32"/> + <ROW Property="ProductVersion" Value="1.2.3.0" Type="32"/> <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/> <ROW Property="UpgradeCode" Value="{F8EAB8B4-FD57-45B7-8307-D52DF760273D}"/> <ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/> @@ -174,6 +174,7 @@ <ROW Component="Tango.Console.dll" ComponentId="{9F335170-14FF-472E-B3A5-1AAFA7C3067B}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Console.dll"/> <ROW Component="Tango.Core.dll" ComponentId="{4DF6644D-C4EC-419D-9622-2F79BBBC5A3F}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Core.dll"/> <ROW Component="Tango.DataStore.EF.dll" ComponentId="{8CB699F6-2992-4E8B-A985-BFB711F00887}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.EF.dll"/> + <ROW Component="Tango.DataStore.Editing.dll" ComponentId="{C32CCCC2-23B6-4B73-9846-9EF6ED8EDAA5}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Editing.dll"/> <ROW Component="Tango.DataStore.Lite.dll" ComponentId="{A4DE7D38-9FFE-4876-8EA5-D2DFFF941DD7}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Lite.dll"/> <ROW Component="Tango.DataStore.Remote.dll" ComponentId="{75E21DF0-35CB-4C0D-9542-79176449F9E1}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.Remote.dll"/> <ROW Component="Tango.DataStore.dll" ComponentId="{8CD7FAF4-6184-490D-B632-FA65A392F79F}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.DataStore.dll"/> @@ -227,26 +228,26 @@ <ROW Component="Tango.WiFi.dll" ComponentId="{8082C9BD-5BDB-4C52-BCA6-E8604D4D232B}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.WiFi.dll"/> <ROW Component="WebRtc.NET.dll" ComponentId="{11563A6C-E1FC-4578-8BDD-8A8C30677126}" Directory_="APPDIR" Attributes="0" KeyPath="WebRtc.NET.dll"/> <ROW Component="WindowsInput.dll" ComponentId="{916884AD-CD7D-4AB0-8B3B-A2205ACFBDF4}" Directory_="APPDIR" Attributes="0" KeyPath="WindowsInput.dll"/> - <ROW Component="alpine.3.9x64" ComponentId="{D4BCF305-49A6-4295-82B6-104C83D9D3A6}" Directory_="alpine.3.9x64_Dir" Attributes="0"/> - <ROW Component="alpinex64" ComponentId="{61852CDB-13E7-4A1B-8E80-5EC2F09698B7}" Directory_="alpinex64_Dir" Attributes="0"/> - <ROW Component="debian.9x64" ComponentId="{DC31704C-C7AF-47FD-9EE8-116E5F602B68}" Directory_="debian.9x64_Dir" Attributes="0"/> - <ROW Component="debianarm64" ComponentId="{FC83A31E-4E0A-4840-A044-BDDD61B0FE1E}" Directory_="debianarm64_Dir" Attributes="0"/> - <ROW Component="fedorax64" ComponentId="{24C8A0D2-96C5-428E-97B3-3DAA62B414E9}" Directory_="fedorax64_Dir" Attributes="0"/> - <ROW Component="linuxx64" ComponentId="{D88F848F-666F-4CD1-A62D-F8CDE2CBA18F}" Directory_="linuxx64_Dir" Attributes="0"/> + <ROW Component="alpine.3.9x64" ComponentId="{CB3DEB2E-FE4C-4100-9EAE-415F45208180}" Directory_="alpine.3.9x64_Dir" Attributes="0"/> + <ROW Component="alpinex64" ComponentId="{72CBAAB2-6B3C-438B-BA67-500D34BE0DD5}" Directory_="alpinex64_Dir" Attributes="0"/> + <ROW Component="debian.9x64" ComponentId="{3AD4437F-641E-4B96-BB54-18E3B1B0A2D7}" Directory_="debian.9x64_Dir" Attributes="0"/> + <ROW Component="debianarm64" ComponentId="{6A227317-CDE4-4A4D-89FD-D00B70F14E18}" Directory_="debianarm64_Dir" Attributes="0"/> + <ROW Component="fedorax64" ComponentId="{121BA66E-6589-4AB4-B48F-83F1A5643753}" Directory_="fedorax64_Dir" Attributes="0"/> + <ROW Component="linuxx64" ComponentId="{E041A10C-C47F-4E71-9D09-BE0638FF1AC4}" Directory_="linuxx64_Dir" Attributes="0"/> <ROW Component="mscoree.dll" ComponentId="{85F439D0-8FD0-4B99-888D-336C7A125E3D}" Directory_="APPDIR" Attributes="0" KeyPath="mscoree.dll"/> <ROW Component="msvcp140d.dll" ComponentId="{69E32675-9ACF-4C23-A495-300B78913B66}" Directory_="APPDIR" Attributes="0" KeyPath="msvcp140d.dll"/> - <ROW Component="osx" ComponentId="{EFAA0F58-2E8D-4EAA-9E30-58E5A062EBB0}" Directory_="osx_Dir" Attributes="0"/> + <ROW Component="osx" ComponentId="{0DC599EF-C425-487B-96BB-2F9B972BF198}" Directory_="osx_Dir" Attributes="0"/> <ROW Component="protobufnet.dll" ComponentId="{163F1E17-6462-4ABE-BC86-E055F7690139}" Directory_="APPDIR" Attributes="0" KeyPath="protobufnet.dll"/> - <ROW Component="rhelx64" ComponentId="{20FDADE2-65E8-4ABA-8ED2-A7923A4EFE86}" Directory_="rhelx64_Dir" Attributes="0"/> - <ROW Component="ubuntu.16.04arm64" ComponentId="{C6CE6C53-EF79-4EFC-8616-5FDC856F8644}" Directory_="ubuntu.16.04arm64_Dir" Attributes="0"/> - <ROW Component="ubuntu.18.04x64" ComponentId="{81511E67-ED99-4AE0-AA1C-5F4C3BD93282}" Directory_="ubuntu.18.04x64_Dir" Attributes="0"/> + <ROW Component="rhelx64" ComponentId="{76C245EC-C4CD-44BA-B634-46082E9F5689}" Directory_="rhelx64_Dir" Attributes="0"/> + <ROW Component="ubuntu.16.04arm64" ComponentId="{20707512-F0CB-4AEE-8C74-C4EFB5D5121F}" Directory_="ubuntu.16.04arm64_Dir" Attributes="0"/> + <ROW Component="ubuntu.18.04x64" ComponentId="{BE57FEBD-4942-4394-8859-F8003FB5148A}" Directory_="ubuntu.18.04x64_Dir" Attributes="0"/> <ROW Component="ucrtbased.dll" ComponentId="{B8D025EA-CD16-4EE7-A3E7-713E2BE82BF3}" Directory_="APPDIR" Attributes="0" KeyPath="ucrtbased.dll"/> <ROW Component="vcruntime140.dll" ComponentId="{144594CC-D19B-45E4-A420-7A1BBB122EE3}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140.dll"/> <ROW Component="vcruntime140d.dll" ComponentId="{7653420C-C6C3-4F31-97E8-D6DE417D3DF2}" Directory_="APPDIR" Attributes="0" KeyPath="vcruntime140d.dll"/> - <ROW Component="win7x64" ComponentId="{A4F0F832-0F44-4BEB-B50F-1C6B8C5BE876}" Directory_="win7x64_Dir" Attributes="0"/> - <ROW Component="win7x86" ComponentId="{19161320-54C7-4E88-A0CF-999336DC5173}" Directory_="win7x86_Dir" Attributes="0"/> - <ROW Component="x64" ComponentId="{29CA5548-8E90-4F84-BCB4-C74FB4B2AE7B}" Directory_="x64_Dir" Attributes="0"/> - <ROW Component="x86" ComponentId="{0DBB98B7-0CE8-446B-9540-D4A7A2E28B08}" Directory_="x86_Dir" Attributes="0"/> + <ROW Component="win7x64" ComponentId="{F1CC2A93-6B0C-475D-AF49-CCD5D4430668}" Directory_="win7x64_Dir" Attributes="0"/> + <ROW Component="win7x86" ComponentId="{02BC7433-536A-4FAA-83AB-5B0C7406F85D}" Directory_="win7x86_Dir" Attributes="0"/> + <ROW Component="x64" ComponentId="{3E0CECFA-175F-422E-852F-8103A67A83C3}" Directory_="x64_Dir" Attributes="0"/> + <ROW Component="x86" ComponentId="{DDE574A7-B6C7-4D28-A612-8AE0100A31F0}" Directory_="x86_Dir" Attributes="0"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent"> <ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/> @@ -487,7 +488,6 @@ <ROW File="Tango.WebRTC.dll" Component_="Tango.WebRTC.dll" FileName="TANGOW~3.DLL|Tango.WebRTC.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.WebRTC.dll" SelfReg="false"/> <ROW File="Tango.WebRTC.pdb" Component_="Tango.WebRTC.dll" FileName="TANGOW~3.PDB|Tango.WebRTC.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.WebRTC.pdb" SelfReg="false"/> <ROW File="WebRtc.NET.dll" Component_="WebRtc.NET.dll" FileName="WEBRTC~1.DLL|WebRtc.NET.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\WebRtc.NET.dll" SelfReg="false"/> - <ROW File="WebRtc.NET.pdb" Component_="WebRtc.NET.dll" FileName="WEBRTC~1.PDB|WebRtc.NET.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\WebRtc.NET.pdb" SelfReg="false"/> <ROW File="Microsoft.WindowsAPICodePack.pdb" Component_="Microsoft.WindowsAPICodePack.dll" FileName="MICROS~3.PDB|Microsoft.WindowsAPICodePack.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Microsoft.WindowsAPICodePack.pdb" SelfReg="false"/> <ROW File="LiteDB.dll" Component_="LiteDB.dll" FileName="LiteDB.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\LiteDB.dll" SelfReg="false"/> <ROW File="Tango.PPC.Shared.dll" Component_="Tango.PPC.Shared.dll" FileName="TANGO~13.DLL|Tango.PPC.Shared.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.PPC.Shared.dll" SelfReg="false"/> @@ -520,6 +520,8 @@ <ROW File="Tango.DataStore.pdb" Component_="Tango.DataStore.dll" FileName="TANGOD~5.PDB|Tango.DataStore.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.DataStore.pdb" SelfReg="false"/> <ROW File="Tango.DataStore.Remote.dll" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~6.DLL|Tango.DataStore.Remote.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.DataStore.Remote.dll" SelfReg="false"/> <ROW File="Tango.DataStore.Remote.pdb" Component_="Tango.DataStore.Remote.dll" FileName="TANGOD~6.PDB|Tango.DataStore.Remote.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.DataStore.Remote.pdb" SelfReg="false"/> + <ROW File="Tango.DataStore.Editing.dll" Component_="Tango.DataStore.Editing.dll" FileName="TANGOD~7.DLL|Tango.DataStore.Editing.dll" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.DataStore.Editing.dll" SelfReg="false"/> + <ROW File="Tango.DataStore.Editing.pdb" Component_="Tango.DataStore.Editing.dll" FileName="TANGOD~7.PDB|Tango.DataStore.Editing.pdb" Version="65535.65535.65535.65535" Attributes="0" SourcePath="..\Build\PPC\Release\Tango.DataStore.Editing.pdb" SelfReg="false"/> <ATTRIBUTE name="DontAddFileAttributes" value="true"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent"> @@ -529,7 +531,7 @@ <ROW Action="AI_DetectSoftware" Sequence="101"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BuildComponent"> - <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\PPC" PackageFileName="PPC Installer_v1.2.1" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="PPC Installer_v1.2.1"/> + <ROW BuildKey="DefaultBuild" BuildName="DefaultBuild" BuildOrder="1" BuildType="0" PackageFolder="..\Build\Installers\PPC" PackageFileName="PPC Installer_v1.2.3" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExtractionFolder="[AppDataFolder][|Manufacturer]\[|ProductName] [|ProductVersion]\install" ExtUI="true" UseLargeSchema="true" ExeName="PPC Installer_v1.2.3"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent"> <ROW Path="<AI_DICTS>ui.ail"/> @@ -815,6 +817,8 @@ <ROW Feature_="MainFeature" Component_="Tango.DataStore.EF.dll"/> <ROW Feature_="MainFeature" Component_="Tango.DataStore.Lite.dll"/> <ROW Feature_="MainFeature" Component_="Tango.DataStore.Remote.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.DataStore.Editing.dll"/> + <ROW Feature_="MainFeature" Component_="win7x86"/> <ROW Feature_="MainFeature" Component_="alpinex64"/> <ROW Feature_="MainFeature" Component_="alpine.3.9x64"/> <ROW Feature_="MainFeature" Component_="debianarm64"/> @@ -828,7 +832,6 @@ <ROW Feature_="MainFeature" Component_="x64"/> <ROW Feature_="MainFeature" Component_="x86"/> <ROW Feature_="MainFeature" Component_="win7x64"/> - <ROW Feature_="MainFeature" Component_="win7x86"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent"> <ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1502"/> diff --git a/Software/Visual_Studio/Advanced Installer Projects/Stubs UI.aip b/Software/Visual_Studio/Advanced Installer Projects/Stubs UI.aip index 381c640d6..9a07a9eab 100644 --- a/Software/Visual_Studio/Advanced Installer Projects/Stubs UI.aip +++ b/Software/Visual_Studio/Advanced Installer Projects/Stubs UI.aip @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> -<DOCUMENT Type="Advanced Installer" CreateVersion="15.6" version="15.6" Modules="professional" RootPath="." Language="en" Id="{6D76F676-1F63-438B-BABF-97CE3EB17202}"> +<DOCUMENT Type="Advanced Installer" CreateVersion="15.6" version="16.2" Modules="professional" RootPath="." Language="en" Id="{6D76F676-1F63-438B-BABF-97CE3EB17202}"> <COMPONENT cid="caphyon.advinst.msicomp.ProjectOptionsComponent"> <ROW Name="HiddenItems" Value="AppXProductDetailsComponent;AppXDependenciesComponent;AppXAppDetailsComponent;AppXVisualAssetsComponent;AppXCapabilitiesComponent;AppXAppDeclarationsComponent;AppXUriRulesComponent;MsiJavaComponent;MsiDriverPackagesComponent;UserAccountsComponent;ScheduledTasksComponent;SqlConnectionComponent;AutorunComponent;FirewallExceptionComponent;GameUxComponent;MsiDirectEditorComponent;SharePointSlnComponent;SilverlightSlnComponent;MultipleInstancesComponent;SccmComponent;ActSyncAppComponent;FixupComponent"/> </COMPONENT> @@ -46,10 +46,10 @@ <ROW Property="ARPCOMMENTS" Value="This installer database contains the logic and data required to install [|ProductName]." ValueLocId="*"/> <ROW Property="ARPNOREPAIR" MultiBuildValue="DefaultBuild:1"/> <ROW Property="Manufacturer" Value="Twine"/> - <ROW Property="ProductCode" Value="1033:{A0E07AB2-717A-45B1-BA0F-12DAF72D2388} " Type="16"/> + <ROW Property="ProductCode" Value="1033:{C21D96CD-00C7-4C3D-A32C-19595D137942} " Type="16"/> <ROW Property="ProductLanguage" Value="1033"/> - <ROW Property="ProductName" Value="Tango Stubs Execution Utility [|ProductVersion]"/> - <ROW Property="ProductVersion" Value="3.4.0.0" Type="32" TargetFile="StubsExecutionGUI.exe"/> + <ROW Property="ProductName" Value="Tango Stubs Execution Utility"/> + <ROW Property="ProductVersion" Value="3.5.0.0" Type="32" TargetFile="StubsExecutionGUI.exe"/> <ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/> <ROW Property="UpgradeCode" Value="{C48A8C30-0BC1-4AD3-9DDD-99C9119912DF}"/> <ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/> @@ -64,6 +64,7 @@ <COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent"> <ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/> <ROW Directory="DesktopFolder" Directory_Parent="TARGETDIR" DefaultDir="DESKTO~1|DesktopFolder" IsPseudoRoot="1"/> + <ROW Directory="ProtoCompilers_Dir" Directory_Parent="APPDIR" DefaultDir="PROTOC~1|ProtoCompilers"/> <ROW Directory="SHORTCUTDIR" Directory_Parent="TARGETDIR" DefaultDir="SHORTC~1|SHORTCUTDIR" IsPseudoRoot="1"/> <ROW Directory="TARGETDIR" DefaultDir="SourceDir"/> <ROW Directory="de_Dir" Directory_Parent="APPDIR" DefaultDir="de"/> @@ -78,6 +79,7 @@ </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent"> <ROW Component="AI_ExePath" ComponentId="{D8EE1353-5CAF-4992-9CDE-20D8278DE183}" Directory_="APPDIR" Attributes="4" KeyPath="AI_ExePath"/> + <ROW Component="APPDIR" ComponentId="{D6869372-4EEF-4E20-8911-5C22BC27B3B9}" Directory_="APPDIR" Attributes="0"/> <ROW Component="ColorMine.dll" ComponentId="{50928020-3011-46AF-9E6F-9931A7E47249}" Directory_="APPDIR" Attributes="0" KeyPath="ColorMine.dll"/> <ROW Component="DocumentFormat.OpenXml.dll" ComponentId="{64E7E433-693A-4A95-8EDF-31DAD1C75C1E}" Directory_="APPDIR" Attributes="0" KeyPath="DocumentFormat.OpenXml.dll"/> <ROW Component="EFCache.dll" ComponentId="{9050B5BB-E466-45C9-9B96-277D0865E961}" Directory_="APPDIR" Attributes="0" KeyPath="EFCache.dll"/> @@ -86,40 +88,43 @@ <ROW Component="Google.Protobuf.dll" ComponentId="{B3DD271A-F410-4A67-874D-318D598157DA}" Directory_="APPDIR" Attributes="0" KeyPath="Google.Protobuf.dll"/> <ROW Component="ICSharpCode.AvalonEdit.dll" ComponentId="{173091C9-636C-4ED5-9969-22D1975EB36B}" Directory_="APPDIR" Attributes="0" KeyPath="ICSharpCode.AvalonEdit.dll"/> <ROW Component="Ionic.Zip.dll" ComponentId="{A7151FD5-D49D-46FE-BAAA-DA40109053E2}" Directory_="APPDIR" Attributes="0" KeyPath="Ionic.Zip.dll"/> + <ROW Component="LiteDB.dll" ComponentId="{2DF7865E-C1B6-4319-AF16-315481A17A84}" Directory_="APPDIR" Attributes="0" KeyPath="LiteDB.dll"/> <ROW Component="MahApps.Metro.dll" ComponentId="{EF919364-81E5-4C98-B140-724A2E4EC7A9}" Directory_="APPDIR" Attributes="0" KeyPath="MahApps.Metro.dll"/> + <ROW Component="Microsoft.AspNet.SignalR.Client.dll" ComponentId="{DA4B751C-13B2-46E5-B7DF-B59E03807252}" Directory_="APPDIR" Attributes="0" KeyPath="Microsoft.AspNet.SignalR.Client.dll"/> <ROW Component="Microsoft.Data.Edm.dll" ComponentId="{87B21639-F7D0-4074-8254-5C2C4614D28F}" Directory_="APPDIR" Attributes="0" KeyPath="Microsoft.Data.Edm.dll"/> - <ROW Component="Microsoft.Data.Edm.resources.dll" ComponentId="{4CAFFF34-C62D-4673-B33F-330328622EE5}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_10" ComponentId="{9CE736E4-2525-45BD-AAB4-BF4C0025A2BA}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_10"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_11" ComponentId="{4BAA8388-5FE4-409A-AC88-48DCC2B48F00}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_11"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_12" ComponentId="{BAA53C80-F7FB-4DC5-A692-20BEFC5FD917}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_12"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_13" ComponentId="{C8D92506-1C77-43B8-9BCB-1DCCE5A0259F}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_13"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_14" ComponentId="{D64D5032-E105-4D5A-8ECE-9021472E2A9B}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_14"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_15" ComponentId="{54794790-9BF7-457F-8540-5DC69347ACCF}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_15"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_16" ComponentId="{20B1E10A-B32D-4367-9C30-8D58DE7350A9}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_16"/> - <ROW Component="Microsoft.Data.Edm.resources.dll_9" ComponentId="{513E6F50-96E1-4B97-9B7E-E0670568B287}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_9"/> + <ROW Component="Microsoft.Data.Edm.resources.dll" ComponentId="{E8336CBF-077D-46AC-A7DC-FFDB3602F429}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_1" ComponentId="{964B3FE2-3D37-4D8C-8068-3F747EB8563B}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_1"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_2" ComponentId="{FF0A1079-A0BB-4184-8301-E27E91DE57C2}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_2"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_3" ComponentId="{775FF1B1-5224-48AD-96A7-25D63DABE11B}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_3"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_4" ComponentId="{2A77A8F1-72B3-4490-8899-9D2EA0DE176B}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_4"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_5" ComponentId="{61384CF9-66B3-479C-A123-8AF2B9ECBE08}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_5"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_6" ComponentId="{83DCD62E-18DA-46AA-8A77-A27CEB86623E}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_6"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_7" ComponentId="{FBFDAE34-E745-4EE3-B08C-E6A2E81FE2DF}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_7"/> + <ROW Component="Microsoft.Data.Edm.resources.dll_8" ComponentId="{924D3D23-E9E3-4321-A3B2-36BE120272CF}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.Edm.resources.dll_8"/> <ROW Component="Microsoft.Data.OData.dll" ComponentId="{7B4B025A-269E-4748-A932-D15EA6515B2A}" Directory_="APPDIR" Attributes="0" KeyPath="Microsoft.Data.OData.dll"/> - <ROW Component="Microsoft.Data.OData.resources.dll" ComponentId="{B4CF47BC-A4A4-4381-81F6-26357D666BCE}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll"/> - <ROW Component="Microsoft.Data.OData.resources.dll_10" ComponentId="{6CDF7895-38EF-46DF-96AA-90FD82C3326E}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_10"/> - <ROW Component="Microsoft.Data.OData.resources.dll_11" ComponentId="{7DFBE61A-3999-4BE2-A0E4-18E971CDB81F}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_11"/> - <ROW Component="Microsoft.Data.OData.resources.dll_12" ComponentId="{38204EB8-0EED-4CA9-83F5-DA24E2A7B785}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_12"/> - <ROW Component="Microsoft.Data.OData.resources.dll_13" ComponentId="{3E49F116-6E7C-4419-91B5-643737BE2B89}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_13"/> - <ROW Component="Microsoft.Data.OData.resources.dll_14" ComponentId="{CA204B38-E625-49FD-A47C-EAF035B43442}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_14"/> - <ROW Component="Microsoft.Data.OData.resources.dll_15" ComponentId="{493B7859-D59F-4553-93DC-F590F0A418C7}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_15"/> - <ROW Component="Microsoft.Data.OData.resources.dll_16" ComponentId="{AF4B9E9D-0617-4A31-8519-78FAC055BF69}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_16"/> - <ROW Component="Microsoft.Data.OData.resources.dll_9" ComponentId="{CBF8BC47-3869-4370-8F0A-E7D31A169132}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_9"/> + <ROW Component="Microsoft.Data.OData.resources.dll" ComponentId="{1D754CF8-791D-4D0C-A3D6-9A3C8845AA45}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll"/> + <ROW Component="Microsoft.Data.OData.resources.dll_1" ComponentId="{01BBBB0A-F567-447D-9E4E-2848507E590A}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_1"/> + <ROW Component="Microsoft.Data.OData.resources.dll_2" ComponentId="{56DB79C3-9412-4FF6-91A6-AB6A310F9CC0}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_2"/> + <ROW Component="Microsoft.Data.OData.resources.dll_3" ComponentId="{34F1342A-2A1A-4F0A-9006-2BE9C54685B8}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_3"/> + <ROW Component="Microsoft.Data.OData.resources.dll_4" ComponentId="{3B0C02D6-B01F-4AE3-B024-B32A4AAFAAA7}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_4"/> + <ROW Component="Microsoft.Data.OData.resources.dll_5" ComponentId="{1170B80E-9A6B-4E2D-B6DF-9CC4AAAD27F2}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_5"/> + <ROW Component="Microsoft.Data.OData.resources.dll_6" ComponentId="{D61DF80F-7ACA-4832-9D02-58AA0199778F}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_6"/> + <ROW Component="Microsoft.Data.OData.resources.dll_7" ComponentId="{C4D136F7-8452-4DDB-8811-81DD32339120}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_7"/> + <ROW Component="Microsoft.Data.OData.resources.dll_8" ComponentId="{65033F59-F096-4C7A-AE01-31B1D655E378}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.OData.resources.dll_8"/> <ROW Component="Microsoft.Data.Services.Client.dll" ComponentId="{935BB0C2-731D-4F4F-A68D-9BCF35D18312}" Directory_="APPDIR" Attributes="0" KeyPath="Microsoft.Data.Services.Client.dll"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll" ComponentId="{AEB50A62-DE86-4619-B272-FCBD6892CFDF}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_10" ComponentId="{7338A301-EFA7-41B6-AD74-E78C744ADB83}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_10"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_11" ComponentId="{6E22CEA9-736C-4739-BF44-7220DA340879}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_11"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_12" ComponentId="{82D1494B-C343-4AA4-9D2A-03EE5E9821C6}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_12"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_13" ComponentId="{EDB6281D-EEBE-43AC-A2C3-F61446AC953E}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_13"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_14" ComponentId="{53233CE2-1EEA-4219-8C8B-DB14B11603A3}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_14"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_15" ComponentId="{F010E18A-E2B8-43D6-A3BB-D0927E408173}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_15"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_16" ComponentId="{991C957F-1087-434B-993B-369169F8961F}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_16"/> - <ROW Component="Microsoft.Data.Services.Client.resources.dll_9" ComponentId="{A00CC468-ECC0-4391-8595-8F21F50065D2}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_9"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll" ComponentId="{9F24B782-661C-4A17-9559-A8E607B73894}" Directory_="de_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_1" ComponentId="{DE1820BE-8CB4-4234-AC3E-1DC011F314B2}" Directory_="es_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_1"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_2" ComponentId="{74F4BD4C-7937-4078-B60A-42EE4FB16039}" Directory_="fr_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_2"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_3" ComponentId="{C9FE756C-B3BD-409B-80F3-08AF4E365DC5}" Directory_="it_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_3"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_4" ComponentId="{27D37577-4022-41AE-BA26-C62A83F38394}" Directory_="ja_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_4"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_5" ComponentId="{5436B274-01A8-4656-BFAA-5772E0647BCF}" Directory_="ko_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_5"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_6" ComponentId="{5682CE86-5B23-4C4F-9619-FCD56E696CD5}" Directory_="ru_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_6"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_7" ComponentId="{7A4F8C42-59AB-42A7-9108-5E5793AB9D7A}" Directory_="zhHans_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_7"/> + <ROW Component="Microsoft.Data.Services.Client.resources.dll_8" ComponentId="{FE3BB0FB-5A06-4BFD-9035-7A15DA721A0F}" Directory_="zhHant_Dir" Attributes="0" KeyPath="Microsoft.Data.Services.Client.resources.dll_8"/> <ROW Component="Microsoft.WindowsAzure.Storage.dll" ComponentId="{300D7036-2A74-46AB-A1CE-C12B6B9FBF4E}" Directory_="APPDIR" Attributes="0" KeyPath="Microsoft.WindowsAzure.Storage.dll"/> <ROW Component="Newtonsoft.Json.dll" ComponentId="{CE1E8492-4E41-44D4-80E0-F2DFE03DD95E}" Directory_="APPDIR" Attributes="0" KeyPath="Newtonsoft.Json.dll"/> <ROW Component="ProductInformation" ComponentId="{90CCE76F-23C8-48F8-A649-28AABA01DB40}" Directory_="APPDIR" Attributes="4" KeyPath="Version"/> + <ROW Component="ProtoCompilers" ComponentId="{E47EAC29-98CB-429D-8CA2-FBC91F5CA31D}" Directory_="ProtoCompilers_Dir" Attributes="0"/> <ROW Component="SHORTCUTDIR" ComponentId="{AE37F244-6B63-4042-80D7-9964CAA98AFB}" Directory_="SHORTCUTDIR" Attributes="0"/> <ROW Component="SimpleValidator.dll" ComponentId="{4184B8EC-88D3-4691-8C57-9C0234E8E720}" Directory_="APPDIR" Attributes="0" KeyPath="SimpleValidator.dll"/> <ROW Component="StubsExecutionGUI.exe" ComponentId="{D684A33C-E021-4BD6-84E7-6C04A1564AE2}" Directory_="APPDIR" Attributes="0" KeyPath="StubsExecutionGUI.exe"/> @@ -145,91 +150,95 @@ <ROW Component="Tango.SharedUI.dll" ComponentId="{E1BEC5BE-BEBF-4ACC-A96B-8CB69BD77BF7}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.SharedUI.dll"/> <ROW Component="Tango.Stubs.dll" ComponentId="{8C328AC0-C71F-4A34-8B8F-C7938C5EF9A1}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Stubs.dll"/> <ROW Component="Tango.Transport.dll" ComponentId="{7F23FE40-A587-4A44-A764-E7E74CCA7915}" Directory_="APPDIR" Attributes="0" KeyPath="Tango.Transport.dll"/> + <ROW Component="protobufnet.dll" ComponentId="{FD1664A4-86B4-4E48-9D9C-F2225A654941}" Directory_="APPDIR" Attributes="0" KeyPath="protobufnet.dll"/> <ROW Component="stubexec.exe" ComponentId="{C5E9AEE5-BA73-46A5-A80D-BD05BD0BCEE0}" Directory_="APPDIR" Attributes="0" KeyPath="stubexec.exe"/> <ROW Component="stubexec.exe.config" ComponentId="{451846C8-1ACD-4FC0-B20F-3473179721A2}" Directory_="APPDIR" Attributes="0" KeyPath="stubexec.exe.config" Type="0"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent"> - <ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0" Components="AI_ExePath ColorMine.dll DocumentFormat.OpenXml.dll EFCache.dll EntityFramework.dll FontAwesome.WPF.dll Google.Protobuf.dll ICSharpCode.AvalonEdit.dll Ionic.Zip.dll MahApps.Metro.dll Microsoft.Data.Edm.dll Microsoft.Data.Edm.resources.dll Microsoft.Data.Edm.resources.dll_10 Microsoft.Data.Edm.resources.dll_11 Microsoft.Data.Edm.resources.dll_12 Microsoft.Data.Edm.resources.dll_13 Microsoft.Data.Edm.resources.dll_14 Microsoft.Data.Edm.resources.dll_15 Microsoft.Data.Edm.resources.dll_16 Microsoft.Data.Edm.resources.dll_9 Microsoft.Data.OData.dll Microsoft.Data.OData.resources.dll Microsoft.Data.OData.resources.dll_10 Microsoft.Data.OData.resources.dll_11 Microsoft.Data.OData.resources.dll_12 Microsoft.Data.OData.resources.dll_13 Microsoft.Data.OData.resources.dll_14 Microsoft.Data.OData.resources.dll_15 Microsoft.Data.OData.resources.dll_16 Microsoft.Data.OData.resources.dll_9 Microsoft.Data.Services.Client.dll Microsoft.Data.Services.Client.resources.dll Microsoft.Data.Services.Client.resources.dll_10 Microsoft.Data.Services.Client.resources.dll_11 Microsoft.Data.Services.Client.resources.dll_12 Microsoft.Data.Services.Client.resources.dll_13 Microsoft.Data.Services.Client.resources.dll_14 Microsoft.Data.Services.Client.resources.dll_15 Microsoft.Data.Services.Client.resources.dll_16 Microsoft.Data.Services.Client.resources.dll_9 Microsoft.WindowsAzure.Storage.dll Newtonsoft.Json.dll ProductInformation SHORTCUTDIR SimpleValidator.dll StubsExecutionGUI.exe System.Data.SQLite.dll System.Reactive.Core.dll System.Reactive.Interfaces.dll System.Reactive.Linq.dll System.Reactive.PlatformServices.dll System.Windows.Interactivity.dll Tango.BL.dll Tango.ColorConversion.dll Tango.Core.dll Tango.Documents.dll Tango.DragAndDrop.dll Tango.FirmwareUpdateLib.WPF.dll Tango.FirmwareUpdateLib.dll Tango.Integration.dll Tango.Logging.dll Tango.PMR.dll Tango.Scripting.dll Tango.Serialization.dll Tango.Settings.dll Tango.SharedUI.dll Tango.Stubs.dll Tango.Transport.dll stubexec.exe stubexec.exe.config"/> + <ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/> <ATTRIBUTE name="CurrentFeature" value="MainFeature"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiFilesComponent"> - <ROW File="ColorMine.dll" Component_="ColorMine.dll" FileName="COLORM~1.DLL|ColorMine.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ColorMine.dll" SelfReg="false" NextFile="DocumentFormat.OpenXml.dll"/> - <ROW File="DocumentFormat.OpenXml.dll" Component_="DocumentFormat.OpenXml.dll" FileName="DOCUME~1.DLL|DocumentFormat.OpenXml.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\DocumentFormat.OpenXml.dll" SelfReg="false" NextFile="EFCache.dll"/> - <ROW File="EFCache.dll" Component_="EFCache.dll" FileName="EFCache.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\EFCache.dll" SelfReg="false" NextFile="EntityFramework.dll"/> - <ROW File="EntityFramework.dll" Component_="EntityFramework.dll" FileName="ENTITY~1.DLL|EntityFramework.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\EntityFramework.dll" SelfReg="false" NextFile="FontAwesome.WPF.dll"/> - <ROW File="FontAwesome.WPF.dll" Component_="FontAwesome.WPF.dll" FileName="FONTAW~1.DLL|FontAwesome.WPF.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\FontAwesome.WPF.dll" SelfReg="false" NextFile="Google.Protobuf.dll"/> - <ROW File="Google.Protobuf.dll" Component_="Google.Protobuf.dll" FileName="GOOGLE~1.DLL|Google.Protobuf.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Google.Protobuf.dll" SelfReg="false" NextFile="ICSharpCode.AvalonEdit.dll"/> - <ROW File="ICSharpCode.AvalonEdit.dll" Component_="ICSharpCode.AvalonEdit.dll" FileName="ICSHAR~1.DLL|ICSharpCode.AvalonEdit.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ICSharpCode.AvalonEdit.dll" SelfReg="false" NextFile="Ionic.Zip.dll"/> - <ROW File="Ionic.Zip.dll" Component_="Ionic.Zip.dll" FileName="IONICZ~1.DLL|Ionic.Zip.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Ionic.Zip.dll" SelfReg="false" NextFile="MahApps.Metro.dll"/> - <ROW File="MahApps.Metro.dll" Component_="MahApps.Metro.dll" FileName="MAHAPP~1.DLL|MahApps.Metro.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\MahApps.Metro.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.dll"/> - <ROW File="Microsoft.Data.Edm.dll" Component_="Microsoft.Data.Edm.dll" FileName="MICROS~1.DLL|Microsoft.Data.Edm.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.Edm.dll" SelfReg="false" NextFile="Microsoft.Data.OData.dll"/> - <ROW File="Microsoft.Data.Edm.resources.dll" Component_="Microsoft.Data.Edm.resources.dll" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll"/> - <ROW File="Microsoft.Data.Edm.resources.dll_10" Component_="Microsoft.Data.Edm.resources.dll_10" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_10"/> - <ROW File="Microsoft.Data.Edm.resources.dll_11" Component_="Microsoft.Data.Edm.resources.dll_11" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_11"/> - <ROW File="Microsoft.Data.Edm.resources.dll_12" Component_="Microsoft.Data.Edm.resources.dll_12" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_12"/> - <ROW File="Microsoft.Data.Edm.resources.dll_13" Component_="Microsoft.Data.Edm.resources.dll_13" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_13"/> - <ROW File="Microsoft.Data.Edm.resources.dll_14" Component_="Microsoft.Data.Edm.resources.dll_14" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_14"/> - <ROW File="Microsoft.Data.Edm.resources.dll_15" Component_="Microsoft.Data.Edm.resources.dll_15" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_15"/> - <ROW File="Microsoft.Data.Edm.resources.dll_16" Component_="Microsoft.Data.Edm.resources.dll_16" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_16"/> - <ROW File="Microsoft.Data.Edm.resources.dll_9" Component_="Microsoft.Data.Edm.resources.dll_9" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.Edm.resources.dll" SelfReg="false" NextFile="Microsoft.Data.OData.resources.dll_9"/> - <ROW File="Microsoft.Data.OData.dll" Component_="Microsoft.Data.OData.dll" FileName="MICROS~2.DLL|Microsoft.Data.OData.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.OData.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.dll"/> - <ROW File="Microsoft.Data.OData.resources.dll" Component_="Microsoft.Data.OData.resources.dll" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll"/> - <ROW File="Microsoft.Data.OData.resources.dll_10" Component_="Microsoft.Data.OData.resources.dll_10" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_10"/> - <ROW File="Microsoft.Data.OData.resources.dll_11" Component_="Microsoft.Data.OData.resources.dll_11" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_11"/> - <ROW File="Microsoft.Data.OData.resources.dll_12" Component_="Microsoft.Data.OData.resources.dll_12" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_12"/> - <ROW File="Microsoft.Data.OData.resources.dll_13" Component_="Microsoft.Data.OData.resources.dll_13" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_13"/> - <ROW File="Microsoft.Data.OData.resources.dll_14" Component_="Microsoft.Data.OData.resources.dll_14" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_14"/> - <ROW File="Microsoft.Data.OData.resources.dll_15" Component_="Microsoft.Data.OData.resources.dll_15" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_15"/> - <ROW File="Microsoft.Data.OData.resources.dll_16" Component_="Microsoft.Data.OData.resources.dll_16" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_16"/> - <ROW File="Microsoft.Data.OData.resources.dll_9" Component_="Microsoft.Data.OData.resources.dll_9" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.OData.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Services.Client.resources.dll_9"/> - <ROW File="Microsoft.Data.Services.Client.dll" Component_="Microsoft.Data.Services.Client.dll" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.Services.Client.dll" SelfReg="false" NextFile="Microsoft.WindowsAzure.Storage.dll"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll" Component_="Microsoft.Data.Services.Client.resources.dll" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_9"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_10" Component_="Microsoft.Data.Services.Client.resources.dll_10" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_11"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_11" Component_="Microsoft.Data.Services.Client.resources.dll_11" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_12"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_12" Component_="Microsoft.Data.Services.Client.resources.dll_12" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_13"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_13" Component_="Microsoft.Data.Services.Client.resources.dll_13" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_14"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_14" Component_="Microsoft.Data.Services.Client.resources.dll_14" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_15"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_15" Component_="Microsoft.Data.Services.Client.resources.dll_15" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_16"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_16" Component_="Microsoft.Data.Services.Client.resources.dll_16" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> - <ROW File="Microsoft.Data.Services.Client.resources.dll_9" Component_="Microsoft.Data.Services.Client.resources.dll_9" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.Services.Client.resources.dll" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll_10"/> - <ROW File="Microsoft.WindowsAzure.Storage.dll" Component_="Microsoft.WindowsAzure.Storage.dll" FileName="MICROS~4.DLL|Microsoft.WindowsAzure.Storage.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.WindowsAzure.Storage.dll" SelfReg="false" NextFile="Newtonsoft.Json.dll"/> - <ROW File="Newtonsoft.Json.dll" Component_="Newtonsoft.Json.dll" FileName="NEWTON~1.DLL|Newtonsoft.Json.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Newtonsoft.Json.dll" SelfReg="false" NextFile="SimpleValidator.dll"/> - <ROW File="SimpleValidator.dll" Component_="SimpleValidator.dll" FileName="SIMPLE~1.DLL|SimpleValidator.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\SimpleValidator.dll" SelfReg="false" NextFile="stubexec.exe"/> - <ROW File="StubsExecutionGUI.exe" Component_="StubsExecutionGUI.exe" FileName="STUBSE~1.EXE|StubsExecutionGUI.exe" Attributes="0" SourcePath="..\Build\Stubs\Debug\StubsExecutionGUI.exe" SelfReg="false" NextFile="StubsExecutionGUI.exe.config" DigSign="true"/> - <ROW File="StubsExecutionGUI.exe.config" Component_="stubexec.exe.config" FileName="STUBSE~1.CON|StubsExecutionGUI.exe.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\StubsExecutionGUI.exe.config" SelfReg="false" NextFile="System.Data.SQLite.dll"/> - <ROW File="System.Data.SQLite.dll" Component_="System.Data.SQLite.dll" FileName="SYSTEM~1.DLL|System.Data.SQLite.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Data.SQLite.dll" SelfReg="false" NextFile="System.Data.SQLite.dll.config"/> - <ROW File="System.Data.SQLite.dll.config" Component_="stubexec.exe.config" FileName="SYSTEM~1.CON|System.Data.SQLite.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Data.SQLite.dll.config" SelfReg="false" NextFile="System.Reactive.Core.dll"/> - <ROW File="System.Reactive.Core.dll" Component_="System.Reactive.Core.dll" FileName="SYSTEM~2.DLL|System.Reactive.Core.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Core.dll" SelfReg="false" NextFile="System.Reactive.Interfaces.dll"/> - <ROW File="System.Reactive.Interfaces.dll" Component_="System.Reactive.Interfaces.dll" FileName="SYSTEM~3.DLL|System.Reactive.Interfaces.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Interfaces.dll" SelfReg="false" NextFile="System.Reactive.Linq.dll"/> - <ROW File="System.Reactive.Linq.dll" Component_="System.Reactive.Linq.dll" FileName="SYSTEM~4.DLL|System.Reactive.Linq.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Linq.dll" SelfReg="false" NextFile="System.Reactive.PlatformServices.dll"/> - <ROW File="System.Reactive.PlatformServices.dll" Component_="System.Reactive.PlatformServices.dll" FileName="SYSTEM~5.DLL|System.Reactive.PlatformServices.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.PlatformServices.dll" SelfReg="false" NextFile="System.Windows.Interactivity.dll"/> - <ROW File="System.Windows.Interactivity.dll" Component_="System.Windows.Interactivity.dll" FileName="SYSTEM~6.DLL|System.Windows.Interactivity.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Windows.Interactivity.dll" SelfReg="false" NextFile="Tango.BL.dll"/> - <ROW File="Tango.BL.dll" Component_="Tango.BL.dll" FileName="TANGOB~1.DLL|Tango.BL.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.BL.dll" SelfReg="false" NextFile="Tango.BL.dll.config"/> - <ROW File="Tango.BL.dll.config" Component_="stubexec.exe.config" FileName="TANGOB~1.CON|Tango.BL.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.BL.dll.config" SelfReg="false" NextFile="Tango.ColorConversion.dll"/> - <ROW File="Tango.ColorConversion.dll" Component_="Tango.ColorConversion.dll" FileName="TANGOC~1.DLL|Tango.ColorConversion.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.ColorConversion.dll" SelfReg="false" NextFile="Tango.Core.dll"/> - <ROW File="Tango.Core.dll" Component_="Tango.Core.dll" FileName="TANGOC~2.DLL|Tango.Core.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Core.dll" SelfReg="false" NextFile="Tango.Core.dll.config"/> - <ROW File="Tango.Core.dll.config" Component_="stubexec.exe.config" FileName="TANGOC~1.CON|Tango.Core.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Core.dll.config" SelfReg="false" NextFile="Tango.Documents.dll"/> - <ROW File="Tango.Documents.dll" Component_="Tango.Documents.dll" FileName="TANGOD~1.DLL|Tango.Documents.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Documents.dll" SelfReg="false" NextFile="Tango.DragAndDrop.dll"/> - <ROW File="Tango.DragAndDrop.dll" Component_="Tango.DragAndDrop.dll" FileName="TANGOD~2.DLL|Tango.DragAndDrop.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.DragAndDrop.dll" SelfReg="false" NextFile="Tango.DragAndDrop.dll.config"/> - <ROW File="Tango.DragAndDrop.dll.config" Component_="stubexec.exe.config" FileName="TANGOD~1.CON|Tango.DragAndDrop.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.DragAndDrop.dll.config" SelfReg="false" NextFile="Tango.FirmwareUpdateLib.dll"/> - <ROW File="Tango.FirmwareUpdateLib.WPF.dll" Component_="Tango.FirmwareUpdateLib.WPF.dll" FileName="TANGOF~2.DLL|Tango.FirmwareUpdateLib.WPF.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.FirmwareUpdateLib.WPF.dll" SelfReg="false" NextFile="Tango.Integration.dll"/> - <ROW File="Tango.FirmwareUpdateLib.dll" Component_="Tango.FirmwareUpdateLib.dll" FileName="TANGOF~1.DLL|Tango.FirmwareUpdateLib.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.FirmwareUpdateLib.dll" SelfReg="false" NextFile="Tango.FirmwareUpdateLib.WPF.dll"/> - <ROW File="Tango.Integration.dll" Component_="Tango.Integration.dll" FileName="TANGOI~1.DLL|Tango.Integration.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Integration.dll" SelfReg="false" NextFile="Tango.Integration.dll.config"/> - <ROW File="Tango.Integration.dll.config" Component_="stubexec.exe.config" FileName="TANGOI~1.CON|Tango.Integration.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Integration.dll.config" SelfReg="false" NextFile="Tango.Logging.dll"/> - <ROW File="Tango.Logging.dll" Component_="Tango.Logging.dll" FileName="TANGOL~1.DLL|Tango.Logging.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Logging.dll" SelfReg="false" NextFile="Tango.PMR.dll"/> - <ROW File="Tango.PMR.dll" Component_="Tango.PMR.dll" FileName="TANGOP~1.DLL|Tango.PMR.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.PMR.dll" SelfReg="false" NextFile="Tango.Scripting.dll"/> - <ROW File="Tango.Scripting.dll" Component_="Tango.Scripting.dll" FileName="TANGOS~1.DLL|Tango.Scripting.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Scripting.dll" SelfReg="false" NextFile="Tango.Scripting.dll.config"/> - <ROW File="Tango.Scripting.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~1.CON|Tango.Scripting.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Scripting.dll.config" SelfReg="false" NextFile="Tango.Serialization.dll"/> - <ROW File="Tango.Serialization.dll" Component_="Tango.Serialization.dll" FileName="TANGOS~2.DLL|Tango.Serialization.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Serialization.dll" SelfReg="false" NextFile="Tango.Settings.dll"/> - <ROW File="Tango.Settings.dll" Component_="Tango.Settings.dll" FileName="TANGOS~3.DLL|Tango.Settings.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Settings.dll" SelfReg="false" NextFile="Tango.SharedUI.dll"/> - <ROW File="Tango.SharedUI.dll" Component_="Tango.SharedUI.dll" FileName="TANGOS~4.DLL|Tango.SharedUI.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.SharedUI.dll" SelfReg="false" NextFile="Tango.SharedUI.dll.config"/> - <ROW File="Tango.SharedUI.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~2.CON|Tango.SharedUI.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.SharedUI.dll.config" SelfReg="false" NextFile="Tango.Stubs.dll"/> - <ROW File="Tango.Stubs.dll" Component_="Tango.Stubs.dll" FileName="TANGOS~5.DLL|Tango.Stubs.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Stubs.dll" SelfReg="false" NextFile="Tango.Stubs.dll.config"/> - <ROW File="Tango.Stubs.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~3.CON|Tango.Stubs.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Stubs.dll.config" SelfReg="false" NextFile="Tango.Transport.dll"/> - <ROW File="Tango.Transport.dll" Component_="Tango.Transport.dll" FileName="TANGOT~1.DLL|Tango.Transport.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Transport.dll" SelfReg="false" NextFile="Tango.Transport.dll.config"/> - <ROW File="Tango.Transport.dll.config" Component_="stubexec.exe.config" FileName="TANGOT~1.CON|Tango.Transport.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Transport.dll.config" SelfReg="false" NextFile="Microsoft.Data.Edm.resources.dll"/> - <ROW File="stubexec.exe" Component_="stubexec.exe" FileName="stubexec.exe" Attributes="0" SourcePath="..\Build\Stubs\Debug\stubexec.exe" SelfReg="false" NextFile="stubexec.exe.config" DigSign="true"/> - <ROW File="stubexec.exe.config" Component_="stubexec.exe.config" FileName="STUBEX~1.CON|stubexec.exe.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\stubexec.exe.config" SelfReg="false" NextFile="StubsExecutionGUI.exe"/> + <ROW File="ColorMine.dll" Component_="ColorMine.dll" FileName="COLORM~1.DLL|ColorMine.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ColorMine.dll" SelfReg="false"/> + <ROW File="DocumentFormat.OpenXml.dll" Component_="DocumentFormat.OpenXml.dll" FileName="DOCUME~1.DLL|DocumentFormat.OpenXml.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\DocumentFormat.OpenXml.dll" SelfReg="false"/> + <ROW File="EFCache.dll" Component_="EFCache.dll" FileName="EFCache.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\EFCache.dll" SelfReg="false"/> + <ROW File="EntityFramework.dll" Component_="EntityFramework.dll" FileName="ENTITY~1.DLL|EntityFramework.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\EntityFramework.dll" SelfReg="false"/> + <ROW File="FontAwesome.WPF.dll" Component_="FontAwesome.WPF.dll" FileName="FONTAW~1.DLL|FontAwesome.WPF.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\FontAwesome.WPF.dll" SelfReg="false"/> + <ROW File="Google.Protobuf.dll" Component_="Google.Protobuf.dll" FileName="GOOGLE~1.DLL|Google.Protobuf.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Google.Protobuf.dll" SelfReg="false"/> + <ROW File="ICSharpCode.AvalonEdit.dll" Component_="ICSharpCode.AvalonEdit.dll" FileName="ICSHAR~1.DLL|ICSharpCode.AvalonEdit.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ICSharpCode.AvalonEdit.dll" SelfReg="false"/> + <ROW File="Ionic.Zip.dll" Component_="Ionic.Zip.dll" FileName="IONICZ~1.DLL|Ionic.Zip.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Ionic.Zip.dll" SelfReg="false"/> + <ROW File="MahApps.Metro.dll" Component_="MahApps.Metro.dll" FileName="MAHAPP~1.DLL|MahApps.Metro.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\MahApps.Metro.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.dll" Component_="Microsoft.Data.Edm.dll" FileName="MICROS~1.DLL|Microsoft.Data.Edm.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.Edm.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.dll" Component_="Microsoft.Data.OData.dll" FileName="MICROS~2.DLL|Microsoft.Data.OData.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.OData.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.dll" Component_="Microsoft.Data.Services.Client.dll" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.Data.Services.Client.dll" SelfReg="false"/> + <ROW File="Microsoft.WindowsAzure.Storage.dll" Component_="Microsoft.WindowsAzure.Storage.dll" FileName="MICROS~4.DLL|Microsoft.WindowsAzure.Storage.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.WindowsAzure.Storage.dll" SelfReg="false"/> + <ROW File="Newtonsoft.Json.dll" Component_="Newtonsoft.Json.dll" FileName="NEWTON~1.DLL|Newtonsoft.Json.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Newtonsoft.Json.dll" SelfReg="false"/> + <ROW File="SimpleValidator.dll" Component_="SimpleValidator.dll" FileName="SIMPLE~1.DLL|SimpleValidator.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\SimpleValidator.dll" SelfReg="false"/> + <ROW File="stubexec.exe" Component_="stubexec.exe" FileName="stubexec.exe" Attributes="0" SourcePath="..\Build\Stubs\Debug\stubexec.exe" SelfReg="false" DigSign="true"/> + <ROW File="stubexec.exe.config" Component_="stubexec.exe.config" FileName="STUBEX~1.CON|stubexec.exe.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\stubexec.exe.config" SelfReg="false"/> + <ROW File="StubsExecutionGUI.exe" Component_="StubsExecutionGUI.exe" FileName="STUBSE~1.EXE|StubsExecutionGUI.exe" Attributes="0" SourcePath="..\Build\Stubs\Debug\StubsExecutionGUI.exe" SelfReg="false" DigSign="true"/> + <ROW File="StubsExecutionGUI.exe.config" Component_="stubexec.exe.config" FileName="STUBSE~1.CON|StubsExecutionGUI.exe.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\StubsExecutionGUI.exe.config" SelfReg="false"/> + <ROW File="System.Data.SQLite.dll" Component_="System.Data.SQLite.dll" FileName="SYSTEM~1.DLL|System.Data.SQLite.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Data.SQLite.dll" SelfReg="false"/> + <ROW File="System.Data.SQLite.dll.config" Component_="stubexec.exe.config" FileName="SYSTEM~1.CON|System.Data.SQLite.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Data.SQLite.dll.config" SelfReg="false"/> + <ROW File="System.Reactive.Core.dll" Component_="System.Reactive.Core.dll" FileName="SYSTEM~2.DLL|System.Reactive.Core.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Core.dll" SelfReg="false"/> + <ROW File="System.Reactive.Interfaces.dll" Component_="System.Reactive.Interfaces.dll" FileName="SYSTEM~3.DLL|System.Reactive.Interfaces.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Interfaces.dll" SelfReg="false"/> + <ROW File="System.Reactive.Linq.dll" Component_="System.Reactive.Linq.dll" FileName="SYSTEM~4.DLL|System.Reactive.Linq.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.Linq.dll" SelfReg="false"/> + <ROW File="System.Reactive.PlatformServices.dll" Component_="System.Reactive.PlatformServices.dll" FileName="SYSTEM~5.DLL|System.Reactive.PlatformServices.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Reactive.PlatformServices.dll" SelfReg="false"/> + <ROW File="System.Windows.Interactivity.dll" Component_="System.Windows.Interactivity.dll" FileName="SYSTEM~6.DLL|System.Windows.Interactivity.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\System.Windows.Interactivity.dll" SelfReg="false"/> + <ROW File="Tango.BL.dll" Component_="Tango.BL.dll" FileName="TANGOB~1.DLL|Tango.BL.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.BL.dll" SelfReg="false"/> + <ROW File="Tango.BL.dll.config" Component_="stubexec.exe.config" FileName="TANGOB~1.CON|Tango.BL.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.BL.dll.config" SelfReg="false"/> + <ROW File="Tango.ColorConversion.dll" Component_="Tango.ColorConversion.dll" FileName="TANGOC~1.DLL|Tango.ColorConversion.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.ColorConversion.dll" SelfReg="false"/> + <ROW File="Tango.Core.dll" Component_="Tango.Core.dll" FileName="TANGOC~2.DLL|Tango.Core.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Core.dll" SelfReg="false"/> + <ROW File="Tango.Core.dll.config" Component_="stubexec.exe.config" FileName="TANGOC~1.CON|Tango.Core.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Core.dll.config" SelfReg="false"/> + <ROW File="Tango.Documents.dll" Component_="Tango.Documents.dll" FileName="TANGOD~1.DLL|Tango.Documents.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Documents.dll" SelfReg="false"/> + <ROW File="Tango.DragAndDrop.dll" Component_="Tango.DragAndDrop.dll" FileName="TANGOD~2.DLL|Tango.DragAndDrop.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.DragAndDrop.dll" SelfReg="false"/> + <ROW File="Tango.DragAndDrop.dll.config" Component_="stubexec.exe.config" FileName="TANGOD~1.CON|Tango.DragAndDrop.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.DragAndDrop.dll.config" SelfReg="false"/> + <ROW File="Tango.FirmwareUpdateLib.dll" Component_="Tango.FirmwareUpdateLib.dll" FileName="TANGOF~1.DLL|Tango.FirmwareUpdateLib.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.FirmwareUpdateLib.dll" SelfReg="false"/> + <ROW File="Tango.FirmwareUpdateLib.WPF.dll" Component_="Tango.FirmwareUpdateLib.WPF.dll" FileName="TANGOF~2.DLL|Tango.FirmwareUpdateLib.WPF.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.FirmwareUpdateLib.WPF.dll" SelfReg="false"/> + <ROW File="Tango.Integration.dll" Component_="Tango.Integration.dll" FileName="TANGOI~1.DLL|Tango.Integration.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Integration.dll" SelfReg="false"/> + <ROW File="Tango.Integration.dll.config" Component_="stubexec.exe.config" FileName="TANGOI~1.CON|Tango.Integration.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Integration.dll.config" SelfReg="false"/> + <ROW File="Tango.Logging.dll" Component_="Tango.Logging.dll" FileName="TANGOL~1.DLL|Tango.Logging.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Logging.dll" SelfReg="false"/> + <ROW File="Tango.PMR.dll" Component_="Tango.PMR.dll" FileName="TANGOP~1.DLL|Tango.PMR.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.PMR.dll" SelfReg="false"/> + <ROW File="Tango.Scripting.dll" Component_="Tango.Scripting.dll" FileName="TANGOS~1.DLL|Tango.Scripting.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Scripting.dll" SelfReg="false"/> + <ROW File="Tango.Scripting.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~1.CON|Tango.Scripting.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Scripting.dll.config" SelfReg="false"/> + <ROW File="Tango.Serialization.dll" Component_="Tango.Serialization.dll" FileName="TANGOS~2.DLL|Tango.Serialization.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Serialization.dll" SelfReg="false"/> + <ROW File="Tango.Settings.dll" Component_="Tango.Settings.dll" FileName="TANGOS~3.DLL|Tango.Settings.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Settings.dll" SelfReg="false"/> + <ROW File="Tango.SharedUI.dll" Component_="Tango.SharedUI.dll" FileName="TANGOS~4.DLL|Tango.SharedUI.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.SharedUI.dll" SelfReg="false"/> + <ROW File="Tango.SharedUI.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~2.CON|Tango.SharedUI.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.SharedUI.dll.config" SelfReg="false"/> + <ROW File="Tango.Stubs.dll" Component_="Tango.Stubs.dll" FileName="TANGOS~5.DLL|Tango.Stubs.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Stubs.dll" SelfReg="false"/> + <ROW File="Tango.Stubs.dll.config" Component_="stubexec.exe.config" FileName="TANGOS~3.CON|Tango.Stubs.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Stubs.dll.config" SelfReg="false"/> + <ROW File="Tango.Transport.dll" Component_="Tango.Transport.dll" FileName="TANGOT~1.DLL|Tango.Transport.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Transport.dll" SelfReg="false"/> + <ROW File="Tango.Transport.dll.config" Component_="stubexec.exe.config" FileName="TANGOT~1.CON|Tango.Transport.dll.config" Attributes="0" SourcePath="..\Build\Stubs\Debug\Tango.Transport.dll.config" SelfReg="false"/> + <ROW File="LiteDB.dll" Component_="LiteDB.dll" FileName="LiteDB.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\LiteDB.dll" SelfReg="false"/> + <ROW File="Microsoft.AspNet.SignalR.Client.dll" Component_="Microsoft.AspNet.SignalR.Client.dll" FileName="MICROS~5.DLL|Microsoft.AspNet.SignalR.Client.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\Microsoft.AspNet.SignalR.Client.dll" SelfReg="false"/> + <ROW File="protobufnet.dll" Component_="protobufnet.dll" FileName="PROTOB~1.DLL|protobuf-net.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\protobuf-net.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll" Component_="Microsoft.Data.Edm.resources.dll" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll" Component_="Microsoft.Data.OData.resources.dll" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll" Component_="Microsoft.Data.Services.Client.resources.dll" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\de\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_1" Component_="Microsoft.Data.Edm.resources.dll_1" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_1" Component_="Microsoft.Data.OData.resources.dll_1" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_1" Component_="Microsoft.Data.Services.Client.resources.dll_1" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\es\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_2" Component_="Microsoft.Data.Edm.resources.dll_2" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_2" Component_="Microsoft.Data.OData.resources.dll_2" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_2" Component_="Microsoft.Data.Services.Client.resources.dll_2" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\fr\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_3" Component_="Microsoft.Data.Edm.resources.dll_3" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_3" Component_="Microsoft.Data.OData.resources.dll_3" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_3" Component_="Microsoft.Data.Services.Client.resources.dll_3" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\it\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_4" Component_="Microsoft.Data.Edm.resources.dll_4" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_4" Component_="Microsoft.Data.OData.resources.dll_4" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_4" Component_="Microsoft.Data.Services.Client.resources.dll_4" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ja\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_5" Component_="Microsoft.Data.Edm.resources.dll_5" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_5" Component_="Microsoft.Data.OData.resources.dll_5" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_5" Component_="Microsoft.Data.Services.Client.resources.dll_5" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ko\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_6" Component_="Microsoft.Data.Edm.resources.dll_6" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_6" Component_="Microsoft.Data.OData.resources.dll_6" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_6" Component_="Microsoft.Data.Services.Client.resources.dll_6" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\ru\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_7" Component_="Microsoft.Data.Edm.resources.dll_7" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_7" Component_="Microsoft.Data.OData.resources.dll_7" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_7" Component_="Microsoft.Data.Services.Client.resources.dll_7" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hans\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Edm.resources.dll_8" Component_="Microsoft.Data.Edm.resources.dll_8" FileName="MICROS~1.DLL|Microsoft.Data.Edm.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.Edm.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.OData.resources.dll_8" Component_="Microsoft.Data.OData.resources.dll_8" FileName="MICROS~2.DLL|Microsoft.Data.OData.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.OData.resources.dll" SelfReg="false"/> + <ROW File="Microsoft.Data.Services.Client.resources.dll_8" Component_="Microsoft.Data.Services.Client.resources.dll_8" FileName="MICROS~3.DLL|Microsoft.Data.Services.Client.resources.dll" Attributes="0" SourcePath="..\Build\Stubs\Debug\zh-Hant\Microsoft.Data.Services.Client.resources.dll" SelfReg="false"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent"> <ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/> @@ -326,6 +335,8 @@ </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent"> <ROW Directory_="SHORTCUTDIR" Component_="SHORTCUTDIR" ManualDelete="false"/> + <ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/> + <ROW Directory_="ProtoCompilers_Dir" Component_="ProtoCompilers" ManualDelete="false"/> </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent"> <ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/> @@ -354,6 +365,83 @@ <ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]"/> <ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/> </COMPONENT> + <COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent"> + <ROW Feature_="MainFeature" Component_="AI_ExePath"/> + <ROW Feature_="MainFeature" Component_="ColorMine.dll"/> + <ROW Feature_="MainFeature" Component_="DocumentFormat.OpenXml.dll"/> + <ROW Feature_="MainFeature" Component_="EFCache.dll"/> + <ROW Feature_="MainFeature" Component_="EntityFramework.dll"/> + <ROW Feature_="MainFeature" Component_="FontAwesome.WPF.dll"/> + <ROW Feature_="MainFeature" Component_="Google.Protobuf.dll"/> + <ROW Feature_="MainFeature" Component_="ICSharpCode.AvalonEdit.dll"/> + <ROW Feature_="MainFeature" Component_="Ionic.Zip.dll"/> + <ROW Feature_="MainFeature" Component_="MahApps.Metro.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.WindowsAzure.Storage.dll"/> + <ROW Feature_="MainFeature" Component_="Newtonsoft.Json.dll"/> + <ROW Feature_="MainFeature" Component_="ProductInformation"/> + <ROW Feature_="MainFeature" Component_="SHORTCUTDIR"/> + <ROW Feature_="MainFeature" Component_="SimpleValidator.dll"/> + <ROW Feature_="MainFeature" Component_="StubsExecutionGUI.exe"/> + <ROW Feature_="MainFeature" Component_="System.Data.SQLite.dll"/> + <ROW Feature_="MainFeature" Component_="System.Reactive.Core.dll"/> + <ROW Feature_="MainFeature" Component_="System.Reactive.Interfaces.dll"/> + <ROW Feature_="MainFeature" Component_="System.Reactive.Linq.dll"/> + <ROW Feature_="MainFeature" Component_="System.Reactive.PlatformServices.dll"/> + <ROW Feature_="MainFeature" Component_="System.Windows.Interactivity.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.BL.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.ColorConversion.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Core.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Documents.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.DragAndDrop.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.FirmwareUpdateLib.WPF.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.FirmwareUpdateLib.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Integration.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Logging.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.PMR.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Scripting.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Serialization.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Settings.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.SharedUI.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Stubs.dll"/> + <ROW Feature_="MainFeature" Component_="Tango.Transport.dll"/> + <ROW Feature_="MainFeature" Component_="stubexec.exe"/> + <ROW Feature_="MainFeature" Component_="stubexec.exe.config"/> + <ROW Feature_="MainFeature" Component_="APPDIR"/> + <ROW Feature_="MainFeature" Component_="LiteDB.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.AspNet.SignalR.Client.dll"/> + <ROW Feature_="MainFeature" Component_="protobufnet.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_1"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_1"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_1"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_2"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_2"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_2"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_3"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_3"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_3"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_4"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_4"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_4"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_5"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_5"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_5"/> + <ROW Feature_="MainFeature" Component_="ProtoCompilers"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_6"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_6"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_6"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_7"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_7"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_7"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Edm.resources.dll_8"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.OData.resources.dll_8"/> + <ROW Feature_="MainFeature" Component_="Microsoft.Data.Services.Client.resources.dll_8"/> + </COMPONENT> <COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent"> <ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel <> 5)" Sequence="210"/> <ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=""" Sequence="749"/> diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/App.config b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/App.config new file mode 100644 index 000000000..f850936a4 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/App.config @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <configSections> + <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> + </configSections> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> + </startup> + <entityFramework> + <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> + <providers> + <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> + </providers> + </entityFramework> + <runtime> + <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> + <dependentAssembly> + <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="5.0.5.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Z.EntityFramework.Extensions" publicKeyToken="59b66d028979105b" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.50.0" newVersion="4.0.50.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" /> + </dependentAssembly> + </assemblyBinding> + </runtime> +</configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtil.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtil.cs new file mode 100644 index 000000000..b18476e3f --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtil.cs @@ -0,0 +1,131 @@ +using ConsoleTables; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.Cryptography; +using Tango.DataStore.Web; +using Tango.Settings; +using Tango.Web; + +namespace Tango.DataStore.CLI +{ + public class DataStoreConsole + { + public void Get(GetOptions options) + { + try + { + ApplyAutoLogin(options); + + if (options.MachineSerialNumber != null) + { + Console.WriteLine($"Retrieving data store values for '{options.MachineSerialNumber}'..."); + } + else + { + Console.WriteLine("Retrieving global data store values..."); + } + + var client = CreateClient(options.Email, options.Password, options.Environment); + + var items = client.Get(options.MachineSerialNumber, options.Collection, options.Key).ToList(); + + ConsoleTable table = new ConsoleTable("COLLECTION", "KEY", "DATA TYPE", "PROTO TYPE", "STATE", "GLOBAL", "LOCAL"); + + foreach (var item in items) + { + table.AddRow(item.Collection, item.Key, item.DataType, item.ProtoMessageType != MessageType.None ? item.ProtoMessageType.ToString() : null, item.Type, item.GlobalValue.ToStringSafe().ToOneLine(), item.LocalValue.ToStringSafe().ToOneLine()); + } + + Console.WriteLine(); + Console.WriteLine("DATA STORE RESULTS:"); + Console.WriteLine(); + + table.Write(); + } + catch (Exception ex) + { + Console.WriteLine(ex.FlattenMessage()); + } + } + + public void Put(PutOptions options) + { + try + { + ApplyAutoLogin(options); + + if (options.MachineSerialNumber != null) + { + Console.WriteLine($"Storing data store value for '{options.MachineSerialNumber}'..."); + } + else + { + Console.WriteLine("Storing global data store value..."); + } + + var client = CreateClient(options.Email, options.Password, options.Environment); + + if (options.DataType == Web.DataType.Proto) + { + options.Value = options.Value.ToStringOrEmpty().Replace("'", "\""); + } + + client.Put(new DataStoreWebPutItem() + { + Collection = options.Collection, + Key = options.Key, + DataType = options.DataType, + MachineSerialNumber = options.MachineSerialNumber, + ProtoMessageType = options.ProtoMessageType, + Value = options.Value + }); + + Console.WriteLine($"Item '{options.Key}' stored successfully."); + } + catch (Exception ex) + { + Console.WriteLine(ex.FlattenMessage()); + } + } + + public void AutoLogin(LoginConfig options) + { + MachineLevelCryptographer crypt = new MachineLevelCryptographer(); + var settings = SettingsManager.Default.GetOrCreate<DataStoreUtilSettings>(); + settings.Email = options.Email; + settings.Password = crypt.Encrypt(options.Password); + settings.Save(); + } + + private void ApplyAutoLogin(OptionsBase options) + { + if (options.Email == null && options.Password == null) + { + MachineLevelCryptographer crypt = new MachineLevelCryptographer(); + var settings = SettingsManager.Default.GetOrCreate<DataStoreUtilSettings>(); + options.Email = settings.Email; + options.Password = crypt.Decrypt(settings.Password); + } + } + + private DataStoreClient CreateClient(String email, String password, DeploymentSlot slot) + { + String token = String.Empty; + + HttpClient http = new HttpClient(); + DataStoreClient dsClient = new DataStoreClient(slot.ToAddress(), http); + var response = dsClient.Login(new LoginRequest() + { + Email = email, + Password = password, + }); + http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", response.Token); + + return dsClient; + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtilSettings.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtilSettings.cs new file mode 100644 index 000000000..58380d231 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/DataStoreUtilSettings.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Settings; + +namespace Tango.DataStore.CLI +{ + public class DataStoreUtilSettings : SettingsBase + { + public String Email { get; set; } + public String Password { get; set; } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Options.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Options.cs new file mode 100644 index 000000000..fd91a5722 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Options.cs @@ -0,0 +1,68 @@ +using CommandLine; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore.Web; +using Tango.Web; + +namespace Tango.DataStore.CLI +{ + public class OptionsBase + { + [Option(longName: "email", HelpText = "Email address.")] + public String Email { get; set; } + + [Option(longName: "password", HelpText = "Password.")] + public String Password { get; set; } + + [Option(longName: "env", HelpText = "The target environment.", Required = true)] + public DeploymentSlot Environment { get; set; } + } + + [Verb("get", HelpText = "Get a data store item.")] + public class GetOptions : OptionsBase + { + [Option(longName: "sn", HelpText = "Machine serial number. if not specified will return only global values.")] + public String MachineSerialNumber { get; set; } + + [Option(longName: "collection", HelpText = "Collection name.\nIf not specified will return all collections.\nIf 'key' if specified the 'collection' must be specified.")] + public String Collection { get; set; } + + [Option(longName: "key", HelpText = "Item key. If not specified will return the entire collection.")] + public String Key { get; set; } + } + + [Verb("put", HelpText = "Put a new, or update an existing data store item.")] + public class PutOptions : OptionsBase + { + [Option(longName: "sn", HelpText = "Machine serial number. If not specified will put a value on the global data store.")] + public String MachineSerialNumber { get; set; } + + [Option(longName: "collection", HelpText = "New or existing collection name.", Required = true)] + public String Collection { get; set; } + + [Option(longName: "key", HelpText = "New or existing item key", Required = true)] + public String Key { get; set; } + + [Option(longName: "data-type", HelpText = "Item data type", Required = true)] + public Web.DataType DataType { get; set; } + + [Option(longName: "proto-type", HelpText = "Protobuf message type when data-type is 'Proto'.")] + public MessageType ProtoMessageType { get; set; } + + [Option(longName: "value", HelpText = "Item value", Required = true)] + public String Value { get; set; } + } + + [Verb("login-config", HelpText = "Stores the specified credentials for use with the --auto-login flag.")] + public class LoginConfig + { + [Option(longName: "email", HelpText = "Email address.")] + public String Email { get; set; } + + [Option(longName: "password", HelpText = "Password.")] + public String Password { get; set; } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Program.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Program.cs new file mode 100644 index 000000000..85dfbb0bb --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Program.cs @@ -0,0 +1,48 @@ +using CommandLine; +using ConsoleTables; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.DataStore.Web; +using Tango.Web; + +namespace Tango.DataStore.CLI +{ + class Program + { + static void Main(string[] args) + { + var console = new DataStoreConsole(); + + var result = Parser.Default.ParseArguments<GetOptions, PutOptions, LoginConfig>(args) + .WithParsed<GetOptions>((options) => + { + console.Get(options); + }) + .WithParsed<PutOptions>((options) => + { + console.Put(options); + }) + .WithParsed<LoginConfig>((options) => + { + console.AutoLogin(options); + }) + .WithNotParsed((errors) => + { + + }); + + if (Debugger.IsAttached) + { + Console.WriteLine(); + Console.WriteLine("Press return to exit..."); + Console.ReadLine(); + } + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..366b8e28e --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Tango.DataStore.CLI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.DataStore.CLI")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6189b8c3-7af9-43dd-8a61-a8a05f526f62")] + +// 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/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Tango.DataStore.CLI.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Tango.DataStore.CLI.csproj new file mode 100644 index 000000000..42b0b95dc --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Tango.DataStore.CLI.csproj @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{6189B8C3-7AF9-43DD-8A61-A8A05F526F62}</ProjectGuid> + <OutputType>Exe</OutputType> + <RootNamespace>Tango.DataStore.CLI</RootNamespace> + <AssemblyName>dsUtil</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> + <Deterministic>true</Deterministic> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="CommandLine, Version=2.8.0.0, Culture=neutral, PublicKeyToken=5a870481e358d379, processorArchitecture=MSIL"> + <HintPath>..\..\packages\CommandLineParser.2.8.0\lib\net461\CommandLine.dll</HintPath> + </Reference> + <Reference Include="ConsoleTables, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\packages\ConsoleTables.2.4.2\lib\net40\ConsoleTables.dll</HintPath> + </Reference> + <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath> + </Reference> + <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> + </Reference> + <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath> + </Reference> + <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.ComponentModel.DataAnnotations" /> + <Reference Include="System.Core" /> + <Reference Include="System.Runtime.Serialization" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="DataStoreUtil.cs" /> + <Compile Include="DataStoreUtilSettings.cs" /> + <Compile Include="Options.cs" /> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Web\DataStoreClient.cs" /> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + <None Include="packages.config" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Tango.BL\Tango.BL.csproj"> + <Project>{F441FEEE-322A-4943-B566-110E12FD3B72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.PMR\Tango.PMR.csproj"> + <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> + <Name>Tango.PMR</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Settings\Tango.Settings.csproj"> + <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project> + <Name>Tango.Settings</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Web\Tango.Web.csproj"> + <Project>{5001990f-977b-48ff-b217-0236a5022ad8}</Project> + <Name>Tango.Web</Name> + </ProjectReference> + <ProjectReference Include="..\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <Folder Include="Options\" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <PropertyGroup> + <PreBuildEvent>REM nswag run "$(SolutionDir)Web\Tango.MachineService\Nswag\DataStoreClient.nswag" /variables:assembly="$(SolutionDir)Web\Tango.MachineService\bin\Tango.MachineService.dll",output="$(ProjectDir)Web\DataStoreClient.cs"</PreBuildEvent> + </PropertyGroup> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Web/DataStoreClient.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Web/DataStoreClient.cs new file mode 100644 index 000000000..cf280284f --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/Web/DataStoreClient.cs @@ -0,0 +1,3766 @@ +//---------------------- +// <auto-generated> +// Generated using the NSwag toolchain v13.2.3.0 (NJsonSchema v10.1.5.0 (Newtonsoft.Json v11.0.0.0)) (http://NSwag.org) +// </auto-generated> +//---------------------- + +#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." +#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." +#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' +#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... +#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." + +namespace Tango.DataStore.Web +{ + using System = global::System; + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.2.3.0 (NJsonSchema v10.1.5.0 (Newtonsoft.Json v11.0.0.0))")] + public partial class DataStoreClient + { + private string _baseUrl = ""; + private System.Net.Http.HttpClient _httpClient; + private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings; + + public DataStoreClient(string baseUrl, System.Net.Http.HttpClient httpClient) + { + BaseUrl = baseUrl; + _httpClient = httpClient; + _settings = new System.Lazy<Newtonsoft.Json.JsonSerializerSettings>(CreateSerializerSettings); + } + + private Newtonsoft.Json.JsonSerializerSettings CreateSerializerSettings() + { + var settings = new Newtonsoft.Json.JsonSerializerSettings(); + UpdateJsonSerializerSettings(settings); + return settings; + } + + public string BaseUrl + { + get { return _baseUrl; } + set { _baseUrl = value; } + } + + protected Newtonsoft.Json.JsonSerializerSettings JsonSerializerSettings { get { return _settings.Value; } } + + partial void UpdateJsonSerializerSettings(Newtonsoft.Json.JsonSerializerSettings settings); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); + partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); + partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); + + /// <exception cref="ApiException">A server side error occurred.</exception> + public System.Threading.Tasks.Task<LoginResponse> LoginAsync(LoginRequest request) + { + return LoginAsync(request, System.Threading.CancellationToken.None); + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public LoginResponse Login(LoginRequest request) + { + return System.Threading.Tasks.Task.Run(async () => await LoginAsync(request, System.Threading.CancellationToken.None)).GetAwaiter().GetResult(); + } + + /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> + /// <exception cref="ApiException">A server side error occurred.</exception> + public async System.Threading.Tasks.Task<LoginResponse> LoginAsync(LoginRequest request, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/DataStore/Login"); + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(request, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = ((int)response_.StatusCode).ToString(); + if (status_ == "200") + { + var objectResponse_ = await ReadObjectResponseAsync<LoginResponse>(response_, headers_).ConfigureAwait(false); + return objectResponse_.Object; + } + else + if (status_ != "200" && status_ != "204") + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null); + } + + return default(LoginResponse); + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DataStoreWebItem>> GetAsync(string sn, string collection, string key) + { + return GetAsync(sn, collection, key, System.Threading.CancellationToken.None); + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public System.Collections.Generic.ICollection<DataStoreWebItem> Get(string sn, string collection, string key) + { + return System.Threading.Tasks.Task.Run(async () => await GetAsync(sn, collection, key, System.Threading.CancellationToken.None)).GetAwaiter().GetResult(); + } + + /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> + /// <exception cref="ApiException">A server side error occurred.</exception> + public async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<DataStoreWebItem>> GetAsync(string sn, string collection, string key, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/DataStore/Get?"); + if (sn != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("sn") + "=").Append(System.Uri.EscapeDataString(ConvertToString(sn, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (collection != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("collection") + "=").Append(System.Uri.EscapeDataString(ConvertToString(collection, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + if (key != null) + { + urlBuilder_.Append(System.Uri.EscapeDataString("key") + "=").Append(System.Uri.EscapeDataString(ConvertToString(key, System.Globalization.CultureInfo.InvariantCulture))).Append("&"); + } + urlBuilder_.Length--; + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + request_.Method = new System.Net.Http.HttpMethod("GET"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = ((int)response_.StatusCode).ToString(); + if (status_ == "200") + { + var objectResponse_ = await ReadObjectResponseAsync<System.Collections.Generic.ICollection<DataStoreWebItem>>(response_, headers_).ConfigureAwait(false); + return objectResponse_.Object; + } + else + if (status_ != "200" && status_ != "204") + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null); + } + + return default(System.Collections.Generic.ICollection<DataStoreWebItem>); + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public System.Threading.Tasks.Task PutAsync(DataStoreWebPutItem item) + { + return PutAsync(item, System.Threading.CancellationToken.None); + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public void Put(DataStoreWebPutItem item) + { + System.Threading.Tasks.Task.Run(async () => await PutAsync(item, System.Threading.CancellationToken.None)).GetAwaiter().GetResult(); + } + + /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> + /// <exception cref="ApiException">A server side error occurred.</exception> + public async System.Threading.Tasks.Task PutAsync(DataStoreWebPutItem item, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/DataStore/Put"); + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(item, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("PUT"); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = ((int)response_.StatusCode).ToString(); + if (status_ == "204") + { + return; + } + else + if (status_ != "200" && status_ != "204") + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null); + } + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public System.Threading.Tasks.Task<FileResponse> ExecuteAsync(HttpControllerContext context) + { + return ExecuteAsync(context, System.Threading.CancellationToken.None); + } + + /// <exception cref="ApiException">A server side error occurred.</exception> + public FileResponse Execute(HttpControllerContext context) + { + return System.Threading.Tasks.Task.Run(async () => await ExecuteAsync(context, System.Threading.CancellationToken.None)).GetAwaiter().GetResult(); + } + + /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> + /// <exception cref="ApiException">A server side error occurred.</exception> + public async System.Threading.Tasks.Task<FileResponse> ExecuteAsync(HttpControllerContext context, System.Threading.CancellationToken cancellationToken) + { + var urlBuilder_ = new System.Text.StringBuilder(); + urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/DataStore/Execute"); + + var client_ = _httpClient; + try + { + using (var request_ = new System.Net.Http.HttpRequestMessage()) + { + var content_ = new System.Net.Http.StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(context, _settings.Value)); + content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); + request_.Content = content_; + request_.Method = new System.Net.Http.HttpMethod("POST"); + request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); + + PrepareRequest(client_, request_, urlBuilder_); + var url_ = urlBuilder_.ToString(); + request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); + PrepareRequest(client_, request_, url_); + + var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); + try + { + var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value); + if (response_.Content != null && response_.Content.Headers != null) + { + foreach (var item_ in response_.Content.Headers) + headers_[item_.Key] = item_.Value; + } + + ProcessResponse(client_, response_); + + var status_ = ((int)response_.StatusCode).ToString(); + if (status_ == "200" || status_ == "206") + { + var responseStream_ = response_.Content == null ? System.IO.Stream.Null : await response_.Content.ReadAsStreamAsync().ConfigureAwait(false); + var fileResponse_ = new FileResponse((int)response_.StatusCode, headers_, responseStream_, null, response_); + client_ = null; response_ = null; // response and client are disposed by FileResponse + return fileResponse_; + } + else + if (status_ != "200" && status_ != "204") + { + var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); + throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null); + } + + return default(FileResponse); + } + finally + { + if (response_ != null) + response_.Dispose(); + } + } + } + finally + { + } + } + + protected struct ObjectResponseResult<T> + { + public ObjectResponseResult(T responseObject, string responseText) + { + this.Object = responseObject; + this.Text = responseText; + } + + public T Object { get; } + + public string Text { get; } + } + + public bool ReadResponseAsString { get; set; } + + protected virtual async System.Threading.Tasks.Task<ObjectResponseResult<T>> ReadObjectResponseAsync<T>(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers) + { + if (response == null || response.Content == null) + { + return new ObjectResponseResult<T>(default(T), string.Empty); + } + + if (ReadResponseAsString) + { + var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); + try + { + var typedBody = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseText, JsonSerializerSettings); + return new ObjectResponseResult<T>(typedBody, responseText); + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); + } + } + else + { + try + { + using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) + using (var streamReader = new System.IO.StreamReader(responseStream)) + using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader)) + { + var serializer = Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings); + var typedBody = serializer.Deserialize<T>(jsonTextReader); + return new ObjectResponseResult<T>(typedBody, string.Empty); + } + } + catch (Newtonsoft.Json.JsonException exception) + { + var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; + throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); + } + } + } + + private string ConvertToString(object value, System.Globalization.CultureInfo cultureInfo) + { + if (value is System.Enum) + { + string name = System.Enum.GetName(value.GetType(), value); + if (name != null) + { + var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); + if (field != null) + { + var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) + as System.Runtime.Serialization.EnumMemberAttribute; + if (attribute != null) + { + return attribute.Value != null ? attribute.Value : name; + } + } + } + } + else if (value is bool) { + return System.Convert.ToString(value, cultureInfo).ToLowerInvariant(); + } + else if (value is byte[]) + { + return System.Convert.ToBase64String((byte[]) value); + } + else if (value != null && value.GetType().IsArray) + { + var array = System.Linq.Enumerable.OfType<object>((System.Array) value); + return string.Join(",", System.Linq.Enumerable.Select(array, o => ConvertToString(o, cultureInfo))); + } + + return System.Convert.ToString(value, cultureInfo); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class LoginResponse + { + [Newtonsoft.Json.JsonProperty("Token", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Token { get; set; } + + [Newtonsoft.Json.JsonProperty("ExpirationUTC", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset ExpirationUTC { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class LoginRequest + { + [Newtonsoft.Json.JsonProperty("Email", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Email { get; set; } + + [Newtonsoft.Json.JsonProperty("Password", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Password { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class DataStoreWebItem + { + [Newtonsoft.Json.JsonProperty("Collection", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Collection { get; set; } + + [Newtonsoft.Json.JsonProperty("Type", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public DataStoreWebItemType Type { get; set; } + + [Newtonsoft.Json.JsonProperty("Date", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset Date { get; set; } + + [Newtonsoft.Json.JsonProperty("Key", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Key { get; set; } + + [Newtonsoft.Json.JsonProperty("DataType", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public DataType DataType { get; set; } + + [Newtonsoft.Json.JsonProperty("ProtoMessageType", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public MessageType ProtoMessageType { get; set; } + + [Newtonsoft.Json.JsonProperty("LocalValue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object LocalValue { get; set; } + + [Newtonsoft.Json.JsonProperty("GlobalValue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object GlobalValue { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DataStoreWebItemType + { + [System.Runtime.Serialization.EnumMember(Value = @"Local")] + Local = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Global")] + Global = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Overrides")] + Overrides = 2, + + } + + /// <summary>Represents a data store item type.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DataType + { + [System.Runtime.Serialization.EnumMember(Value = @"Int32")] + Int32 = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"Float")] + Float = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"Double")] + Double = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"Boolean")] + Boolean = 3, + + [System.Runtime.Serialization.EnumMember(Value = @"String")] + String = 4, + + [System.Runtime.Serialization.EnumMember(Value = @"Bytes")] + Bytes = 5, + + [System.Runtime.Serialization.EnumMember(Value = @"Proto")] + Proto = 6, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum MessageType + { + [System.Runtime.Serialization.EnumMember(Value = @"None")] + None = 0, + + [System.Runtime.Serialization.EnumMember(Value = @"ErrorResponse")] + ErrorResponse = 1, + + [System.Runtime.Serialization.EnumMember(Value = @"CalculateRequest")] + CalculateRequest = 2, + + [System.Runtime.Serialization.EnumMember(Value = @"CalculateResponse")] + CalculateResponse = 3, + + [System.Runtime.Serialization.EnumMember(Value = @"ProgressRequest")] + ProgressRequest = 4, + + [System.Runtime.Serialization.EnumMember(Value = @"ProgressResponse")] + ProgressResponse = 5, + + [System.Runtime.Serialization.EnumMember(Value = @"StubCartridgeReadRequest")] + StubCartridgeReadRequest = 6, + + [System.Runtime.Serialization.EnumMember(Value = @"StubCartridgeReadResponse")] + StubCartridgeReadResponse = 7, + + [System.Runtime.Serialization.EnumMember(Value = @"StubCartridgeWriteRequest")] + StubCartridgeWriteRequest = 8, + + [System.Runtime.Serialization.EnumMember(Value = @"StubCartridgeWriteResponse")] + StubCartridgeWriteResponse = 9, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDispenserRequest")] + StubDispenserRequest = 10, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDispenserResponse")] + StubDispenserResponse = 11, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioinputSetupRequest")] + StubGpioinputSetupRequest = 12, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioinputSetupResponse")] + StubGpioinputSetupResponse = 13, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioreadBitRequest")] + StubGpioreadBitRequest = 14, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioreadBitResponse")] + StubGpioreadBitResponse = 15, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioreadByteRequest")] + StubGpioreadByteRequest = 16, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpioreadByteResponse")] + StubGpioreadByteResponse = 17, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpiowriteBitRequest")] + StubGpiowriteBitRequest = 18, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpiowriteBitResponse")] + StubGpiowriteBitResponse = 19, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpiowriteByteRequest")] + StubGpiowriteByteRequest = 20, + + [System.Runtime.Serialization.EnumMember(Value = @"StubGpiowriteByteResponse")] + StubGpiowriteByteResponse = 21, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeaterRequest")] + StubHeaterRequest = 22, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeaterResponse")] + StubHeaterResponse = 23, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2Crequest")] + StubI2Crequest = 24, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2Cresponse")] + StubI2Cresponse = 25, + + [System.Runtime.Serialization.EnumMember(Value = @"StubOptLimitSwitchRequest")] + StubOptLimitSwitchRequest = 26, + + [System.Runtime.Serialization.EnumMember(Value = @"StubOptLimitSwitchResponse")] + StubOptLimitSwitchResponse = 27, + + [System.Runtime.Serialization.EnumMember(Value = @"StubSteperMotorRequest")] + StubSteperMotorRequest = 28, + + [System.Runtime.Serialization.EnumMember(Value = @"StubSteperMotorResponse")] + StubSteperMotorResponse = 29, + + [System.Runtime.Serialization.EnumMember(Value = @"StubValveRequest")] + StubValveRequest = 30, + + [System.Runtime.Serialization.EnumMember(Value = @"StubValveResponse")] + StubValveResponse = 31, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashReadRequest")] + StubExtFlashReadRequest = 32, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashReadResponse")] + StubExtFlashReadResponse = 33, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashWriteRequest")] + StubExtFlashWriteRequest = 34, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashWriteResponse")] + StubExtFlashWriteResponse = 35, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgareadBackRegRequest")] + StubFpgareadBackRegRequest = 36, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgareadBackRegResponse")] + StubFpgareadBackRegResponse = 37, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgareadVersionRequest")] + StubFpgareadVersionRequest = 38, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgareadVersionResponse")] + StubFpgareadVersionResponse = 39, + + [System.Runtime.Serialization.EnumMember(Value = @"StubL6470DriverRequest")] + StubL6470DriverRequest = 40, + + [System.Runtime.Serialization.EnumMember(Value = @"StubL6470DriverResponse")] + StubL6470DriverResponse = 41, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorInitRequest")] + StubMotorInitRequest = 42, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorInitResponse")] + StubMotorInitResponse = 43, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorRunRequest")] + StubMotorRunRequest = 44, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorRunResponse")] + StubMotorRunResponse = 45, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorStopRequest")] + StubMotorStopRequest = 46, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorStopResponse")] + StubMotorStopResponse = 47, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorStatusRequest")] + StubMotorStatusRequest = 48, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorStatusResponse")] + StubMotorStatusResponse = 49, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorMovRequest")] + StubMotorMovRequest = 50, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorMovResponse")] + StubMotorMovResponse = 51, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorSpeedRequest")] + StubMotorSpeedRequest = 52, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorSpeedResponse")] + StubMotorSpeedResponse = 53, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorPositionRequest")] + StubMotorPositionRequest = 54, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorPositionResponse")] + StubMotorPositionResponse = 55, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHwversionRequest")] + StubHwversionRequest = 56, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHwversionResponse")] + StubHwversionResponse = 57, + + [System.Runtime.Serialization.EnumMember(Value = @"StubF3Gpo01WriteRequest")] + StubF3Gpo01WriteRequest = 58, + + [System.Runtime.Serialization.EnumMember(Value = @"StubF3Gpo01WriteResponse")] + StubF3Gpo01WriteResponse = 59, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeatingTestRequest")] + StubHeatingTestRequest = 60, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeatingTestResponse")] + StubHeatingTestResponse = 61, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeatingTestPollRequest")] + StubHeatingTestPollRequest = 62, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeatingTestPollResponse")] + StubHeatingTestPollResponse = 63, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorRequest")] + StubMotorRequest = 64, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorResponse")] + StubMotorResponse = 65, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorHomeMarkRequest")] + StubMotorHomeMarkRequest = 66, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorHomeMarkResponse")] + StubMotorHomeMarkResponse = 67, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorRunStepTickRequest")] + StubMotorRunStepTickRequest = 68, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMotorRunStepTickResponse")] + StubMotorRunStepTickResponse = 69, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgaReadRegRequest")] + StubFpgaReadRegRequest = 70, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgaReadRegResponse")] + StubFpgaReadRegResponse = 71, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgaWriteRegRequest")] + StubFpgaWriteRegRequest = 72, + + [System.Runtime.Serialization.EnumMember(Value = @"StubFpgaWriteRegResponse")] + StubFpgaWriteRegResponse = 73, + + [System.Runtime.Serialization.EnumMember(Value = @"StubReadEmbeddedVersionRequest")] + StubReadEmbeddedVersionRequest = 74, + + [System.Runtime.Serialization.EnumMember(Value = @"StubReadEmbeddedVersionResponse")] + StubReadEmbeddedVersionResponse = 75, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTivaReadRegRequest")] + StubTivaReadRegRequest = 76, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTivaReadRegResponse")] + StubTivaReadRegResponse = 77, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTivaWriteRegRequest")] + StubTivaWriteRegRequest = 78, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTivaWriteRegResponse")] + StubTivaWriteRegResponse = 79, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDancerPositionRequest")] + StubDancerPositionRequest = 80, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDancerPositionResponse")] + StubDancerPositionResponse = 81, + + [System.Runtime.Serialization.EnumMember(Value = @"StubSpeedSensorRequest")] + StubSpeedSensorRequest = 82, + + [System.Runtime.Serialization.EnumMember(Value = @"StubSpeedSensorResponse")] + StubSpeedSensorResponse = 83, + + [System.Runtime.Serialization.EnumMember(Value = @"StubRealTimeUsageRequest")] + StubRealTimeUsageRequest = 84, + + [System.Runtime.Serialization.EnumMember(Value = @"StubRealTimeUsageResponse")] + StubRealTimeUsageResponse = 85, + + [System.Runtime.Serialization.EnumMember(Value = @"StubIntAdcreadRequest")] + StubIntAdcreadRequest = 86, + + [System.Runtime.Serialization.EnumMember(Value = @"StubIntAdcreadResponse")] + StubIntAdcreadResponse = 87, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTempSensorRequest")] + StubTempSensorRequest = 88, + + [System.Runtime.Serialization.EnumMember(Value = @"StubTempSensorResponse")] + StubTempSensorResponse = 89, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2CreadBytesRequest")] + StubI2CreadBytesRequest = 90, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2CreadBytesResponse")] + StubI2CreadBytesResponse = 91, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2CwriteBytesRequest")] + StubI2CwriteBytesRequest = 92, + + [System.Runtime.Serialization.EnumMember(Value = @"StubI2CwriteBytesResponse")] + StubI2CwriteBytesResponse = 93, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashWriteWordsRequest")] + StubExtFlashWriteWordsRequest = 94, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashWriteWordsResponse")] + StubExtFlashWriteWordsResponse = 95, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashReadWordsRequest")] + StubExtFlashReadWordsRequest = 96, + + [System.Runtime.Serialization.EnumMember(Value = @"StubExtFlashReadWordsResponse")] + StubExtFlashReadWordsResponse = 97, + + [System.Runtime.Serialization.EnumMember(Value = @"StubJobRequest")] + StubJobRequest = 98, + + [System.Runtime.Serialization.EnumMember(Value = @"StubJobResponse")] + StubJobResponse = 99, + + [System.Runtime.Serialization.EnumMember(Value = @"StubAbortJobRequest")] + StubAbortJobRequest = 100, + + [System.Runtime.Serialization.EnumMember(Value = @"StubAbortJobResponse")] + StubAbortJobResponse = 101, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMidTankPressureSensorRequest")] + StubMidTankPressureSensorRequest = 102, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMidTankPressureSensorResponse")] + StubMidTankPressureSensorResponse = 103, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDispenserEepromRequest")] + StubDispenserEepromRequest = 104, + + [System.Runtime.Serialization.EnumMember(Value = @"StubDispenserEepromResponse")] + StubDispenserEepromResponse = 105, + + [System.Runtime.Serialization.EnumMember(Value = @"StubWhsEepromRequest")] + StubWhsEepromRequest = 106, + + [System.Runtime.Serialization.EnumMember(Value = @"StubWhsEepromResponse")] + StubWhsEepromResponse = 107, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMainCardEepromReadRequest")] + StubMainCardEepromReadRequest = 108, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMainCardEepromReadResponse")] + StubMainCardEepromReadResponse = 109, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMainCardEepromWriteRequest")] + StubMainCardEepromWriteRequest = 110, + + [System.Runtime.Serialization.EnumMember(Value = @"StubMainCardEepromWriteResponse")] + StubMainCardEepromWriteResponse = 111, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeadEepromRequest")] + StubHeadEepromRequest = 112, + + [System.Runtime.Serialization.EnumMember(Value = @"StubHeadEepromResponse")] + StubHeadEepromResponse = 113, + + [System.Runtime.Serialization.EnumMember(Value = @"ExternalBridgeUdpDiscoveryPacket")] + ExternalBridgeUdpDiscoveryPacket = 114, + + [System.Runtime.Serialization.EnumMember(Value = @"ExternalBridgeLoginRequest")] + ExternalBridgeLoginRequest = 115, + + [System.Runtime.Serialization.EnumMember(Value = @"ExternalBridgeLoginResponse")] + ExternalBridgeLoginResponse = 116, + + [System.Runtime.Serialization.EnumMember(Value = @"ExternalBridgeLogoutRequest")] + ExternalBridgeLogoutRequest = 117, + + [System.Runtime.Serialization.EnumMember(Value = @"ExternalBridgeLogoutResponse")] + ExternalBridgeLogoutResponse = 118, + + [System.Runtime.Serialization.EnumMember(Value = @"DirectSynchronizationRequest")] + DirectSynchronizationRequest = 119, + + [System.Runtime.Serialization.EnumMember(Value = @"DirectSynchronizationResponse")] + DirectSynchronizationResponse = 120, + + [System.Runtime.Serialization.EnumMember(Value = @"OverrideDataBaseRequest")] + OverrideDataBaseRequest = 121, + + [System.Runtime.Serialization.EnumMember(Value = @"OverrideDataBaseResponse")] + OverrideDataBaseResponse = 122, + + [System.Runtime.Serialization.EnumMember(Value = @"StartApplicationLogsRequest")] + StartApplicationLogsRequest = 123, + + [System.Runtime.Serialization.EnumMember(Value = @"StartApplicationLogsResponse")] + StartApplicationLogsResponse = 124, + + [System.Runtime.Serialization.EnumMember(Value = @"StopApplicationLogsRequest")] + StopApplicationLogsRequest = 125, + + [System.Runtime.Serialization.EnumMember(Value = @"StopApplicationLogsResponse")] + StopApplicationLogsResponse = 126, + + [System.Runtime.Serialization.EnumMember(Value = @"ColorProfileRequest")] + ColorProfileRequest = 127, + + [System.Runtime.Serialization.EnumMember(Value = @"ColorProfileResponse")] + ColorProfileResponse = 128, + + [System.Runtime.Serialization.EnumMember(Value = @"UpdateStatusRequest")] + UpdateStatusRequest = 129, + + [System.Runtime.Serialization.EnumMember(Value = @"UpdateStatusResponse")] + UpdateStatusResponse = 130, + + [System.Runtime.Serialization.EnumMember(Value = @"GenericRequest")] + GenericRequest = 131, + + [System.Runtime.Serialization.EnumMember(Value = @"GenericResponse")] + GenericResponse = 132, + + [System.Runtime.Serialization.EnumMember(Value = @"ConfigureProtocolRequest")] + ConfigureProtocolRequest = 133, + + [System.Runtime.Serialization.EnumMember(Value = @"ConfigureProtocolResponse")] + ConfigureProtocolResponse = 134, + + [System.Runtime.Serialization.EnumMember(Value = @"StartDiagnosticsRequest")] + StartDiagnosticsRequest = 135, + + [System.Runtime.Serialization.EnumMember(Value = @"StartDiagnosticsResponse")] + StartDiagnosticsResponse = 136, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorAbortHomingRequest")] + MotorAbortHomingRequest = 137, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorAbortHomingResponse")] + MotorAbortHomingResponse = 138, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorHomingRequest")] + MotorHomingRequest = 139, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorHomingResponse")] + MotorHomingResponse = 140, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorJoggingRequest")] + MotorJoggingRequest = 141, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorJoggingResponse")] + MotorJoggingResponse = 142, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorAbortJoggingRequest")] + MotorAbortJoggingRequest = 143, + + [System.Runtime.Serialization.EnumMember(Value = @"MotorAbortJoggingResponse")] + MotorAbortJoggingResponse = 144, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserAbortHomingRequest")] + DispenserAbortHomingRequest = 145, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserAbortHomingResponse")] + DispenserAbortHomingResponse = 146, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserHomingRequest")] + DispenserHomingRequest = 147, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserHomingResponse")] + DispenserHomingResponse = 148, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserJoggingRequest")] + DispenserJoggingRequest = 149, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserJoggingResponse")] + DispenserJoggingResponse = 150, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserAbortJoggingRequest")] + DispenserAbortJoggingRequest = 151, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserAbortJoggingResponse")] + DispenserAbortJoggingResponse = 152, + + [System.Runtime.Serialization.EnumMember(Value = @"SetDigitalOutRequest")] + SetDigitalOutRequest = 153, + + [System.Runtime.Serialization.EnumMember(Value = @"SetDigitalOutResponse")] + SetDigitalOutResponse = 154, + + [System.Runtime.Serialization.EnumMember(Value = @"ThreadJoggingRequest")] + ThreadJoggingRequest = 155, + + [System.Runtime.Serialization.EnumMember(Value = @"ThreadJoggingResponse")] + ThreadJoggingResponse = 156, + + [System.Runtime.Serialization.EnumMember(Value = @"ThreadAbortJoggingRequest")] + ThreadAbortJoggingRequest = 157, + + [System.Runtime.Serialization.EnumMember(Value = @"ThreadAbortJoggingResponse")] + ThreadAbortJoggingResponse = 158, + + [System.Runtime.Serialization.EnumMember(Value = @"SetComponentValueRequest")] + SetComponentValueRequest = 159, + + [System.Runtime.Serialization.EnumMember(Value = @"SetComponentValueResponse")] + SetComponentValueResponse = 160, + + [System.Runtime.Serialization.EnumMember(Value = @"ResolveEventRequest")] + ResolveEventRequest = 161, + + [System.Runtime.Serialization.EnumMember(Value = @"ResolveEventResponse")] + ResolveEventResponse = 162, + + [System.Runtime.Serialization.EnumMember(Value = @"StopDiagnosticsRequest")] + StopDiagnosticsRequest = 163, + + [System.Runtime.Serialization.EnumMember(Value = @"StopDiagnosticsResponse")] + StopDiagnosticsResponse = 164, + + [System.Runtime.Serialization.EnumMember(Value = @"StartEventsNotificationRequest")] + StartEventsNotificationRequest = 165, + + [System.Runtime.Serialization.EnumMember(Value = @"StartEventsNotificationResponse")] + StartEventsNotificationResponse = 166, + + [System.Runtime.Serialization.EnumMember(Value = @"StopEventsNotificationRequest")] + StopEventsNotificationRequest = 167, + + [System.Runtime.Serialization.EnumMember(Value = @"StopEventsNotificationResponse")] + StopEventsNotificationResponse = 168, + + [System.Runtime.Serialization.EnumMember(Value = @"SetHeaterStateRequest")] + SetHeaterStateRequest = 169, + + [System.Runtime.Serialization.EnumMember(Value = @"SetHeaterStateResponse")] + SetHeaterStateResponse = 170, + + [System.Runtime.Serialization.EnumMember(Value = @"SetBlowerStateRequest")] + SetBlowerStateRequest = 171, + + [System.Runtime.Serialization.EnumMember(Value = @"SetBlowerStateResponse")] + SetBlowerStateResponse = 172, + + [System.Runtime.Serialization.EnumMember(Value = @"SetValveStateRequest")] + SetValveStateRequest = 173, + + [System.Runtime.Serialization.EnumMember(Value = @"SetValveStateResponse")] + SetValveStateResponse = 174, + + [System.Runtime.Serialization.EnumMember(Value = @"CartridgeValidationRequest")] + CartridgeValidationRequest = 175, + + [System.Runtime.Serialization.EnumMember(Value = @"CartridgeValidationResponse")] + CartridgeValidationResponse = 176, + + [System.Runtime.Serialization.EnumMember(Value = @"JobRequest")] + JobRequest = 177, + + [System.Runtime.Serialization.EnumMember(Value = @"JobResponse")] + JobResponse = 178, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortJobRequest")] + AbortJobRequest = 179, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortJobResponse")] + AbortJobResponse = 180, + + [System.Runtime.Serialization.EnumMember(Value = @"UploadProcessParametersRequest")] + UploadProcessParametersRequest = 181, + + [System.Runtime.Serialization.EnumMember(Value = @"UploadProcessParametersResponse")] + UploadProcessParametersResponse = 182, + + [System.Runtime.Serialization.EnumMember(Value = @"CurrentJobRequest")] + CurrentJobRequest = 183, + + [System.Runtime.Serialization.EnumMember(Value = @"CurrentJobResponse")] + CurrentJobResponse = 184, + + [System.Runtime.Serialization.EnumMember(Value = @"ResumeCurrentJobRequest")] + ResumeCurrentJobRequest = 185, + + [System.Runtime.Serialization.EnumMember(Value = @"ResumeCurrentJobResponse")] + ResumeCurrentJobResponse = 186, + + [System.Runtime.Serialization.EnumMember(Value = @"StartHeadCleaningRequest")] + StartHeadCleaningRequest = 187, + + [System.Runtime.Serialization.EnumMember(Value = @"StartHeadCleaningResponse")] + StartHeadCleaningResponse = 188, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortHeadCleaningRequest")] + AbortHeadCleaningRequest = 189, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortHeadCleaningResponse")] + AbortHeadCleaningResponse = 190, + + [System.Runtime.Serialization.EnumMember(Value = @"StartDebugLogRequest")] + StartDebugLogRequest = 191, + + [System.Runtime.Serialization.EnumMember(Value = @"StartDebugLogResponse")] + StartDebugLogResponse = 192, + + [System.Runtime.Serialization.EnumMember(Value = @"StopDebugLogRequest")] + StopDebugLogRequest = 193, + + [System.Runtime.Serialization.EnumMember(Value = @"StopDebugLogResponse")] + StopDebugLogResponse = 194, + + [System.Runtime.Serialization.EnumMember(Value = @"SetDebugLogCategoryRequest")] + SetDebugLogCategoryRequest = 195, + + [System.Runtime.Serialization.EnumMember(Value = @"SetDebugLogCategoryResponse")] + SetDebugLogCategoryResponse = 196, + + [System.Runtime.Serialization.EnumMember(Value = @"SetupDebugDisributorsRequest")] + SetupDebugDisributorsRequest = 197, + + [System.Runtime.Serialization.EnumMember(Value = @"SetupDebugDisributorsResponse")] + SetupDebugDisributorsResponse = 198, + + [System.Runtime.Serialization.EnumMember(Value = @"UploadHardwareConfigurationRequest")] + UploadHardwareConfigurationRequest = 199, + + [System.Runtime.Serialization.EnumMember(Value = @"UploadHardwareConfigurationResponse")] + UploadHardwareConfigurationResponse = 200, + + [System.Runtime.Serialization.EnumMember(Value = @"SystemResetRequest")] + SystemResetRequest = 201, + + [System.Runtime.Serialization.EnumMember(Value = @"SystemResetResponse")] + SystemResetResponse = 202, + + [System.Runtime.Serialization.EnumMember(Value = @"KeepAliveRequest")] + KeepAliveRequest = 203, + + [System.Runtime.Serialization.EnumMember(Value = @"KeepAliveResponse")] + KeepAliveResponse = 204, + + [System.Runtime.Serialization.EnumMember(Value = @"ConnectRequest")] + ConnectRequest = 205, + + [System.Runtime.Serialization.EnumMember(Value = @"ConnectResponse")] + ConnectResponse = 206, + + [System.Runtime.Serialization.EnumMember(Value = @"DisconnectRequest")] + DisconnectRequest = 207, + + [System.Runtime.Serialization.EnumMember(Value = @"DisconnectResponse")] + DisconnectResponse = 208, + + [System.Runtime.Serialization.EnumMember(Value = @"FileUploadRequest")] + FileUploadRequest = 209, + + [System.Runtime.Serialization.EnumMember(Value = @"FileUploadResponse")] + FileUploadResponse = 210, + + [System.Runtime.Serialization.EnumMember(Value = @"FileChunkUploadRequest")] + FileChunkUploadRequest = 211, + + [System.Runtime.Serialization.EnumMember(Value = @"FileChunkUploadResponse")] + FileChunkUploadResponse = 212, + + [System.Runtime.Serialization.EnumMember(Value = @"ExecuteProcessRequest")] + ExecuteProcessRequest = 213, + + [System.Runtime.Serialization.EnumMember(Value = @"ExecuteProcessResponse")] + ExecuteProcessResponse = 214, + + [System.Runtime.Serialization.EnumMember(Value = @"KillProcessRequest")] + KillProcessRequest = 215, + + [System.Runtime.Serialization.EnumMember(Value = @"KillProcessResponse")] + KillProcessResponse = 216, + + [System.Runtime.Serialization.EnumMember(Value = @"CreateRequest")] + CreateRequest = 217, + + [System.Runtime.Serialization.EnumMember(Value = @"CreateResponse")] + CreateResponse = 218, + + [System.Runtime.Serialization.EnumMember(Value = @"DeleteRequest")] + DeleteRequest = 219, + + [System.Runtime.Serialization.EnumMember(Value = @"DeleteResponse")] + DeleteResponse = 220, + + [System.Runtime.Serialization.EnumMember(Value = @"GetStorageInfoRequest")] + GetStorageInfoRequest = 221, + + [System.Runtime.Serialization.EnumMember(Value = @"GetStorageInfoResponse")] + GetStorageInfoResponse = 222, + + [System.Runtime.Serialization.EnumMember(Value = @"GetFilesRequest")] + GetFilesRequest = 223, + + [System.Runtime.Serialization.EnumMember(Value = @"GetFilesResponse")] + GetFilesResponse = 224, + + [System.Runtime.Serialization.EnumMember(Value = @"FileDownloadRequest")] + FileDownloadRequest = 225, + + [System.Runtime.Serialization.EnumMember(Value = @"FileDownloadResponse")] + FileDownloadResponse = 226, + + [System.Runtime.Serialization.EnumMember(Value = @"FileChunkDownloadRequest")] + FileChunkDownloadRequest = 227, + + [System.Runtime.Serialization.EnumMember(Value = @"FileChunkDownloadResponse")] + FileChunkDownloadResponse = 228, + + [System.Runtime.Serialization.EnumMember(Value = @"ValidateVersionRequest")] + ValidateVersionRequest = 229, + + [System.Runtime.Serialization.EnumMember(Value = @"ValidateVersionResponse")] + ValidateVersionResponse = 230, + + [System.Runtime.Serialization.EnumMember(Value = @"ActivateVersionRequest")] + ActivateVersionRequest = 231, + + [System.Runtime.Serialization.EnumMember(Value = @"ActivateVersionResponse")] + ActivateVersionResponse = 232, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserDataRequest")] + DispenserDataRequest = 233, + + [System.Runtime.Serialization.EnumMember(Value = @"DispenserDataResponse")] + DispenserDataResponse = 234, + + [System.Runtime.Serialization.EnumMember(Value = @"MidTankDataSetupRequest")] + MidTankDataSetupRequest = 235, + + [System.Runtime.Serialization.EnumMember(Value = @"MidTankDataSetupResponse")] + MidTankDataSetupResponse = 236, + + [System.Runtime.Serialization.EnumMember(Value = @"MachineCalibrationDataRequest")] + MachineCalibrationDataRequest = 237, + + [System.Runtime.Serialization.EnumMember(Value = @"MachineCalibrationDataResponse")] + MachineCalibrationDataResponse = 238, + + [System.Runtime.Serialization.EnumMember(Value = @"MainCardStoredDataRequest")] + MainCardStoredDataRequest = 239, + + [System.Runtime.Serialization.EnumMember(Value = @"MainCardStoredDataResponse")] + MainCardStoredDataResponse = 240, + + [System.Runtime.Serialization.EnumMember(Value = @"StartMachineStatusUpdateRequest")] + StartMachineStatusUpdateRequest = 241, + + [System.Runtime.Serialization.EnumMember(Value = @"StartMachineStatusUpdateResponse")] + StartMachineStatusUpdateResponse = 242, + + [System.Runtime.Serialization.EnumMember(Value = @"StopMachineStatusUpdateRequest")] + StopMachineStatusUpdateRequest = 243, + + [System.Runtime.Serialization.EnumMember(Value = @"StopMachineStatusUpdateResponse")] + StopMachineStatusUpdateResponse = 244, + + [System.Runtime.Serialization.EnumMember(Value = @"StartPowerDownRequest")] + StartPowerDownRequest = 245, + + [System.Runtime.Serialization.EnumMember(Value = @"StartPowerDownResponse")] + StartPowerDownResponse = 246, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortPowerDownRequest")] + AbortPowerDownRequest = 247, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortPowerDownResponse")] + AbortPowerDownResponse = 248, + + [System.Runtime.Serialization.EnumMember(Value = @"StartPowerUpRequest")] + StartPowerUpRequest = 249, + + [System.Runtime.Serialization.EnumMember(Value = @"StartPowerUpResponse")] + StartPowerUpResponse = 250, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortPowerUpRequest")] + AbortPowerUpRequest = 251, + + [System.Runtime.Serialization.EnumMember(Value = @"AbortPowerUpResponse")] + AbortPowerUpResponse = 252, + + [System.Runtime.Serialization.EnumMember(Value = @"StandByRequest")] + StandByRequest = 253, + + [System.Runtime.Serialization.EnumMember(Value = @"StandByResponse")] + StandByResponse = 254, + + [System.Runtime.Serialization.EnumMember(Value = @"StartThreadLoadingRequest")] + StartThreadLoadingRequest = 255, + + [System.Runtime.Serialization.EnumMember(Value = @"StartThreadLoadingResponse")] + StartThreadLoadingResponse = 256, + + [System.Runtime.Serialization.EnumMember(Value = @"ContinueThreadLoadingRequest")] + ContinueThreadLoadingRequest = 257, + + [System.Runtime.Serialization.EnumMember(Value = @"ContinueThreadLoadingResponse")] + ContinueThreadLoadingResponse = 258, + + [System.Runtime.Serialization.EnumMember(Value = @"StopThreadLoadingRequest")] + StopThreadLoadingRequest = 259, + + [System.Runtime.Serialization.EnumMember(Value = @"StopThreadLoadingResponse")] + StopThreadLoadingResponse = 260, + + [System.Runtime.Serialization.EnumMember(Value = @"TryThreadLoadingRequest")] + TryThreadLoadingRequest = 261, + + [System.Runtime.Serialization.EnumMember(Value = @"TryThreadLoadingResponse")] + TryThreadLoadingResponse = 262, + + [System.Runtime.Serialization.EnumMember(Value = @"AttemptThreadJoggingRequest")] + AttemptThreadJoggingRequest = 263, + + [System.Runtime.Serialization.EnumMember(Value = @"AttemptThreadJoggingResponse")] + AttemptThreadJoggingResponse = 264, + + [System.Runtime.Serialization.EnumMember(Value = @"StartInkFillingStatusRequest")] + StartInkFillingStatusRequest = 265, + + [System.Runtime.Serialization.EnumMember(Value = @"StartInkFillingStatusResponse")] + StartInkFillingStatusResponse = 266, + + [System.Runtime.Serialization.EnumMember(Value = @"PutDataStoreItemRequest")] + PutDataStoreItemRequest = 267, + + [System.Runtime.Serialization.EnumMember(Value = @"PutDataStoreItemResponse")] + PutDataStoreItemResponse = 268, + + [System.Runtime.Serialization.EnumMember(Value = @"GetDataStoreItemRequest")] + GetDataStoreItemRequest = 269, + + [System.Runtime.Serialization.EnumMember(Value = @"GetDataStoreItemResponse")] + GetDataStoreItemResponse = 270, + + [System.Runtime.Serialization.EnumMember(Value = @"DataStoreItemModifiedRequest")] + DataStoreItemModifiedRequest = 271, + + [System.Runtime.Serialization.EnumMember(Value = @"DataStoreItemModifiedResponse")] + DataStoreItemModifiedResponse = 272, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class DataStoreWebPutItem + { + [Newtonsoft.Json.JsonProperty("MachineSerialNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string MachineSerialNumber { get; set; } + + [Newtonsoft.Json.JsonProperty("Collection", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Collection { get; set; } + + [Newtonsoft.Json.JsonProperty("Key", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Key { get; set; } + + [Newtonsoft.Json.JsonProperty("DataType", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public DataType DataType { get; set; } + + [Newtonsoft.Json.JsonProperty("ProtoMessageType", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] + public MessageType ProtoMessageType { get; set; } + + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object Value { get; set; } + + + } + + /// <summary>Contains information for a single HTTP operation.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpControllerContext + { + /// <summary>Gets or sets the configuration.</summary> + [Newtonsoft.Json.JsonProperty("Configuration", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpConfiguration Configuration { get; set; } + + /// <summary>Gets or sets the controller descriptor.</summary> + [Newtonsoft.Json.JsonProperty("ControllerDescriptor", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpControllerDescriptor ControllerDescriptor { get; set; } + + /// <summary>Gets or sets the HTTP controller.</summary> + [Newtonsoft.Json.JsonProperty("Controller", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IHttpController Controller { get; set; } + + /// <summary>Gets or sets the request.</summary> + [Newtonsoft.Json.JsonProperty("Request", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpRequestMessage Request { get; set; } + + /// <summary>Gets or sets the request context.</summary> + [Newtonsoft.Json.JsonProperty("RequestContext", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpRequestContext RequestContext { get; set; } + + /// <summary>Gets or sets the route data.</summary> + [Newtonsoft.Json.JsonProperty("RouteData", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IHttpRouteData RouteData { get; set; } + + + } + + /// <summary>Represents a configuration of HttpServer instances. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpConfiguration + { + /// <summary>Gets or sets the action that will perform final initialization of the HttpConfiguration instance before it is used to process requests. </summary> + [Newtonsoft.Json.JsonProperty("Initializer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ActionOfHttpConfiguration Initializer { get; set; } + + /// <summary>Gets the list of filters that apply to all requests served using this HttpConfiguration instance.</summary> + [Newtonsoft.Json.JsonProperty("Filters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<FilterInfo> Filters { get; set; } + + /// <summary>Gets an ordered list of DelegatingHandler instances to be invoked as an HttpRequestMessage travels up the stack and an HttpResponseMessage travels down in stack in return. </summary> + [Newtonsoft.Json.JsonProperty("MessageHandlers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<DelegatingHandler> MessageHandlers { get; set; } + + /// <summary>Gets the HttpRouteCollection associated with this HttpConfiguration instance.</summary> + [Newtonsoft.Json.JsonProperty("Routes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<IHttpRoute> Routes { get; set; } + + /// <summary>Gets the properties associated with this instance.</summary> + [Newtonsoft.Json.JsonProperty("Properties", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Properties { get; set; } + + /// <summary>Gets the root virtual path.</summary> + [Newtonsoft.Json.JsonProperty("VirtualPathRoot", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string VirtualPathRoot { get; set; } + + /// <summary>Gets or sets the dependency resolver associated with thisinstance.</summary> + [Newtonsoft.Json.JsonProperty("DependencyResolver", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IDependencyResolver DependencyResolver { get; set; } + + /// <summary>Gets the container of default services associated with this instance.</summary> + [Newtonsoft.Json.JsonProperty("Services", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ServicesContainer Services { get; set; } + + /// <summary>Gets the collection of rules for how parameters should be bound.</summary> + [Newtonsoft.Json.JsonProperty("ParameterBindingRules", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ParameterBindingRulesCollection ParameterBindingRules { get; set; } + + /// <summary>Gets or sets a value indicating whether error details should be included in error messages.</summary> + [Newtonsoft.Json.JsonProperty("IncludeErrorDetailPolicy", Required = Newtonsoft.Json.Required.Always)] + public IncludeErrorDetailPolicy IncludeErrorDetailPolicy { get; set; } + + /// <summary>Gets the media-type formatters for this instance.</summary> + [Newtonsoft.Json.JsonProperty("Formatters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MediaTypeFormatterCollection Formatters { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ActionOfHttpConfiguration : MulticastDelegate + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MulticastDelegate : Delegate + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class Delegate + { + [Newtonsoft.Json.JsonProperty("_target", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object _target { get; set; } + + [Newtonsoft.Json.JsonProperty("_methodBase", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object _methodBase { get; set; } + + [Newtonsoft.Json.JsonProperty("_methodPtr", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public IntPtr _methodPtr { get; set; } = new IntPtr(); + + [Newtonsoft.Json.JsonProperty("_methodPtrAux", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public IntPtr _methodPtrAux { get; set; } = new IntPtr(); + + [Newtonsoft.Json.JsonProperty("Method", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MethodInfo Method { get; set; } + + [Newtonsoft.Json.JsonProperty("Target", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object Target { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class IntPtr + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MethodInfo : MethodBase + { + [Newtonsoft.Json.JsonProperty("MemberType", Required = Newtonsoft.Json.Required.Always)] + public MemberTypes MemberType { get; set; } + + [Newtonsoft.Json.JsonProperty("ReturnType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ReturnType { get; set; } + + [Newtonsoft.Json.JsonProperty("ReturnParameter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ParameterInfo ReturnParameter { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum MemberTypes + { + Constructor = 1, + + Event = 2, + + Field = 4, + + Method = 8, + + Property = 16, + + TypeInfo = 32, + + Custom = 64, + + NestedType = 128, + + All = 191, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ParameterInfo + { + [Newtonsoft.Json.JsonProperty("ParameterType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ParameterType { get; set; } + + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("HasDefaultValue", Required = Newtonsoft.Json.Required.Always)] + public bool HasDefaultValue { get; set; } + + [Newtonsoft.Json.JsonProperty("DefaultValue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object DefaultValue { get; set; } + + [Newtonsoft.Json.JsonProperty("RawDefaultValue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object RawDefaultValue { get; set; } + + [Newtonsoft.Json.JsonProperty("Position", Required = Newtonsoft.Json.Required.Always)] + public int Position { get; set; } + + [Newtonsoft.Json.JsonProperty("Attributes", Required = Newtonsoft.Json.Required.Always)] + public ParameterAttributes Attributes { get; set; } + + [Newtonsoft.Json.JsonProperty("Member", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MemberInfo Member { get; set; } + + [Newtonsoft.Json.JsonProperty("IsIn", Required = Newtonsoft.Json.Required.Always)] + public bool IsIn { get; set; } + + [Newtonsoft.Json.JsonProperty("IsOut", Required = Newtonsoft.Json.Required.Always)] + public bool IsOut { get; set; } + + [Newtonsoft.Json.JsonProperty("IsLcid", Required = Newtonsoft.Json.Required.Always)] + public bool IsLcid { get; set; } + + [Newtonsoft.Json.JsonProperty("IsRetval", Required = Newtonsoft.Json.Required.Always)] + public bool IsRetval { get; set; } + + [Newtonsoft.Json.JsonProperty("IsOptional", Required = Newtonsoft.Json.Required.Always)] + public bool IsOptional { get; set; } + + [Newtonsoft.Json.JsonProperty("MetadataToken", Required = Newtonsoft.Json.Required.Always)] + public int MetadataToken { get; set; } + + [Newtonsoft.Json.JsonProperty("CustomAttributes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeData> CustomAttributes { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum ParameterAttributes + { + None = 0, + + In = 1, + + Out = 2, + + Lcid = 4, + + Retval = 8, + + Optional = 16, + + HasDefault = 4096, + + HasFieldMarshal = 8192, + + Reserved3 = 16384, + + Reserved4 = 32768, + + ReservedMask = 61440, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MemberInfo + { + [Newtonsoft.Json.JsonProperty("CustomAttributes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeData> CustomAttributes { get; set; } + + [Newtonsoft.Json.JsonProperty("MetadataToken", Required = Newtonsoft.Json.Required.Always)] + public int MetadataToken { get; set; } + + [Newtonsoft.Json.JsonProperty("Module", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Module Module { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class CustomAttributeData + { + [Newtonsoft.Json.JsonProperty("AttributeType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string AttributeType { get; set; } + + [Newtonsoft.Json.JsonProperty("Constructor", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ConstructorInfo Constructor { get; set; } + + [Newtonsoft.Json.JsonProperty("ConstructorArguments", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeTypedArgument> ConstructorArguments { get; set; } + + [Newtonsoft.Json.JsonProperty("NamedArguments", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeNamedArgument> NamedArguments { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class ConstructorInfo : MethodBase + { + [Newtonsoft.Json.JsonProperty("MemberType", Required = Newtonsoft.Json.Required.Always)] + public MemberTypes MemberType { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MethodBase : MemberInfo + { + [Newtonsoft.Json.JsonProperty("MethodImplementationFlags", Required = Newtonsoft.Json.Required.Always)] + public MethodImplAttributes MethodImplementationFlags { get; set; } + + [Newtonsoft.Json.JsonProperty("CallingConvention", Required = Newtonsoft.Json.Required.Always)] + public CallingConventions CallingConvention { get; set; } + + [Newtonsoft.Json.JsonProperty("IsGenericMethodDefinition", Required = Newtonsoft.Json.Required.Always)] + public bool IsGenericMethodDefinition { get; set; } + + [Newtonsoft.Json.JsonProperty("ContainsGenericParameters", Required = Newtonsoft.Json.Required.Always)] + public bool ContainsGenericParameters { get; set; } + + [Newtonsoft.Json.JsonProperty("IsGenericMethod", Required = Newtonsoft.Json.Required.Always)] + public bool IsGenericMethod { get; set; } + + [Newtonsoft.Json.JsonProperty("IsSecurityCritical", Required = Newtonsoft.Json.Required.Always)] + public bool IsSecurityCritical { get; set; } + + [Newtonsoft.Json.JsonProperty("IsSecuritySafeCritical", Required = Newtonsoft.Json.Required.Always)] + public bool IsSecuritySafeCritical { get; set; } + + [Newtonsoft.Json.JsonProperty("IsSecurityTransparent", Required = Newtonsoft.Json.Required.Always)] + public bool IsSecurityTransparent { get; set; } + + [Newtonsoft.Json.JsonProperty("IsPublic", Required = Newtonsoft.Json.Required.Always)] + public bool IsPublic { get; set; } + + [Newtonsoft.Json.JsonProperty("IsPrivate", Required = Newtonsoft.Json.Required.Always)] + public bool IsPrivate { get; set; } + + [Newtonsoft.Json.JsonProperty("IsFamily", Required = Newtonsoft.Json.Required.Always)] + public bool IsFamily { get; set; } + + [Newtonsoft.Json.JsonProperty("IsAssembly", Required = Newtonsoft.Json.Required.Always)] + public bool IsAssembly { get; set; } + + [Newtonsoft.Json.JsonProperty("IsFamilyAndAssembly", Required = Newtonsoft.Json.Required.Always)] + public bool IsFamilyAndAssembly { get; set; } + + [Newtonsoft.Json.JsonProperty("IsFamilyOrAssembly", Required = Newtonsoft.Json.Required.Always)] + public bool IsFamilyOrAssembly { get; set; } + + [Newtonsoft.Json.JsonProperty("IsStatic", Required = Newtonsoft.Json.Required.Always)] + public bool IsStatic { get; set; } + + [Newtonsoft.Json.JsonProperty("IsFinal", Required = Newtonsoft.Json.Required.Always)] + public bool IsFinal { get; set; } + + [Newtonsoft.Json.JsonProperty("IsVirtual", Required = Newtonsoft.Json.Required.Always)] + public bool IsVirtual { get; set; } + + [Newtonsoft.Json.JsonProperty("IsHideBySig", Required = Newtonsoft.Json.Required.Always)] + public bool IsHideBySig { get; set; } + + [Newtonsoft.Json.JsonProperty("IsAbstract", Required = Newtonsoft.Json.Required.Always)] + public bool IsAbstract { get; set; } + + [Newtonsoft.Json.JsonProperty("IsSpecialName", Required = Newtonsoft.Json.Required.Always)] + public bool IsSpecialName { get; set; } + + [Newtonsoft.Json.JsonProperty("IsConstructor", Required = Newtonsoft.Json.Required.Always)] + public bool IsConstructor { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum MethodImplAttributes + { + IL = 0, + + Managed = 0, + + Native = 1, + + OPTIL = 2, + + Runtime = 3, + + CodeTypeMask = 3, + + Unmanaged = 4, + + ManagedMask = 4, + + NoInlining = 8, + + ForwardRef = 16, + + Synchronized = 32, + + NoOptimization = 64, + + PreserveSig = 128, + + AggressiveInlining = 256, + + SecurityMitigations = 1024, + + InternalCall = 4096, + + MaxMethodImplVal = 65535, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum CallingConventions + { + Standard = 1, + + VarArgs = 2, + + Any = 3, + + HasThis = 32, + + ExplicitThis = 64, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class CustomAttributeTypedArgument + { + [Newtonsoft.Json.JsonProperty("ArgumentType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ArgumentType { get; set; } + + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object Value { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class CustomAttributeNamedArgument + { + [Newtonsoft.Json.JsonProperty("MemberInfo", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MemberInfo MemberInfo { get; set; } + + [Newtonsoft.Json.JsonProperty("TypedValue", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public CustomAttributeTypedArgument TypedValue { get; set; } = new CustomAttributeTypedArgument(); + + [Newtonsoft.Json.JsonProperty("MemberName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string MemberName { get; set; } + + [Newtonsoft.Json.JsonProperty("IsField", Required = Newtonsoft.Json.Required.Always)] + public bool IsField { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class Module + { + [Newtonsoft.Json.JsonProperty("CustomAttributes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeData> CustomAttributes { get; set; } + + [Newtonsoft.Json.JsonProperty("MDStreamVersion", Required = Newtonsoft.Json.Required.Always)] + public int MDStreamVersion { get; set; } + + [Newtonsoft.Json.JsonProperty("FullyQualifiedName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FullyQualifiedName { get; set; } + + [Newtonsoft.Json.JsonProperty("ModuleVersionId", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.Guid ModuleVersionId { get; set; } + + [Newtonsoft.Json.JsonProperty("MetadataToken", Required = Newtonsoft.Json.Required.Always)] + public int MetadataToken { get; set; } + + [Newtonsoft.Json.JsonProperty("ScopeName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ScopeName { get; set; } + + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("Assembly", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Assembly Assembly { get; set; } + + [Newtonsoft.Json.JsonProperty("ModuleHandle", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public ModuleHandle ModuleHandle { get; set; } = new ModuleHandle(); + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class Assembly + { + [Newtonsoft.Json.JsonProperty("CodeBase", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string CodeBase { get; set; } + + [Newtonsoft.Json.JsonProperty("EscapedCodeBase", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string EscapedCodeBase { get; set; } + + [Newtonsoft.Json.JsonProperty("FullName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FullName { get; set; } + + [Newtonsoft.Json.JsonProperty("EntryPoint", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MethodInfo EntryPoint { get; set; } + + [Newtonsoft.Json.JsonProperty("ExportedTypes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> ExportedTypes { get; set; } + + [Newtonsoft.Json.JsonProperty("DefinedTypes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> DefinedTypes { get; set; } + + [Newtonsoft.Json.JsonProperty("Evidence", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<Evidence> Evidence { get; set; } + + [Newtonsoft.Json.JsonProperty("PermissionSet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<PermissionSet> PermissionSet { get; set; } + + [Newtonsoft.Json.JsonProperty("IsFullyTrusted", Required = Newtonsoft.Json.Required.Always)] + public bool IsFullyTrusted { get; set; } + + [Newtonsoft.Json.JsonProperty("SecurityRuleSet", Required = Newtonsoft.Json.Required.Always)] + public SecurityRuleSet SecurityRuleSet { get; set; } + + [Newtonsoft.Json.JsonProperty("ManifestModule", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Module ManifestModule { get; set; } + + [Newtonsoft.Json.JsonProperty("CustomAttributes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<CustomAttributeData> CustomAttributes { get; set; } + + [Newtonsoft.Json.JsonProperty("ReflectionOnly", Required = Newtonsoft.Json.Required.Always)] + public bool ReflectionOnly { get; set; } + + [Newtonsoft.Json.JsonProperty("Modules", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<Module> Modules { get; set; } + + [Newtonsoft.Json.JsonProperty("Location", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Location { get; set; } + + [Newtonsoft.Json.JsonProperty("ImageRuntimeVersion", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ImageRuntimeVersion { get; set; } + + [Newtonsoft.Json.JsonProperty("GlobalAssemblyCache", Required = Newtonsoft.Json.Required.Always)] + public bool GlobalAssemblyCache { get; set; } + + [Newtonsoft.Json.JsonProperty("HostContext", Required = Newtonsoft.Json.Required.Always)] + public long HostContext { get; set; } + + [Newtonsoft.Json.JsonProperty("IsDynamic", Required = Newtonsoft.Json.Required.Always)] + public bool IsDynamic { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum SecurityRuleSet + { + None = 0, + + Level1 = 1, + + Level2 = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ModuleHandle + { + [Newtonsoft.Json.JsonProperty("MDStreamVersion", Required = Newtonsoft.Json.Required.Always)] + public int MDStreamVersion { get; set; } + + + } + + /// <summary>Provides information about the available action filters.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class FilterInfo + { + /// <summary>Gets or sets an instance of the FilterInfo.</summary> + [Newtonsoft.Json.JsonProperty("Instance", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IFilter Instance { get; set; } + + /// <summary>Gets or sets the scope FilterInfo.</summary> + [Newtonsoft.Json.JsonProperty("Scope", Required = Newtonsoft.Json.Required.Always)] + public FilterScope Scope { get; set; } + + + } + + /// <summary>Defines the methods that are used in a filter.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IFilter + { + /// <summary>Gets or sets a value indicating whether more than one instance of the indicated attribute can be specified for a single program element.</summary> + [Newtonsoft.Json.JsonProperty("AllowMultiple", Required = Newtonsoft.Json.Required.Always)] + public bool AllowMultiple { get; set; } + + + } + + /// <summary>Defines values that specify the order in which filters run within the same filter type and filter order.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum FilterScope + { + Global = 0, + + Controller = 10, + + Action = 20, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class DelegatingHandler : HttpMessageHandler + { + [Newtonsoft.Json.JsonProperty("InnerHandler", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpMessageHandler InnerHandler { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class HttpMessageHandler + { + + } + + /// <summary>IHttpRoute defines the interface for a route expressing how to map an incoming HttpRequestMessage to a particular controller and action. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IHttpRoute + { + /// <summary>Gets the route template describing the URI pattern to match against. </summary> + [Newtonsoft.Json.JsonProperty("RouteTemplate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string RouteTemplate { get; set; } + + /// <summary>Gets the default values for route parameters if not provided by the incoming HttpRequestMessage. </summary> + [Newtonsoft.Json.JsonProperty("Defaults", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Defaults { get; set; } + + /// <summary>Gets the constraints for the route parameters. </summary> + [Newtonsoft.Json.JsonProperty("Constraints", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Constraints { get; set; } + + /// <summary>Gets any additional data tokens not used directly to determine whether a route matches an incoming HttpRequestMessage. </summary> + [Newtonsoft.Json.JsonProperty("DataTokens", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> DataTokens { get; set; } + + /// <summary>Gets the message handler that will be the recipient of the request.</summary> + [Newtonsoft.Json.JsonProperty("Handler", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpMessageHandler Handler { get; set; } + + + } + + /// <summary>Represents a dependency injection container.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IDependencyResolver + { + + } + + /// <summary>An abstract class that provides a container for services used by ASP.NET Web API.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class ServicesContainer + { + + } + + /// <summary>Collection of functions that can produce a parameter binding for a given parameter. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ParameterBindingRulesCollection : System.Collections.ObjectModel.Collection<FuncOfHttpParameterDescriptorAndHttpParameterBinding> + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class FuncOfHttpParameterDescriptorAndHttpParameterBinding : MulticastDelegate + { + + } + + /// <summary>Specifies whether error details, such as exception messages and stack traces, should be included in error messages.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum IncludeErrorDetailPolicy + { + Default = 0, + + LocalOnly = 1, + + Always = 2, + + Never = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class MediaTypeFormatterCollection : Anonymous + { + + } + + /// <summary>MediaTypeFormatter class to handle Xml. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class XmlMediaTypeFormatter : MediaTypeFormatter + { + /// <summary>Gets or sets a value indicating whether the XML formatter uses the XmlSerializer as the default serializer, instead of using the DataContractSerializer.</summary> + [Newtonsoft.Json.JsonProperty("UseXmlSerializer", Required = Newtonsoft.Json.Required.Always)] + public bool UseXmlSerializer { get; set; } = false; + + /// <summary>Gets or sets a value indicating whether to indent elements when writing data.</summary> + [Newtonsoft.Json.JsonProperty("Indent", Required = Newtonsoft.Json.Required.Always)] + public bool Indent { get; set; } + + /// <summary>Gets the settings to be used while writing.</summary> + [Newtonsoft.Json.JsonProperty("WriterSettings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public XmlWriterSettings WriterSettings { get; set; } + + /// <summary>Gets and sets the maximum nested node depth.</summary> + [Newtonsoft.Json.JsonProperty("MaxDepth", Required = Newtonsoft.Json.Required.Always)] + public int MaxDepth { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class XmlWriterSettings + { + [Newtonsoft.Json.JsonProperty("Async", Required = Newtonsoft.Json.Required.Always)] + public bool Async { get; set; } + + [Newtonsoft.Json.JsonProperty("Encoding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Encoding Encoding { get; set; } + + [Newtonsoft.Json.JsonProperty("OmitXmlDeclaration", Required = Newtonsoft.Json.Required.Always)] + public bool OmitXmlDeclaration { get; set; } + + [Newtonsoft.Json.JsonProperty("NewLineHandling", Required = Newtonsoft.Json.Required.Always)] + public NewLineHandling NewLineHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("NewLineChars", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string NewLineChars { get; set; } + + [Newtonsoft.Json.JsonProperty("Indent", Required = Newtonsoft.Json.Required.Always)] + public bool Indent { get; set; } + + [Newtonsoft.Json.JsonProperty("IndentChars", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string IndentChars { get; set; } + + [Newtonsoft.Json.JsonProperty("NewLineOnAttributes", Required = Newtonsoft.Json.Required.Always)] + public bool NewLineOnAttributes { get; set; } + + [Newtonsoft.Json.JsonProperty("CloseOutput", Required = Newtonsoft.Json.Required.Always)] + public bool CloseOutput { get; set; } + + [Newtonsoft.Json.JsonProperty("ConformanceLevel", Required = Newtonsoft.Json.Required.Always)] + public ConformanceLevel ConformanceLevel { get; set; } + + [Newtonsoft.Json.JsonProperty("CheckCharacters", Required = Newtonsoft.Json.Required.Always)] + public bool CheckCharacters { get; set; } + + [Newtonsoft.Json.JsonProperty("NamespaceHandling", Required = Newtonsoft.Json.Required.Always)] + public NamespaceHandling NamespaceHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("WriteEndDocumentOnClose", Required = Newtonsoft.Json.Required.Always)] + public bool WriteEndDocumentOnClose { get; set; } + + [Newtonsoft.Json.JsonProperty("OutputMethod", Required = Newtonsoft.Json.Required.Always)] + public XmlOutputMethod OutputMethod { get; set; } + + [Newtonsoft.Json.JsonProperty("DoNotEscapeUriAttributes", Required = Newtonsoft.Json.Required.Always)] + public bool DoNotEscapeUriAttributes { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class Encoding + { + [Newtonsoft.Json.JsonProperty("BodyName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string BodyName { get; set; } + + [Newtonsoft.Json.JsonProperty("EncodingName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string EncodingName { get; set; } + + [Newtonsoft.Json.JsonProperty("HeaderName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string HeaderName { get; set; } + + [Newtonsoft.Json.JsonProperty("WebName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string WebName { get; set; } + + [Newtonsoft.Json.JsonProperty("WindowsCodePage", Required = Newtonsoft.Json.Required.Always)] + public int WindowsCodePage { get; set; } + + [Newtonsoft.Json.JsonProperty("IsBrowserDisplay", Required = Newtonsoft.Json.Required.Always)] + public bool IsBrowserDisplay { get; set; } + + [Newtonsoft.Json.JsonProperty("IsBrowserSave", Required = Newtonsoft.Json.Required.Always)] + public bool IsBrowserSave { get; set; } + + [Newtonsoft.Json.JsonProperty("IsMailNewsDisplay", Required = Newtonsoft.Json.Required.Always)] + public bool IsMailNewsDisplay { get; set; } + + [Newtonsoft.Json.JsonProperty("IsMailNewsSave", Required = Newtonsoft.Json.Required.Always)] + public bool IsMailNewsSave { get; set; } + + [Newtonsoft.Json.JsonProperty("IsSingleByte", Required = Newtonsoft.Json.Required.Always)] + public bool IsSingleByte { get; set; } + + [Newtonsoft.Json.JsonProperty("EncoderFallback", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public EncoderFallback EncoderFallback { get; set; } + + [Newtonsoft.Json.JsonProperty("DecoderFallback", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public DecoderFallback DecoderFallback { get; set; } + + [Newtonsoft.Json.JsonProperty("IsReadOnly", Required = Newtonsoft.Json.Required.Always)] + public bool IsReadOnly { get; set; } + + [Newtonsoft.Json.JsonProperty("CodePage", Required = Newtonsoft.Json.Required.Always)] + public int CodePage { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class EncoderFallback + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class DecoderFallback + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum NewLineHandling + { + Replace = 0, + + Entitize = 1, + + None = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum ConformanceLevel + { + Auto = 0, + + Fragment = 1, + + Document = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum NamespaceHandling + { + Default = 0, + + OmitDuplicates = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum XmlOutputMethod + { + Xml = 0, + + Html = 1, + + Text = 2, + + AutoDetect = 3, + + } + + /// <summary>Base class to handle serializing and deserializing strongly-typed objects using ObjectContent. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MediaTypeFormatter + { + /// <summary>Gets the mutable collection of media types supported bythis MediaTypeFormatter.</summary> + [Newtonsoft.Json.JsonProperty("SupportedMediaTypes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<MediaTypeHeaderValue> SupportedMediaTypes { get; set; } + + /// <summary>Gets the mutable collection of character encodings supported bythis MediaTypeFormatter.</summary> + [Newtonsoft.Json.JsonProperty("SupportedEncodings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<Encoding> SupportedEncodings { get; set; } + + /// <summary>Gets the mutable collection of MediaTypeMapping objects that match HTTP requests to media types.</summary> + [Newtonsoft.Json.JsonProperty("MediaTypeMappings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<MediaTypeMapping> MediaTypeMappings { get; set; } + + /// <summary>Gets or sets the IRequiredMemberSelector instance used to determine required members.</summary> + [Newtonsoft.Json.JsonProperty("RequiredMemberSelector", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IRequiredMemberSelector RequiredMemberSelector { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class MediaTypeHeaderValue + { + [Newtonsoft.Json.JsonProperty("CharSet", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string CharSet { get; set; } + + [Newtonsoft.Json.JsonProperty("Parameters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Parameters { get; set; } + + [Newtonsoft.Json.JsonProperty("MediaType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string MediaType { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class NameValueHeaderValue + { + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Value { get; set; } + + + } + + /// <summary>An abstract base class used to create an association between HttpRequestMessage or HttpResponseMessage instances that have certain characteristics and a specific MediaTypeHeaderValue. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class MediaTypeMapping + { + /// <summary>Gets the MediaTypeHeaderValue that is associated with HttpRequestMessage or HttpResponseMessage instances that have the given characteristics of the MediaTypeMapping. </summary> + [Newtonsoft.Json.JsonProperty("MediaType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MediaTypeHeaderValue MediaType { get; set; } + + + } + + /// <summary>Defines method that determines whether a given member is required on deserialization.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IRequiredMemberSelector + { + + } + + /// <summary>Represents the MediaTypeFormatter class to handle JSON. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class JsonMediaTypeFormatter : BaseJsonMediaTypeFormatter + { + /// <summary>Gets or sets a value indicating whether to use DataContractJsonSerializer by default. </summary> + [Newtonsoft.Json.JsonProperty("UseDataContractJsonSerializer", Required = Newtonsoft.Json.Required.Always)] + public bool UseDataContractJsonSerializer { get; set; } + + /// <summary>Gets or sets a value indicating whether to indent elements when writing data. </summary> + [Newtonsoft.Json.JsonProperty("Indent", Required = Newtonsoft.Json.Required.Always)] + public bool Indent { get; set; } + + /// <summary>Gets or sets the maximum depth allowed by this formatter.</summary> + [Newtonsoft.Json.JsonProperty("MaxDepth", Required = Newtonsoft.Json.Required.Always)] + public int MaxDepth { get; set; } + + + } + + /// <summary>Abstract media type formatter class to support Bson and Json.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class BaseJsonMediaTypeFormatter : MediaTypeFormatter + { + /// <summary>Gets or sets the JsonSerializerSettings used to configure the JsonSerializer.</summary> + [Newtonsoft.Json.JsonProperty("SerializerSettings", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public JsonSerializerSettings SerializerSettings { get; set; } + + /// <summary>Gets or sets the maximum depth allowed by this formatter.</summary> + [Newtonsoft.Json.JsonProperty("MaxDepth", Required = Newtonsoft.Json.Required.Always)] + public int MaxDepth { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class JsonSerializerSettings + { + [Newtonsoft.Json.JsonProperty("ReferenceLoopHandling", Required = Newtonsoft.Json.Required.Always)] + public ReferenceLoopHandling ReferenceLoopHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("MissingMemberHandling", Required = Newtonsoft.Json.Required.Always)] + public MissingMemberHandling MissingMemberHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("ObjectCreationHandling", Required = Newtonsoft.Json.Required.Always)] + public ObjectCreationHandling ObjectCreationHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("NullValueHandling", Required = Newtonsoft.Json.Required.Always)] + public NullValueHandling NullValueHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("DefaultValueHandling", Required = Newtonsoft.Json.Required.Always)] + public DefaultValueHandling DefaultValueHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("Converters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<JsonConverter> Converters { get; set; } + + [Newtonsoft.Json.JsonProperty("PreserveReferencesHandling", Required = Newtonsoft.Json.Required.Always)] + public PreserveReferencesHandling PreserveReferencesHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("TypeNameHandling", Required = Newtonsoft.Json.Required.Always)] + public TypeNameHandling TypeNameHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("MetadataPropertyHandling", Required = Newtonsoft.Json.Required.Always)] + public MetadataPropertyHandling MetadataPropertyHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("TypeNameAssemblyFormat", Required = Newtonsoft.Json.Required.Always)] + public FormatterAssemblyStyle TypeNameAssemblyFormat { get; set; } + + [Newtonsoft.Json.JsonProperty("TypeNameAssemblyFormatHandling", Required = Newtonsoft.Json.Required.Always)] + public TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("ConstructorHandling", Required = Newtonsoft.Json.Required.Always)] + public ConstructorHandling ConstructorHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("ContractResolver", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IContractResolver ContractResolver { get; set; } + + [Newtonsoft.Json.JsonProperty("EqualityComparer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IEqualityComparer EqualityComparer { get; set; } + + [Newtonsoft.Json.JsonProperty("ReferenceResolver", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IReferenceResolver ReferenceResolver { get; set; } + + [Newtonsoft.Json.JsonProperty("ReferenceResolverProvider", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FuncOfIReferenceResolver ReferenceResolverProvider { get; set; } + + [Newtonsoft.Json.JsonProperty("TraceWriter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ITraceWriter TraceWriter { get; set; } + + [Newtonsoft.Json.JsonProperty("Binder", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public SerializationBinder Binder { get; set; } + + [Newtonsoft.Json.JsonProperty("SerializationBinder", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ISerializationBinder SerializationBinder { get; set; } + + [Newtonsoft.Json.JsonProperty("Error", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public EventHandlerOfErrorEventArgs Error { get; set; } + + [Newtonsoft.Json.JsonProperty("Context", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public StreamingContext Context { get; set; } = new StreamingContext(); + + [Newtonsoft.Json.JsonProperty("DateFormatString", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string DateFormatString { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxDepth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? MaxDepth { get; set; } + + [Newtonsoft.Json.JsonProperty("Formatting", Required = Newtonsoft.Json.Required.Always)] + public Formatting Formatting { get; set; } + + [Newtonsoft.Json.JsonProperty("DateFormatHandling", Required = Newtonsoft.Json.Required.Always)] + public DateFormatHandling DateFormatHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("DateTimeZoneHandling", Required = Newtonsoft.Json.Required.Always)] + public DateTimeZoneHandling DateTimeZoneHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("DateParseHandling", Required = Newtonsoft.Json.Required.Always)] + public DateParseHandling DateParseHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("FloatFormatHandling", Required = Newtonsoft.Json.Required.Always)] + public FloatFormatHandling FloatFormatHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("FloatParseHandling", Required = Newtonsoft.Json.Required.Always)] + public FloatParseHandling FloatParseHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("StringEscapeHandling", Required = Newtonsoft.Json.Required.Always)] + public StringEscapeHandling StringEscapeHandling { get; set; } + + [Newtonsoft.Json.JsonProperty("Culture", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Culture { get; set; } + + [Newtonsoft.Json.JsonProperty("CheckAdditionalContent", Required = Newtonsoft.Json.Required.Always)] + public bool CheckAdditionalContent { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum ReferenceLoopHandling + { + Error = 0, + + Ignore = 1, + + Serialize = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum MissingMemberHandling + { + Ignore = 0, + + Error = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum ObjectCreationHandling + { + Auto = 0, + + Reuse = 1, + + Replace = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum NullValueHandling + { + Include = 0, + + Ignore = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum DefaultValueHandling + { + Include = 0, + + Ignore = 1, + + Populate = 2, + + IgnoreAndPopulate = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class JsonConverter + { + [Newtonsoft.Json.JsonProperty("CanRead", Required = Newtonsoft.Json.Required.Always)] + public bool CanRead { get; set; } + + [Newtonsoft.Json.JsonProperty("CanWrite", Required = Newtonsoft.Json.Required.Always)] + public bool CanWrite { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum PreserveReferencesHandling + { + None = 0, + + Objects = 1, + + Arrays = 2, + + All = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum TypeNameHandling + { + None = 0, + + Objects = 1, + + Arrays = 2, + + All = 3, + + Auto = 4, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum MetadataPropertyHandling + { + Default = 0, + + ReadAhead = 1, + + Ignore = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum FormatterAssemblyStyle + { + Simple = 0, + + Full = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum TypeNameAssemblyFormatHandling + { + Simple = 0, + + Full = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum ConstructorHandling + { + Default = 0, + + AllowNonPublicDefaultConstructor = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IContractResolver + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IEqualityComparer + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IReferenceResolver + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class FuncOfIReferenceResolver : MulticastDelegate + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class ITraceWriter + { + [Newtonsoft.Json.JsonProperty("LevelFilter", Required = Newtonsoft.Json.Required.Always)] + public TraceLevel LevelFilter { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum TraceLevel + { + Off = 0, + + Error = 1, + + Warning = 2, + + Info = 3, + + Verbose = 4, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class SerializationBinder + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class ISerializationBinder + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class EventHandlerOfErrorEventArgs : MulticastDelegate + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class StreamingContext + { + [Newtonsoft.Json.JsonProperty("Context", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public object Context { get; set; } + + [Newtonsoft.Json.JsonProperty("State", Required = Newtonsoft.Json.Required.Always)] + public StreamingContextStates State { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + [System.Flags] + public enum StreamingContextStates + { + CrossProcess = 1, + + CrossMachine = 2, + + File = 4, + + Persistence = 8, + + Remoting = 16, + + Other = 32, + + Clone = 64, + + CrossAppDomain = 128, + + All = 255, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum Formatting + { + None = 0, + + Indented = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DateFormatHandling + { + IsoDateFormat = 0, + + MicrosoftDateFormat = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DateTimeZoneHandling + { + Local = 0, + + Utc = 1, + + Unspecified = 2, + + RoundtripKind = 3, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum DateParseHandling + { + None = 0, + + DateTime = 1, + + DateTimeOffset = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum FloatFormatHandling + { + String = 0, + + Symbol = 1, + + DefaultValue = 2, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum FloatParseHandling + { + Double = 0, + + Decimal = 1, + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public enum StringEscapeHandling + { + Default = 0, + + EscapeNonAscii = 1, + + EscapeHtml = 2, + + } + + /// <summary>MediaTypeFormatter class for handling HTML form URL-ended data, also known as application/x-www-form-urlencoded. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class FormUrlEncodedMediaTypeFormatter : MediaTypeFormatter + { + /// <summary>Gets or sets the maximum depth allowed by this formatter.</summary> + [Newtonsoft.Json.JsonProperty("MaxDepth", Required = Newtonsoft.Json.Required.Always)] + public int MaxDepth { get; set; } + + /// <summary>Gets or sets the size of the buffer when reading the incoming stream.</summary> + [Newtonsoft.Json.JsonProperty("ReadBufferSize", Required = Newtonsoft.Json.Required.Always)] + public int ReadBufferSize { get; set; } + + + } + + /// <summary>Represents information that describes the HTTP controller.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpControllerDescriptor + { + /// <summary>Gets the properties associated with this instance.</summary> + [Newtonsoft.Json.JsonProperty("Properties", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Properties { get; set; } + + /// <summary>Gets or sets the configurations associated with the controller.</summary> + [Newtonsoft.Json.JsonProperty("Configuration", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpConfiguration Configuration { get; set; } + + /// <summary>Gets or sets the name of the controller.</summary> + [Newtonsoft.Json.JsonProperty("ControllerName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ControllerName { get; set; } + + /// <summary>Gets or sets the type of the controller.</summary> + [Newtonsoft.Json.JsonProperty("ControllerType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ControllerType { get; set; } + + + } + + /// <summary>Represents an HTTP controller.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IHttpController + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpRequestMessage + { + [Newtonsoft.Json.JsonProperty("Version", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Version Version { get; set; } + + [Newtonsoft.Json.JsonProperty("Content", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpContent Content { get; set; } + + [Newtonsoft.Json.JsonProperty("Method", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpMethod Method { get; set; } + + [Newtonsoft.Json.JsonProperty("RequestUri", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Uri RequestUri { get; set; } + + [Newtonsoft.Json.JsonProperty("Headers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpRequestHeaders Headers { get; set; } + + [Newtonsoft.Json.JsonProperty("Properties", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Properties { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Version + { + [Newtonsoft.Json.JsonProperty("Major", Required = Newtonsoft.Json.Required.Always)] + public int Major { get; set; } + + [Newtonsoft.Json.JsonProperty("Minor", Required = Newtonsoft.Json.Required.Always)] + public int Minor { get; set; } + + [Newtonsoft.Json.JsonProperty("Build", Required = Newtonsoft.Json.Required.Always)] + public int Build { get; set; } + + [Newtonsoft.Json.JsonProperty("Revision", Required = Newtonsoft.Json.Required.Always)] + public int Revision { get; set; } + + [Newtonsoft.Json.JsonProperty("MajorRevision", Required = Newtonsoft.Json.Required.Always)] + public int MajorRevision { get; set; } + + [Newtonsoft.Json.JsonProperty("MinorRevision", Required = Newtonsoft.Json.Required.Always)] + public int MinorRevision { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class HttpContent + { + [Newtonsoft.Json.JsonProperty("Headers", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpContentHeaders Headers { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpContentHeaders : Anonymous2 + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ContentDispositionHeaderValue + { + [Newtonsoft.Json.JsonProperty("DispositionType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string DispositionType { get; set; } + + [Newtonsoft.Json.JsonProperty("Parameters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Parameters { get; set; } + + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("FileName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileName { get; set; } + + [Newtonsoft.Json.JsonProperty("FileNameStar", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FileNameStar { get; set; } + + [Newtonsoft.Json.JsonProperty("CreationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? CreationDate { get; set; } + + [Newtonsoft.Json.JsonProperty("ModificationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? ModificationDate { get; set; } + + [Newtonsoft.Json.JsonProperty("ReadDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? ReadDate { get; set; } + + [Newtonsoft.Json.JsonProperty("Size", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Size { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ContentRangeHeaderValue + { + [Newtonsoft.Json.JsonProperty("Unit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Unit { get; set; } + + [Newtonsoft.Json.JsonProperty("From", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? From { get; set; } + + [Newtonsoft.Json.JsonProperty("To", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? To { get; set; } + + [Newtonsoft.Json.JsonProperty("Length", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? Length { get; set; } + + [Newtonsoft.Json.JsonProperty("HasLength", Required = Newtonsoft.Json.Required.Always)] + public bool HasLength { get; set; } + + [Newtonsoft.Json.JsonProperty("HasRange", Required = Newtonsoft.Json.Required.Always)] + public bool HasRange { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class KeyValuePairOfStringAndIEnumerableOfString + { + [Newtonsoft.Json.JsonProperty("Key", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Key { get; set; } + + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> Value { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpMethod + { + [Newtonsoft.Json.JsonProperty("Method", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Method { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpRequestHeaders : Anonymous3 + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class MediaTypeWithQualityHeaderValue : MediaTypeHeaderValue + { + [Newtonsoft.Json.JsonProperty("Quality", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Quality { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class StringWithQualityHeaderValue + { + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Value { get; set; } + + [Newtonsoft.Json.JsonProperty("Quality", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Quality { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class AuthenticationHeaderValue + { + [Newtonsoft.Json.JsonProperty("Scheme", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Scheme { get; set; } + + [Newtonsoft.Json.JsonProperty("Parameter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Parameter { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class NameValueWithParametersHeaderValue : NameValueHeaderValue + { + [Newtonsoft.Json.JsonProperty("Parameters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Parameters { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class EntityTagHeaderValue + { + [Newtonsoft.Json.JsonProperty("Tag", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Tag { get; set; } + + [Newtonsoft.Json.JsonProperty("IsWeak", Required = Newtonsoft.Json.Required.Always)] + public bool IsWeak { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class RangeConditionHeaderValue + { + [Newtonsoft.Json.JsonProperty("Date", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? Date { get; set; } + + [Newtonsoft.Json.JsonProperty("EntityTag", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public EntityTagHeaderValue EntityTag { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class RangeHeaderValue + { + [Newtonsoft.Json.JsonProperty("Unit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Unit { get; set; } + + [Newtonsoft.Json.JsonProperty("Ranges", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<RangeItemHeaderValue> Ranges { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class RangeItemHeaderValue + { + [Newtonsoft.Json.JsonProperty("From", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? From { get; set; } + + [Newtonsoft.Json.JsonProperty("To", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? To { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class TransferCodingWithQualityHeaderValue : TransferCodingHeaderValue + { + [Newtonsoft.Json.JsonProperty("Quality", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public double? Quality { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class TransferCodingHeaderValue + { + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Value { get; set; } + + [Newtonsoft.Json.JsonProperty("Parameters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Parameters { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ProductInfoHeaderValue + { + [Newtonsoft.Json.JsonProperty("Product", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ProductHeaderValue Product { get; set; } + + [Newtonsoft.Json.JsonProperty("Comment", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Comment { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ProductHeaderValue + { + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("Version", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Version { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class CacheControlHeaderValue + { + [Newtonsoft.Json.JsonProperty("NoCache", Required = Newtonsoft.Json.Required.Always)] + public bool NoCache { get; set; } + + [Newtonsoft.Json.JsonProperty("NoCacheHeaders", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> NoCacheHeaders { get; set; } + + [Newtonsoft.Json.JsonProperty("NoStore", Required = Newtonsoft.Json.Required.Always)] + public bool NoStore { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxAge", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan? MaxAge { get; set; } + + [Newtonsoft.Json.JsonProperty("SharedMaxAge", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan? SharedMaxAge { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxStale", Required = Newtonsoft.Json.Required.Always)] + public bool MaxStale { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxStaleLimit", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan? MaxStaleLimit { get; set; } + + [Newtonsoft.Json.JsonProperty("MinFresh", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.TimeSpan? MinFresh { get; set; } + + [Newtonsoft.Json.JsonProperty("NoTransform", Required = Newtonsoft.Json.Required.Always)] + public bool NoTransform { get; set; } + + [Newtonsoft.Json.JsonProperty("OnlyIfCached", Required = Newtonsoft.Json.Required.Always)] + public bool OnlyIfCached { get; set; } + + [Newtonsoft.Json.JsonProperty("Public", Required = Newtonsoft.Json.Required.Always)] + public bool Public { get; set; } + + [Newtonsoft.Json.JsonProperty("Private", Required = Newtonsoft.Json.Required.Always)] + public bool Private { get; set; } + + [Newtonsoft.Json.JsonProperty("PrivateHeaders", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> PrivateHeaders { get; set; } + + [Newtonsoft.Json.JsonProperty("MustRevalidate", Required = Newtonsoft.Json.Required.Always)] + public bool MustRevalidate { get; set; } + + [Newtonsoft.Json.JsonProperty("ProxyRevalidate", Required = Newtonsoft.Json.Required.Always)] + public bool ProxyRevalidate { get; set; } + + [Newtonsoft.Json.JsonProperty("Extensions", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Extensions { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class ViaHeaderValue + { + [Newtonsoft.Json.JsonProperty("ProtocolName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ProtocolName { get; set; } + + [Newtonsoft.Json.JsonProperty("ProtocolVersion", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ProtocolVersion { get; set; } + + [Newtonsoft.Json.JsonProperty("ReceivedBy", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string ReceivedBy { get; set; } + + [Newtonsoft.Json.JsonProperty("Comment", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Comment { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class WarningHeaderValue + { + [Newtonsoft.Json.JsonProperty("Code", Required = Newtonsoft.Json.Required.Always)] + public int Code { get; set; } + + [Newtonsoft.Json.JsonProperty("Agent", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Agent { get; set; } + + [Newtonsoft.Json.JsonProperty("Text", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Text { get; set; } + + [Newtonsoft.Json.JsonProperty("Date", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? Date { get; set; } + + + } + + /// <summary>Represents the context associated with a request.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class HttpRequestContext + { + /// <summary>Gets or sets the client certificate.</summary> + [Newtonsoft.Json.JsonProperty("ClientCertificate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public X509Certificate2 ClientCertificate { get; set; } + + /// <summary>Gets or sets the configuration.</summary> + [Newtonsoft.Json.JsonProperty("Configuration", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpConfiguration Configuration { get; set; } + + /// <summary>Gets or sets a value indicating whether error details, such as exception messages and stack traces, should be included in the response for this request.</summary> + [Newtonsoft.Json.JsonProperty("IncludeErrorDetail", Required = Newtonsoft.Json.Required.Always)] + public bool IncludeErrorDetail { get; set; } + + /// <summary>Gets or sets a value indicating whether the request originates from a local address.</summary> + [Newtonsoft.Json.JsonProperty("IsLocal", Required = Newtonsoft.Json.Required.Always)] + public bool IsLocal { get; set; } + + /// <summary>.Gets or sets the principal</summary> + [Newtonsoft.Json.JsonProperty("Principal", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IPrincipal Principal { get; set; } + + /// <summary>Gets or sets the route data.</summary> + [Newtonsoft.Json.JsonProperty("RouteData", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IHttpRouteData RouteData { get; set; } + + /// <summary>Gets or sets the factory used to generate URLs to other APIs.</summary> + [Newtonsoft.Json.JsonProperty("Url", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public UrlHelper Url { get; set; } + + /// <summary>Gets or sets the virtual path root.</summary> + [Newtonsoft.Json.JsonProperty("VirtualPathRoot", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string VirtualPathRoot { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class X509Certificate2 : X509Certificate + { + [Newtonsoft.Json.JsonProperty("Archived", Required = Newtonsoft.Json.Required.Always)] + public bool Archived { get; set; } + + [Newtonsoft.Json.JsonProperty("Extensions", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<Extensions> Extensions { get; set; } + + [Newtonsoft.Json.JsonProperty("FriendlyName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FriendlyName { get; set; } + + [Newtonsoft.Json.JsonProperty("IssuerName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public X500DistinguishedName IssuerName { get; set; } + + [Newtonsoft.Json.JsonProperty("NotAfter", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset NotAfter { get; set; } + + [Newtonsoft.Json.JsonProperty("NotBefore", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] + public System.DateTimeOffset NotBefore { get; set; } + + [Newtonsoft.Json.JsonProperty("HasPrivateKey", Required = Newtonsoft.Json.Required.Always)] + public bool HasPrivateKey { get; set; } + + [Newtonsoft.Json.JsonProperty("PrivateKey", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AsymmetricAlgorithm PrivateKey { get; set; } + + [Newtonsoft.Json.JsonProperty("PublicKey", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public PublicKey PublicKey { get; set; } + + [Newtonsoft.Json.JsonProperty("RawData", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public byte[] RawData { get; set; } + + [Newtonsoft.Json.JsonProperty("SerialNumber", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string SerialNumber { get; set; } + + [Newtonsoft.Json.JsonProperty("SubjectName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public X500DistinguishedName SubjectName { get; set; } + + [Newtonsoft.Json.JsonProperty("SignatureAlgorithm", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Oid SignatureAlgorithm { get; set; } + + [Newtonsoft.Json.JsonProperty("Thumbprint", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Thumbprint { get; set; } + + [Newtonsoft.Json.JsonProperty("Version", Required = Newtonsoft.Json.Required.Always)] + public int Version { get; set; } + + [Newtonsoft.Json.JsonProperty("CertContext", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public SafeCertContextHandle CertContext { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class X500DistinguishedName : AsnEncodedData + { + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class AsnEncodedData + { + [Newtonsoft.Json.JsonProperty("Oid", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Oid Oid { get; set; } + + [Newtonsoft.Json.JsonProperty("RawData", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public byte[] RawData { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Oid + { + [Newtonsoft.Json.JsonProperty("Value", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Value { get; set; } + + [Newtonsoft.Json.JsonProperty("FriendlyName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string FriendlyName { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class AsymmetricAlgorithm + { + [Newtonsoft.Json.JsonProperty("KeySize", Required = Newtonsoft.Json.Required.Always)] + public int KeySize { get; set; } + + [Newtonsoft.Json.JsonProperty("LegalKeySizes", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<KeySizes> LegalKeySizes { get; set; } + + [Newtonsoft.Json.JsonProperty("SignatureAlgorithm", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string SignatureAlgorithm { get; set; } + + [Newtonsoft.Json.JsonProperty("KeyExchangeAlgorithm", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string KeyExchangeAlgorithm { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class KeySizes + { + [Newtonsoft.Json.JsonProperty("MinSize", Required = Newtonsoft.Json.Required.Always)] + public int MinSize { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxSize", Required = Newtonsoft.Json.Required.Always)] + public int MaxSize { get; set; } + + [Newtonsoft.Json.JsonProperty("SkipSize", Required = Newtonsoft.Json.Required.Always)] + public int SkipSize { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class PublicKey + { + [Newtonsoft.Json.JsonProperty("Key", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AsymmetricAlgorithm Key { get; set; } + + [Newtonsoft.Json.JsonProperty("Oid", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public Oid Oid { get; set; } + + [Newtonsoft.Json.JsonProperty("EncodedKeyValue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AsnEncodedData EncodedKeyValue { get; set; } + + [Newtonsoft.Json.JsonProperty("EncodedParameters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AsnEncodedData EncodedParameters { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class SafeCertContextHandle : SafeHandleZeroOrMinusOneIsInvalid + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class SafeHandleZeroOrMinusOneIsInvalid : SafeHandle + { + [Newtonsoft.Json.JsonProperty("IsInvalid", Required = Newtonsoft.Json.Required.Always)] + public bool IsInvalid { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class SafeHandle : CriticalFinalizerObject + { + [Newtonsoft.Json.JsonProperty("IsClosed", Required = Newtonsoft.Json.Required.Always)] + public bool IsClosed { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class CriticalFinalizerObject + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class X509Certificate + { + [Newtonsoft.Json.JsonProperty("Handle", Required = Newtonsoft.Json.Required.Always)] + [System.ComponentModel.DataAnnotations.Required] + public IntPtr Handle { get; set; } = new IntPtr(); + + [Newtonsoft.Json.JsonProperty("Issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Issuer { get; set; } + + [Newtonsoft.Json.JsonProperty("Subject", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Subject { get; set; } + + [Newtonsoft.Json.JsonProperty("CertContext", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public SafeCertContextHandle2 CertContext { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class SafeCertContextHandle2 : SafeHandleZeroOrMinusOneIsInvalid + { + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IPrincipal + { + [Newtonsoft.Json.JsonProperty("Identity", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IIdentity Identity { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IIdentity + { + [Newtonsoft.Json.JsonProperty("Name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Name { get; set; } + + [Newtonsoft.Json.JsonProperty("AuthenticationType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string AuthenticationType { get; set; } + + [Newtonsoft.Json.JsonProperty("IsAuthenticated", Required = Newtonsoft.Json.Required.Always)] + public bool IsAuthenticated { get; set; } + + + } + + /// <summary>Provides information about a route.</summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public abstract partial class IHttpRouteData + { + /// <summary>Gets the object that represents the route.</summary> + [Newtonsoft.Json.JsonProperty("Route", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public IHttpRoute Route { get; set; } + + /// <summary>Gets a collection of URL parameter values and default values for the route.</summary> + [Newtonsoft.Json.JsonProperty("Values", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.IDictionary<string, object> Values { get; set; } + + + } + + /// <summary>Represents a factory for creating URLs. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class UrlHelper + { + /// <summary>Gets or sets the HttpRequestMessage of the current UrlHelper instance.</summary> + [Newtonsoft.Json.JsonProperty("Request", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public HttpRequestMessage Request { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Evidence + { + private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary<string, object> AdditionalProperties + { + get { return _additionalProperties; } + set { _additionalProperties = value; } + } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class PermissionSet + { + private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary<string, object> AdditionalProperties + { + get { return _additionalProperties; } + set { _additionalProperties = value; } + } + + + } + + /// <summary>Collection class that contains MediaTypeFormatter instances. </summary> + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Anonymous + { + /// <summary>Gets the MediaTypeFormatter to use for XML.</summary> + [Newtonsoft.Json.JsonProperty("XmlFormatter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public XmlMediaTypeFormatter XmlFormatter { get; set; } + + /// <summary>Gets the MediaTypeFormatter to use for JSON.</summary> + [Newtonsoft.Json.JsonProperty("JsonFormatter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public JsonMediaTypeFormatter JsonFormatter { get; set; } + + /// <summary>Gets the MediaTypeFormatter to use for application/x-www-form-urlencoded data.</summary> + [Newtonsoft.Json.JsonProperty("FormUrlEncodedFormatter", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public FormUrlEncodedMediaTypeFormatter FormUrlEncodedFormatter { get; set; } + + [Newtonsoft.Json.JsonProperty("WritingFormatters", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<MediaTypeFormatter> WritingFormatters { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Anonymous2 + { + [Newtonsoft.Json.JsonProperty("Allow", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> Allow { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentDisposition", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ContentDispositionHeaderValue ContentDisposition { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentEncoding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> ContentEncoding { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentLanguage", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> ContentLanguage { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentLength", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public long? ContentLength { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentLocation", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Uri ContentLocation { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentMD5", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public byte[] ContentMD5 { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentRange", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public ContentRangeHeaderValue ContentRange { get; set; } + + [Newtonsoft.Json.JsonProperty("ContentType", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public MediaTypeHeaderValue ContentType { get; set; } + + [Newtonsoft.Json.JsonProperty("Expires", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? Expires { get; set; } + + [Newtonsoft.Json.JsonProperty("LastModified", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? LastModified { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Anonymous3 + { + [Newtonsoft.Json.JsonProperty("Accept", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<MediaTypeWithQualityHeaderValue> Accept { get; set; } + + [Newtonsoft.Json.JsonProperty("AcceptCharset", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<StringWithQualityHeaderValue> AcceptCharset { get; set; } + + [Newtonsoft.Json.JsonProperty("AcceptEncoding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<StringWithQualityHeaderValue> AcceptEncoding { get; set; } + + [Newtonsoft.Json.JsonProperty("AcceptLanguage", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<StringWithQualityHeaderValue> AcceptLanguage { get; set; } + + [Newtonsoft.Json.JsonProperty("Authorization", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AuthenticationHeaderValue Authorization { get; set; } + + [Newtonsoft.Json.JsonProperty("Expect", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueWithParametersHeaderValue> Expect { get; set; } + + [Newtonsoft.Json.JsonProperty("ExpectContinue", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? ExpectContinue { get; set; } + + [Newtonsoft.Json.JsonProperty("From", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string From { get; set; } + + [Newtonsoft.Json.JsonProperty("Host", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public string Host { get; set; } + + [Newtonsoft.Json.JsonProperty("IfMatch", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<EntityTagHeaderValue> IfMatch { get; set; } + + [Newtonsoft.Json.JsonProperty("IfModifiedSince", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? IfModifiedSince { get; set; } + + [Newtonsoft.Json.JsonProperty("IfNoneMatch", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<EntityTagHeaderValue> IfNoneMatch { get; set; } + + [Newtonsoft.Json.JsonProperty("IfRange", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public RangeConditionHeaderValue IfRange { get; set; } + + [Newtonsoft.Json.JsonProperty("IfUnmodifiedSince", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? IfUnmodifiedSince { get; set; } + + [Newtonsoft.Json.JsonProperty("MaxForwards", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public int? MaxForwards { get; set; } + + [Newtonsoft.Json.JsonProperty("ProxyAuthorization", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public AuthenticationHeaderValue ProxyAuthorization { get; set; } + + [Newtonsoft.Json.JsonProperty("Range", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public RangeHeaderValue Range { get; set; } + + [Newtonsoft.Json.JsonProperty("Referrer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Uri Referrer { get; set; } + + [Newtonsoft.Json.JsonProperty("TE", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<TransferCodingWithQualityHeaderValue> TE { get; set; } + + [Newtonsoft.Json.JsonProperty("UserAgent", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<ProductInfoHeaderValue> UserAgent { get; set; } + + [Newtonsoft.Json.JsonProperty("CacheControl", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public CacheControlHeaderValue CacheControl { get; set; } + + [Newtonsoft.Json.JsonProperty("Connection", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> Connection { get; set; } + + [Newtonsoft.Json.JsonProperty("ConnectionClose", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? ConnectionClose { get; set; } + + [Newtonsoft.Json.JsonProperty("Date", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.DateTimeOffset? Date { get; set; } + + [Newtonsoft.Json.JsonProperty("Pragma", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<NameValueHeaderValue> Pragma { get; set; } + + [Newtonsoft.Json.JsonProperty("Trailer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<string> Trailer { get; set; } + + [Newtonsoft.Json.JsonProperty("TransferEncoding", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<TransferCodingHeaderValue> TransferEncoding { get; set; } + + [Newtonsoft.Json.JsonProperty("TransferEncodingChunked", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public bool? TransferEncodingChunked { get; set; } + + [Newtonsoft.Json.JsonProperty("Upgrade", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<ProductHeaderValue> Upgrade { get; set; } + + [Newtonsoft.Json.JsonProperty("Via", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<ViaHeaderValue> Via { get; set; } + + [Newtonsoft.Json.JsonProperty("Warning", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] + public System.Collections.Generic.ICollection<WarningHeaderValue> Warning { get; set; } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.1.5.0 (Newtonsoft.Json v11.0.0.0)")] + public partial class Extensions + { + private System.Collections.Generic.IDictionary<string, object> _additionalProperties = new System.Collections.Generic.Dictionary<string, object>(); + + [Newtonsoft.Json.JsonExtensionData] + public System.Collections.Generic.IDictionary<string, object> AdditionalProperties + { + get { return _additionalProperties; } + set { _additionalProperties = value; } + } + + + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.2.3.0 (NJsonSchema v10.1.5.0 (Newtonsoft.Json v11.0.0.0))")] + public partial class FileResponse : System.IDisposable + { + private System.IDisposable _client; + private System.IDisposable _response; + + public int StatusCode { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; } + + public System.IO.Stream Stream { get; private set; } + + public bool IsPartial + { + get { return StatusCode == 206; } + } + + public FileResponse(int statusCode, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.IO.Stream stream, System.IDisposable client, System.IDisposable response) + { + StatusCode = statusCode; + Headers = headers; + Stream = stream; + _client = client; + _response = response; + } + + public void Dispose() + { + if (Stream != null) + Stream.Dispose(); + if (_response != null) + _response.Dispose(); + if (_client != null) + _client.Dispose(); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.2.3.0 (NJsonSchema v10.1.5.0 (Newtonsoft.Json v11.0.0.0))")] + public partial class ApiException : System.Exception + { + public int StatusCode { get; private set; } + + public string Response { get; private set; } + + public System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> Headers { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, System.Exception innerException) + : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + response.Substring(0, response.Length >= 512 ? 512 : response.Length), innerException) + { + StatusCode = statusCode; + Response = response; + Headers = headers; + } + + public override string ToString() + { + return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); + } + } + + [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.2.3.0 (NJsonSchema v10.1.5.0 (Newtonsoft.Json v11.0.0.0))")] + public partial class ApiException<TResult> : ApiException + { + public TResult Result { get; private set; } + + public ApiException(string message, int statusCode, string response, System.Collections.Generic.IReadOnlyDictionary<string, System.Collections.Generic.IEnumerable<string>> headers, TResult result, System.Exception innerException) + : base(message, statusCode, response, headers, innerException) + { + Result = result; + } + } + +} + +#pragma warning restore 1591 +#pragma warning restore 1573 +#pragma warning restore 472 +#pragma warning restore 114 +#pragma warning restore 108
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/packages.config new file mode 100644 index 000000000..dcc862688 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.CLI/packages.config @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="CommandLineParser" version="2.8.0" targetFramework="net461" /> + <package id="ConsoleTables" version="2.4.2" targetFramework="net461" /> + <package id="EntityFramework" version="6.2.0" targetFramework="net461" /> + <package id="Google.Protobuf" version="3.4.1" targetFramework="net461" /> + <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> +</packages>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreCollection.cs index 0baf5bb19..c1b45e37f 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreCollection.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreCollection.cs @@ -33,6 +33,16 @@ namespace Tango.DataStore.EF { using (var db = ObservablesContext.CreateDefault()) { + var globalItem = db.GlobalDataStoreItems.FirstOrDefault(x => x.CollectionName == Name && x.Key == key); + + if (globalItem != null) + { + if (globalItem.DataType != (int)type) + { + throw new InvalidOperationException("A global data store item exists with the same key, but different data type."); + } + } + DataStoreItem item = db.DataStoreItems.SingleOrDefault(x => x.CollectionName == Name && x.Key == key); if (item == null) @@ -113,11 +123,20 @@ namespace Tango.DataStore.EF { using (var db = ObservablesContext.CreateDefault()) { - var items = db.DataStoreItems.Where(x => x.CollectionName == Name).ToList().Select(x => x.ToDataStoreItem()).ToList(); - var globalItems = db.GlobalDataStoreItems.Where(x => x.CollectionName == Name).ToList().Select(x => x.ToDataStoreItem()).ToList(); + var localItems = db.DataStoreItems.Where(x => x.CollectionName == Name).ToList(); + var globalItems = db.GlobalDataStoreItems.Where(x => x.CollectionName == Name).ToList(); + foreach (var globalItem in globalItems.ToList()) + { + var localItem = localItems.FirstOrDefault(x => x.CollectionName == globalItem.CollectionName && x.Key == globalItem.Key); + + if (localItem != null) + { + globalItems.Remove(globalItem); + } + } - return globalItems.Concat(items).ToList(); + return localItems.Select(x => x.ToDataStoreItem()).Concat(localItems.Select(x => x.ToDataStoreItem())).ToList(); } } diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreHelper.cs index 85b3b6731..5e885458b 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreHelper.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreHelper.cs @@ -89,11 +89,12 @@ namespace Tango.DataStore.EF }; } - public static DataStoreItem CreateDbDataStoreItem(IDataStoreItem item) + public static DataStoreItem CreateLocalDbDataStoreItem(IDataStoreItem item, String collection) { return new DataStoreItem() { Guid = item.Guid, + CollectionName = collection, LastUpdated = item.Date, IsSynchronized = item.IsSynchronized, Key = item.Key, @@ -101,5 +102,18 @@ namespace Tango.DataStore.EF Value = CreateBytes(item.Type, item.Value) }; } + + public static GlobalDataStoreItem CreateGlobalDbDataStoreItem(IDataStoreItem item, String collection) + { + return new GlobalDataStoreItem() + { + Guid = item.Guid, + CollectionName = collection, + LastUpdated = item.Date, + Key = item.Key, + DataType = (int)item.Type, + Value = CreateBytes(item.Type, item.Value) + }; + } } } diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreItem.cs index 6bcb97d17..6bcb97d17 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreItem.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreItem.cs diff --git a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreManager.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreManager.cs index 4314a25f9..4314a25f9 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/EFDataStoreManager.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/EFDataStoreManager.cs diff --git a/Software/Visual_Studio/Tango.DataStore.EF/ExtensionMethods.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/ExtensionMethods.cs index 9f09ae658..6d45a69e7 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/ExtensionMethods.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/ExtensionMethods.cs @@ -19,9 +19,14 @@ public static class ExtensionMethods return EFDataStoreHelper.CreateDataStoreItem(item); } - public static DataStoreItem ToDbDataStoreItem(this IDataStoreItem item) + public static DataStoreItem ToLocalDbDataStoreItem(this IDataStoreItem item, String collection) { - return EFDataStoreHelper.CreateDbDataStoreItem(item); + return EFDataStoreHelper.CreateLocalDbDataStoreItem(item, collection); + } + + public static GlobalDataStoreItem ToGlobalDbDataStoreItem(this IDataStoreItem item, String collection) + { + return EFDataStoreHelper.CreateGlobalDbDataStoreItem(item, collection); } } diff --git a/Software/Visual_Studio/Tango.DataStore.EF/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/Properties/AssemblyInfo.cs index c59e45461..c59e45461 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/Properties/AssemblyInfo.cs diff --git a/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/Tango.DataStore.EF.csproj index 96ecb5ad1..491c710e0 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/Tango.DataStore.EF.csproj +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/Tango.DataStore.EF.csproj @@ -54,7 +54,7 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> - <Compile Include="..\Versioning\GlobalVersionInfo.cs"> + <Compile Include="..\..\Versioning\GlobalVersionInfo.cs"> <Link>GlobalVersionInfo.cs</Link> </Compile> <Compile Include="EFDataStoreCollection.cs" /> @@ -68,11 +68,11 @@ <None Include="packages.config" /> </ItemGroup> <ItemGroup> - <ProjectReference Include="..\Tango.BL\Tango.BL.csproj"> + <ProjectReference Include="..\..\Tango.BL\Tango.BL.csproj"> <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project> <Name>Tango.BL</Name> </ProjectReference> - <ProjectReference Include="..\Tango.Core\Tango.Core.csproj"> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> <Name>Tango.Core</Name> </ProjectReference> @@ -80,7 +80,7 @@ <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> <Name>Tango.DataStore</Name> </ProjectReference> - <ProjectReference Include="..\Tango.PMR\Tango.PMR.csproj"> + <ProjectReference Include="..\..\Tango.PMR\Tango.PMR.csproj"> <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> <Name>Tango.PMR</Name> </ProjectReference> diff --git a/Software/Visual_Studio/Tango.DataStore.EF/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/packages.config index 13be55da1..13be55da1 100644 --- a/Software/Visual_Studio/Tango.DataStore.EF/packages.config +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.EF/packages.config diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/CustomControl1.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/CustomControl1.cs new file mode 100644 index 000000000..fab0127e8 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/CustomControl1.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.DataStore.Editing +{ + public class CustomControl1 : Control + { + static CustomControl1() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreCollectionModel.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreCollectionModel.cs new file mode 100644 index 000000000..3e58aa4b1 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreCollectionModel.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.DataStore.Editing +{ + public class DataStoreCollectionModel : ExtendedObject + { + public String Name { get; set; } + public ObservableCollection<DataStoreItemModel> Items { get; set; } + public bool IsDeleted { get; set; } + + private bool _isSelected; + public bool IsSelected + { + get { return _isSelected; } + set { _isSelected = value; RaisePropertyChangedAuto(); Items.ToList().ForEach(x => x.IsSelected = value); } + } + + public DataStoreCollectionModel() + { + Items = new ObservableCollection<DataStoreItemModel>(); + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreItemModel.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreItemModel.cs new file mode 100644 index 000000000..8f00a0ec6 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreItemModel.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.DataStore.Editing +{ + public class DataStoreItemModel : ExtendedObject, IDataStoreItem + { + public IDataStoreItem GlobalItem { get; set; } + + public DataType OriginalType { get; set; } + public Object OriginalValue { get; set; } + + private Object _value; + public Object Value + { + get { return _value; } + set { _value = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(HasDifference)); RaisePropertyChanged(nameof(FormattedValue)); } + } + + private bool _isSelected; + public bool IsSelected + { + get { return _isSelected; } + set { _isSelected = value; RaisePropertyChangedAuto(); } + } + + public bool HasDifference + { + get + { + if (OriginalType != Type) + { + return true; + } + + if (OriginalType == DataType.Bytes && Type == DataType.Bytes) + { + if (OriginalValue != null && Value != null) + { + return !Enumerable.SequenceEqual(OriginalValue as byte[], Value as byte[]); + } + } + + if (Value == null && OriginalValue == null) return false; + + return !OriginalValue.ToStringSafe().Equals(Value.ToStringSafe()) || (IsGlobal && GlobalItem.Value != Value); + } + } + + public String FormattedValue + { + get + { + var value = this.ToString(); + + if (value != null) return value.ToOneLine(); + return null; + } + } + + public string Guid { get; set; } + public string Key { get; set; } + + private DataType _type; + public DataType Type + { + get { return _type; } + set { _type = value; RaisePropertyChangedAuto(); } + } + + private DateTime _date; + public DateTime Date + { + get { return _date; } + set { _date = value; RaisePropertyChangedAuto(); } + } + + public bool IsSynchronized { get; set; } + public bool ExistsOnMachine { get; set; } + + private bool _isGlobal; + public bool IsGlobal + { + get { return _isGlobal; } + set { _isGlobal = value; RaisePropertyChangedAuto(); } + } + + private bool _isDeleted; + public bool IsDeleted + { + get { return _isDeleted; } + set { _isDeleted = value; RaisePropertyChangedAuto(); } + } + + public static DataStoreItemModel FromLocalDataStoreItem(IDataStoreItem local, IDataStoreItem globalItem) + { + DataStoreItemModel model = new DataStoreItemModel(); + + model.OriginalValue = local.Value; + model.Value = local.Value; + model.Guid = local.Guid; + model.Key = local.Key; + model.OriginalType = local.Type; + model.Type = local.Type; + model.Date = local.Date; + model.IsGlobal = false; + model.IsSynchronized = local.IsSynchronized; + + model.GlobalItem = globalItem; + + return model; + } + + public static DataStoreItemModel FromGlobalDataStoreItem(IDataStoreItem global) + { + DataStoreItemModel model = new DataStoreItemModel(); + + model.GlobalItem = global; + model.Guid = global.Guid; + model.Key = global.Key; + model.Type = global.Type; + model.OriginalType = global.Type; + model.Date = global.Date; + model.IsGlobal = true; + model.IsSynchronized = global.IsSynchronized; + + return model; + } + + public override string ToString() + { + if (this.Value != null) + { + return DataStoreHelper.FormatDataStoreItem(this); + } + else + { + return null; + } + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreModel.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreModel.cs new file mode 100644 index 000000000..a68cc0af9 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/DataStoreModel.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core; + +namespace Tango.DataStore.Editing +{ + public class DataStoreModel : ExtendedObject + { + public ObservableCollection<DataStoreCollectionModel> Collections { get; set; } + + public DataStoreModel() + { + Collections = new ObservableCollection<DataStoreCollectionModel>(); + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..9f04af8ea --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// 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("Tango.DataStore.Editing")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.DataStore.Editing")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file +//inside a <PropertyGroup>. For example, if you are using US english +//in your source files, set the <UICulture> to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly:ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// 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/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.Designer.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.Designer.cs new file mode 100644 index 000000000..c23f8f4eb --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.Designer.cs @@ -0,0 +1,62 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.DataStore.Editing.Properties { + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if ((resourceMan == null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.DataStore.Editing.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.resx b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.Designer.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.Designer.cs new file mode 100644 index 000000000..28f49dcd4 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.DataStore.Editing.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.settings b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile>
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Tango.DataStore.Editing.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Tango.DataStore.Editing.csproj new file mode 100644 index 000000000..b7da15e51 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Tango.DataStore.Editing.csproj @@ -0,0 +1,106 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}</ProjectGuid> + <OutputType>library</OutputType> + <RootNamespace>Tango.DataStore.Editing</RootNamespace> + <AssemblyName>Tango.DataStore.Editing</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + <Deterministic>true</Deterministic> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xaml"> + <RequiredTargetFramework>4.0</RequiredTargetFramework> + </Reference> + <Reference Include="WindowsBase" /> + <Reference Include="PresentationCore" /> + <Reference Include="PresentationFramework" /> + </ItemGroup> + <ItemGroup> + <Compile Include="UpdateDataStoreRequest.cs" /> + <Compile Include="UpdateDataStoreResponse.cs" /> + <Page Include="Themes\Generic.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Compile Include="CustomControl1.cs"> + <SubType>Code</SubType> + </Compile> + </ItemGroup> + <ItemGroup> + <Compile Include="DataStoreCollectionModel.cs" /> + <Compile Include="DataStoreItemModel.cs" /> + <Compile Include="DataStoreModel.cs" /> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Tango.BL\Tango.BL.csproj"> + <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.SharedUI\Tango.SharedUI.csproj"> + <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project> + <Name>Tango.SharedUI</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Themes/Generic.xaml b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Themes/Generic.xaml new file mode 100644 index 000000000..795842292 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/Themes/Generic.xaml @@ -0,0 +1,18 @@ +<ResourceDictionary + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:Tango.DataStore.Editing"> + <Style TargetType="{x:Type local:CustomControl1}"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type local:CustomControl1}"> + <Border Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}"> + + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> +</ResourceDictionary> diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreRequest.cs new file mode 100644 index 000000000..dc95ea6ae --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.DTO; + +namespace Tango.DataStore.Editing +{ + public class UpdateDataStoreRequest + { + public List<String> ToDelete { get; set; } + public List<DataStoreItemDTO> ToUpsert { get; set; } + + public UpdateDataStoreRequest() + { + ToDelete = new List<string>(); + ToUpsert = new List<DataStoreItemDTO>(); + } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreResponse.cs new file mode 100644 index 000000000..697ae341d --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Editing/UpdateDataStoreResponse.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Editing +{ + public class UpdateDataStoreResponse + { + + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs index c76a3b6d9..c76a3b6d9 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreCollection.cs diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs index ba2e5748e..ba2e5748e 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreItem.cs diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreManager.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreManager.cs index 25abd91ab..25abd91ab 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/LiteDBDataStoreManager.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/LiteDBDataStoreManager.cs diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/Properties/AssemblyInfo.cs index f1b35f107..f1b35f107 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/Properties/AssemblyInfo.cs diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/Tango.DataStore.Lite.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/Tango.DataStore.Lite.csproj index 2bf561432..65ba97520 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/Tango.DataStore.Lite.csproj +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/Tango.DataStore.Lite.csproj @@ -45,7 +45,7 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> - <Compile Include="..\Versioning\GlobalVersionInfo.cs"> + <Compile Include="..\..\Versioning\GlobalVersionInfo.cs"> <Link>GlobalVersionInfo.cs</Link> </Compile> <Compile Include="LiteDBDataStoreCollection.cs" /> diff --git a/Software/Visual_Studio/Tango.DataStore.LiteDB/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/packages.config index 9dcac7837..9dcac7837 100644 --- a/Software/Visual_Studio/Tango.DataStore.LiteDB/packages.config +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.LiteDB/packages.config diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/Properties/AssemblyInfo.cs index 808b25d41..808b25d41 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/Properties/AssemblyInfo.cs diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCollection.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCollection.cs new file mode 100644 index 000000000..e4453fafc --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCollection.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreCollection + { + public String Name { get; set; } + public List<RemoteDataStoreItem> Items { get; set; } + + public RemoteDataStoreCollection() + { + Items = new List<RemoteDataStoreItem>(); + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs index 84ba279fb..84ba279fb 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCountRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs index 71d4e13b2..71d4e13b2 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreCountResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs index ab5406611..ab5406611 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteAllRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs index b5ddc0b64..b5ddc0b64 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteAllResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs index 13d400154..13d400154 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs index 07bb40a8b..07bb40a8b 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreDeleteResponse.cs diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsRequest.cs new file mode 100644 index 000000000..a285cd5c1 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetAllItemsRequest + { + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsResponse.cs new file mode 100644 index 000000000..3afb22c1e --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllItemsResponse.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreGetAllItemsResponse + { + public List<RemoteDataStoreCollection> Collections { get; set; } + + public RemoteDataStoreGetAllItemsResponse() + { + Collections = new List<RemoteDataStoreCollection>(); + } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs index 747a5cb2f..747a5cb2f 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs index 2d9e0f527..2d9e0f527 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetAllResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs index 6299f7512..6299f7512 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs index fe98b73fc..fe98b73fc 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetCollectionNamesResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs index 7d16a0f38..7d16a0f38 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetItemRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs index 82393a786..82393a786 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetItemResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs index 4b8e9ee47..4b8e9ee47 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs index cc3b157e8..cc3b157e8 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreGetResponse.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreItem.cs index 4327a0bd6..4327a0bd6 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStoreItem.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreItem.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs index 77aa5e41f..77aa5e41f 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStorePutRequest.cs diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs index 7dd92490a..7dd92490a 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStorePutResponse.cs diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenRequest.cs new file mode 100644 index 000000000..b8da17012 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenRequest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public class RemoteDataStoreStartListenRequest + { + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenResponse.cs new file mode 100644 index 000000000..c2a6c24a6 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/RemoteDataStoreStartListenResponse.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Remote +{ + public enum RemoteDataStoreChangeType + { + None, + Modified + } + + public class RemoteDataStoreStartListenResponse + { + public RemoteDataStoreChangeType ChangeType { get; set; } + public String CollectionName { get; set; } + public RemoteDataStoreItem Item { get; set; } + } +} diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj index 4d0d04054..49fa37dc1 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/Tango.DataStore.Remote.csproj @@ -47,15 +47,18 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> - <Compile Include="..\Versioning\GlobalVersionInfo.cs"> + <Compile Include="..\..\Versioning\GlobalVersionInfo.cs"> <Link>GlobalVersionInfo.cs</Link> </Compile> + <Compile Include="RemoteDataStoreCollection.cs" /> <Compile Include="RemoteDataStoreCountRequest.cs" /> <Compile Include="RemoteDataStoreCountResponse.cs" /> <Compile Include="RemoteDataStoreDeleteAllRequest.cs" /> <Compile Include="RemoteDataStoreDeleteAllResponse.cs" /> <Compile Include="RemoteDataStoreDeleteRequest.cs" /> <Compile Include="RemoteDataStoreDeleteResponse.cs" /> + <Compile Include="RemoteDataStoreGetAllItemsRequest.cs" /> + <Compile Include="RemoteDataStoreGetAllItemsResponse.cs" /> <Compile Include="RemoteDataStoreGetAllRequest.cs" /> <Compile Include="RemoteDataStoreGetAllResponse.cs" /> <Compile Include="RemoteDataStoreGetCollectionNamesRequest.cs" /> @@ -65,6 +68,8 @@ <Compile Include="RemoteDataStoreGetRequest.cs" /> <Compile Include="RemoteDataStoreGetResponse.cs" /> <Compile Include="RemoteDataStoreItem.cs" /> + <Compile Include="RemoteDataStoreStartListenRequest.cs" /> + <Compile Include="RemoteDataStoreStartListenResponse.cs" /> <Compile Include="RemoteDataStorePutRequest.cs" /> <Compile Include="RemoteDataStorePutResponse.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> diff --git a/Software/Visual_Studio/Tango.DataStore.Remote/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/packages.config index 026e719c3..026e719c3 100644 --- a/Software/Visual_Studio/Tango.DataStore.Remote/packages.config +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Remote/packages.config diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebHelper.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebHelper.cs new file mode 100644 index 000000000..2353a70fe --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebHelper.cs @@ -0,0 +1,16 @@ +using Google.Protobuf; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.PMR; +using Tango.PMR.Common; + +namespace Tango.DataStore.Web +{ + public static class DataStoreWebHelper + { + + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItem.cs new file mode 100644 index 000000000..a847517b1 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItem.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using Tango.DataStore; +using Tango.PMR.Common; + +namespace Tango.DataStore.Web +{ + public class DataStoreWebItem + { + public String Collection { get; set; } + [JsonConverter(typeof(StringEnumConverter))] + public DataStoreWebItemType Type { get; set; } + public DateTime Date { get; set; } + public String Key { get; set; } + [JsonConverter(typeof(StringEnumConverter))] + public DataType DataType { get; set; } + [JsonConverter(typeof(StringEnumConverter))] + public MessageType ProtoMessageType { get; set; } + public Object LocalValue { get; set; } + public Object GlobalValue { get; set; } + } +}
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItemType.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItemType.cs new file mode 100644 index 000000000..684997bf4 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebItemType.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Tango.DataStore.Web +{ + public enum DataStoreWebItemType + { + Local, + Global, + Overrides + } +}
\ No newline at end of file diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebPutItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebPutItem.cs new file mode 100644 index 000000000..6b897c82a --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/DataStoreWebPutItem.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.PMR.Common; + +namespace Tango.DataStore.Web +{ + public class DataStoreWebPutItem + { + public String MachineSerialNumber { get; set; } + + public String Collection { get; set; } + + public String Key { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public DataType DataType { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public MessageType ProtoMessageType { get; set; } + + public Object Value { get; set; } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/ExtensionMethods.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/ExtensionMethods.cs new file mode 100644 index 000000000..a0959ae27 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/ExtensionMethods.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Web +{ + public class ExtensionMethods + { + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginRequest.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginRequest.cs new file mode 100644 index 000000000..4a68fe3ab --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginRequest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Web +{ + public class LoginRequest + { + public String Email { get; set; } + public String Password { get; set; } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginResponse.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginResponse.cs new file mode 100644 index 000000000..5c70d85b9 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/LoginResponse.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.DataStore.Web +{ + public class LoginResponse + { + public String Token { get; set; } + public DateTime ExpirationUTC { get; set; } + } +} diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..27f57a100 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Tango.DataStore.Web")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.DataStore.Web")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a9828548-af43-4ce4-8b13-50e99f9c9cf7")] + +// 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/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Tango.DataStore.Web.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Tango.DataStore.Web.csproj new file mode 100644 index 000000000..9233a050b --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/Tango.DataStore.Web.csproj @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{A9828548-AF43-4CE4-8B13-50E99F9C9CF7}</ProjectGuid> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Tango.DataStore.Web</RootNamespace> + <AssemblyName>Tango.DataStore.Web</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <Deterministic>true</Deterministic> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath> + </Reference> + <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="DataStoreWebHelper.cs" /> + <Compile Include="DataStoreWebItem.cs" /> + <Compile Include="DataStoreWebItemType.cs" /> + <Compile Include="DataStoreWebPutItem.cs" /> + <Compile Include="ExtensionMethods.cs" /> + <Compile Include="LoginRequest.cs" /> + <Compile Include="LoginResponse.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Tango.PMR\Tango.PMR.csproj"> + <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> + <Name>Tango.PMR</Name> + </ProjectReference> + <ProjectReference Include="..\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <None Include="packages.config" /> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.DataStore/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/packages.config index 026e719c3..026e719c3 100644 --- a/Software/Visual_Studio/Tango.DataStore/packages.config +++ b/Software/Visual_Studio/DataStore/Tango.DataStore.Web/packages.config diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/DataStoreHelper.cs index 96a905120..0ceecd81b 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreHelper.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/DataStoreHelper.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Tango.Core.ExtensionMethods; using Tango.PMR; @@ -84,14 +85,7 @@ namespace Tango.DataStore { if (item.Type == DataType.Bytes) { - byte[] bytes = (byte[])item.Value; - - StringBuilder hex = new StringBuilder(); - foreach (byte b in bytes) - { - hex.AppendFormat("{0:x2} ", b); - } - return hex.ToString(); + return Convert.ToBase64String((byte[])item.Value); } else if (item.Type == DataType.Proto) { @@ -99,8 +93,55 @@ namespace Tango.DataStore } else { - return $"{item.Key}: {item.Value}"; + return item.Value.ToStringSafe(); } } + + /// <summary> + /// Parses a data store value from a string. + /// </summary> + /// <param name="type">The type.</param> + /// <param name="text">The string.</param> + /// <param name="protoMessageType">Type of the proto message (if type is Proto).</param> + /// <returns></returns> + /// <exception cref="ArgumentNullException">No PMR message type specified.</exception> + /// <exception cref="NotSupportedException">The specified data store type is not supported.</exception> + public static Object ParseDataStoreValue(DataType type, String text, MessageType? protoMessageType = null) + { + switch (type) + { + case DataType.String: + return text; + case DataType.Int32: + return int.Parse(text); + case DataType.Float: + return float.Parse(text); + case DataType.Double: + return double.Parse(text); + case DataType.Boolean: + return bool.Parse(text); + case DataType.Proto: + if (protoMessageType == null) throw new ArgumentNullException("No PMR message type specified."); + var messageType = MessageFactory.GetPMRTypeFromMessageType(protoMessageType.Value); + var instance = Activator.CreateInstance(messageType) as IMessage; + instance = instance.GetParser().ParseJson(text); + return DataStoreProtoObject.FromMessage(instance); + case DataType.Bytes: + return Convert.FromBase64String(text); + } + + throw new NotSupportedException("The specified data store type is not supported."); + } + + /// <summary> + /// Validates the name of the collection or key. + /// </summary> + /// <param name="name">The name.</param> + /// <returns></returns> + public static bool ValidateCollectionOrKeyName(String name) + { + var regexItem = new Regex("^[a-zA-Z0-9_-]*$"); + return regexItem.IsMatch(name); + } } } diff --git a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/DataStoreProtoObject.cs index 6661c2017..1a9dd324d 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataStoreProtoObject.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/DataStoreProtoObject.cs @@ -1,5 +1,6 @@ using Google.Protobuf; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; @@ -8,6 +9,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Bson; +using Tango.Core.ExtensionMethods; using Tango.PMR; using Tango.PMR.Common; using Tango.PMR.DataStore; @@ -16,6 +18,7 @@ namespace Tango.DataStore { public class DataStoreProtoObject { + [JsonConverter(typeof(StringEnumConverter))] public MessageType MessageType { get; set; } public Type Type { get; set; } public byte[] Data { get; set; } @@ -73,5 +76,10 @@ namespace Tango.DataStore proto.Data = item.BytesValue.ToByteArray(); return proto; } + + public override string ToString() + { + return Message?.ToJsonString(); + } } } diff --git a/Software/Visual_Studio/Tango.DataStore/DataType.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/DataType.cs index 132bff28e..132bff28e 100644 --- a/Software/Visual_Studio/Tango.DataStore/DataType.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/DataType.cs diff --git a/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/ExtensionMethods.cs index acc381a61..acc381a61 100644 --- a/Software/Visual_Studio/Tango.DataStore/ExtensionMethods.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/ExtensionMethods.cs diff --git a/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreCollection.cs index baca95c67..baca95c67 100644 --- a/Software/Visual_Studio/Tango.DataStore/IDataStoreCollection.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreCollection.cs diff --git a/Software/Visual_Studio/Tango.DataStore/IDataStoreItem.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreItem.cs index 9c03f40ee..9c03f40ee 100644 --- a/Software/Visual_Studio/Tango.DataStore/IDataStoreItem.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreItem.cs diff --git a/Software/Visual_Studio/Tango.DataStore/IDataStoreManager.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreManager.cs index 5443f12e2..5443f12e2 100644 --- a/Software/Visual_Studio/Tango.DataStore/IDataStoreManager.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/IDataStoreManager.cs diff --git a/Software/Visual_Studio/Tango.DataStore/Properties/AssemblyInfo.cs b/Software/Visual_Studio/DataStore/Tango.DataStore/Properties/AssemblyInfo.cs index 8e9365e03..8e9365e03 100644 --- a/Software/Visual_Studio/Tango.DataStore/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/Properties/AssemblyInfo.cs diff --git a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj b/Software/Visual_Studio/DataStore/Tango.DataStore/Tango.DataStore.csproj index c12abe9e8..d75d39963 100644 --- a/Software/Visual_Studio/Tango.DataStore/Tango.DataStore.csproj +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/Tango.DataStore.csproj @@ -49,7 +49,7 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> - <Compile Include="..\Versioning\GlobalVersionInfo.cs"> + <Compile Include="..\..\Versioning\GlobalVersionInfo.cs"> <Link>GlobalVersionInfo.cs</Link> </Compile> <Compile Include="DataStoreHelper.cs" /> @@ -65,11 +65,11 @@ <None Include="packages.config" /> </ItemGroup> <ItemGroup> - <ProjectReference Include="..\Tango.Core\Tango.Core.csproj"> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> <Project>{A34EE0F0-649D-41C8-8489-B6F1CC6924EE}</Project> <Name>Tango.Core</Name> </ProjectReference> - <ProjectReference Include="..\Tango.PMR\Tango.PMR.csproj"> + <ProjectReference Include="..\..\Tango.PMR\Tango.PMR.csproj"> <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> <Name>Tango.PMR</Name> </ProjectReference> diff --git a/Software/Visual_Studio/DataStore/Tango.DataStore/packages.config b/Software/Visual_Studio/DataStore/Tango.DataStore/packages.config new file mode 100644 index 000000000..026e719c3 --- /dev/null +++ b/Software/Visual_Studio/DataStore/Tango.DataStore/packages.config @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="Google.Protobuf" version="3.4.1" targetFramework="net461" /> + <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> +</packages>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/Tango.FSE.Firmware_0qifchtm_wpftmp.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/Tango.FSE.Firmware_0qifchtm_wpftmp.csproj new file mode 100644 index 000000000..8708fb9b0 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/Tango.FSE.Firmware_0qifchtm_wpftmp.csproj @@ -0,0 +1,203 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{7CB96D74-8B71-4A81-B4E1-6DE7BFCA6174}</ProjectGuid> + <OutputType>library</OutputType> + <RootNamespace>Tango.FSE.Firmware</RootNamespace> + <AssemblyName>Tango.FSE.Firmware</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + <Deterministic>true</Deterministic> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>..\..\..\Build\FSE\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>..\..\..\Build\FSE\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + </ItemGroup> + <ItemGroup> + <Compile Include="Contracts\ILogsView.cs" /> + <Compile Include="Dialogs\FirmwareUpdateView.xaml.cs"> + <DependentUpon>FirmwareUpdateView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\FirmwareUpdateViewVM.cs" /> + <Compile Include="Navigation\PeekLogsNavigationObject.cs" /> + <Compile Include="ViewModelLocator.cs" /> + <Compile Include="FirmwareModule.cs" /> + <Compile Include="ViewModels\FileSystemViewVM.cs" /> + <Compile Include="ViewModels\LogsViewVM.cs" /> + <Compile Include="ViewModels\MainViewVM.cs" /> + <Compile Include="ViewModels\UpdatesViewVM.cs" /> + <Compile Include="Views\FileSystemView.xaml.cs"> + <DependentUpon>FileSystemView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\LogsView.xaml.cs"> + <DependentUpon>LogsView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\MainView.xaml.cs"> + <DependentUpon>MainView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\UpdatesView.xaml.cs"> + <DependentUpon>UpdatesView.xaml</DependentUpon> + </Compile> + </ItemGroup> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="app.config" /> + <None Include="packages.config" /> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\PPC\Tango.PPC.Shared\Tango.PPC.Shared.csproj"> + <Project>{208C8BD8-72C6-4E3C-ACAA-351091A2ACC7}</Project> + <Name>Tango.PPC.Shared</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\SideChains\Tango.AutoComplete\Tango.AutoComplete.csproj"> + <Project>{bb2abb74-ba58-4812-83aa-ec8171f42df4}</Project> + <Name>Tango.AutoComplete</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.BL\Tango.BL.csproj"> + <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.FileSystem\Tango.FileSystem.csproj"> + <Project>{c6ebbbbe-2123-44dc-aef7-a0d47d736ac0}</Project> + <Name>Tango.FileSystem</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj"> + <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project> + <Name>Tango.Integration</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj"> + <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project> + <Name>Tango.Logging</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.PMR\Tango.PMR.csproj"> + <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> + <Name>Tango.PMR</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Settings\Tango.Settings.csproj"> + <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project> + <Name>Tango.Settings</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj"> + <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project> + <Name>Tango.SharedUI</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Transport\Tango.Transport.csproj"> + <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project> + <Name>Tango.Transport</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.FSE.BL\Tango.FSE.BL.csproj"> + <Project>{834c81c3-09b5-45d7-be12-e7d1e6655a7c}</Project> + <Name>Tango.FSE.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.FSE.Common\Tango.FSE.Common.csproj"> + <Project>{bc37cccb-7392-4f78-8d1c-e9629e6e046e}</Project> + <Name>Tango.FSE.Common</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + </ItemGroup> + <ItemGroup> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Import Project="..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets" Condition="Exists('..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" /> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets'))" /> + </Target> + <ItemGroup> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\ControlzEx.3.0.2.4\lib\net45\ControlzEx.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\MahApps.Metro.1.6.5\lib\net46\MahApps.Metro.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\MaterialDesignColors.1.2.2\lib\net45\MaterialDesignColors.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\MaterialDesignThemes.3.0.1\lib\net45\MaterialDesignThemes.Wpf.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Microsoft.CSharp.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\PresentationCore.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\PresentationFramework.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.ComponentModel.DataAnnotations.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Core.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.DataSetExtensions.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Data.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\packages\ControlzEx.3.0.2.4\lib\net45\System.Windows.Interactivity.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xaml.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Xml.Linq.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\SideChains\Tango.AutoComplete\bin\Debug\Tango.AutoComplete.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.BL.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.Core.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Tango.FileSystem\bin\Debug\Tango.FileSystem.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\FSE\Debug\Tango.FSE.BL.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\FSE\Debug\Tango.FSE.Common.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.Integration.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.Logging.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.PMR.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\PPC\Debug\Tango.PPC.Shared.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.Settings.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.SharedUI.dll" /> + <ReferencePath Include="C:\DATA\Development\Tango\Software\Visual_Studio\Build\Core\Debug\Tango.Transport.dll" /> + <ReferencePath Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\WindowsBase.dll" /> + </ItemGroup> + <ItemGroup> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\App.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\Dialogs\FirmwareUpdateView.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\Views\FileSystemView.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\Views\LogsView.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\Views\MainView.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\Views\UpdatesView.g.cs" /> + <Compile Include="C:\DATA\Development\Tango\Software\Visual_Studio\FSE\Modules\Tango.FSE.Firmware\obj\Debug\GeneratedInternalTypeHelper.g.cs" /> + </ItemGroup> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/ViewModels/LogsViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/ViewModels/LogsViewVM.cs index ead8366ad..70c73a7be 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/ViewModels/LogsViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Firmware/ViewModels/LogsViewVM.cs @@ -200,8 +200,8 @@ namespace Tango.FSE.Firmware.ViewModels } catch (Exception ex) { - LogManager.Log(ex, "Error loading log files."); - NotificationProvider.PushErrorReportingSnackbar(ex, "PPC Module Error", "Could not initialize the remote PPC logs history."); + LogManager.Log(ex, "Error loading remote firmware log files."); + NotificationProvider.PushErrorReportingSnackbar(ex, "Firmware Module Error", "Could not initialize the remote Firmware logs history."); } finally { diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/App.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/App.xaml new file mode 100644 index 000000000..28a976e78 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/App.xaml @@ -0,0 +1,16 @@ +<Application x:Class="Tango.FSE.MachineConfiguration.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> + <Application.Resources> + <ResourceDictionary> + <ResourceDictionary.MergedDictionaries> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Converters.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Colors.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Fonts.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Images.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Styles.xaml" /> + <ResourceDictionary Source="pack://application:,,,/Tango.FSE.Common;component/Resources/Controls.xaml" /> + </ResourceDictionary.MergedDictionaries> + </ResourceDictionary> + </Application.Resources> +</Application>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationModule.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationModule.cs new file mode 100644 index 000000000..2f2c0dbb1 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationModule.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; +using Tango.BL.Enumerations; +using Tango.FSE.Common; +using Tango.FSE.MachineConfiguration.Views; + +namespace Tango.FSE.MachineConfiguration +{ + [FSEModule(index: 7)] + public class ConfigurationModule : FSEModuleBase + { + public override string Name { get; } = "Configuration"; + public override string Description { get; } = "Configuration Module"; + public override Type MainViewType { get; } = typeof(MainView); + public override Permissions Permission { get; } = Permissions.FSE_RunFSE; + + public override void Dispose() + { + + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationViewModel.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationViewModel.cs new file mode 100644 index 000000000..bfcc60bcf --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ConfigurationViewModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.FSE.Common.Navigation; +using Tango.FSE.MachineConfiguration.Navigation; + +namespace Tango.FSE.MachineConfiguration +{ + public class ConfigurationViewModel : ModularNavigationFSEViewModel<ConfigurationView> + { + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Converters/DataStoreValueToStringConverter.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Converters/DataStoreValueToStringConverter.cs new file mode 100644 index 000000000..4acf7fd8e --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Converters/DataStoreValueToStringConverter.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using Tango.DataStore; + +namespace Tango.FSE.MachineConfiguration.Converters +{ + public class DataStoreValueToStringConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is IDataStoreItem item) + { + if (item != null) + { + return DataStoreHelper.FormatDataStoreItem(item).ToOneLine().Ellipsis(100); + } + } + + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml new file mode 100644 index 000000000..2fd3b9cdf --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml @@ -0,0 +1,53 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Dialogs.DataStoreItemEditDialogView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Dialogs" + xmlns:controls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:sharedControls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI" + xmlns:datastore="clr-namespace:Tango.DataStore;assembly=Tango.DataStore" + xmlns:pmr="clr-namespace:Tango.PMR.Common;assembly=Tango.PMR" + mc:Ignorable="d" + Width="400" Height="500" d:DataContext="{d:DesignInstance Type=local:DataStoreItemEditDialogViewVM, IsDesignTimeCreatable=False}" Background="{StaticResource FSE_PrimaryBackgroundLightBrush}" Foreground="{StaticResource FSE_PrimaryForegroundBrush}"> + <Grid Margin="10"> + <DockPanel> + <StackPanel DockPanel.Dock="Top" > + <StackPanel Orientation="Horizontal"> + <material:PackIcon Width="40" Height="40" Kind="Key" /> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_LargerFontSize}" VerticalAlignment="Center" Text="{Binding Item.Key}"></TextBlock> + </StackPanel> + </StackPanel> + + <StackPanel Margin="0 10 0 0" DockPanel.Dock="Top"> + <TextBlock FontSize="{StaticResource FSE_SmallerFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Data Type</TextBlock> + + <DockPanel> + <Button Visibility="{Binding Type,Converter={StaticResource EnumToVisibilityConverter},ConverterParameter='Proto'}" DockPanel.Dock="Right" Style="{StaticResource FSE_RaisedButton_Dark_Hover_Accent_Foreground}" Margin="5 5 0 0" Padding="10 0" FontSize="{StaticResource FSE_SmallFontSize}" Height="20" VerticalAlignment="Center" Command="{Binding InitProtoCommand}" ToolTip="Create the basic structure for this proto message">Init</Button> + <Button Visibility="{Binding Type,Converter={StaticResource EnumToVisibilityConverter},ConverterParameter='Bytes'}" DockPanel.Dock="Right" Style="{StaticResource FSE_RaisedButton_Dark_Hover_Accent_Foreground}" Margin="5 5 0 0" Padding="10 0" FontSize="{StaticResource FSE_SmallFontSize}" Height="20" VerticalAlignment="Center" Command="{Binding LoadFileCommand}" ToolTip="Load bytes from file">Load File</Button> + <controls:FSERoundedCornersComboBox IsEnabled="{Binding EnableTypeChange}" FontSize="{StaticResource FSE_SmallFontSize}" Margin="0 5 0 0" ItemsSource="{Binding Source={x:Type datastore:DataType},Converter={StaticResource EnumToItemsSourceConverter}}" SelectedValue="{Binding Type,Mode=TwoWay}" SelectedValuePath="Value" DisplayMemberPath="DisplayName"></controls:FSERoundedCornersComboBox> + </DockPanel> + + <StackPanel Margin="0 10 0 0" Visibility="{Binding Type,Converter={StaticResource EnumToVisibilityConverter},ConverterParameter='Proto'}"> + <TextBlock Foreground="{StaticResource FSE_GrayBrush}" FontSize="{StaticResource FSE_SmallerFontSize}">Message Type</TextBlock> + <sharedControls:SearchComboBox IsEnabled="{Binding EnableTypeChange}" FontSize="{StaticResource FSE_SmallFontSize}" Margin="0 -5 5 0" ItemsSource="{Binding Source={x:Type pmr:MessageType},Converter={StaticResource EnumToItemsSourceConverter},ConverterParameter='false'}" SelectedItem="{Binding ProtoMessageType,Mode=TwoWay}"></sharedControls:SearchComboBox> + </StackPanel> + </StackPanel> + + <DockPanel DockPanel.Dock="Bottom" Margin="0 5 0 0" MinHeight="15"> + <DockPanel Visibility="{Binding HasError,Converter={StaticResource BooleanToVisibilityConverter}}"> + <material:PackIcon Margin="0 0 0 0" VerticalAlignment="Top" Kind="Alert" Foreground="{StaticResource FSE_ErrorBrush}" Width="12" Height="12" /> + <TextBlock Foreground="{StaticResource FSE_ErrorBrush}" Margin="5 0 0 0" Text="{Binding Error}" FontSize="{StaticResource FSE_SmallerFontSize}" TextWrapping="Wrap"></TextBlock> + </DockPanel> + </DockPanel> + + <Grid Margin="0 10 0 0"> + <TextBox Style="{StaticResource FSE_Rounded_Corners_TextBox_Multiline}" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" TextWrapping="NoWrap" Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}" FontSize="{StaticResource FSE_SmallFontSize}" Text="{Binding EditingValue,UpdateSourceTrigger=PropertyChanged}"> + + </TextBox> + </Grid> + + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml.cs new file mode 100644 index 000000000..b0f741759 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + /// <summary> + /// Interaction logic for DataStoreItemEditDialogView.xaml + /// </summary> + public partial class DataStoreItemEditDialogView : UserControl + { + public DataStoreItemEditDialogView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogViewVM.cs new file mode 100644 index 000000000..9cde14c6f --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/DataStoreItemEditDialogViewVM.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.Commands; +using Tango.Core.DI; +using Tango.Core.ExtensionMethods; +using Tango.Core.Helpers; +using Tango.DataStore; +using Tango.DataStore.Editing; +using Tango.FSE.Common; +using Tango.FSE.Common.Storage; +using Tango.PMR; +using Tango.PMR.Common; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + public class DataStoreItemEditDialogViewVM : FSEDialogViewVM + { + private const int MAX_FILE_SIZE_KB = 100; + + [TangoInject] + private IStorageProvider StorageProvider { get; set; } + + [TangoInject] + private Common.Notifications.INotificationProvider NotificationProvider { get; set; } + + private DataStoreItemModel _item; + public DataStoreItemModel Item + { + get { return _item; } + set + { + _item = value; + RaisePropertyChangedAuto(); + + if (_item.IsGlobal) + { + Value = _item.GlobalItem.Value; + } + else + { + Value = _item.Value; + } + + Type = _item.Type; + + if (Type == DataType.Proto) + { + ProtoMessageType = (Value as DataStoreProtoObject).MessageType; + } + + if (_item.IsGlobal) + { + EditingValue = _item.GlobalItem.ToString(); + } + else + { + EditingValue = _item.ToString(); + } + } + } + + public bool EnableTypeChange { get; set; } + + private Object _value; + public Object Value + { + get { return _value; } + set { _value = value; RaisePropertyChangedAuto(); } + } + + private DataType _type; + public DataType Type + { + get { return _type; } + set { _type = value; RaisePropertyChangedAuto(); OnEditingValueChanged(); } + } + + private MessageType _protoMessageType; + public MessageType ProtoMessageType + { + get { return _protoMessageType; } + set { _protoMessageType = value; RaisePropertyChangedAuto(); OnEditingValueChanged(); } + } + + private String _editingValue; + public String EditingValue + { + get { return _editingValue; } + set { _editingValue = value; RaisePropertyChangedAuto(); OnEditingValueChanged(); } + } + + private String _error; + public String Error + { + get { return _error; } + set { _error = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(HasError)); InvalidateRelayCommands(); } + } + + public bool HasError + { + get { return Error != null; } + } + + public RelayCommand LoadFileCommand { get; set; } + + public RelayCommand InitProtoCommand { get; set; } + + public DataStoreItemEditDialogViewVM() + { + EnableTypeChange = true; + LoadFileCommand = new RelayCommand(LoadFile); + InitProtoCommand = new RelayCommand(InitProto); + TangoIOC.Default.Inject(this); + } + + private void InitProto() + { + if (Type == DataType.Proto) + { + var type = MessageFactory.GetPMRTypeFromMessageType(ProtoMessageType); + var instance = Activator.CreateInstance(type); + EditingValue = instance.ToJsonString(); + } + } + + private async void LoadFile() + { + if (Type == DataType.Bytes) + { + var result = await StorageProvider.OpenFile("Load a file"); + if (result) + { + if ((new FileInfo(result.SelectedItem).Length / 1024) > MAX_FILE_SIZE_KB) + { + await NotificationProvider.ShowError($"The selected file size exceeds the maximum {MAX_FILE_SIZE_KB}kb allowed."); + return; + } + + var bytes = File.ReadAllBytes(result.SelectedItem); + Value = bytes; + _editingValue = Convert.ToBase64String(bytes); + RaisePropertyChanged(nameof(EditingValue)); + } + } + } + + private void OnEditingValueChanged() + { + if (EditingValue != null) + { + try + { + Value = DataStoreHelper.ParseDataStoreValue(Type, EditingValue, ProtoMessageType); + Error = null; + } + catch (Exception ex) + { + Error = ex.Message; + } + } + } + + protected override bool CanOK() + { + return base.CanOK() && !HasError; + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml new file mode 100644 index 000000000..55d0efc4f --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml @@ -0,0 +1,114 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Dialogs.ExportDialogView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:controls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Dialogs" + mc:Ignorable="d" + Width="800" Height="500" d:DataContext="{d:DesignInstance Type=local:ExportDialogViewVM, IsDesignTimeCreatable=False}" Background="{StaticResource FSE_PrimaryBackgroundLightBrush}" Foreground="{StaticResource FSE_PrimaryForegroundBrush}"> + <Grid Margin="10"> + <DockPanel> + <StackPanel DockPanel.Dock="Top" > + <StackPanel Orientation="Horizontal"> + <material:PackIcon Width="40" Height="40" Kind="Export" /> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_LargerFontSize}" VerticalAlignment="Center" Text="Export Data Store"></TextBlock> + </StackPanel> + </StackPanel> + + <DockPanel Margin="0 10 0 0"> + <Border Padding="5" MinWidth="100" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}" BorderThickness="1" CornerRadius="3" Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}"> + <ListBox x:Name="listCollections" ItemsSource="{Binding DataStore.Collections}" SelectedIndex="0"> + <ListBox.ItemTemplate> + <DataTemplate> + <DockPanel> + <CheckBox IsChecked="{Binding IsSelected}" /> + <TextBlock Margin="10 0 0 0" Text="{Binding Name}"></TextBlock> + </DockPanel> + </DataTemplate> + </ListBox.ItemTemplate> + </ListBox> + </Border> + + <Border Margin="5 0 0 0" Padding="5" MinWidth="100" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}" BorderThickness="1" CornerRadius="3" Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}"> + <DataGrid IsReadOnly="True" AutoGenerateColumns="False" Style="{StaticResource FSE_DataGrid}" CellStyle="{StaticResource FSE_DataGrid_Cell}" CanUserReorderColumns="False" CanUserSortColumns="False" ItemsSource="{Binding ElementName=listCollections,Path=SelectedItem.Items}"> + <DataGrid.Columns> + <DataGridTemplateColumn> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <UniformGrid Columns="2"> + <CheckBox IsEnabled="{Binding IsGlobal,Converter={StaticResource BooleanInverseConverter}}" IsChecked="{Binding IsSelected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> + <material:PackIcon Kind="Key" Width="32" /> + </UniformGrid> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="KEY" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Key}"></TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="TYPE" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Type}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="Foreground" Value="{StaticResource FSE_PrimaryForegroundBrush}"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding Type}" Value="Boolean"> + <Setter Property="Foreground" Value="#FF9BFF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Bytes"> + <Setter Property="Foreground" Value="#FFFBA3"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Double"> + <Setter Property="Foreground" Value="#85B1FF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Float"> + <Setter Property="Foreground" Value="#FFDCB8"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Int32"> + <Setter Property="Foreground" Value="#FF858D "></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="String"> + <Setter Property="Foreground" Value="#B9FFA5"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Proto"> + <Setter Property="Foreground" Value="#A5FFF9"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="LOCAL" Width="1*"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding FormattedValue,Converter={StaticResource StringToOneLineConverter},ConverterParameter='100',Mode=OneWay}" Visibility="{Binding IsDeleted,Converter={StaticResource BooleanToVisibilityInverseConverter}}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="FontWeight" Value="Normal"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding HasDifference}" Value="True"> + <Setter Property="FontWeight" Value="Bold"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + </DataGrid.Columns> + </DataGrid> + </Border> + </DockPanel> + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml.cs new file mode 100644 index 000000000..4ee37908c --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + /// <summary> + /// Interaction logic for ImportDialogView.xaml + /// </summary> + public partial class ExportDialogView : UserControl + { + public ExportDialogView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogViewVM.cs new file mode 100644 index 000000000..9f605c79e --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ExportDialogViewVM.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore.Editing; +using Tango.FSE.Common; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + public class ExportDialogViewVM : FSEDialogViewVM + { + public DataStoreModel DataStore { get; set; } + + public ExportDialogViewVM() + { + OKText = "EXPORT"; + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml new file mode 100644 index 000000000..5d9653eb4 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml @@ -0,0 +1,113 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Dialogs.ImportDialogView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Dialogs" + mc:Ignorable="d" + Width="800" Height="500" d:DataContext="{d:DesignInstance Type=local:ImportDialogViewVM, IsDesignTimeCreatable=False}" Background="{StaticResource FSE_PrimaryBackgroundLightBrush}" Foreground="{StaticResource FSE_PrimaryForegroundBrush}"> + <Grid Margin="10"> + <DockPanel> + <StackPanel DockPanel.Dock="Top" > + <StackPanel Orientation="Horizontal"> + <material:PackIcon Width="40" Height="40" Kind="Import" /> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_LargerFontSize}" VerticalAlignment="Center" Text="Import Data Store"></TextBlock> + </StackPanel> + </StackPanel> + + <DockPanel Margin="0 10 0 0"> + <Border Padding="5" MinWidth="100" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}" BorderThickness="1" CornerRadius="3" Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}"> + <ListBox x:Name="listCollections" ItemsSource="{Binding DataStore.Collections}" SelectedIndex="0"> + <ListBox.ItemTemplate> + <DataTemplate> + <DockPanel> + <CheckBox IsChecked="{Binding IsSelected}" /> + <TextBlock Margin="10 0 0 0" Text="{Binding Name}"></TextBlock> + </DockPanel> + </DataTemplate> + </ListBox.ItemTemplate> + </ListBox> + </Border> + + <Border Margin="5 0 0 0" Padding="5" MinWidth="100" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}" BorderThickness="1" CornerRadius="3" Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}"> + <DataGrid IsReadOnly="True" AutoGenerateColumns="False" Style="{StaticResource FSE_DataGrid}" CellStyle="{StaticResource FSE_DataGrid_Cell}" CanUserReorderColumns="False" CanUserSortColumns="False" ItemsSource="{Binding ElementName=listCollections,Path=SelectedItem.Items}"> + <DataGrid.Columns> + <DataGridTemplateColumn> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <UniformGrid Columns="2"> + <CheckBox IsEnabled="{Binding IsGlobal,Converter={StaticResource BooleanInverseConverter}}" IsChecked="{Binding IsSelected,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> + <material:PackIcon Kind="Key" Width="32" /> + </UniformGrid> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="KEY" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Key}"></TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="TYPE" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Type}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="Foreground" Value="{StaticResource FSE_PrimaryForegroundBrush}"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding Type}" Value="Boolean"> + <Setter Property="Foreground" Value="#FF9BFF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Bytes"> + <Setter Property="Foreground" Value="#FFFBA3"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Double"> + <Setter Property="Foreground" Value="#85B1FF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Float"> + <Setter Property="Foreground" Value="#FFDCB8"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Int32"> + <Setter Property="Foreground" Value="#FF858D "></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="String"> + <Setter Property="Foreground" Value="#B9FFA5"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Proto"> + <Setter Property="Foreground" Value="#A5FFF9"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="LOCAL" Width="1*"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding FormattedValue,Converter={StaticResource StringToOneLineConverter},ConverterParameter='100',Mode=OneWay}" Visibility="{Binding IsDeleted,Converter={StaticResource BooleanToVisibilityInverseConverter}}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="FontWeight" Value="Normal"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding HasDifference}" Value="True"> + <Setter Property="FontWeight" Value="Bold"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + </DataGrid.Columns> + </DataGrid> + </Border> + </DockPanel> + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml.cs new file mode 100644 index 000000000..bc729601f --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + /// <summary> + /// Interaction logic for ImportDialogView.xaml + /// </summary> + public partial class ImportDialogView : UserControl + { + public ImportDialogView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogViewVM.cs new file mode 100644 index 000000000..a4e53e85b --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Dialogs/ImportDialogViewVM.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore.Editing; +using Tango.FSE.Common; + +namespace Tango.FSE.MachineConfiguration.Dialogs +{ + public class ImportDialogViewVM : FSEDialogViewVM + { + public DataStoreModel DataStore { get; set; } + + public ImportDialogViewVM() + { + OKText = "IMPORT"; + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/configuration.png b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/configuration.png Binary files differnew file mode 100644 index 000000000..f46a49d23 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/configuration.png diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/data_collection.png b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/data_collection.png Binary files differnew file mode 100644 index 000000000..95163a226 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Images/data_collection.png diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Messages/EditingCompositionLoadedMessage.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Messages/EditingCompositionLoadedMessage.cs new file mode 100644 index 000000000..b858c34e0 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Messages/EditingCompositionLoadedMessage.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.FSE.BL.Services; +using static Tango.FSE.BL.Services.MachineConfigurationService; + +namespace Tango.FSE.MachineConfiguration.Messages +{ + public class EditingCompositionLoadedMessage + { + public MachineEditingComposition EditingComposition { get; set; } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Models/CsvModel.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Models/CsvModel.cs new file mode 100644 index 000000000..1e12fda4b --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Models/CsvModel.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.FSE.MachineConfiguration.Models +{ + public class CsvModel + { + public String Date { get; set; } + public String Collection { get; set; } + public String Key { get; set; } + public String Type { get; set; } + public String MessageType { get; set; } + public String Value { get; set; } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationNavigationManager.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationNavigationManager.cs new file mode 100644 index 000000000..c1dfdfda7 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationNavigationManager.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using Tango.FSE.Common.Navigation; +using Tango.SharedUI.Controls; + +namespace Tango.FSE.MachineConfiguration.Navigation +{ + public class ConfigurationNavigationManager : ModularNavigationManager<ConfigurationView> + { + public ConfigurationNavigationManager(FrameworkElement navigationControlParent) : base(navigationControlParent) + { + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationView.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationView.cs new file mode 100644 index 000000000..187e44ac9 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Navigation/ConfigurationView.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.FSE.MachineConfiguration.Navigation +{ + public enum ConfigurationView + { + SelectionView, + MachineView, + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/AssemblyInfo.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..027dd9516 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// 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("Tango.FSE.MachineConfiguration")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.FSE.MachineConfiguration")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file +//inside a <PropertyGroup>. For example, if you are using US english +//in your source files, set the <UICulture> to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// 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/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.Designer.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.Designer.cs new file mode 100644 index 000000000..830d15d6a --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.FSE.MachineConfiguration.Properties +{ + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.FSE.MachineConfiguration.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.resx b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.Designer.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.Designer.cs new file mode 100644 index 000000000..e41736026 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.FSE.MachineConfiguration.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.settings b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Tango.FSE.MachineConfiguration.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Tango.FSE.MachineConfiguration.csproj new file mode 100644 index 000000000..6e48f0ee7 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Tango.FSE.MachineConfiguration.csproj @@ -0,0 +1,266 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{15BCB5BB-731E-4E2D-AA28-75485050A8DC}</ProjectGuid> + <OutputType>library</OutputType> + <RootNamespace>Tango.FSE.MachineConfiguration</RootNamespace> + <AssemblyName>Tango.FSE.MachineConfiguration</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + <Deterministic>true</Deterministic> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>..\..\..\Build\FSE\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>..\..\..\Build\FSE\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="ControlzEx, Version=3.0.2.4, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\ControlzEx.3.0.2.4\lib\net45\ControlzEx.dll</HintPath> + </Reference> + <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath> + </Reference> + <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> + </Reference> + <Reference Include="Google.Protobuf, Version=3.4.1.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll</HintPath> + </Reference> + <Reference Include="MahApps.Metro, Version=1.6.5.1, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\MahApps.Metro.1.6.5\lib\net46\MahApps.Metro.dll</HintPath> + </Reference> + <Reference Include="MaterialDesignColors, Version=1.2.2.920, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\MaterialDesignColors.1.2.2\lib\net45\MaterialDesignColors.dll</HintPath> + </Reference> + <Reference Include="MaterialDesignThemes.Wpf, Version=3.0.1.920, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\MaterialDesignThemes.3.0.1\lib\net45\MaterialDesignThemes.Wpf.dll</HintPath> + </Reference> + <Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.ComponentModel.DataAnnotations" /> + <Reference Include="System.Data" /> + <Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>..\..\..\packages\ControlzEx.3.0.2.4\lib\net45\System.Windows.Interactivity.dll</HintPath> + </Reference> + <Reference Include="System.Xml" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xaml"> + <RequiredTargetFramework>4.0</RequiredTargetFramework> + </Reference> + <Reference Include="WindowsBase" /> + <Reference Include="PresentationCore" /> + <Reference Include="PresentationFramework" /> + </ItemGroup> + <ItemGroup> + <Compile Include="ConfigurationViewModel.cs" /> + <Compile Include="Converters\DataStoreValueToStringConverter.cs" /> + <Compile Include="Dialogs\DataStoreItemEditDialogView.xaml.cs"> + <DependentUpon>DataStoreItemEditDialogView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\DataStoreItemEditDialogViewVM.cs" /> + <Compile Include="Dialogs\ExportDialogView.xaml.cs"> + <DependentUpon>ExportDialogView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\ImportDialogView.xaml.cs"> + <DependentUpon>ImportDialogView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\ExportDialogViewVM.cs" /> + <Compile Include="Dialogs\ImportDialogViewVM.cs" /> + <Compile Include="Messages\EditingCompositionLoadedMessage.cs" /> + <Compile Include="Models\CsvModel.cs" /> + <Compile Include="Navigation\ConfigurationNavigationManager.cs" /> + <Compile Include="Navigation\ConfigurationView.cs" /> + <Compile Include="ViewModelLocator.cs" /> + <Compile Include="ConfigurationModule.cs" /> + <Compile Include="ViewModels\SettingsViewVM.cs" /> + <Compile Include="ViewModels\DataStoreViewVM.cs" /> + <Compile Include="ViewModels\MachineViewVM.cs" /> + <Compile Include="ViewModels\MainViewVM.cs" /> + <Compile Include="ViewModels\SelectionViewVM.cs" /> + <Compile Include="Views\SettingsView.xaml.cs"> + <DependentUpon>SettingsView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\DataStoreView.xaml.cs"> + <DependentUpon>DataStoreView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\SelectionView.xaml.cs"> + <DependentUpon>SelectionView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\MachineView.xaml.cs"> + <DependentUpon>MachineView.xaml</DependentUpon> + </Compile> + <Compile Include="Views\MainView.xaml.cs"> + <DependentUpon>MainView.xaml</DependentUpon> + </Compile> + </ItemGroup> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="app.config" /> + <None Include="packages.config" /> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\..\SideChains\Tango.AutoComplete\Tango.AutoComplete.csproj"> + <Project>{bb2abb74-ba58-4812-83aa-ec8171f42df4}</Project> + <Name>Tango.AutoComplete</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.BL\Tango.BL.csproj"> + <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.CSV\Tango.CSV.csproj"> + <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> + <Name>Tango.CSV</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore.Editing\Tango.DataStore.Editing.csproj"> + <Project>{ee088ff7-04d1-41fb-9d6a-cedeee7a7b9c}</Project> + <Name>Tango.DataStore.Editing</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> + <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> + <Name>Tango.DataStore.Remote</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Integration\Tango.Integration.csproj"> + <Project>{4206ac58-3b57-4699-8835-90bf6db01a61}</Project> + <Name>Tango.Integration</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Logging\Tango.Logging.csproj"> + <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project> + <Name>Tango.Logging</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.PMR\Tango.PMR.csproj"> + <Project>{e4927038-348d-4295-aaf4-861c58cb3943}</Project> + <Name>Tango.PMR</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Settings\Tango.Settings.csproj"> + <Project>{d8f1ad85-526a-4f50-b6dc-d437af63d8d8}</Project> + <Name>Tango.Settings</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.SharedUI\Tango.SharedUI.csproj"> + <Project>{8491d07b-c1f6-4b62-a412-41b9fd2d6538}</Project> + <Name>Tango.SharedUI</Name> + </ProjectReference> + <ProjectReference Include="..\..\..\Tango.Transport\Tango.Transport.csproj"> + <Project>{74e700b0-1156-4126-be40-ee450d3c3026}</Project> + <Name>Tango.Transport</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.FSE.BL\Tango.FSE.BL.csproj"> + <Project>{834c81c3-09b5-45d7-be12-e7d1e6655a7c}</Project> + <Name>Tango.FSE.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.FSE.Common\Tango.FSE.Common.csproj"> + <Project>{bc37cccb-7392-4f78-8d1c-e9629e6e046e}</Project> + <Name>Tango.FSE.Common</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <Page Include="App.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Page Include="Dialogs\DataStoreItemEditDialogView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="Dialogs\ExportDialogView.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Page Include="Dialogs\ImportDialogView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="Views\SettingsView.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Page Include="Views\DataStoreView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="Views\SelectionView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="Views\MachineView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + <Page Include="Views\MainView.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> + </ItemGroup> + <ItemGroup> + <Resource Include="Images\configuration.png" /> + </ItemGroup> + <ItemGroup> + <Resource Include="Images\data_collection.png" /> + </ItemGroup> + <ItemGroup /> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <Import Project="..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets" Condition="Exists('..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" /> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets'))" /> + </Target> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModelLocator.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModelLocator.cs new file mode 100644 index 000000000..b924868b2 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModelLocator.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.DI; +using Tango.FSE.MachineConfiguration.Navigation; +using Tango.FSE.MachineConfiguration.ViewModels; +using Tango.FSE.MachineConfiguration.Views; + +namespace Tango.FSE.MachineConfiguration +{ + public static class ViewModelLocator + { + static ViewModelLocator() + { + TangoIOC.Default.Register<ConfigurationNavigationManager>(new ConfigurationNavigationManager(MainView.Instance)); + TangoIOC.Default.Register<MainViewVM>(); + TangoIOC.Default.Register<SelectionViewVM>(); + TangoIOC.Default.Register<MachineViewVM>(); + TangoIOC.Default.Register<SettingsViewVM>(); + TangoIOC.Default.Register<DataStoreViewVM>(); + } + + public static MainViewVM MainViewVM + { + get + { + return TangoIOC.Default.GetInstance<MainViewVM>(); + } + } + + public static SelectionViewVM SelectionViewVM + { + get + { + return TangoIOC.Default.GetInstance<SelectionViewVM>(); + } + } + + public static MachineViewVM MachineViewVM + { + get + { + return TangoIOC.Default.GetInstance<MachineViewVM>(); + } + } + + public static SettingsViewVM SettingsViewVM + { + get + { + return TangoIOC.Default.GetInstance<SettingsViewVM>(); + } + } + + public static DataStoreViewVM DataStoreViewVM + { + get + { + return TangoIOC.Default.GetInstance<DataStoreViewVM>(); + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/DataStoreViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/DataStoreViewVM.cs new file mode 100644 index 000000000..46f388461 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/DataStoreViewVM.cs @@ -0,0 +1,517 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using Tango.Core.Commands; +using Tango.Core.DI; +using Tango.CSV; +using Tango.DataStore; +using Tango.DataStore.Editing; +using Tango.FSE.Common; +using Tango.FSE.Common.Connection; +using Tango.FSE.Common.DataStore; +using Tango.FSE.Common.Notifications; +using Tango.FSE.MachineConfiguration.Dialogs; +using Tango.FSE.MachineConfiguration.Messages; +using Tango.FSE.MachineConfiguration.Models; +using static Tango.FSE.BL.Services.MachineConfigurationService; +using static Tango.SharedUI.Controls.NavigationControl; + +namespace Tango.FSE.MachineConfiguration.ViewModels +{ + public class DataStoreViewVM : FSEViewModel, INavigationViewModel + { + private String _machineGuid; + private MachineEditingComposition _editingComposition; + private ICollectionView _selectedCollectionView; + private ICollectionView _collectionsView; + + [TangoInject] + public IDataStoreProvider DataStoreProvider { get; set; } + + private DataStoreModel _dataStore; + public DataStoreModel DataStore + { + get { return _dataStore; } + set { _dataStore = value; RaisePropertyChangedAuto(); } + } + + private DataStoreCollectionModel _selectedCollection; + public DataStoreCollectionModel SelectedCollection + { + get { return _selectedCollection; } + set { _selectedCollection = value; RaisePropertyChangedAuto(); OnSelectedCollectionChanged(); } + } + + private DataStoreItemModel _selectedItem; + public DataStoreItemModel SelectedItem + { + get { return _selectedItem; } + set { _selectedItem = value; RaisePropertyChangedAuto(); } + } + + private String _filter; + public String Filter + { + get { return _filter; } + set { _filter = value; RaisePropertyChangedAuto(); _selectedCollectionView?.Refresh(); } + } + + public bool CanSync + { + get { return MachineProvider.IsPPCAvailable && MachineProvider.Machine != null && _machineGuid == MachineProvider.Machine.Guid; } + } + + public RelayCommand<DataStoreItemModel> RemoveItemCommand { get; set; } + public RelayCommand<DataStoreCollectionModel> RemoveCollectionCommand { get; set; } + public RelayCommand AddItemCommand { get; set; } + public RelayCommand AddCollectionCommand { get; set; } + public RelayCommand<DataStoreItemModel> EditItemCommand { get; set; } + public RelayCommand SaveCommand { get; set; } + public RelayCommand ReloadCommand { get; set; } + public RelayCommand ImportCommand { get; set; } + public RelayCommand ExportCommand { get; set; } + + public DataStoreViewVM() + { + RegisterForMessage<EditingCompositionLoadedMessage>(OnEditingCompositionLoaded); + RemoveItemCommand = new RelayCommand<DataStoreItemModel>(RemoveItem); + RemoveCollectionCommand = new RelayCommand<DataStoreCollectionModel>(RemoveCollection); + AddItemCommand = new RelayCommand(AddItem); + AddCollectionCommand = new RelayCommand(AddCollection); + EditItemCommand = new RelayCommand<DataStoreItemModel>(EditItem); + SaveCommand = new RelayCommand(SaveModel); + ReloadCommand = new RelayCommand(ReloadDataStore); + ExportCommand = new RelayCommand(ExportDataStore); + ImportCommand = new RelayCommand(ImportDataStore); + } + + [TangoInject] + public DataStoreViewVM(IMachineProvider machineProvider) : this() + { + machineProvider.MachineConnected += (_, __) => RaisePropertyChanged(nameof(CanSync)); + machineProvider.MachineDisconnected += (_, __) => RaisePropertyChanged(nameof(CanSync)); + } + + private async void ReloadDataStore() + { + if (DataStore != null) + { + if (DataStore.Collections.SelectMany(x => x.Items).Any(x => x.HasDifference)) + { + if (!await NotificationProvider.ShowWarningQuestion("Reloading the data store will discard all the current changes. Are you sure?", "RELOAD")) + { + return; + } + } + } + + await LoadDataStore(); + } + + private async void EditItem(DataStoreItemModel item) + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreWrite)) + { + await NotificationProvider.ShowError("The current user profile does not allow editing of the data store.\nPlease contact your administrator."); + return; + } + + var vm = await NotificationProvider.ShowDialog<DataStoreItemEditDialogViewVM>(new DataStoreItemEditDialogViewVM() { Item = item, EnableTypeChange = !item.IsGlobal && item.GlobalItem == null }); + + if (vm.DialogResult) + { + item.IsDeleted = false; + item.IsGlobal = false; + item.Type = vm.Type; + item.Value = vm.Value; + } + } + + private async void AddCollection() + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreCreate)) + { + await NotificationProvider.ShowError("The current user profile does not allow creating new data store collections.\nPlease contact your administrator."); + return; + } + + var result = await NotificationProvider.ShowInputBox("Add Collection", "Please enter the collection name", MaterialDesignThemes.Wpf.PackIconKind.Collection, null, null, 20, null, null, (input) => + { + if (DataStore.Collections.ToList().Exists(x => x.Name.ToLower() == input.ToLower())) + { + return "The specified collection already exists."; + } + + if (!DataStoreHelper.ValidateCollectionOrKeyName(input)) + { + return "Collection name contains invalid characters."; + } + + return null; + }); + + if (result.Confirmed) + { + if (DataStore.Collections.ToList().Exists(x => x.Name.ToLower() == result.Input.ToLower())) + { + await NotificationProvider.ShowError("The specified collection already exists."); + AddCollection(); + return; + } + + DataStore.Collections.Add(new DataStoreCollectionModel() + { + Name = result.Input + }); + + SelectedCollection = DataStore.Collections.Last(); + } + } + + private async void AddItem() + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreCreate)) + { + await NotificationProvider.ShowError("The current user profile does not allow creating new data store items.\nPlease contact your administrator."); + return; + } + + var result = await NotificationProvider.ShowInputBox("Add Item", "Please enter the item key", MaterialDesignThemes.Wpf.PackIconKind.KeyAdd, null, null, 20, null, null, (input) => + { + if (SelectedCollection.Items.ToList().Exists(x => x.Key.ToLower() == input.ToLower())) + { + return "The specified key already exists in the collection."; + } + + if (!DataStoreHelper.ValidateCollectionOrKeyName(input)) + { + return "Key name contains invalid characters."; + } + + return null; + }); + + if (result.Confirmed) + { + if (SelectedCollection.Items.ToList().Exists(x => x.Key == result.Input)) + { + await NotificationProvider.ShowError("The specified key already exists in the collection."); + AddItem(); + return; + } + + SelectedCollection.Items.Add(new DataStoreItemModel() + { + Date = DateTime.UtcNow, + Guid = Guid.NewGuid().ToString(), + Key = result.Input, + Type = DataType.Int32, + Value = 10 + }); + } + } + + private async void RemoveCollection(DataStoreCollectionModel collection) + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreCreate)) + { + await NotificationProvider.ShowError("The current user profile does not allow deleting data store collections.\nPlease contact your administrator."); + return; + } + + collection.IsDeleted = true; + _collectionsView?.Refresh(); + } + + private async void RemoveItem(DataStoreItemModel item) + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreCreate)) + { + await NotificationProvider.ShowError("The current user profile does not allow deleting data store items.\nPlease contact your administrator."); + return; + } + + item.IsDeleted = true; + _selectedCollectionView.Refresh(); + } + + private void OnEditingCompositionLoaded(EditingCompositionLoadedMessage obj) + { + DataStore = null; + _editingComposition = obj.EditingComposition; + _machineGuid = obj.EditingComposition.Machine.Guid; + } + + private void OnSelectedCollectionChanged() + { + if (SelectedCollection != null) + { + _selectedCollectionView = CollectionViewSource.GetDefaultView(SelectedCollection.Items); + _selectedCollectionView.Filter = (x) => FilterItems(x as DataStoreItemModel); + _selectedCollectionView.Refresh(); + } + } + + private bool FilterItems(DataStoreItemModel itemModel) + { + return (!itemModel.IsDeleted || itemModel.GlobalItem != null) && (String.IsNullOrWhiteSpace(Filter) || itemModel.Key.ToLower().Contains(Filter.ToLower())); + } + + private async void SaveModel() + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreWrite)) + { + await NotificationProvider.ShowError("The current user profile does not allow editing of the data store.\nPlease contact your administrator."); + return; + } + + try + { + using (NotificationProvider.PushTaskItem("Updating data store...")) + { + await DataStoreProvider.UpdateDataStoreModel(DataStore, _machineGuid); + } + + if (MachineProvider.IsPPCAvailable) + { + await NotificationProvider.ShowSuccess("The connected machine is now synchronized with the data store."); + } + else + { + await NotificationProvider.ShowSuccess("Data store saved successfully.\nThe machine will be updated on the next synchronization pass."); + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error saving data store."); + await NotificationProvider.ShowError($"Error occurred while trying to save the data store.\n{ex.FlattenMessage()}"); + return; + } + + await LoadDataStore(); + } + + private async Task LoadDataStore() + { + try + { + using (NotificationProvider.PushTaskItem("Loading data store...")) + { + IsFree = false; + RaisePropertyChanged(nameof(CanSync)); + + var dataStore = await DataStoreProvider.GetDataStoreModel(_machineGuid); + + _collectionsView = CollectionViewSource.GetDefaultView(dataStore.Collections); + _collectionsView.Filter = (x) => { return !(x as DataStoreCollectionModel).IsDeleted; }; + _collectionsView.Refresh(); + + DataStore = dataStore; + SelectedCollection = DataStore.Collections.FirstOrDefault(); + + IsFree = true; + } + } + catch (Exception ex) + { + DataStore = null; + LogManager.Log(ex, "Error loading data store."); + if (await NotificationProvider.ShowWarningQuestion($"Error occurred while trying to load the data store.\n{ex.FlattenMessage()}", "RETRY", "CANCEL")) + { + await LoadDataStore(); + return; + } + } + } + + public async override void OnNavigatedTo() + { + base.OnNavigatedTo(); + + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreRead)) + { + return; + } + + if (DataStore == null) + { + await LoadDataStore(); + } + } + + private async void ImportDataStore() + { + var result = await StorageProvider.OpenFile("Import data store", "CSV Files|*.csv"); + + if (result) + { + try + { + DataStoreModel model = new DataStoreModel(); + + using (NotificationProvider.PushTaskItem("Analyzing file...")) + { + await Task.Delay(1000); + + await Task.Factory.StartNew(() => + { + var items = CsvFile.Read<CsvModel>(new CsvSource(result.SelectedItem)).ToList(); + + foreach (var collection in items.GroupBy(x => x.Collection)) + { + DataStoreCollectionModel collectionModel = new DataStoreCollectionModel(); + + collectionModel = new DataStoreCollectionModel(); + collectionModel.Name = collection.First().Collection; + collectionModel.IsSelected = true; + model.Collections.Add(collectionModel); + + foreach (var item in collection) + { + DataStoreItemModel itemModel = new DataStoreItemModel(); + itemModel.Guid = Guid.NewGuid().ToString(); + itemModel.Key = item.Key; + itemModel.Date = DateTime.Parse(item.Date); + itemModel.IsSelected = true; + + DataType type = (DataType)Enum.Parse(typeof(DataType), item.Type); + itemModel.OriginalType = type; + itemModel.Type = type; + + PMR.Common.MessageType? messageType = null; + if (type == DataType.Proto && item.MessageType.IsNotNullOrEmpty()) + { + messageType = (PMR.Common.MessageType)Enum.Parse(typeof(PMR.Common.MessageType), item.MessageType); + } + + itemModel.OriginalValue = DataStoreHelper.ParseDataStoreValue(type, item.Value, messageType); + itemModel.Value = itemModel.OriginalValue; + + collectionModel.Items.Add(itemModel); + } + } + }); + } + + var vm = await NotificationProvider.ShowDialog<ImportDialogViewVM>(new ImportDialogViewVM() { DataStore = model }); + + if (vm.DialogResult) + { + if (!vm.DataStore.Collections.SelectMany(x => x.Items).Any(x => x.IsSelected)) + { + await NotificationProvider.ShowInfo("No items selected to import."); + return; + } + + foreach (var collection in vm.DataStore.Collections.Where(x => x.Items.Any(y => y.IsSelected))) + { + var collectionModel = DataStore.Collections.FirstOrDefault(x => x.Name == collection.Name); + + if (collectionModel == null) + { + DataStore.Collections.Add(collection); + } + else + { + foreach (var item in collection.Items.Where(x => x.IsSelected)) + { + var itemModel = collectionModel.Items.FirstOrDefault(x => x.Key == item.Key); + + if (itemModel == null) + { + itemModel = new DataStoreItemModel(); + itemModel.Guid = item.Guid; + itemModel.Key = item.Key; + collectionModel.Items.Add(itemModel); + } + + itemModel.Date = DateTime.UtcNow; + itemModel.IsDeleted = false; + itemModel.IsGlobal = false; + itemModel.Type = item.Type; + itemModel.Value = item.Value; + } + } + } + + await NotificationProvider.ShowSuccess("Data store imported successfully."); + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error importing data store."); + await NotificationProvider.ShowError($"Error importing the data store.\n{ex.FlattenMessage()}"); + } + } + } + + private async void ExportDataStore() + { + var vm = await NotificationProvider.ShowDialog<ExportDialogViewVM>(new ExportDialogViewVM() { DataStore = DataStore }); + + if (vm.DialogResult) + { + if (!vm.DataStore.Collections.SelectMany(x => x.Items).Any(x => x.IsSelected)) + { + await NotificationProvider.ShowInfo("No items selected to export."); + return; + } + + var result = await StorageProvider.SaveFile("Export data store", "CSV Files|*.csv", $"{_editingComposition.Machine.SerialNumber}_datastore_{DateTime.Now.ToFileName()}.csv", ".csv"); + + if (result) + { + try + { + using (NotificationProvider.PushTaskItem("Exporting data store...")) + { + await Task.Delay(1000); + + await Task.Factory.StartNew(() => + { + using (DynamicCsvFile csvFile = new DynamicCsvFile(result.SelectedItem)) + { + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "Date" }); + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "Collection" }); + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "Key" }); + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "Type" }); + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "MessageType" }); + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = "Value" }); + + foreach (var collection in DataStore.Collections) + { + foreach (var item in collection.Items.Where(x => x.IsSelected && !x.IsGlobal && x.Value != null)) + { + PMR.Common.MessageType? messageType = null; + + if (item.Type == DataType.Proto) + { + messageType = (item.Value as DataStoreProtoObject).MessageType; + } + + csvFile.Append(item.Date, $"\"{collection.Name}\"", $"\"{item.Key}\"", item.Type, messageType.ToStringSafe(), $"\"{item.FormattedValue.Replace("\"", "\"\"")}\""); + } + } + } + }); + } + + NotificationProvider.PushSnackbarItem(MessageType.Success, "Export Data Store", true, "Data store exported successfully.", TimeSpan.FromSeconds(8), null, () => + { + StorageProvider.ShowInExplorer(result.SelectedItem); + }); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error exporting data store."); + await NotificationProvider.ShowError($"Error exporting the data store.\n{ex.FlattenMessage()}"); + } + } + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MachineViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MachineViewVM.cs new file mode 100644 index 000000000..fd953a0b8 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MachineViewVM.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.FSE.Common; +using Tango.FSE.Common.Navigation; +using Tango.FSE.MachineConfiguration.Messages; +using static Tango.FSE.BL.Services.MachineConfigurationService; +using static Tango.FSE.MachineConfiguration.ViewModels.MachineViewVM; + +namespace Tango.FSE.MachineConfiguration.ViewModels +{ + public class MachineViewVM : ConfigurationViewModel, INavigationObjectReceiver<NavigationObject> + { + public class NavigationObject + { + public String MachineGuid { get; set; } + } + + public enum NavigationView + { + SettingsView, + DataStoreView, + } + + private NavigationView _selectedView; + public NavigationView SelectedView + { + get { return _selectedView; } + set + { + if (value == NavigationView.DataStoreView) + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.DataStoreRead)) + { + Task.Delay(500).ContinueWith((x) => + { + SelectedView = _selectedView; + NotificationProvider.ShowError("The current user profile does not allow accessing the data store.\nPlease contact your administrator."); + }); + return; + } + } + + _selectedView = value; + RaisePropertyChangedAuto(); + } + } + + private MachineEditingComposition _editingComposition; + public MachineEditingComposition EditingComposition + { + get { return _editingComposition; } + set { _editingComposition = value; RaisePropertyChangedAuto(); } + } + + public void OnNavigatedToWithObject(NavigationObject obj) + { + SelectedView = NavigationView.SettingsView; + LoadMachine(obj.MachineGuid); + } + + private async void LoadMachine(String machineGuid) + { + using (NotificationProvider.PushTaskItem("Loading machine configuration...")) + { + EditingComposition = await Services.MachineConfigurationService.GetMachineEditingComposition(machineGuid); + RaiseMessage(new EditingCompositionLoadedMessage() { EditingComposition = EditingComposition }); + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MainViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MainViewVM.cs new file mode 100644 index 000000000..250dc1046 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/MainViewVM.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.FSE.Common; +using Tango.FSE.Common.Navigation; +using Tango.FSE.MachineConfiguration.Navigation; +using Tango.SharedUI.Helpers; + +namespace Tango.FSE.MachineConfiguration.ViewModels +{ + [ModularNavigationContainer] + public class MainViewVM : ConfigurationViewModel + { + public override void OnApplicationReady() + { + if (CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.FSE_RunConfigurationModule)) + { + InvokeUI(() => + { + NavigationManager.MenuItems.Add(new NavigationMenuItem(() => + { + NavigationManager.NavigateTo<ConfigurationModule>(); + }) + { + Name = "Configuration", + Index = 8, + Description = "Access to the organization machines configuration and settings", + Image = ResourceHelper.GetImageFromResources("Images/configuration.png"), + }); + }); + } + } + + public async override Task<bool> OnApplicationLogout() + { + while (ModularNavigationManager.CurrentView != ConfigurationView.SelectionView) + { + if (!await ModularNavigationManager.NavigateBack()) + { + return false; + } + } + + return await base.OnApplicationLogout(); + } + + public async override Task<bool> OnNavigateBackRequest() + { + if (ModularNavigationManager.CurrentView == ConfigurationView.SelectionView) + { + return await base.OnNavigateBackRequest(); + } + else + { + await ModularNavigationManager.NavigateBack(); + return false; + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SelectionViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SelectionViewVM.cs new file mode 100644 index 000000000..39772a4cf --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SelectionViewVM.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.Core.Commands; +using Tango.FSE.Common; +using Tango.FSE.MachineConfiguration.Navigation; + +namespace Tango.FSE.MachineConfiguration.ViewModels +{ + public class SelectionViewVM : ConfigurationViewModel + { + private Machine _selectedMachine; + /// <summary> + /// Gets or sets the selected machine. + /// </summary> + public Machine SelectedMachine + { + get { return _selectedMachine; } + set + { + _selectedMachine = value; + RaisePropertyChangedAuto(); + InvalidateRelayCommands(); + OnSelectedMachineChanged(); + } + } + + public RelayCommand ManageMachineCommand { get; set; } + + public SelectionViewVM() + { + ManageMachineCommand = new RelayCommand(ManageSelectedMachine, () => SelectedMachine != null); + } + + private async void OnSelectedMachineChanged() + { + if (SelectedMachine != null) + { + await Task.Delay(100); + this.SetFocus(() => ManageMachineCommand); + } + } + + private void ManageSelectedMachine() + { + if (SelectedMachine == null) + { + NotificationProvider.ShowError("No machine selected."); + return; + } + + ModularNavigationManager.NavigateTo(ConfigurationView.MachineView, new MachineViewVM.NavigationObject() + { + MachineGuid = SelectedMachine.Guid + }); + } + + public override void OnNavigatedTo() + { + base.OnNavigatedTo(); + + if (SelectedMachine == null && MachineProvider.Machine != null) + { + SelectedMachine = MachineProvider.Machine; + } + } + + public override Task<bool> OnApplicationLogout() + { + ModularNavigationManager.NavigateTo(ConfigurationView.SelectionView); + SelectedMachine = null; + return base.OnApplicationLogout(); + } + } +} + + diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SettingsViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SettingsViewVM.cs new file mode 100644 index 000000000..ed2cbd714 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/ViewModels/SettingsViewVM.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL.Entities; +using Tango.Core.Commands; +using Tango.Core.DI; +using Tango.FSE.BL; +using Tango.FSE.Common; +using Tango.FSE.Common.AutoComplete; +using Tango.FSE.Common.SQL; +using Tango.FSE.MachineConfiguration.Messages; +using static Tango.FSE.BL.Services.MachineConfigurationService; + +namespace Tango.FSE.MachineConfiguration.ViewModels +{ + public class SettingsViewVM : FSEViewModel + { + [TangoInject] + private IRemoteSqlProvider RemoteSqlProvider { get; set; } + + private MachineEditingComposition _editingComposition; + public MachineEditingComposition EditingComposition + { + get { return _editingComposition; } + set { _editingComposition = value; RaisePropertyChangedAuto(); } + } + + public RelayCommand SaveCommand { get; set; } + public RelayCommand ResetCountersCommand { get; set; } + public RelayCommand ResetDeviceRegistrationCommand { get; set; } + + private List<Site> _sites; + public List<Site> Sites + { + get { return _sites; } + set { _sites = value; RaisePropertyChangedAuto(); } + } + + private Site _selectedSite; + public Site SelectedSite + { + get { return _selectedSite; } + set { _selectedSite = value; RaisePropertyChangedAuto(); } + } + + public SettingsViewVM() + { + RegisterForMessage<EditingCompositionLoadedMessage>(OnEditingCompositionLoaded); + SaveCommand = new RelayCommand(SaveConfiguration); + ResetCountersCommand = new RelayCommand(ResetCounters); + ResetDeviceRegistrationCommand = new RelayCommand(ResetDeviceRegistration); + } + + private void OnEditingCompositionLoaded(EditingCompositionLoadedMessage msg) + { + using (NotificationProvider.PushTaskItem("Loading machine configuration...")) + { + EditingComposition = msg.EditingComposition; + EditingComposition.Machine.ForceVersionUpdateChanged += (x, value) => { if (value) EditingComposition.Machine.SuspendVersionUpdate = false; }; + EditingComposition.Machine.SuspendVersionUpdateChanged += (x, value) => { if (value) EditingComposition.Machine.ForceVersionUpdate = false; }; + EditingComposition.Machine.OrganizationChanged -= OnMachine_OrganizationChanged; + EditingComposition.Machine.OrganizationChanged += OnMachine_OrganizationChanged; + OnMachine_OrganizationChanged(EditingComposition.Machine, EditingComposition.Machine.Organization); + } + } + + private void OnMachine_OrganizationChanged(object sender, Organization organization) + { + var sites = organization.Sites.ToList(); + sites.Insert(0, new Site() { Guid = null, Name = "NONE", ID = -1 }); + Sites = sites; + SelectedSite = Sites.FirstOrDefault(x => x.Guid == EditingComposition.Machine.SiteGuid); + + if (SelectedSite == null) + { + SelectedSite = Sites.First(); + } + } + + private async void SaveConfiguration() + { + using (NotificationProvider.PushTaskItem("Saving machine configuration...")) + { + EditingComposition.Machine.SiteGuid = SelectedSite.Guid; + EditingComposition = await Services.MachineConfigurationService.SaveMachineEditingComposition(EditingComposition); + await NotificationProvider.ShowSuccess("Machine configuration saved successfully."); + } + } + + private async void ResetCounters() + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.FSE_ResetMachineCounters)) + { + await NotificationProvider.ShowError("The current user profile does not allow resetting the machine counters.\nPlease contact your administrator."); + return; + } + + if (!MachineProvider.IsPPCAvailable) + { + await NotificationProvider.ShowError("Resetting the machine counters requires an active connection to this machine."); + return; + } + + if (!await NotificationProvider.ShowWarningQuestion("Resetting the machine counters will delete the entire job runs history. Are you sure?", "RESET COUNTERS", "CANCEL")) return; + + using (var task = NotificationProvider.PushTaskItem("Resetting machine counters...")) + { + task.UpdateProgress("Resetting local machine counters..."); + + var result = await RemoteSqlProvider.ExecuteSqlCommandAsync(new RemoteSqlCommand() + { + Mode = RemoteSqlCommandMode.Local, + Timeout = 30, + SQL = "DELETE FROM JOB_RUNS" + }); + + int localJobRuns = result.LocalAffectedRecords; + + task.UpdateProgress("Resetting global machine counters..."); + + int remoteJobRuns = await Services.MachineConfigurationService.ResetCounters(EditingComposition.Machine.Guid); + + await NotificationProvider.ShowSuccess("Machine counters deleted successfully."); + } + } + + private async void ResetDeviceRegistration() + { + if (!CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.FSE_ResetMachineDeviceRegistration)) + { + await NotificationProvider.ShowError("The current user profile does not allow resetting the device registration.\nPlease contact your administrator."); + return; + } + + if (!await NotificationProvider.ShowWarningQuestion("Resetting the machine's device registration will allow other panel PCs to perform a machine setup for this machine. Are you sure?", "RESET", "CANCEL")) return; + + EditingComposition.Machine.IsDeviceRegistered = false; + EditingComposition.Machine.DeviceId = null; + EditingComposition.Machine.DeviceName = null; + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml new file mode 100644 index 000000000..52a140c81 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml @@ -0,0 +1,239 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Views.DataStoreView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Views" + xmlns:helpers="clr-namespace:Tango.SharedUI.Helpers;assembly=Tango.SharedUI" + xmlns:global="clr-namespace:Tango.FSE.MachineConfiguration" + xmlns:controls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:vm="clr-namespace:Tango.FSE.MachineConfiguration.ViewModels" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:commonControls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:resolution="clr-namespace:Tango.FSE.Common.Resolution;assembly=Tango.FSE.Common" + xmlns:converters="clr-namespace:Tango.FSE.MachineConfiguration.Converters" + mc:Ignorable="d" + d:DesignHeight="720" d:DesignWidth="1280" d:DataContext="{d:DesignInstance Type=vm:DataStoreViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.DataStoreViewVM}" d:DesignStyle="{StaticResource FSE_User_Control_Designer}"> + + <UserControl.Resources> + <converters:DataStoreValueToStringConverter x:Key="DataStoreValueToStringConverter" /> + </UserControl.Resources> + + <DockPanel Margin="0 10 0 0"> + + <DockPanel DockPanel.Dock="Top"> + <DockPanel DockPanel.Dock="Left" HorizontalAlignment="Left"> + <Image Source="../Images/data_collection.png" Stretch="Uniform" Width="40" RenderOptions.BitmapScalingMode="Fant" Opacity="0.5" /> + <DockPanel Margin="10 0 0 0" > + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}"> + <Run>The data store contains global and local (machine) configuration and calibration parameters.</Run> + <LineBreak/> + <Run>Updating the data store parameters will take effect on the next machine cloud synchronization pass.</Run> + <LineBreak/> + <Run>If this is the currently connected machine, updating the data store will take effect immediately.</Run> + </TextBlock> + </DockPanel> + </DockPanel> + + <DockPanel DockPanel.Dock="Right" Margin="0 0 10 0" VerticalAlignment="Center" ToolTip="Allow updates on this grid based on changes that are triggered by the machine's firmware device"> + <ToggleButton IsChecked="{Binding DataStoreProvider.AcceptFirmwareChanges}" /> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_SmallFontSize}" VerticalAlignment="Center">Accept Real-Time Firmware Updates</TextBlock> + </DockPanel> + + <Grid> + + </Grid> + </DockPanel> + + <DockPanel Margin="0 20 0 0"> + <DockPanel DockPanel.Dock="Bottom" > + + <Grid DockPanel.Dock="Left"> + <DockPanel VerticalAlignment="Center" Visibility="{Binding CanSync,Converter={StaticResource BooleanToVisibilityConverter}}"> + <material:PackIcon Kind="InfoCircleOutline" Foreground="{StaticResource FSE_GreenBrush}" /> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GreenBrush}" VerticalAlignment="Center" Margin="5 2 0 0">Machine is connected, updating the data store will be take effect immediately.</TextBlock> + </DockPanel> + </Grid> + + <StackPanel DockPanel.Dock="Right" Orientation="Horizontal" Margin="0 10 0 5"> + <Button IsEnabled="{Binding IsFree}" ToolTip="Import a data store csv file" Width="120" VerticalAlignment="Center" Margin="0 0 10 0" Height="35" material:ButtonAssist.CornerRadius="18" Style="{StaticResource FSE_RaisedButton_Dark_Hover}" Command="{Binding ImportCommand}"> + <DockPanel> + <material:PackIcon Kind="Import" /> + <TextBlock Margin="5 0 0 0">IMPORT</TextBlock> + </DockPanel> + </Button> + <Button IsEnabled="{Binding IsFree}" ToolTip="Export this data store to a csv file" Width="120" VerticalAlignment="Center" Margin="0 0 10 0" Height="35" material:ButtonAssist.CornerRadius="18" Style="{StaticResource FSE_RaisedButton_Dark_Hover}" Command="{Binding ExportCommand}"> + <DockPanel> + <material:PackIcon Kind="Export" /> + <TextBlock Margin="5 0 0 0">EXPORT</TextBlock> + </DockPanel> + </Button> + <Button ToolTip="Apply the data store changes" IsEnabled="{Binding IsFree}" Width="200" Height="45" material:ButtonAssist.CornerRadius="25" Command="{Binding SaveCommand}"> + <DockPanel> + <material:PackIcon Kind="ContentSaveAll" /> + <TextBlock Margin="5 0 0 0"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="Text" Value="UPDATE"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding CanSync}" Value="True"> + <Setter Property="Text" Value="UPDATE & SYNC"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DockPanel> + </Button> + </StackPanel> + + <Grid> + <!--FOOTER CENTER CONTENT--> + </Grid> + </DockPanel> + <Grid> + <DockPanel> + + <Grid DockPanel.Dock="Top" Panel.ZIndex="100"> + <!--TOP BAR--> + + <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0 0 5 -45"> + <DockPanel Margin="0 0 20 0" VerticalAlignment="Center"> + <material:PackIcon Kind="Search" resolution:ResolutionHelper.Mode="High" Foreground="{StaticResource FSE_PrimaryAccentBrush}" VerticalAlignment="Center" Width="24" Height="24" Margin="0 0 5 0" /> + <TextBox IsEnabled="{Binding IsFree}" material:HintAssist.Hint="Search" Text="{Binding Filter,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,Delay=500}" Background="{StaticResource FSE_PrimaryBackgroundBrush}" Width="250" Style="{StaticResource FSE_Rounded_Corners_TextBox}" Height="33"></TextBox> + </DockPanel> + <controls:TextIconButton IsEnabled="{Binding IsFree}" material:ButtonAssist.CornerRadius="15" Command="{Binding AddItemCommand}" Icon="Add" Width="150">ADD ITEM</controls:TextIconButton> + <commonControls:IconButton Margin="10 0 0 0" Icon="Refresh" Foreground="{StaticResource FSE_PrimaryAccentBrush}" Cursor="Hand" ToolTip="Reload the data store" Command="{Binding ReloadCommand}" /> + </StackPanel> + </Grid> + + <DockPanel> + <!--<TextBlock Margin="0 -25 0 0" DockPanel.Dock="Top" FontFamily="{StaticResource hand}" Foreground="{StaticResource FSE_PrimaryAccentBrush}" FontSize="{StaticResource FSE_LargerFontSize}">Collections</TextBlock>--> + + <DockPanel> + + <Border DockPanel.Dock="Bottom" Height="50" Background="#404040" CornerRadius="0 0 5 5"> + <controls:TextIconButton IsEnabled="{Binding IsFree}" material:ButtonAssist.CornerRadius="15" Command="{Binding AddCollectionCommand}" Icon="Add" Width="180">ADD COLLECTION</controls:TextIconButton> + </Border> + + <Border Padding="8" Background="{StaticResource FSE_PrimaryBackgroundMidBrush}" CornerRadius="5 5 0 0" BorderThickness="1" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}"> + <ListBox IsEnabled="{Binding IsFree}" ItemsSource="{Binding DataStore.Collections}" SelectedItem="{Binding SelectedCollection}" MinWidth="200" HorizontalContentAlignment="Stretch"> + <ListBox.ItemTemplate> + <DataTemplate> + <DockPanel> + <material:PackIcon Kind="Collection" /> + <controls:IconButton DockPanel.Dock="Right" HorizontalAlignment="Right" ToolTip="Delete collection" Cursor="Hand" Width="20" Height="20" Padding="0" Icon="Close" Foreground="{StaticResource FSE_RedBrush}" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveCollectionCommand}" CommandParameter="{Binding}" /> + <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" Text="{Binding Name}"></TextBlock> + </DockPanel> + </DataTemplate> + </ListBox.ItemTemplate> + </ListBox> + </Border> + </DockPanel> + </DockPanel> + + <Grid Margin="10 0 0 0"> + <Border Background="#8B202020" Padding="0 0 0 5" CornerRadius="5" BorderThickness="1" BorderBrush="{StaticResource FSE_PrimaryBackgroundLightBrush}"> + <Grid> + <Border VerticalAlignment="Top" Background="{StaticResource FSE_PrimaryBackgroundLightBrush}" Height="47" CornerRadius="5 5 0 0"> + + </Border> + <DataGrid IsEnabled="{Binding IsFree}" IsReadOnly="True" helpers:DataGridHelper.DoubleClickCommand="{Binding EditItemCommand}" AutoGenerateColumns="False" Style="{StaticResource FSE_DataGrid}" CellStyle="{StaticResource FSE_DataGrid_Cell}" CanUserReorderColumns="False" CanUserSortColumns="False" ItemsSource="{Binding SelectedCollection.Items}" SelectedItem="{Binding SelectedItem}"> + <DataGrid.Columns> + <DataGridTemplateColumn Width="50"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <material:PackIcon Kind="Key" Width="32" /> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="KEY" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Key}"></TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="TYPE" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding Type}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="Foreground" Value="{StaticResource FSE_PrimaryForegroundBrush}"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding Type}" Value="Boolean"> + <Setter Property="Foreground" Value="#FF9BFF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Bytes"> + <Setter Property="Foreground" Value="#FFFBA3"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Double"> + <Setter Property="Foreground" Value="#85B1FF"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Float"> + <Setter Property="Foreground" Value="#FFDCB8"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Int32"> + <Setter Property="Foreground" Value="#FF858D "></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="String"> + <Setter Property="Foreground" Value="#B9FFA5"></Setter> + </DataTrigger> + <DataTrigger Binding="{Binding Type}" Value="Proto"> + <Setter Property="Foreground" Value="#A5FFF9"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="GLOBAL" Width="Auto"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding GlobalItem,Converter={StaticResource DataStoreValueToStringConverter},TargetNullValue='-'}"></TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Header="LOCAL" Width="1*"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <TextBlock Text="{Binding FormattedValue,Converter={StaticResource StringToOneLineConverter},ConverterParameter='100',Mode=OneWay}" Visibility="{Binding IsDeleted,Converter={StaticResource BooleanToVisibilityInverseConverter}}"> + <TextBlock.Style> + <Style TargetType="TextBlock"> + <Setter Property="FontWeight" Value="Normal"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding HasDifference}" Value="True"> + <Setter Property="FontWeight" Value="Bold"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </TextBlock.Style> + </TextBlock> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + <DataGridTemplateColumn Width="100"> + <DataGridTemplateColumn.CellTemplate> + <DataTemplate> + <UniformGrid Columns="2"> + <controls:IconButton ToolTip="Edit local value" Cursor="Hand" Width="20" Padding="0" Height="20" Icon="Edit" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.EditItemCommand}" CommandParameter="{Binding}" /> + <Grid IsEnabled="{Binding IsGlobal,Converter={StaticResource BooleanInverseConverter}}"> + <controls:IconButton ToolTip="Delete local" IsEnabled="{Binding IsDeleted,Converter={StaticResource BooleanInverseConverter}}" Cursor="Hand" Width="20" Height="20" Padding="0" Icon="Close" Foreground="{StaticResource FSE_RedBrush}" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveItemCommand}" CommandParameter="{Binding}" /> + </Grid> + </UniformGrid> + </DataTemplate> + </DataGridTemplateColumn.CellTemplate> + </DataGridTemplateColumn> + </DataGrid.Columns> + </DataGrid> + </Grid> + </Border> + </Grid> + </DockPanel> + </Grid> + </DockPanel> + </DockPanel> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml.cs new file mode 100644 index 000000000..add553b35 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/DataStoreView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Views +{ + /// <summary> + /// Interaction logic for MachineDataStoreView.xaml + /// </summary> + public partial class DataStoreView : UserControl + { + public DataStoreView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml new file mode 100644 index 000000000..d33966e18 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml @@ -0,0 +1,49 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Views.MachineView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:global="clr-namespace:Tango.FSE.MachineConfiguration" + xmlns:vm="clr-namespace:Tango.FSE.MachineConfiguration.ViewModels" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Views" + xmlns:commonControls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:resolution="clr-namespace:Tango.FSE.Common.Resolution;assembly=Tango.FSE.Common" + mc:Ignorable="d" + d:DesignHeight="1080" d:DesignWidth="1920" d:DataContext="{d:DesignInstance Type=vm:MachineViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MachineViewVM}" d:DesignStyle="{StaticResource FSE_User_Control_Designer}"> + <Grid> + + <Grid Margin="0 20 0 0"> + <Grid> + <Grid.Style> + <Style TargetType="Grid"> + <Setter Property="Margin" Value="100 0"></Setter> + <Style.Triggers> + <DataTrigger Binding="{Binding ResolutionService.IsLowResolution}" Value="True"> + <Setter Property="Margin" Value="10"></Setter> + </DataTrigger> + </Style.Triggers> + </Style> + </Grid.Style> + + <DockPanel> + <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" HorizontalAlignment="Left"> + <Image Source="{StaticResource FSE_Machine_Full}" Width="100" Stretch="Uniform" RenderOptions.BitmapScalingMode="Fant" /> + <StackPanel Margin="5 0 0 0"> + <TextBlock Text="{Binding EditingComposition.Machine.SerialNumber,FallbackValue='101010'}" FontSize="{StaticResource FSE_ModuleHeaderFontSize}"></TextBlock> + <TextBlock Text="{Binding EditingComposition.Machine.Organization.Name,FallbackValue='Organization'}" FontSize="{StaticResource FSE_LargerFontSize}" Foreground="{StaticResource FSE_GrayBrush}"></TextBlock> + </StackPanel> + </StackPanel> + <Grid Margin="0 20 0 0"> + <commonControls:FSETabControl TabsWidth="500" x:Name="tabs" SelectedObject="{Binding SelectedView,Mode=TwoWay}"> + <local:SettingsView Tag="SETTINGS"/> + <local:DataStoreView Tag="DATA STORE"/> + </commonControls:FSETabControl> + + <TextBlock resolution:ResolutionHelper.MinWidth="1500" Margin="10 0 0 0" FontFamily="{StaticResource hand}" FontSize="{StaticResource FSE_ModuleHeaderFontSize}" Foreground="{StaticResource FSE_PrimaryAccentDarkBrush}" VerticalAlignment="Top" HorizontalAlignment="Left" Text="{Binding ElementName=tabs,Path=SelectedElement.Tag,Converter={StaticResource StringToTitleCaseConverter}}"></TextBlock> + </Grid> + </DockPanel> + </Grid> + </Grid> + + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml.cs new file mode 100644 index 000000000..5e4d5ed7d --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MachineView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Views +{ + /// <summary> + /// Interaction logic for MachineView.xaml + /// </summary> + public partial class MachineView : UserControl + { + public MachineView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml new file mode 100644 index 000000000..a321a1bb8 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml @@ -0,0 +1,18 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Views.MainView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:global="clr-namespace:Tango.FSE.MachineConfiguration" + xmlns:vm="clr-namespace:Tango.FSE.MachineConfiguration.ViewModels" + xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Views" + mc:Ignorable="d" + d:DesignHeight="1920" d:DesignWidth="1080" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}" d:DesignStyle="{StaticResource FSE_User_Control_Designer}"> + <Grid> + <controls:NavigationControl TransitionType="Slide" TransitionDuration="00:00:0.2"> + <local:SelectionView/> + <local:MachineView/> + </controls:NavigationControl> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml.cs new file mode 100644 index 000000000..650c297a4 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/MainView.xaml.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Views +{ + /// <summary> + /// Interaction logic for MainView.xaml + /// </summary> + public partial class MainView : UserControl + { + public static MainView Instance { get; set; } + + public MainView() + { + Instance = this; + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml new file mode 100644 index 000000000..51039ca89 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml @@ -0,0 +1,61 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Views.SelectionView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Views" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:global="clr-namespace:Tango.FSE.MachineConfiguration" + xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete" + xmlns:vm="clr-namespace:Tango.FSE.MachineConfiguration.ViewModels" + mc:Ignorable="d" + d:DesignHeight="1080" d:DesignWidth="1920" d:DataContext="{d:DesignInstance Type=vm:SelectionViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.SelectionViewVM}" d:DesignStyle="{StaticResource FSE_User_Control_Designer}"> + <Grid> + <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> + + <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource FSE_ModuleHeaderFontSize}">Machine Configuration</TextBlock> + <TextBlock TextWrapping="Wrap" Margin="0 20 0 0" TextAlignment="Center" LineHeight="25"> + <Run>The machine configuration module allows you to manage the currently connected machine configuration and other machine settings.</Run> + <LineBreak/> + <Run>Given the proper permissions, you will also be able to manage other organization machines.</Run> + </TextBlock> + + <StackPanel Margin="0 40 0 0" Width="500" HorizontalAlignment="Center"> + <Image Source="../Images/configuration.png" Stretch="None" /> + + <TextBlock Margin="60" HorizontalAlignment="Center" FontWeight="SemiBold" Foreground="{StaticResource FSE_PrimaryAccentBrush}" FontSize="{StaticResource FSE_LargerFontSize}">Select Machine</TextBlock> + <autoComplete:AutoCompleteTextBox material:HintAssist.Hint="Serial Number" MaxPopupHeight="300" Margin="0 5 0 0" Provider="{Binding MachinesAutoCompleteProvider}" SelectedItem="{Binding SelectedMachine,Mode=TwoWay}" DisplayMember="SerialNumber"> + <autoComplete:AutoCompleteTextBox.SelectedItemTemplate> + <DataTemplate> + <DockPanel VerticalAlignment="Center"> + <Image RenderOptions.BitmapScalingMode="Fant" Source="{StaticResource FSE_Machine_Small}" Width="24" /> + <StackPanel VerticalAlignment="Center" Margin="10 0 0 0" Orientation="Horizontal"> + <TextBlock Text="{Binding SerialNumber}" FontSize="{StaticResource FSE_SmallFontSize}"></TextBlock> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding Name}"></TextBlock> + </StackPanel> + </DockPanel> + </DataTemplate> + </autoComplete:AutoCompleteTextBox.SelectedItemTemplate> + <autoComplete:AutoCompleteTextBox.ItemTemplate> + <DataTemplate> + <DockPanel VerticalAlignment="Center"> + <Image RenderOptions.BitmapScalingMode="Fant" Source="{StaticResource FSE_Machine_Small}" Width="32" /> + <StackPanel Margin="5 0 0 0"> + <TextBlock Text="{Binding SerialNumber}"></TextBlock> + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallerFontSize}" Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding Name}"></TextBlock> + </StackPanel> + </DockPanel> + </DataTemplate> + </autoComplete:AutoCompleteTextBox.ItemTemplate> + </autoComplete:AutoCompleteTextBox> + + <Button material:ButtonAssist.CornerRadius="25" Command="{Binding ManageMachineCommand}" Margin="0 100 0 0" Height="50" Width="250" FocusVisualStyle="{x:Null}"> + <DockPanel> + <TextBlock>CONTINUE</TextBlock> + <material:PackIcon Margin="10 0 0 0" VerticalAlignment="Center" Kind="ArrowRight" /> + </DockPanel> + </Button> + </StackPanel> + </StackPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml.cs new file mode 100644 index 000000000..618ae299a --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SelectionView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Views +{ + /// <summary> + /// Interaction logic for MachineSelectionView.xaml + /// </summary> + public partial class SelectionView : UserControl + { + public SelectionView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml new file mode 100644 index 000000000..88df5a0b3 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml @@ -0,0 +1,196 @@ +<UserControl x:Class="Tango.FSE.MachineConfiguration.Views.SettingsView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:local="clr-namespace:Tango.FSE.MachineConfiguration.Views" + xmlns:global="clr-namespace:Tango.FSE.MachineConfiguration" + xmlns:auth="clr-namespace:Tango.FSE.Common.Authorization;assembly=Tango.FSE.Common" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:vm="clr-namespace:Tango.FSE.MachineConfiguration.ViewModels" + xmlns:enumerations="clr-namespace:Tango.BL.Enumerations;assembly=Tango.BL" + xmlns:commonControls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:resolution="clr-namespace:Tango.FSE.Common.Resolution;assembly=Tango.FSE.Common" + xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI" + xmlns:autoComplete="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete" + mc:Ignorable="d" + d:DesignHeight="2000" d:DesignWidth="1920" d:DataContext="{d:DesignInstance Type=vm:SettingsViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.SettingsViewVM}" d:DesignStyle="{StaticResource FSE_User_Control_Designer}"> + + <Grid Margin="0 20"> + + <ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto" Padding="0 0 20 0" FocusVisualStyle="{x:Null}"> + + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="4*" /> + <ColumnDefinition Width="5*" /> + </Grid.ColumnDefinitions> + + <!--<Grid Grid.Column="1"> + <commonControls:MachineView Opacity="0.6" DataContext="{Binding EditingComposition.Machine}" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="50 100 50 50" MaxWidth="600" /> + </Grid>--> + + <StackPanel Grid.Column="0" > + + <GroupBox Margin="0 20" Style="{StaticResource FSE_Game_GroupBox}" Header="Provisioning" auth:AuthorizationHelper.Mode="Disabled" auth:AuthorizationHelper.Permission="FSE_ModifyMachineProvisioning"> + <StackPanel Margin="0 0 0 5"> + <DockPanel VerticalAlignment="Top" Margin="0 10 0 0" ToolTip="Activate the windows operating system license"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.SetupActivation}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Activate Windows License</TextBlock> + </DockPanel> + + <StackPanel Margin="43 0 0 0"> + <TextBlock Foreground="{StaticResource FSE_GrayBrush}" FontSize="{StaticResource FSE_SmallerFontSize}">License Key</TextBlock> + <TextBox Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.Machine.OsKey,UpdateSourceTrigger=PropertyChanged}" FontSize="{StaticResource FSE_SmallFontSize}" VerticalAlignment="Center" Style="{StaticResource FSE_Rounded_Corners_TextBox}" Margin="0 2 0 0" Width="250" HorizontalAlignment="Left"></TextBox> + </StackPanel> + + <DockPanel Margin="0 20 0 0" ToolTip="Install Team Viewer for remote desktop support"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.SetupRemoteAssistance}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Setup Team Viewer</TextBlock> + </DockPanel> + + <DockPanel Margin="0 20 0 0" ToolTip="Perform UWF activation for protecting the disk by resetting file system changes after each system restart"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.SetupUwf}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Activate Disk Protection</TextBlock> + </DockPanel> + + <DockPanel Margin="0 20 0 0" ToolTip="Connect the panel PC application to an in-memory emulator (for testing purpose only)"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.IsDemo}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Use Firmware Emulator (Demo Machine)</TextBlock> + </DockPanel> + <StackPanel Margin="2 40 0 0"> + + <Separator Margin="0 10" /> + + <TextBlock FontWeight="SemiBold" Foreground="{StaticResource FSE_RedBrush}">Device Registration</TextBlock> + + <DockPanel> + <StackPanel> + + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}"> + <Run>Registered:</Run> + <Run Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.Machine.IsDeviceRegistered,Mode=OneWay,Converter={StaticResource BooleanToYesNoConverter},FallbackValue='No'}"></Run> + </TextBlock> + + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}"> + <Run>Device ID:</Run> + <Run Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.Machine.DeviceId,Mode=OneWay,FallbackValue='N/A',TargetNullValue='N/A'}"></Run> + </TextBlock> + + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}"> + <Run>Device Name:</Run> + <Run Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.Machine.DeviceName,Mode=OneWay,FallbackValue='N/A',TargetNullValue='N/A'}"></Run> + </TextBlock> + </StackPanel> + + <Button Width="180" Command="{Binding ResetDeviceRegistrationCommand}" Margin="0 0 10 0" ToolTip="Device registration protects the system from provisioning of the same machine on multiple devices (panel PC's). Use this reset option when replacing an existing panel PC with a new one." IsEnabled="{Binding Machine.IsDeviceRegistered}" Cursor="Hand" HorizontalAlignment="Right" FontSize="{StaticResource FSE_SmallFontSize}" VerticalAlignment="Bottom" Style="{StaticResource FSE_Button_Red}">Reset Device Registration</Button> + </DockPanel> + </StackPanel> + + <StackPanel Margin="2 40 0 0"> + + <Separator Margin="0 10" /> + + <TextBlock FontWeight="SemiBold" Foreground="{StaticResource FSE_RedBrush}">Machine Counters</TextBlock> + + <DockPanel> + <StackPanel> + + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}"> + <Run>Total Dye Time:</Run> + <Run Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.TotalDyeTime,Mode=OneWay,FallbackValue='N/A',TargetNullValue='N/A'}"></Run> + </TextBlock> + + <TextBlock Margin="0 5 0 0" FontSize="{StaticResource FSE_SmallFontSize}"> + <Run>Total Dye Meters:</Run> + <Run Foreground="{StaticResource FSE_GrayBrush}" Text="{Binding EditingComposition.TotalDyeMeters,Mode=OneWay,FallbackValue='N/A',TargetNullValue='N/A'}"></Run> + </TextBlock> + </StackPanel> + + <Button Width="180" Command="{Binding ResetCountersCommand}" Margin="0 0 10 0" ToolTip="Reset the entire job runs history for this machine" IsEnabled="{Binding Machine.IsDeviceRegistered}" Cursor="Hand" HorizontalAlignment="Right" FontSize="{StaticResource FSE_SmallFontSize}" VerticalAlignment="Bottom" Style="{StaticResource FSE_Button_Red}">Reset Machine Counters</Button> + </DockPanel> + </StackPanel> + </StackPanel> + </GroupBox> + + <GroupBox Margin="0 20" Style="{StaticResource FSE_Game_GroupBox}" Header="Machine Update" auth:AuthorizationHelper.Mode="Disabled" auth:AuthorizationHelper.Permission="FSE_ModifyMachineUpdate"> + <StackPanel Margin="0 10 0 5"> + <DockPanel ToolTip="Prevent firmware upgrade when updating"> + <ToggleButton material:ToggleButtonAssist.SwitchTrackOnBackground="{StaticResource FSE_PrimaryBackgroundLighterBrush}" IsChecked="{Binding EditingComposition.Machine.SetupFirmware,Converter={StaticResource BooleanInverseConverter}}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Disable Firmware Upgrade</TextBlock> + </DockPanel> + + <DockPanel Margin="0 20 0 0" ToolTip="Force the machine to perform an update even if there is no update available"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.ForceVersionUpdate}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Force Version Update</TextBlock> + </DockPanel> + + <DockPanel Margin="0 20 0 0" ToolTip="Prevent this machine from updating software"> + <ToggleButton IsChecked="{Binding EditingComposition.Machine.SuspendVersionUpdate}" /> + <TextBlock VerticalAlignment="Center" Margin="10 0 0 0">Suspend Version Update</TextBlock> + </DockPanel> + </StackPanel> + </GroupBox> + + <GroupBox Margin="0 20" Style="{StaticResource FSE_Game_GroupBox}" Header="Machine Identity" auth:AuthorizationHelper.Mode="Disabled" auth:AuthorizationHelper.Permission="FSE_ModifyMachineIdentity"> + <StackPanel Margin="0 0 0 5"> + + <StackPanel Margin="0 10 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Serial Number</TextBlock> + <TextBox Margin="0 2 0 0" Text="{Binding EditingComposition.Machine.SerialNumber}" Width="250" HorizontalAlignment="Left"></TextBox> + </StackPanel> + + <StackPanel Margin="0 20 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Name</TextBlock> + <TextBox Margin="0 2 0 0" Text="{Binding EditingComposition.Machine.Name}" Width="250" HorizontalAlignment="Left"></TextBox> + </StackPanel> + + <StackPanel Margin="0 20 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Organization</TextBlock> + <ComboBox Width="250" HorizontalAlignment="Left" ItemsSource="{Binding EditingComposition.Organizations}" SelectedItem="{Binding EditingComposition.Machine.Organization}" DisplayMemberPath="Name" /> + </StackPanel> + + <StackPanel Margin="0 20 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Site</TextBlock> + <ComboBox Width="250" HorizontalAlignment="Left" ItemsSource="{Binding Sites}" SelectedItem="{Binding SelectedSite}" DisplayMemberPath="Name" /> + </StackPanel> + </StackPanel> + </GroupBox> + + <GroupBox Margin="0 20" Style="{StaticResource FSE_Game_GroupBox}" Header="Hardware" auth:AuthorizationHelper.Mode="Disabled" auth:AuthorizationHelper.Permission="FSE_ModifyMachineHardware"> + <StackPanel> + <StackPanel Margin="0 10 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Head Type</TextBlock> + <ComboBox Width="250" HorizontalAlignment="Left" ItemsSource="{Binding Source={x:Type enumerations:HeadTypes},Converter={StaticResource EnumToItemsSourceConverter}}" SelectedValue="{Binding EditingComposition.Machine.MachineHeadType}" SelectedValuePath="Value" DisplayMemberPath="DisplayName" /> + </StackPanel> + + <StackPanel Margin="0 20 0 0"> + <TextBlock FontSize="{StaticResource FSE_SmallFontSize}" Foreground="{StaticResource FSE_GrayBrush}">Hardware Version</TextBlock> + <controls:SearchComboBox MinWidth="250" HorizontalAlignment="Left" ItemsSource="{Binding EditingComposition.HardwareVersions}" SelectedItem="{Binding EditingComposition.Machine.Configuration.HardwareVersion}" SearchProperty="FullName" /> + </StackPanel> + </StackPanel> + </GroupBox> + </StackPanel> + </Grid> + </ScrollViewer> + + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="4*" /> + <ColumnDefinition Width="5*" /> + </Grid.ColumnDefinitions> + + <Grid Grid.Column="1" Margin="0 0 50 0"> + <DockPanel> + <Button Command="{Binding SaveCommand}" DockPanel.Dock="Bottom" VerticalAlignment="Top" HorizontalAlignment="Center" Width="250" Height="50" Margin="0 -40 0 0" material:ButtonAssist.CornerRadius="25"> + <DockPanel> + <material:PackIcon Kind="ContentSave" /> + <TextBlock Margin="5 0 0 0">SAVE</TextBlock> + </DockPanel> + </Button> + <commonControls:MachineView Opacity="0.6" DataContext="{Binding EditingComposition.Machine}" HorizontalAlignment="Center" VerticalAlignment="Top" resolution:ResolutionHelper.HighResolutionMargin="50 50 50 50" resolution:ResolutionHelper.LowResolutionMargin="50 0 50 50" MaxWidth="600" /> + </DockPanel> + </Grid> + </Grid> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml.cs new file mode 100644 index 000000000..bdf8d904d --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/Views/SettingsView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.MachineConfiguration.Views +{ + /// <summary> + /// Interaction logic for MachineDataStoreView.xaml + /// </summary> + public partial class SettingsView : UserControl + { + public SettingsView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/app.config b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/app.config new file mode 100644 index 000000000..36bc04f85 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/app.config @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <configSections> + <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> + </configSections> + <runtime> + <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> + <dependentAssembly> + <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="5.0.5.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.2.2.0" newVersion="1.2.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.4.2.0" newVersion="1.4.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.ValueTuple" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.Services.Client" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.6.4.0" newVersion="5.6.4.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="System.Reactive.Core" publicKeyToken="94bc3704cddfc263" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-3.0.3000.0" newVersion="3.0.3000.0" /> + </dependentAssembly> + <dependentAssembly> + <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" /> + </dependentAssembly> + </assemblyBinding> + </runtime> + <entityFramework> + <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> + <providers> + <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> + </providers> + </entityFramework> +</configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/packages.config b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/packages.config new file mode 100644 index 000000000..dd8c723e4 --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.MachineConfiguration/packages.config @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="ControlzEx" version="3.0.2.4" targetFramework="net461" /> + <package id="EntityFramework" version="6.2.0" targetFramework="net461" /> + <package id="Google.Protobuf" version="3.4.1" targetFramework="net461" /> + <package id="MahApps.Metro" version="1.6.5" targetFramework="net461" /> + <package id="MaterialDesignColors" version="1.2.2" targetFramework="net461" /> + <package id="MaterialDesignThemes" version="3.0.1" targetFramework="net461" /> + <package id="Newtonsoft.Json" version="9.0.1" targetFramework="net461" /> +</packages>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Help/proc-doc.chm b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Help/proc-doc.chm Binary files differindex c77ff4e85..ef7ec26c0 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Help/proc-doc.chm +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Help/proc-doc.chm diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Tango.FSE.Procedures.Documentation.shfbproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Tango.FSE.Procedures.Documentation.shfbproj index dc353ec12..10bf82219 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Tango.FSE.Procedures.Documentation.shfbproj +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures.Documentation/Tango.FSE.Procedures.Documentation.shfbproj @@ -34,7 +34,7 @@ <DocumentationSource sourceFile="..\Tango.FSE.Procedures\Tango.FSE.Procedures.csproj" /> <DocumentationSource sourceFile="..\..\Tango.FSE.Common\Tango.FSE.Common.csproj" /> <DocumentationSource sourceFile="..\..\..\PPC\Tango.PPC.Shared\Tango.PPC.Shared.csproj" /> - <DocumentationSource sourceFile="..\..\..\Tango.DataStore\Tango.DataStore.csproj" /> + <DocumentationSource sourceFile="..\..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj" /> </DocumentationSources> <HelpFileFormat>HtmlHelp1</HelpFileFormat> <SyntaxFilters>C#</SyntaxFilters> @@ -57,106 +57,107 @@ <VisibleItems>InheritedMembers, InheritedFrameworkMembers, ProtectedInternalAsProtected, NonBrowsable</VisibleItems> <ApiFilter> <Filter entryType="Namespace" fullName="" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.DataStore" isExposed="True"> - <Filter entryType="Class" fullName="Tango.DataStore.DataStoreHelper" filterName="DataStoreHelper" isExposed="False" /> -</Filter> -<Filter entryType="Namespace" fullName="Tango.FSE.Common" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Authentication" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Authorization" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.AutoComplete" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Behaviors" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.BugReporting" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Connection" isExposed="False"> - <Filter entryType="Enumeration" fullName="Tango.FSE.Common.Connection.MachineConnectionTypes" filterName="MachineConnectionTypes" isExposed="True" /> -</Filter> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Connectivity" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Console" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Controls" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Converters" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Core" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.DemoMode" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Diagnostics" isExposed="False"> - <Filter entryType="Class" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage" filterName="DiagnosticsPackage" isExposed="True"> - <Filter entryType="Property" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage.Frame" filterName="Frame" isExposed="False" /> - <Filter entryType="Property" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage.MonitorsProperties" filterName="MonitorsProperties" isExposed="False" /> - </Filter> -</Filter> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Dialogs" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Events" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.EventTriggerActions" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.FileAssociation" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.FileSystem" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Firmware" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.FSEApplication" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Graphs" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Helpers" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Insights" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Logging" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.MachineUpdates" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Modules" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Navigation" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Notifications" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Performance" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteDesktop" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteJob" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteUpgrade" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Resolution" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Storage" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.SystemInfo" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Threading" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Tiles" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.Updates" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Common.WindowsManager" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures" isExposed="False"> - <Filter entryType="Enumeration" fullName="Tango.FSE.Procedures.ArrayParsingStyle" filterName="ArrayParsingStyle" isExposed="True" /> - <Filter entryType="Interface" fullName="Tango.FSE.Procedures.IDialogController" filterName="IDialogController" isExposed="True" /> - <Filter entryType="Interface" fullName="Tango.FSE.Procedures.IProcedureContext" filterName="IProcedureContext" isExposed="True"> - <Filter entryType="Method" fullName="Tango.FSE.Procedures.IProcedureContext.BreakPoint" filterName="BreakPoint" isExposed="False" /> - <Filter entryType="Property" fullName="Tango.FSE.Procedures.IProcedureContext.Results" filterName="Results" isExposed="False" /> - <Filter entryType="Event" fullName="Tango.FSE.Procedures.IProcedureContext.BreakPointRequest" filterName="BreakPointRequest" isExposed="False" /> - <Filter entryType="Event" fullName="Tango.FSE.Procedures.IProcedureContext.Progress" filterName="Progress" isExposed="False" /> - </Filter> - <Filter entryType="Class" fullName="Tango.FSE.Procedures.Result" filterName="Result" isExposed="True"> - <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsBitmap" filterName="IsBitmap" isExposed="False" /> - <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsGraph" filterName="IsGraph" isExposed="False" /> - <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsValueArray" filterName="IsValueArray" isExposed="False" /> - </Filter> - <Filter entryType="Enumeration" fullName="Tango.FSE.Procedures.ResultType" filterName="ResultType" isExposed="True" /> - <Filter entryType="Class" fullName="Tango.FSE.Procedures.UserInput" filterName="UserInput" isExposed="True" /> -</Filter> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Contracts" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Controls" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Converters" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.CSV" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Designer" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Dialogs" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.AddResult" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Connection" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Csv" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Diagnostics" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.RequestUserInputFor" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Send" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.SendContinuous" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Sql" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Helpers" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Messages" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Navigation" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.ViewModels" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Views" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Windows" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Information" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Insights" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Jobs" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Logs" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Performance" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.RemoteActions" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.RemoteUpgrade" isExposed="False" /> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.SQL" isExposed="True"> - <Filter entryType="Class" fullName="Tango.PPC.Shared.SQL.ExecuteSqlRequest" filterName="ExecuteSqlRequest" isExposed="False" /> - <Filter entryType="Class" fullName="Tango.PPC.Shared.SQL.ExecuteSqlResponse" filterName="ExecuteSqlResponse" isExposed="False" /> -</Filter> -<Filter entryType="Namespace" fullName="Tango.PPC.Shared.Updates" isExposed="False" /> -<Filter entryType="Namespace" fullName="" isExposed="False" /></ApiFilter> + <Filter entryType="Namespace" fullName="Tango.DataStore" isExposed="True"> + <Filter entryType="Class" fullName="Tango.DataStore.DataStoreHelper" filterName="DataStoreHelper" isExposed="False" /> + </Filter> + <Filter entryType="Namespace" fullName="Tango.FSE.Common" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Authentication" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Authorization" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.AutoComplete" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Behaviors" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.BugReporting" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Connection" isExposed="False"> + <Filter entryType="Enumeration" fullName="Tango.FSE.Common.Connection.MachineConnectionTypes" filterName="MachineConnectionTypes" isExposed="True" /> + </Filter> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Connectivity" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Console" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Controls" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Converters" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Core" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.DemoMode" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Diagnostics" isExposed="False"> + <Filter entryType="Class" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage" filterName="DiagnosticsPackage" isExposed="True"> + <Filter entryType="Property" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage.Frame" filterName="Frame" isExposed="False" /> + <Filter entryType="Property" fullName="Tango.FSE.Common.Diagnostics.DiagnosticsPackage.MonitorsProperties" filterName="MonitorsProperties" isExposed="False" /> + </Filter> + </Filter> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Dialogs" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Events" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.EventTriggerActions" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.FileAssociation" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.FileSystem" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Firmware" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.FSEApplication" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Graphs" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Helpers" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Insights" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Logging" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.MachineUpdates" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Modules" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Navigation" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Notifications" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Performance" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteDesktop" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteJob" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.RemoteUpgrade" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Resolution" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Storage" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.SystemInfo" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Threading" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Tiles" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.Updates" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Common.WindowsManager" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures" isExposed="False"> + <Filter entryType="Enumeration" fullName="Tango.FSE.Procedures.ArrayParsingStyle" filterName="ArrayParsingStyle" isExposed="True" /> + <Filter entryType="Interface" fullName="Tango.FSE.Procedures.IDialogController" filterName="IDialogController" isExposed="True" /> + <Filter entryType="Interface" fullName="Tango.FSE.Procedures.IProcedureContext" filterName="IProcedureContext" isExposed="True"> + <Filter entryType="Method" fullName="Tango.FSE.Procedures.IProcedureContext.BreakPoint" filterName="BreakPoint" isExposed="False" /> + <Filter entryType="Property" fullName="Tango.FSE.Procedures.IProcedureContext.Results" filterName="Results" isExposed="False" /> + <Filter entryType="Event" fullName="Tango.FSE.Procedures.IProcedureContext.BreakPointRequest" filterName="BreakPointRequest" isExposed="False" /> + <Filter entryType="Event" fullName="Tango.FSE.Procedures.IProcedureContext.Progress" filterName="Progress" isExposed="False" /> + </Filter> + <Filter entryType="Class" fullName="Tango.FSE.Procedures.Result" filterName="Result" isExposed="True"> + <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsBitmap" filterName="IsBitmap" isExposed="False" /> + <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsGraph" filterName="IsGraph" isExposed="False" /> + <Filter entryType="Property" fullName="Tango.FSE.Procedures.Result.IsValueArray" filterName="IsValueArray" isExposed="False" /> + </Filter> + <Filter entryType="Enumeration" fullName="Tango.FSE.Procedures.ResultType" filterName="ResultType" isExposed="True" /> + <Filter entryType="Class" fullName="Tango.FSE.Procedures.UserInput" filterName="UserInput" isExposed="True" /> + </Filter> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Contracts" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Controls" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Converters" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.CSV" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Designer" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Dialogs" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.AddResult" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Connection" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Csv" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Diagnostics" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.RequestUserInputFor" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Send" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.SendContinuous" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Examples.Sql" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Helpers" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Messages" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Navigation" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.ViewModels" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Views" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.FSE.Procedures.Windows" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Information" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Insights" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Jobs" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Logs" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Performance" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.RemoteActions" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.RemoteUpgrade" isExposed="False" /> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.SQL" isExposed="True"> + <Filter entryType="Class" fullName="Tango.PPC.Shared.SQL.ExecuteSqlRequest" filterName="ExecuteSqlRequest" isExposed="False" /> + <Filter entryType="Class" fullName="Tango.PPC.Shared.SQL.ExecuteSqlResponse" filterName="ExecuteSqlResponse" isExposed="False" /> + </Filter> + <Filter entryType="Namespace" fullName="Tango.PPC.Shared.Updates" isExposed="False" /> + <Filter entryType="Namespace" fullName="" isExposed="False" /> + </ApiFilter> <ProjectSummary>This is the global summery for the help file.</ProjectSummary> <NamespaceSummaries> <NamespaceSummaryItem name="(global)" isDocumented="True">This is the global summery for the help file.</NamespaceSummaryItem> @@ -211,10 +212,10 @@ </Content> </ItemGroup> <ItemGroup> - <ProjectReference Include="..\..\..\Tango.DataStore\Tango.DataStore.csproj"> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> <Name>Tango.DataStore</Name> <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> - <Private>True</Private> + <Private>False</Private> </ProjectReference> <ProjectReference Include="..\..\Tango.FSE.Common\Tango.FSE.Common.csproj"> <Name>Tango.FSE.Common</Name> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml new file mode 100644 index 000000000..0541c5dcb --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml @@ -0,0 +1,28 @@ +<UserControl x:Class="Tango.FSE.Procedures.Dialogs.SelectFolderDialogView" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:controls="clr-namespace:Tango.FSE.Common.Controls;assembly=Tango.FSE.Common" + xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:local="clr-namespace:Tango.FSE.Procedures.Dialogs" + mc:Ignorable="d" + Width="600" Height="200" d:DataContext="{d:DesignInstance Type=local:SelectFolderDialogViewVM, IsDesignTimeCreatable=False}" Background="{StaticResource FSE_PrimaryBackgroundLightBrush}" Foreground="{StaticResource FSE_PrimaryForegroundBrush}"> + <Grid Margin="10"> + <DockPanel> + <StackPanel DockPanel.Dock="Top" Orientation="Horizontal"> + <material:PackIcon Kind="FolderOpen" Width="32" Height="32" /> + <TextBlock Margin="10 0 0 0" FontSize="{StaticResource FSE_LargeFontSize}" VerticalAlignment="Center">Select Folder</TextBlock> + </StackPanel> + + <StackPanel Margin="0 10 0 0"> + <TextBlock Text="{Binding Message}"></TextBlock> + + <DockPanel Margin="0 5 0 0"> + <controls:IconButton Command="{Binding BrowseCommand}" Margin="5 0 0 0" DockPanel.Dock="Right" Icon="FolderOpen" /> + <TextBox material:HintAssist.Hint="Selected Folder" material:HintAssist.IsFloating="True" Text="{Binding SelectedFolder}" IsReadOnly="True"></TextBox> + </DockPanel> + </StackPanel> + </DockPanel> + </Grid> +</UserControl> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml.cs new file mode 100644 index 000000000..846ffa67e --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogView.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.FSE.Procedures.Dialogs +{ + /// <summary> + /// Interaction logic for UserFileDialogView.xaml + /// </summary> + public partial class SelectFolderDialogView : UserControl + { + public SelectFolderDialogView() + { + InitializeComponent(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogViewVM.cs new file mode 100644 index 000000000..3e871e0ca --- /dev/null +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Dialogs/SelectFolderDialogViewVM.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Core.Commands; +using Tango.Core.DI; +using Tango.FSE.Common; +using Tango.FSE.Common.Storage; + +namespace Tango.FSE.Procedures.Dialogs +{ + public class SelectFolderDialogViewVM : FSEDialogViewVM + { + [TangoInject] + protected IStorageProvider StorageProvider { get; set; } + + private String _selectedFolder; + public String SelectedFolder + { + get { return _selectedFolder; } + set { _selectedFolder = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } + } + + public String Message { get; set; } + + public RelayCommand BrowseCommand { get; set; } + + public SelectFolderDialogViewVM(String message) + { + TangoIOC.Default.Inject(this); + + AutoMode = true; + Message = message; + + BrowseCommand = new RelayCommand(BrowseForFolder); + } + + private async void BrowseForFolder() + { + var result = await StorageProvider.SelectFolder("Select folder"); + + if (result.Confirmed) + { + SelectedFolder = result.SelectedItem; + } + } + + protected override bool CanOK() + { + return base.CanOK() && SelectedFolder != null; + } + + protected override void Cancel() + { + SelectedFolder = null; + base.Cancel(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/IProcedureContext.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/IProcedureContext.cs index 69b747906..ff45a7df4 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/IProcedureContext.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/IProcedureContext.cs @@ -496,6 +496,13 @@ namespace Tango.FSE.Procedures String RequestFileSave(String message, String extension = "*.*", String defaultFileName = null); /// <summary> + /// Requests a folder path from the user. + /// </summary> + /// <param name="message">The message.</param> + /// <returns></returns> + String RequestFolderSelect(String message); + + /// <summary> /// Updates the procedure user progress. /// </summary> /// <param name="message">The progress message.</param> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureContext.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureContext.cs index 43c969a35..f47f1174e 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureContext.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/ProcedureContext.cs @@ -566,6 +566,22 @@ namespace Tango.FSE.Procedures return result; } + public string RequestFolderSelect(string message) + { + SelectFolderDialogViewVM vm = new SelectFolderDialogViewVM(message); + + TaskCompletionSource<String> completion = new TaskCompletionSource<String>(); + + DispatcherProvider.Invoke(async () => + { + await NotificationProvider.ShowDialog(vm); + completion.SetResult(vm.SelectedFolder); + }); + + var result = completion.Task.GetAwaiter().GetResult(); + return result; + } + public void UpdateProgress(string message, bool isIndeterminate = true, double value = 0, double maximum = 100) { Progress?.Invoke(this, new TangoProgressChangedEventArgs<double>() diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj index 2e7099857..72b3dadd1 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Tango.FSE.Procedures.csproj @@ -134,6 +134,10 @@ <DependentUpon>LoadPublishedProjectView.xaml</DependentUpon> </Compile> <Compile Include="Dialogs\LoadPublishedProjectViewVM.cs" /> + <Compile Include="Dialogs\SelectFolderDialogView.xaml.cs"> + <DependentUpon>SelectFolderDialogView.xaml</DependentUpon> + </Compile> + <Compile Include="Dialogs\SelectFolderDialogViewVM.cs" /> <Compile Include="Dialogs\ProcedureDialogEditorView.xaml.cs"> <DependentUpon>ProcedureDialogEditorView.xaml</DependentUpon> </Compile> @@ -284,7 +288,7 @@ <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> <Name>Tango.CSV</Name> </ProjectReference> - <ProjectReference Include="..\..\..\Tango.DataStore\Tango.DataStore.csproj"> + <ProjectReference Include="..\..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> <Name>Tango.DataStore</Name> </ProjectReference> @@ -350,6 +354,10 @@ <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> </Page> + <Page Include="Dialogs\SelectFolderDialogView.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> <Page Include="Dialogs\ProcedureDialogEditorView.xaml"> <SubType>Designer</SubType> <Generator>MSBuild:Compile</Generator> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Themes/Generic.xaml b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Themes/Generic.xaml index 3917368f2..0e055d730 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Themes/Generic.xaml +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.Procedures/Themes/Generic.xaml @@ -635,7 +635,6 @@ </Style.Triggers> </Style> - <Style x:Key="FSE_Debug_TextBoxStyle" TargetType="TextBox"> <Setter Property="Background" Value="Transparent"></Setter> <Setter Property="BorderBrush" Value="{StaticResource FSE_BorderBrush}"></Setter> diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/OrganizationSelectionViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/OrganizationSelectionViewVM.cs index 9a84cca7d..0abc285a9 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/OrganizationSelectionViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/OrganizationSelectionViewVM.cs @@ -63,7 +63,7 @@ namespace Tango.FSE.UsersAndRoles.ViewModels try { - return Services.OrganizationsService.GetCurrentUserOrganizations().Result.Where(x => x.Name.ToLower().StartsWith(key.ToLower())).Take(4).ToList(); + return Services.OrganizationsService.GetCurrentUserOrganizations().Result.Where(x => x.Name.ToLower().StartsWith(key.ToLower())).ToList(); } catch (Exception ex) { diff --git a/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/UserDetailsViewVM.cs b/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/UserDetailsViewVM.cs index 0e243e02d..20953faa1 100644 --- a/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/UserDetailsViewVM.cs +++ b/Software/Visual_Studio/FSE/Modules/Tango.FSE.UsersAndRoles/ViewModels/UserDetailsViewVM.cs @@ -189,9 +189,10 @@ namespace Tango.FSE.UsersAndRoles.ViewModels { collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineTechnician), Roles.FSETechnician, Roles.FSEAdvancedTechnician)); collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineAdministrator), Roles.FSETechnician, Roles.FSEAdvancedTechnician, Roles.FSEAdministrator, Roles.FSETwineTechnician)); - collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineProcedureDesigner), Roles.FSETechnician)); - collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineProcedurePublisher), Roles.FSETechnician, Roles.FSETwineProcedureDesigner)); - collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineDeveloper), Roles.FSETechnician) { IsVisible = CurrentUser.HasRole(Roles.FSETwineDeveloper) }); + collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineProcedureDesigner), Roles.FSETechnician, Roles.FSEAdvancedTechnician, Roles.FSETwineTechnician)); + collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineProcedurePublisher), Roles.FSETechnician, Roles.FSEAdvancedTechnician, Roles.FSETwineTechnician, Roles.FSETwineProcedureDesigner)); + collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineDataStoreDeveloper), Roles.FSETechnician, Roles.FSEAdvancedTechnician, Roles.FSETwineTechnician)); + collection.Add(new RoleModel(roles.SingleOrDefault(x => x.RoleEnum == Roles.FSETwineDeveloper), Roles.FSETechnician, Roles.FSEAdvancedTechnician, Roles.FSETwineTechnician) { IsVisible = CurrentUser.HasRole(Roles.FSETwineDeveloper) }); } collection.ToList().ForEach(x => x.IsSelected = user.FSERoles.Any(y => y.Code == x.Role.Code)); diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Administrator.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Administrator.csv new file mode 100644 index 000000000..c889f448e --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Administrator.csv @@ -0,0 +1,2 @@ +Administrator +Manage Organization Users And Roles diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Advanced Technician.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Advanced Technician.csv new file mode 100644 index 000000000..35ac5c8ae --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Advanced Technician.csv @@ -0,0 +1,5 @@ +Advanced Technician +Remote Desktop Control +PPC File System Read +Firmware File System Read +Remote Upgrade Online diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.eddx b/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.eddx Binary files differnew file mode 100644 index 000000000..dcabc3bf9 --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.eddx diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.pdf b/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.pdf Binary files differnew file mode 100644 index 000000000..f5bf232bd --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Roles & Permissions.pdf diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Technician.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Technician.csv new file mode 100644 index 000000000..f4a50edef --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Technician.csv @@ -0,0 +1,5 @@ +Technician +Run FSE +Remote Desktop View +PPC File System Read +Remote Upgrade Offline diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Administrator.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Administrator.csv new file mode 100644 index 000000000..42d217a67 --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Administrator.csv @@ -0,0 +1,3 @@ +Twine Administrator +Manage All Organizations Users And Roles +Reset Machine Device Registration diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Data Store Developer.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Data Store Developer.csv new file mode 100644 index 000000000..b1650e363 --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Data Store Developer.csv @@ -0,0 +1,2 @@ +Twine Data Store Developer +DataStore Create diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Developer.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Developer.csv new file mode 100644 index 000000000..93a5fae98 --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Developer.csv @@ -0,0 +1,2 @@ +Twine Developer +DataStore Create Write Global diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Designer.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Designer.csv new file mode 100644 index 000000000..e0bc0e9f3 --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Designer.csv @@ -0,0 +1,2 @@ +Twine Procedure Designer +Run Procedure Designer diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Publisher.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Publisher.csv new file mode 100644 index 000000000..42d81e75e --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Procedure Publisher.csv @@ -0,0 +1,2 @@ +Twine Procedure Publisher +Publish Procedure Projects diff --git a/Software/Visual_Studio/FSE/Roles & Permissions/Twine Technician.csv b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Technician.csv new file mode 100644 index 000000000..2b1ce91aa --- /dev/null +++ b/Software/Visual_Studio/FSE/Roles & Permissions/Twine Technician.csv @@ -0,0 +1,18 @@ +Twine Technician +Connect Any Machine +PPC File System Write +Firmware File System Write +Execute Remote Console Commands +Edit Diagnostics Project +View FSE Logs +Modify Bug Report +View Internal Published Procedures +Run Procedure Project File +Run Configuration Module +Modify Machine Provisioning +Modify Machine Update +Modify Machine Identity +Modify Machine Hardware +DataStore Read +DataStore Write +Reset Machine Counters diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/FSEServicesContainer.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/FSEServicesContainer.cs index e5487bc1e..c8773eccd 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.BL/FSEServicesContainer.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/FSEServicesContainer.cs @@ -63,6 +63,16 @@ namespace Tango.FSE.BL public OrganizationsService OrganizationsService { get; set; } /// <summary> + /// Gets or sets the machine configuration service. + /// </summary> + public MachineConfigurationService MachineConfigurationService { get; set; } + + /// <summary> + /// Gets or sets the data store service. + /// </summary> + public DataStoreService DataStoreService { get; set; } + + /// <summary> /// Initializes a new instance of the <see cref="FSEServicesContainer"/> class. /// </summary> /// <param name="authentication">The authentication.</param> @@ -78,6 +88,8 @@ namespace Tango.FSE.BL PublishedProcedureProjectsService = new PublishedProcedureProjectsService(); MachineEventsService = new MachineEventsService(); OrganizationsService = new OrganizationsService(); + MachineConfigurationService = new MachineConfigurationService(); + DataStoreService = new DataStoreService(); } } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/DataStoreService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/DataStoreService.cs new file mode 100644 index 000000000..2dd29fdc4 --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/DataStoreService.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.BL.Entities; +using Tango.DataStore; + +namespace Tango.FSE.BL.Services +{ + public class DataStoreService : FSEServiceBase + { + public Task<List<GlobalDataStoreItem>> GetGlobalDataStoreItems() + { + return Task.Factory.StartNew<List<GlobalDataStoreItem>>(() => + { + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + return db.GlobalDataStoreItems.ToList().OrderBy(x => x.CollectionName).OrderBy(x => x.Key).ToList(); + } + }); + } + + public Task<List<DataStoreItem>> GetMachinelDataStoreItems(String machineGuid) + { + return Task.Factory.StartNew<List<DataStoreItem>>(() => + { + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + return db.DataStoreItems.Where(x => x.MachineGuid == machineGuid && !x.IsDeleted).ToList().OrderBy(x => x.CollectionName).OrderBy(x => x.Key).ToList(); + } + }); + } + } +} diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineConfigurationService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineConfigurationService.cs new file mode 100644 index 000000000..a30198ff2 --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachineConfigurationService.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.BL.Entities; +using System.Data.Entity; +using Tango.BL.Builders; + +namespace Tango.FSE.BL.Services +{ + public class MachineConfigurationService : FSEServiceBase + { + public class MachineEditingComposition : IDisposable + { + public Machine Machine { get; set; } + public List<Organization> Organizations { get; set; } + public List<HardwareVersion> HardwareVersions { get; set; } + public String TotalDyeTime { get; set; } + public String TotalDyeMeters { get; set; } + internal ObservablesContext Context { get; set; } + + public MachineEditingComposition() + { + Organizations = new List<Organization>(); + HardwareVersions = new List<HardwareVersion>(); + } + + public void Dispose() + { + Context?.Dispose(); + Context = null; + } + } + + public Task<MachineEditingComposition> GetMachineEditingComposition(String machineGuid) + { + return Task.Factory.StartNew<MachineEditingComposition>(() => + { + ObservablesContext db = ObservablesContext.CreateDefault(); + + MachineEditingComposition composition = new MachineEditingComposition(); + + //Organizations + bool allowAll = CurrentUser.HasPermission(Tango.BL.Enumerations.Permissions.FSE_ManageAllOrganizationsUsersAndRoles); + composition.Organizations = db.Organizations.Where(x => allowAll || x.Guid == CurrentUser.OrganizationGuid).Include(x => x.Sites).ToList(); + + //Machine + composition.Machine = new MachineBuilder(db).Set(machineGuid).WithConfiguration().Build(); + + //Hardware Versions + composition.HardwareVersions = db.HardwareVersions.OrderByDescending(x => x.Version).ToList(); + + //Counters + var jobRuns = db.JobRuns.Where(x => x.MachineGuid == machineGuid).Select(x => new { x.StartDate, x.EndDate, x.EndPosition }).ToList(); + composition.TotalDyeTime = TimeSpan.FromHours(jobRuns.Select(x => x.EndDate - x.StartDate).Sum(x => x.TotalHours)).ToStringUnlimitedHours(); + int meters = (int)jobRuns.Select(x => x.EndPosition).Sum(); + composition.TotalDyeMeters = $"{meters.ToString("N0")} meters"; + + composition.Context = db; + + return composition; + }); + } + + public Task<MachineEditingComposition> SaveMachineEditingComposition(MachineEditingComposition composition) + { + return Task.Factory.StartNew<MachineEditingComposition>(() => + { + composition.Machine.SetupFpga = composition.Machine.SetupFirmware; + + composition.Context.SaveChanges(); + composition.Context.Dispose(); + return GetMachineEditingComposition(composition.Machine.Guid).Result; + }); + } + + public Task<int> ResetCounters(String machineGuid) + { + return Task.Factory.StartNew<int>(() => + { + using (ObservablesContext db = new ObservablesContext()) + { + return db.JobRuns.Where(x => x.MachineGuid == machineGuid).DeleteFromQuery(); + } + }); + } + } +} diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs index 6f598a770..c03077a45 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Services/MachinesService.cs @@ -73,7 +73,6 @@ namespace Tango.FSE.BL.Services LogManager.Log("Machine retrieved successfully. Caching machine..."); var cachedMachine = CachedMachine.FromObservable<CachedMachine>(machine); - var m = cachedMachine.ToObservable(); //Store in memory cache. _machinesCache.Put(serialNumber, cachedMachine); @@ -271,12 +270,24 @@ namespace Tango.FSE.BL.Services List<CachedMachine> cachedMachines = new List<CachedMachine>(); - try + foreach (var machine in machines) { - foreach (var machine in machines) + try { var cachedMachine = CachedMachine.FromObservable<CachedMachine>(machine); - _machinesCache.Put(machine.SerialNumber, cachedMachine); + cachedMachines.Add(cachedMachine); + } + catch (Exception ex) + { + LogManager.Log(ex, $"Error creating cached machine (partial) '{machine.SerialNumber}'."); + } + } + + try + { + foreach (var cachedMachine in cachedMachines) + { + _machinesCache.Put(cachedMachine.SerialNumber, cachedMachine); } } catch (Exception ex) @@ -292,7 +303,14 @@ namespace Tango.FSE.BL.Services foreach (var cachedMachine in cachedMachines) { - collection.Upsert(cachedMachine); + try + { + collection.Upsert(cachedMachine); + } + catch (Exception ex) + { + LogManager.Log(ex, $"Error caching machine '{cachedMachine.SerialNumber}' (partial) to disk."); + } } } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.BL/Tango.FSE.BL.csproj b/Software/Visual_Studio/FSE/Tango.FSE.BL/Tango.FSE.BL.csproj index 39257df86..c361f1d3f 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.BL/Tango.FSE.BL.csproj +++ b/Software/Visual_Studio/FSE/Tango.FSE.BL/Tango.FSE.BL.csproj @@ -119,6 +119,8 @@ <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="ReadOnlyEntityRepository.cs" /> <Compile Include="ServicesSettings.cs" /> + <Compile Include="Services\DataStoreService.cs" /> + <Compile Include="Services\MachineConfigurationService.cs" /> <Compile Include="WindowsRegistry\RegistryService.cs" /> <Compile Include="Services\AuthenticationService.cs" /> <Compile Include="Services\BugReportingService.cs" /> @@ -145,6 +147,14 @@ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> <Name>Tango.Core</Name> </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> <ProjectReference Include="..\..\Tango.Logging\Tango.Logging.csproj"> <Project>{bc932dbd-7cdb-488c-99e4-f02cf441f55e}</Project> <Name>Tango.Logging</Name> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Connection/IMachineProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/Connection/IMachineProvider.cs index 9a98477b8..8c4512c41 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Connection/IMachineProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Connection/IMachineProvider.cs @@ -41,7 +41,7 @@ namespace Tango.FSE.Common.Connection MachineConnectionTypes ConnectionType { get; } /// <summary> - /// Gets a value indicating whether the <see cref="ConnectionType"/> equals <see cref="MachineConnectionTypes.Wifi"/> or <see cref="MachineConnectionTypes.SignalR"/>. + /// Gets a value indicating whether the machine is connected and the <see cref="ConnectionType"/> equals <see cref="MachineConnectionTypes.Wifi"/> or <see cref="MachineConnectionTypes.SignalR"/>. /// </summary> bool IsPPCAvailable { get; } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Controls/MachineView.xaml b/Software/Visual_Studio/FSE/Tango.FSE.Common/Controls/MachineView.xaml index c37613e3e..8d375cc6d 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Controls/MachineView.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Controls/MachineView.xaml @@ -47,11 +47,11 @@ </Border> </Grid> - <TextBlock Canvas.Left="532" FontStyle="Italic" Foreground="Gray" Canvas.Top="-22">Hardware</TextBlock> + <!--<TextBlock Canvas.Left="532" FontStyle="Italic" Foreground="Gray" Canvas.Top="-22">Hardware</TextBlock> <Grid Width="97" Height="90" Canvas.Left="431" Canvas.Top="-13"> <Rectangle Stroke="Gray" VerticalAlignment="Top" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/> <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/> - </Grid> + </Grid>--> <UniformGrid Width="310" Canvas.Top="295" Canvas.Left="420" TextElement.Foreground="#252525" Rows="1" Columns="8" TextElement.FontSize="9"> <TextBlock HorizontalAlignment="Center">1</TextBlock> @@ -217,17 +217,17 @@ <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="2" StrokeDashArray="3" RenderTransformOrigin="0.5,0.5"/> </Grid> - <TextBlock Canvas.Top="395" Canvas.Left="331" FontStyle="Italic" Foreground="Gray">Mid Tanks</TextBlock> + <!--<TextBlock Canvas.Top="395" Canvas.Left="331" FontStyle="Italic" Foreground="Gray">Mid Tanks</TextBlock> <Grid Width="62" Height="29" Canvas.Top="418" Canvas.Left="357"> <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="2" StrokeDashArray="4" RenderTransformOrigin="0.5,0.5"/> <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="1" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/> - </Grid> + </Grid>--> - <TextBlock Canvas.Top="469" Canvas.Left="304" FontStyle="Italic" Foreground="Gray">Cartridges</TextBlock> + <!--<TextBlock Canvas.Top="469" Canvas.Left="304" FontStyle="Italic" Foreground="Gray">Cartridges</TextBlock> <Grid Width="87" Height="10" Canvas.Top="487" Canvas.Left="332"> <Rectangle Stroke="Gray" VerticalAlignment="Bottom" StrokeThickness="2" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/> <Rectangle Stroke="Gray" HorizontalAlignment="Left" StrokeThickness="2" StrokeDashArray="5" RenderTransformOrigin="0.5,0.5"/> - </Grid> + </Grid>--> <Grid x:Name="gridTablet" Width="67" IsHitTestVisible="True" SnapsToDevicePixels="True" ClipToBounds="True" Height="90" Canvas.Left="188" Canvas.Top="198"> <Grid.RowDefinitions> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IDataStoreProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IDataStoreProvider.cs new file mode 100644 index 000000000..a54766893 --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IDataStoreProvider.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.DataStore.Editing; + +namespace Tango.FSE.Common.DataStore +{ + public interface IDataStoreProvider + { + bool AcceptFirmwareChanges { get; set; } + Task<DataStoreModel> GetDataStoreModel(String machineGuid); + Task<DataStoreModel> UpdateDataStoreModel(DataStoreModel model, String machineGuid); + } +} diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IRemoteDataStoreManager.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IRemoteDataStoreManager.cs index 02cc3ac9d..162c109be 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IRemoteDataStoreManager.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/DataStore/IRemoteDataStoreManager.cs @@ -9,6 +9,6 @@ namespace Tango.FSE.Common.DataStore { public interface IRemoteDataStoreManager : IDataStoreManager { - + } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/INotificationProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/INotificationProvider.cs index 3c7350be7..027555022 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/INotificationProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/INotificationProvider.cs @@ -138,7 +138,7 @@ namespace Tango.FSE.Common.Notifications /// <param name="okText">The ok text.</param> /// <param name="cancelText">The cancel text.</param> /// <returns></returns> - Task<InputBoxResult> ShowInputBox(String title, String message, PackIconKind icon = PackIconKind.InfoOutline, String defaultInput = null, String inputHint = null, int? maxChars = null, String okText = null, String cancelText = null); + Task<InputBoxResult> ShowInputBox(String title, String message, PackIconKind icon = PackIconKind.InfoOutline, String defaultInput = null, String inputHint = null, int? maxChars = null, String okText = null, String cancelText = null, Func<String, String> validationFunc = null); /// <summary> /// Shows a question message box. diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/InputBoxVM.cs b/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/InputBoxVM.cs index 7744d04d0..415c6cfc5 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/InputBoxVM.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Notifications/InputBoxVM.cs @@ -14,11 +14,45 @@ namespace Tango.FSE.Common.Notifications public int MaxCharacters { get; set; } + internal Func<String,String> ValidationFunction { get; set; } + private String _input; public String Input { get { return _input; } - set { _input = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); } + set + { + _input = value; + RaisePropertyChangedAuto(); + + if (_input.IsNotNullOrEmpty()) + { + if (ValidationFunction != null) + { + Error = ValidationFunction.Invoke(_input); + } + } + else + { + Error = null; + } + + RaisePropertyChanged(nameof(HasValidationError)); + + InvalidateRelayCommands(); + } + } + + public bool HasValidationError + { + get { return !String.IsNullOrWhiteSpace(Error); } + } + + private String _error; + public String Error + { + get { return _error; } + set { _error = value; RaisePropertyChangedAuto(); } } public InputBoxVM() : base() @@ -28,7 +62,7 @@ namespace Tango.FSE.Common.Notifications protected override bool CanOK() { - return base.CanOK() && Input.IsNotNullOrEmpty(); + return base.CanOK() && Input.IsNotNullOrEmpty() && !HasValidationError; } } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Resources/Styles.xaml b/Software/Visual_Studio/FSE/Tango.FSE.Common/Resources/Styles.xaml index 24c4e91ec..4b5d8f8d2 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Resources/Styles.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Resources/Styles.xaml @@ -3,11 +3,14 @@ xmlns:editors="clr-namespace:Tango.AutoComplete.Editors;assembly=Tango.AutoComplete" xmlns:actions="clr-namespace:Tango.FSE.Common.EventTriggerActions" xmlns:material="http://materialdesigninxaml.net/winfx/xaml/themes" + xmlns:controls="clr-namespace:Tango.SharedUI.Controls;assembly=Tango.SharedUI" xmlns:wpf="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:Tango.FSE.Common.Resources"> + + <Style x:Key="FSE_FlatButton_OpacityHover" TargetType="Button" BasedOn="{StaticResource MaterialDesignToolForegroundButton}"> <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter> <Style.Triggers> @@ -821,4 +824,252 @@ </Setter> </Style> + <Style x:Key="FSE_Game_GroupBox" TargetType="GroupBox"> + <Setter Property="Foreground" Value="{StaticResource FSE_PrimaryForegroundBrush}"></Setter> + <Setter Property="Background" Value="{StaticResource FSE_PrimaryBackgroundMidBrush}"></Setter> + <Setter Property="BorderBrush" Value="{StaticResource FSE_PrimaryBackgroundLightBrush}"></Setter> + <Setter Property="FontSize" Value="{StaticResource FSE_SmallFontSize}"></Setter> + <Setter Property="Padding" Value="8"></Setter> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="GroupBox"> + <DockPanel> + <Grid DockPanel.Dock="Top"> + <Polygon HorizontalAlignment="Left" VerticalAlignment="Top" Width="{Binding ElementName=border,Path=ActualWidth}" Height="{Binding ElementName=border,Path=ActualHeight}" Fill="{StaticResource FSE_PrimaryBackgroundLighterBrush}" Stretch="Fill" Points="0,0 100,0 130,30 0,30"></Polygon> + + <Grid VerticalAlignment="Top"> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="40*" /> + <ColumnDefinition Width="60*" /> + </Grid.ColumnDefinitions> + <Border VerticalAlignment="Top" Padding="0 0 50 0" x:Name="border"> + <Border Padding="{TemplateBinding Padding}" TextElement.FontSize="{StaticResource FSE_DefaultFontSize}"> + <ContentPresenter Content="{TemplateBinding Header}" /> + </Border> + </Border> + </Grid> + </Grid> + <Border TextElement.Foreground="{TemplateBinding Foreground}" TextElement.FontSize="{TemplateBinding FontSize}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" CornerRadius="0 3 3 3" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1"> + <ContentPresenter Content="{TemplateBinding Content}" /> + </Border> + </DockPanel> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style TargetType="{x:Type controls:SearchComboBox}" BasedOn="{StaticResource MaterialDesignComboBox}"> + <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Once"></Setter> + <Setter Property="ItemTemplate"> + <Setter.Value> + <DataTemplate> + <TextBlock Text="{Binding}"></TextBlock> + </DataTemplate> + </Setter.Value> + </Setter> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type controls:SearchComboBox}"> + <Border Background="{TemplateBinding Background}" + BorderBrush="{TemplateBinding BorderBrush}" + BorderThickness="{TemplateBinding BorderThickness}"> + + <Grid Background="Transparent"> + <DockPanel> + <Grid VerticalAlignment="Center" Margin="15 10 0 10" DockPanel.Dock="Right" Width="8" Height="8"> + <Path Stretch="Uniform" Data="M7,10L12,15L17,10H7Z" Fill="{StaticResource FSE_GrayBrush}"> + + </Path> + </Grid> + <ContentControl Focusable="False" FocusVisualStyle="{x:Null}" VerticalAlignment="Bottom" Margin="0 0 0 5" Content="{TemplateBinding SelectedItem}" ContentTemplate="{TemplateBinding ItemTemplate}"> + + </ContentControl> + </DockPanel> + <ToggleButton x:Name="btnToggle" Focusable="False" FocusVisualStyle="{x:Null}" KeyboardNavigation.DirectionalNavigation="Once" Opacity="0" Style="{x:Null}" IsChecked="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=IsOpened,Mode=TwoWay}"> + + </ToggleButton> + + <Popup StaysOpen="False" MinWidth="{Binding ElementName=btnToggle,Path=ActualWidth}" PlacementTarget="{Binding ElementName=btnToggle}" Placement="Bottom" IsOpen="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=IsOpened,Mode=TwoWay}" MaxHeight="{TemplateBinding MaxDropDownHeight}" AllowsTransparency="True"> + <Border Margin="5" Background="{StaticResource WhiteBrush}" CornerRadius="3" Padding="5" MinWidth="{Binding ElementName=btnToggle,Path=ActualWidth}"> + <Border.Effect> + <DropShadowEffect ShadowDepth="0" /> + </Border.Effect> + <DockPanel> + <TextBox x:Name="txt" KeyboardNavigation.DirectionalNavigation="Once" DockPanel.Dock="Top" Margin="10" Padding="0 5" Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=SearchFilter,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox> + <ListBox x:Name="list" FocusVisualStyle="{x:Null}" ItemsSource="{TemplateBinding ListItemsSource}" ItemTemplate="{TemplateBinding ItemTemplate}" DisplayMemberPath="{TemplateBinding DisplayMemberPath}"> + + </ListBox> + </DockPanel> + </Border> + </Popup> + </Grid> + + </Border> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style TargetType="{x:Type ToggleButton}"> + <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/> + <Setter Property="Foreground" Value="{DynamicResource PrimaryHueMidForegroundBrush}"/> + <Setter Property="Background" Value="{DynamicResource PrimaryHueMidBrush}"/> + <Setter Property="wpf:ToggleButtonAssist.SwitchTrackOnBackground" Value="Black"/> + <Setter Property="wpf:ToggleButtonAssist.SwitchTrackOffBackground" Value="Black"/> + <Setter Property="BorderThickness" Value="1"/> + <Setter Property="Padding" Value="0 1 0 0"/> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="{x:Type ToggleButton}"> + <ControlTemplate.Resources> + <SineEase x:Key="RippleEasingFunction" EasingMode="EaseInOut"/> + <Storyboard x:Key="ShowRipple"> + <DoubleAnimation Storyboard.TargetName="RippleThumb" Storyboard.TargetProperty="Opacity" + EasingFunction="{StaticResource RippleEasingFunction}" + To="0.26" Duration="0"/> + <DoubleAnimation Storyboard.TargetName="RippleThumb" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleX)" + EasingFunction="{StaticResource RippleEasingFunction}" + From="1" To="2.5" Duration="0:0:0.2"/> + <DoubleAnimation Storyboard.TargetName="RippleThumb" Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" + EasingFunction="{StaticResource RippleEasingFunction}" + From="1" To="2.5" Duration="0:0:0.2"/> + </Storyboard> + <Storyboard x:Key="HideRipple"> + <DoubleAnimation Storyboard.TargetName="RippleThumb" Storyboard.TargetProperty="Opacity" + EasingFunction="{StaticResource RippleEasingFunction}" + To="0" Duration="0:0:0.3"/> + </Storyboard> + </ControlTemplate.Resources> + <Viewbox Width="34"> + <VisualStateManager.VisualStateGroups> + <VisualStateGroup x:Name="CheckStates"> + <VisualStateGroup.Transitions> + <VisualTransition From="*" To="Checked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ThumbHolder"> + <EasingDoubleKeyFrame KeyTime="0" Value="0"/> + <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="23.5"> + <EasingDoubleKeyFrame.EasingFunction> + <QuadraticEase EasingMode="EaseOut"/> + </EasingDoubleKeyFrame.EasingFunction> + </EasingDoubleKeyFrame> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </VisualTransition> + <VisualTransition From="Checked" To="Unchecked"> + <Storyboard> + <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ThumbHolder"> + <EasingDoubleKeyFrame KeyTime="0" Value="23.5"/> + <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"> + <EasingDoubleKeyFrame.EasingFunction> + <QuadraticEase EasingMode="EaseOut"/> + </EasingDoubleKeyFrame.EasingFunction> + </EasingDoubleKeyFrame> + </DoubleAnimationUsingKeyFrames> + </Storyboard> + </VisualTransition> + </VisualStateGroup.Transitions> + <VisualState x:Name="Checked"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ThumbHolder" + Duration="0" To="23.5" /> + </Storyboard> + </VisualState> + <VisualState x:Name="Unchecked"> + <Storyboard> + <DoubleAnimation Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" Storyboard.TargetName="ThumbHolder" + Duration="0" To="0" /> + </Storyboard> + </VisualState> + </VisualStateGroup> + </VisualStateManager.VisualStateGroups> + <Grid> + <Rectangle x:Name="Track" + Fill= "{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ToggleButtonAssist.SwitchTrackOffBackground)}" + Opacity="0.26" + HorizontalAlignment="Left" + Height="15" + Margin="4.211,5,4.211,0" + Stroke="{x:Null}" + VerticalAlignment="Top" + Width="40" + RadiusY="7.5" + RadiusX="7.5"/> + <Grid x:Name="ThumbHolder" + HorizontalAlignment="Left" VerticalAlignment="Top"> + <Ellipse x:Name="RippleThumb" + Fill="{DynamicResource PrimaryHueLightBrush}" + Height="25" Width="25" + IsHitTestVisible="False" + Opacity="0.26" + Margin="0" + HorizontalAlignment="Center" VerticalAlignment="Center" + RenderTransformOrigin="0.5,0.5"> + <Ellipse.RenderTransform> + <ScaleTransform ScaleX="1" ScaleY="1"/> + </Ellipse.RenderTransform> + </Ellipse> + <AdornerDecorator CacheMode="{Binding RelativeSource={RelativeSource Self}, Path=(wpf:ShadowAssist.CacheMode)}"> + <Ellipse x:Name="Thumb" + Fill="#707070" Stroke="{x:Null}" + HorizontalAlignment="Center" VerticalAlignment="Center" + Width="25" Height="25" + Margin="0,0,0,0" + RenderTransformOrigin="0.5,0.5" + Effect="{DynamicResource MaterialDesignShadowDepth1}"> + </Ellipse> + </AdornerDecorator> + <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" + Margin="{TemplateBinding Padding}" + x:Name="ContentPresenter" + HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" + FlowDirection="LeftToRight"/> + <Grid.RenderTransform> + <TranslateTransform X="0" Y="0"/> + </Grid.RenderTransform> + </Grid> + </Grid> + </Viewbox> + <ControlTemplate.Triggers> + <Trigger Property="IsChecked" Value="True"> + <Setter TargetName="Thumb" Property="Fill" Value="{StaticResource FSE_PrimaryAccentBrush}" /> + <Setter TargetName="Track" Property="Fill" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ToggleButtonAssist.SwitchTrackOnBackground)}" /> + <Setter Property="Foreground" Value="{DynamicResource PrimaryHueMidForegroundBrush}"/> + </Trigger> + <MultiTrigger> + <MultiTrigger.Conditions> + <Condition Property="IsChecked" Value="True" /> + <Condition Property="wpf:ToggleButtonAssist.HasOnContent" Value="True" /> + </MultiTrigger.Conditions> + <Setter TargetName="ContentPresenter" Property="Content" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ToggleButtonAssist.OnContent)}" /> + <Setter TargetName="ContentPresenter" Property="ContentTemplate" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(wpf:ToggleButtonAssist.OnContentTemplate)}" /> + </MultiTrigger> + <Trigger Property="IsChecked" Value="False"> + <Setter Property="Foreground" Value="{DynamicResource PrimaryHueMidBrush}"/> + <!-- Need to set Foreground to Background here instead of hardcoded PrimaryHueMidBrush --> + </Trigger> + <Trigger Property="Button.IsDefaulted" Value="true"/> + <Trigger Property="IsMouseOver" Value="true"/> + <Trigger Property="IsPressed" Value="true"> + <Trigger.EnterActions> + <BeginStoryboard Storyboard="{StaticResource ShowRipple}"/> + </Trigger.EnterActions> + <Trigger.ExitActions> + <BeginStoryboard Storyboard="{StaticResource HideRipple}"/> + </Trigger.ExitActions> + </Trigger> + <Trigger Property="IsEnabled" Value="false"> + <Setter TargetName="Thumb" Property="Fill" Value="{StaticResource FSE_PrimaryBackgroundLightBrush}" /> + <Setter TargetName="Track" Property="Fill" Value="{StaticResource FSE_PrimaryBackgroundLightBrush}" /> + </Trigger> + </ControlTemplate.Triggers> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style TargetType="Separator"> + <Setter Property="Background" Value="{StaticResource FSE_PrimaryBackgroundLightBrush}"></Setter> + </Style> + </ResourceDictionary>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.Common/Tango.FSE.Common.csproj b/Software/Visual_Studio/FSE/Tango.FSE.Common/Tango.FSE.Common.csproj index 4f0cb622b..9a43bb5fb 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.Common/Tango.FSE.Common.csproj +++ b/Software/Visual_Studio/FSE/Tango.FSE.Common/Tango.FSE.Common.csproj @@ -188,6 +188,7 @@ <Compile Include="Converters\TimeSpanHumanizeConverter.cs" /> <Compile Include="Core\FSEProgress.cs" /> <Compile Include="DashboardTile.cs" /> + <Compile Include="DataStore\IDataStoreProvider.cs" /> <Compile Include="DataStore\IRemoteDataStoreManager.cs" /> <Compile Include="DemoMode\DemoModeCommand.cs" /> <Compile Include="DemoMode\IDemoModeManager.cs" /> @@ -505,7 +506,11 @@ <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> <Name>Tango.Core</Name> </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore\Tango.DataStore.csproj"> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Editing\Tango.DataStore.Editing.csproj"> + <Project>{ee088ff7-04d1-41fb-9d6a-cedeee7a7b9c}</Project> + <Name>Tango.DataStore.Editing</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> <Name>Tango.DataStore</Name> </ProjectReference> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/App.config b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/App.config new file mode 100644 index 000000000..4ef5218a0 --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/App.config @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <configSections> + <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> + <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> + </configSections> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> + </startup> + <entityFramework> + <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> + <providers> + <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> + </providers> + </entityFramework> + <runtime> + <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> + <dependentAssembly> + <assemblyIdentity name="Microsoft.IdentityModel.Clients.ActiveDirectory" publicKeyToken="31bf3856ad364e35" culture="neutral" /> + <bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="5.0.5.0" /> + </dependentAssembly> + </assemblyBinding> + </runtime> +</configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Program.cs b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Program.cs new file mode 100644 index 000000000..9eb0fb7b6 --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Program.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.BL.Entities; +using Tango.CSV; + +namespace Tango.FSE.DPGraphGenerator +{ + class Program + { + private class RolePermission + { + public String Name { get; set; } + + public override string ToString() + { + return Name; + } + } + + private class RoleModel + { + public String Name { get; set; } + public List<RolePermission> Permissions { get; set; } + + public RoleModel() + { + Permissions = new List<RolePermission>(); + } + } + + static void Main(string[] args) + { + String outputFolder = Path.GetFullPath(@"..\..\..\Roles & Permissions"); + + Console.WriteLine($"Generating roles and permissions csv files to '{outputFolder}'..."); + + List<RoleModel> models = new List<RoleModel>(); + + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var roles = db.Roles.ToList(); + var roles_permissions = db.RolesPermissions.ToList(); + var permissions = db.Permissions.ToList(); + + foreach (var role in roles.Where(x => x.Name.Contains("FSE")).ToList()) + { + RoleModel model = new RoleModel(); + model.Name = role.Description; + + List<Permission> role_permissions = role.RolesPermissions.Select(x => x.Permission).ToList(); + + foreach (var permission in role_permissions.OrderBy(x => x.Code)) + { + model.Permissions.Add(new RolePermission() { Name = permission.Name.Replace("FSE_", "") }); + } + + models.Add(model); + } + } + + Directory.CreateDirectory(outputFolder); + + foreach (var model in models) + { + Console.WriteLine($"Generating role '{model.Name}'..."); + + using (DynamicCsvFile csvFile = new DynamicCsvFile(Path.Combine(outputFolder, $"{model.Name}.csv"))) + { + csvFile.Columns.Add(new DynamicCsvFileColumn() { Name = model.Name }); + + foreach (var permission in model.Permissions) + { + csvFile.Append(permission); + } + } + } + + Console.WriteLine(); + Console.WriteLine("Done!, press return to exit..."); + Console.ReadLine(); + } + } +} diff --git a/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Properties/AssemblyInfo.cs b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..4cec0e5fd --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Tango.FSE.DPGraphGenerator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.FSE.DPGraphGenerator")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c57d9d68-336c-4665-9ef4-ec1bdbb84885")] + +// 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/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Tango.FSE.DPGraphGenerator.csproj b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Tango.FSE.DPGraphGenerator.csproj new file mode 100644 index 000000000..ae2b84d7c --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/Tango.FSE.DPGraphGenerator.csproj @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{C57D9D68-336C-4665-9EF4-EC1BDBB84885}</ProjectGuid> + <OutputType>Exe</OutputType> + <RootNamespace>Tango.FSE.DPGraphGenerator</RootNamespace> + <AssemblyName>Tango.FSE.DPGraphGenerator</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> + <Deterministic>true</Deterministic> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.dll</HintPath> + </Reference> + <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> + </Reference> + <Reference Include="System" /> + <Reference Include="System.ComponentModel.DataAnnotations" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + <None Include="packages.config" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Tango.BL\Tango.BL.csproj"> + <Project>{f441feee-322a-4943-b566-110e12fd3b72}</Project> + <Name>Tango.BL</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.CSV\Tango.CSV.csproj"> + <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> + <Name>Tango.CSV</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/packages.config b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/packages.config new file mode 100644 index 000000000..b3daf0d6c --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.DPGraphGenerator/packages.config @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<packages> + <package id="EntityFramework" version="6.2.0" targetFramework="net461" /> +</packages>
\ No newline at end of file diff --git a/Software/Visual_Studio/FSE/Tango.FSE.LogViewer.UI/Views/LogFileTabView.xaml b/Software/Visual_Studio/FSE/Tango.FSE.LogViewer.UI/Views/LogFileTabView.xaml index 8f06dac0d..92064f9fd 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.LogViewer.UI/Views/LogFileTabView.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.LogViewer.UI/Views/LogFileTabView.xaml @@ -16,7 +16,7 @@ Background="{StaticResource FSE_PrimaryBackgroundDarkBrush}" Foreground="{StaticResource FSE_PrimaryForegroundBrush}"> <Grid> - <DataGrid Visibility="{Binding IsEmbedded,Converter={StaticResource BooleanToVisibilityInverseConverter}}" Margin="0 5 0 0" Style="{StaticResource FSE_LogsGridStyle}" ItemsSource="{Binding Logs}" SelectedItem="{Binding SelectedLog}" CellStyle="{StaticResource FSE_LogsGridCellStyle}" CanUserSortColumns="True"> + <DataGrid Visibility="{Binding IsEmbedded,Converter={StaticResource BooleanToVisibilityInverseConverter}}" Margin="0 5 0 0" Style="{StaticResource FSE_LogsGridStyle}" ItemsSource="{Binding Logs}" SelectedItem="{Binding SelectedLog}" CellStyle="{StaticResource FSE_LogsGridCellStyle}" CanUserSortColumns="True" CanUserResizeColumns="True"> <DataGrid.Resources> <components:BindingProxy x:Key="proxy" Data="{Binding}" /> </DataGrid.Resources> @@ -24,6 +24,7 @@ <DataGridTemplateColumn Header="#" Width="40" CellTemplate="{StaticResource FSE_LogIcon_Cell}"/> <DataGridTextColumn Header="DATE TIME" Binding="{Binding TimeStamp,StringFormat='HH:mm:ss.ff'}" Width="100" /> <DataGridTextColumn Header="SERVICE" Binding="{Binding ClassName}" Width="200" /> + <DataGridTextColumn Header="LN" Binding="{Binding CallerLineNumber}" Width="60" /> <DataGridTemplateColumn Header="MESSAGE" Width="1*" > <DataGridTemplateColumn.CellTemplate> <DataTemplate> @@ -34,7 +35,7 @@ </DataGrid.Columns> </DataGrid> - <DataGrid Visibility="{Binding IsEmbedded,Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0 5 0 0" Style="{StaticResource FSE_LogsGridStyle}" ItemsSource="{Binding Logs}" SelectedItem="{Binding SelectedLog}" CellStyle="{StaticResource FSE_LogsGridCellStyle}" CanUserSortColumns="True"> + <DataGrid Visibility="{Binding IsEmbedded,Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0 5 0 0" Style="{StaticResource FSE_LogsGridStyle}" ItemsSource="{Binding Logs}" SelectedItem="{Binding SelectedLog}" CellStyle="{StaticResource FSE_LogsGridCellStyle}" CanUserSortColumns="True" CanUserResizeColumns="True"> <DataGrid.Resources> <components:BindingProxy x:Key="proxy" Data="{Binding}" /> </DataGrid.Resources> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Connection/DefaultMachineProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/Connection/DefaultMachineProvider.cs index 94b035ab5..aad63fdf9 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Connection/DefaultMachineProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Connection/DefaultMachineProvider.cs @@ -342,6 +342,7 @@ namespace Tango.FSE.UI.Connection { IsConnected = false; IsBusy = false; + Machine = null; OnMachineDisconnected(MachineOperator, null); } } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Controls/NotificationsControl.xaml b/Software/Visual_Studio/FSE/Tango.FSE.UI/Controls/NotificationsControl.xaml index 4e6ada6b5..4a2510552 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Controls/NotificationsControl.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Controls/NotificationsControl.xaml @@ -336,10 +336,14 @@ <commonControls:IconButton Icon="Close" Padding="5" Cursor="Hand" Margin="0 0 5 0" Command="{Binding CloseCommand}" CommandParameter="{Binding}" HorizontalAlignment="Right" Width="{Binding RelativeSource={RelativeSource Self},Path=ActualHeight}"/> </Grid> - <StackPanel Grid.Row="1" Margin="40" VerticalAlignment="Top"> - <TextBlock Foreground="{StaticResource FSE_PrimaryForegroundBrush}" Text="{Binding Message}" TextWrapping="Wrap"></TextBlock> - <TextBox x:Name="txtInput" KeyDown="TxtInput_KeyDown" Margin="0 20 0 0" Text="{Binding Input,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MaxLength="{Binding MaxCharacters}" material:HintAssist.Hint="{Binding InputHint}" /> - </StackPanel> + <Grid Grid.Row="1" Margin="40" VerticalAlignment="Top"> + <StackPanel> + <TextBlock Foreground="{StaticResource FSE_PrimaryForegroundBrush}" Text="{Binding Message}" TextWrapping="Wrap"></TextBlock> + <TextBox x:Name="txtInput" KeyDown="TxtInput_KeyDown" Margin="0 20 0 0" Text="{Binding Input,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" MaxLength="{Binding MaxCharacters}" material:HintAssist.Hint="{Binding InputHint}" /> + </StackPanel> + + <TextBlock VerticalAlignment="Bottom" Margin="0 0 0 -20" TextWrapping="Wrap" Foreground="{StaticResource FSE_ErrorBrush}" FontSize="{StaticResource FSE_SmallFontSize}" Text="{Binding Error}" Visibility="{Binding HasValidationError,Converter={StaticResource BooleanToVisibilityConverter}}"></TextBlock> + </Grid> <StackPanel HorizontalAlignment="Right" Grid.Row="2" Margin="10" Orientation="Horizontal"> <Button MinWidth="150" x:Name="btnInputCancel" Height="Auto" Style="{StaticResource FSE_RaisedButton_Dark_Hover}" Margin="0 0 10 0" Command="{Binding CloseCommand}" Visibility="{Binding HasCancel,Converter={StaticResource BooleanToVisibilityConverter}}" Content="{Binding CancelText}"></Button> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/DefaultDataStoreProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/DefaultDataStoreProvider.cs new file mode 100644 index 000000000..7b8e6684d --- /dev/null +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/DataStore/DefaultDataStoreProvider.cs @@ -0,0 +1,366 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.BL; +using Tango.BL.DTO; +using Tango.BL.Entities; +using Tango.Core; +using Tango.Core.DI; +using Tango.DataStore; +using Tango.DataStore.Editing; +using Tango.DataStore.EF; +using Tango.DataStore.Remote; +using Tango.FSE.BL; +using Tango.FSE.Common.Connection; +using Tango.FSE.Common.DataStore; + +namespace Tango.FSE.UI.DataStore +{ + public class DefaultDataStoreProvider : ExtendedObject, IDataStoreProvider + { + private DataStoreModel _lastModel; + private IMachineProvider MachineProvider { get; set; } + + [TangoInject] + private FSEServicesContainer Services { get; set; } + + private bool _acceptFirmwareChanges; + public bool AcceptFirmwareChanges + { + get { return _acceptFirmwareChanges; } + set { _acceptFirmwareChanges = value; RaisePropertyChangedAuto(); } + } + + public DefaultDataStoreProvider(IMachineProvider machineProvider) + { + MachineProvider = machineProvider; + MachineProvider.MachineConnected += MachineProvider_MachineConnected; + } + + private void MachineProvider_MachineConnected(object sender, MachineConnectedEventArgs e) + { + _lastModel = null; + + if (MachineProvider.IsPPCAvailable) + { + LogManager.Log("Starting listening for data store changes..."); + + MachineProvider.MachineOperator.SendGenericContinuousRequest<RemoteDataStoreStartListenRequest, RemoteDataStoreStartListenResponse>(new RemoteDataStoreStartListenRequest()).Subscribe((response) => + { + if (response.ChangeType != RemoteDataStoreChangeType.None) + { + LogManager.Log($"Data store change received for '{response.CollectionName}.{response.Item.Key}'..."); + OnDataStoreItemChanged(response); + } + }, (ex) => + { + if (!(ex is Transport.TransporterDisconnectedException)) + { + LogManager.Log(ex, "Error occurred on data store changes listener."); + } + }, () => + { + //Nothing. + }); + } + } + + private void OnDataStoreItemChanged(RemoteDataStoreStartListenResponse response) + { + try + { + if (_lastModel != null && AcceptFirmwareChanges) + { + DataStoreCollectionModel collectionModel = _lastModel.Collections.FirstOrDefault(x => x.Name == response.CollectionName); + + if (collectionModel == null) + { + collectionModel = new DataStoreCollectionModel(); + collectionModel.Name = response.CollectionName; + _lastModel.Collections.Add(collectionModel); + } + + var remoteItem = response.Item; + + var itemModel = collectionModel.Items.FirstOrDefault(x => x.Guid == remoteItem.Guid); + + if (itemModel == null) + { + itemModel = DataStoreItemModel.FromLocalDataStoreItem(remoteItem, null); + itemModel.ExistsOnMachine = true; + collectionModel.Items.Add(itemModel); + } + else + { + itemModel.Value = remoteItem.Value; + itemModel.Type = remoteItem.Type; + itemModel.Date = remoteItem.Date; + } + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error occurred while processing a data store item remote change."); + } + } + + public Task<DataStoreModel> GetDataStoreModel(String machineGuid) + { + return Task.Factory.StartNew<DataStoreModel>(() => + { + DataStoreModel model = new DataStoreModel(); + + List<GlobalDataStoreItem> globalItems = Services.DataStoreService.GetGlobalDataStoreItems().Result; + List<DataStoreItem> localItems = Services.DataStoreService.GetMachinelDataStoreItems(machineGuid).Result; + + List<DataStoreItemModel> itemsModels = new List<DataStoreItemModel>(); + + //Get machine items from db. + foreach (var collection in localItems.GroupBy(x => x.CollectionName)) + { + DataStoreCollectionModel collectionModel = new DataStoreCollectionModel(); + collectionModel.Name = collection.First().CollectionName; + + foreach (var item in collection) + { + GlobalDataStoreItem globalItem = globalItems.FirstOrDefault(x => x.CollectionName == item.CollectionName && x.Key == item.Key); + + if (globalItem != null) + { + globalItems.Remove(globalItem); + } + + DataStoreItemModel itemModel = DataStoreItemModel.FromLocalDataStoreItem(item.ToDataStoreItem(), globalItem?.ToDataStoreItem()); + collectionModel.Items.Add(itemModel); + } + + model.Collections.Add(collectionModel); + } + + //Get machine items from connected machine. + if (MachineProvider.IsPPCAvailable && machineGuid == MachineProvider.Machine.Guid) + { + var response = MachineProvider.MachineOperator.SendGenericRequest<RemoteDataStoreGetAllItemsRequest, RemoteDataStoreGetAllItemsResponse>(new RemoteDataStoreGetAllItemsRequest(), new Transport.TransportRequestConfig() { Timeout = TimeSpan.FromSeconds(30) }).Result; + + foreach (var collection in response.Collections) + { + DataStoreCollectionModel collectionModel = model.Collections.FirstOrDefault(x => x.Name == collection.Name); + + if (collectionModel == null) + { + collectionModel = new DataStoreCollectionModel(); + collectionModel.Name = collection.Name; + model.Collections.Add(collectionModel); + } + + foreach (var remoteItem in collection.Items) + { + var localItem = collectionModel.Items.FirstOrDefault(x => x.Key == remoteItem.Key); + + if (localItem != null) + { + localItem.ExistsOnMachine = true; + } + + if (localItem != null && remoteItem.Date > localItem.Date) + { + localItem.Value = remoteItem.Value; + localItem.OriginalValue = remoteItem.Value; + localItem.Type = remoteItem.Type; + localItem.Date = remoteItem.Date; + } + else if (localItem == null) + { + GlobalDataStoreItem globalItem = globalItems.FirstOrDefault(x => x.CollectionName == collection.Name && x.Key == remoteItem.Key); + + if (globalItem != null) + { + globalItems.Remove(globalItem); + } + + DataStoreItemModel itemModel = DataStoreItemModel.FromLocalDataStoreItem(remoteItem, globalItem?.ToDataStoreItem()); + itemModel.ExistsOnMachine = true; + collectionModel.Items.Add(itemModel); + } + + } + } + } + + //Get global items without overrides from db. + foreach (var collection in globalItems.GroupBy(x => x.CollectionName)) + { + DataStoreCollectionModel collectionModel = model.Collections.FirstOrDefault(x => x.Name == collection.First().CollectionName); + + if (collectionModel == null) + { + collectionModel = new DataStoreCollectionModel(); + collectionModel.Name = collection.First().CollectionName; + model.Collections.Add(collectionModel); + } + + foreach (var item in collection) + { + DataStoreItemModel itemModel = DataStoreItemModel.FromGlobalDataStoreItem(item.ToDataStoreItem()); + collectionModel.Items.Add(itemModel); + } + } + + + _lastModel = model; + return model; + }); + } + + private class SaveModel + { + public String CollectionName { get; set; } + public DataStoreItemModel Item { get; set; } + } + + public Task<DataStoreModel> UpdateDataStoreModel(DataStoreModel model, String machineGuid) + { + return Task.Factory.StartNew<DataStoreModel>(() => + { + List<SaveModel> globals = new List<SaveModel>(); + List<SaveModel> locals = new List<SaveModel>(); + List<SaveModel> deleted = new List<SaveModel>(); + UpdateDataStoreRequest updateRequest = new UpdateDataStoreRequest(); + + foreach (var collection in model.Collections.Where(x => !x.IsDeleted)) + { + foreach (var item in collection.Items) + { + if (item.IsGlobal) + { + globals.Add(new SaveModel() { CollectionName = collection.Name, Item = item }); + } + else if (item.IsDeleted) + { + deleted.Add(new SaveModel() { CollectionName = collection.Name, Item = item }); + } + else if (item.HasDifference || (MachineProvider.IsPPCAvailable && !item.ExistsOnMachine)) + { + locals.Add(new SaveModel() { CollectionName = collection.Name, Item = item }); + } + } + } + + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var allItems = db.DataStoreItems.Where(x => x.MachineGuid == machineGuid).ToList(); + + //Deleted collections + foreach (var deletedCollection in model.Collections.Where(x => x.IsDeleted)) + { + foreach (var itemDb in allItems.ToList()) + { + if (itemDb.CollectionName == deletedCollection.Name) + { + itemDb.IsDeleted = true; + itemDb.LastUpdated = DateTime.UtcNow; + itemDb.IsSynchronized = false; + updateRequest.ToDelete.Add(itemDb.Guid); + } + } + } + + //Deleted items + foreach (var item in deleted) + { + var itemDb = allItems.FirstOrDefault(x => x.CollectionName == item.CollectionName && x.Key == item.Item.Key); + if (itemDb != null) + { + itemDb.IsDeleted = true; + itemDb.LastUpdated = DateTime.UtcNow; + itemDb.IsSynchronized = false; + updateRequest.ToDelete.Add(itemDb.Guid); + } + } + + //locals + foreach (var item in locals) + { + DataStoreItem itemDb = allItems.FirstOrDefault(x => x.CollectionName == item.CollectionName && x.Key == item.Item.Key); + + if (itemDb == null) //new local item. + { + itemDb = new DataStoreItem(); + itemDb.MachineGuid = machineGuid; + itemDb.CollectionName = item.CollectionName; + itemDb.Key = item.Item.Key; + itemDb.LastUpdated = DateTime.UtcNow; + itemDb.DataType = (int)item.Item.Type; + itemDb.Value = EFDataStoreHelper.CreateBytes(item.Item.Type, item.Item.Value); + db.DataStoreItems.Add(itemDb); + updateRequest.ToUpsert.Add(DataStoreItemDTO.FromObservable(itemDb)); + } + else //update local item only if changed... + { + bool upsert = MachineProvider.IsPPCAvailable && !item.Item.ExistsOnMachine; + + if (itemDb.IsDeleted) //restore if item was deleted.. + { + itemDb.IsDeleted = false; + itemDb.LastUpdated = DateTime.UtcNow; + itemDb.IsSynchronized = false; + upsert = true; + } + + //update item only if it has difference although "locals" already contains only differences. + var bytes = EFDataStoreHelper.CreateBytes(item.Item.Type, item.Item.Value); + + if (itemDb.DataType != (int)item.Item.Type || !Enumerable.SequenceEqual(itemDb.Value, bytes)) + { + itemDb.DataType = (int)item.Item.Type; + itemDb.Value = bytes; + itemDb.LastUpdated = DateTime.UtcNow; + itemDb.IsSynchronized = false; + upsert = true; + } + + if (upsert) + { + updateRequest.ToUpsert.Add(DataStoreItemDTO.FromObservable(itemDb)); + } + } + } + + if (MachineProvider.IsPPCAvailable && machineGuid == MachineProvider.Machine.Guid) + { + //Direct Sync Here. + //Make all items "IsSynchronized = true" if success. + var response = MachineProvider.MachineOperator.SendGenericRequest<UpdateDataStoreRequest, UpdateDataStoreResponse>(updateRequest, new Transport.TransportRequestConfig() { Timeout = TimeSpan.FromSeconds(30) }).Result; + + allItems.ForEach(x => x.IsSynchronized = true); + } + + db.SaveChanges(); + } + + return GetDataStoreModel(machineGuid).Result; + }); + } + + private void ValidateCollectionAndKey(String collection = null, String key = null) + { + if (collection != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(collection)) + { + throw new ArgumentException("Collection name contains invalid characters."); + } + } + + if (key != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(key)) + { + throw new ArgumentException("Item key contains invalid characters."); + } + } + } + } +} diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/FileAssociation/DefaultFileAssociationProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/FileAssociation/DefaultFileAssociationProvider.cs index 0d582cb11..89364cbbd 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/FileAssociation/DefaultFileAssociationProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/FileAssociation/DefaultFileAssociationProvider.cs @@ -19,6 +19,7 @@ namespace Tango.FSE.UI.FileAssociation { private Dictionary<String, Action<FileAssociationPackage>> _handlers; private IpcServer _ipcServer; + private bool _initialized; public const string FILE_ASSOCIATION_PREFIX = "-file"; public const int FILE_ASSOCIATION_ARGS_COUNT = 3; @@ -44,6 +45,10 @@ namespace Tango.FSE.UI.FileAssociation public async void OnApplicationReady(IFSEApplicationManager applicationManager) { + if (!_initialized) return; + + _initialized = true; + try { LogManager.Log("Starting file association IPC service..."); diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs index 4992953c2..7299a836d 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Notifications/DefaultNotificationProvider.cs @@ -340,7 +340,7 @@ namespace Tango.FSE.UI.Notifications return source.Task; } - public Task<InputBoxResult> ShowInputBox(string title, string message, PackIconKind icon = PackIconKind.InformationOutline, string defaultInput = null, string inputHint = null, int? maxChars = null, string okText = null, string cancelText = null) + public Task<InputBoxResult> ShowInputBox(string title, string message, PackIconKind icon = PackIconKind.InformationOutline, string defaultInput = null, string inputHint = null, int? maxChars = null, string okText = null, string cancelText = null, Func<String, String> validationFunc = null) { TaskCompletionSource<InputBoxResult> source = new TaskCompletionSource<InputBoxResult>(); @@ -350,6 +350,8 @@ namespace Tango.FSE.UI.Notifications vm.Icon = icon; vm.Input = defaultInput; vm.InputHint = inputHint; + vm.ValidationFunction = validationFunc; + if (maxChars != null) { vm.MaxCharacters = maxChars.Value; diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/Properties/AssemblyInfo.cs index fa70e630e..964eb990b 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Properties/AssemblyInfo.cs @@ -8,5 +8,4 @@ using System.Windows; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Tango FSE")] -[assembly: AssemblyVersion("1.1.1.0")] - +[assembly: AssemblyVersion("1.1.1.0")] diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Tango.FSE.UI.csproj b/Software/Visual_Studio/FSE/Tango.FSE.UI/Tango.FSE.UI.csproj index 6c5b993b5..4a1934404 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Tango.FSE.UI.csproj +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Tango.FSE.UI.csproj @@ -261,6 +261,7 @@ <Compile Include="Converters\MidTankLevelToElementHeightConverter.cs" /> <Compile Include="Converters\StringToFirstLetterConverter.cs" /> <Compile Include="Cryptography\DefaultCryptographyProvider.cs" /> + <Compile Include="DataStore\DefaultDataStoreProvider.cs" /> <Compile Include="DataStore\DefaultRemoteDataStoreManager.cs" /> <Compile Include="DataStore\RemoteDataStoreCollection.cs" /> <Compile Include="DemoMode\DefaultDemoModeManager.cs" /> @@ -600,6 +601,10 @@ </None> </ItemGroup> <ItemGroup> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.CLI\Tango.DataStore.CLI.csproj"> + <Project>{6189b8c3-7af9-43dd-8a61-a8a05f526f62}</Project> + <Name>Tango.DataStore.CLI</Name> + </ProjectReference> <ProjectReference Include="..\..\PPC\Tango.PPC.Shared\Tango.PPC.Shared.csproj"> <Project>{208C8BD8-72C6-4E3C-ACAA-351091A2ACC7}</Project> <Name>Tango.PPC.Shared</Name> @@ -640,11 +645,19 @@ <Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project> <Name>Tango.DAL.Remote</Name> </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Editing\Tango.DataStore.Editing.csproj"> + <Project>{EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}</Project> + <Name>Tango.DataStore.Editing</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> <Name>Tango.DataStore.Remote</Name> </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore\Tango.DataStore.csproj"> + <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> <Project>{E0364DFA-0721-4637-9D32-9D22AAC109D6}</Project> <Name>Tango.DataStore</Name> </ProjectReference> @@ -716,6 +729,10 @@ <Project>{ac5b4be7-d607-4a38-98f8-b87aca468313}</Project> <Name>Tango.FSE.Insights</Name> </ProjectReference> + <ProjectReference Include="..\Modules\Tango.FSE.MachineConfiguration\Tango.FSE.MachineConfiguration.csproj"> + <Project>{15bcb5bb-731e-4e2d-aa28-75485050a8dc}</Project> + <Name>Tango.FSE.MachineConfiguration</Name> + </ProjectReference> <ProjectReference Include="..\Modules\Tango.FSE.PPCConsole\Tango.FSE.PPCConsole.csproj"> <Project>{866b916a-207c-43f0-b403-7c4a820c2e11}</Project> <Name>Tango.FSE.PPCConsole</Name> @@ -926,7 +943,9 @@ if $(ConfigurationName) == Release del *.pdb attrib -r Tango* if $(ConfigurationName) == Release RD /S /Q "$(TargetDir)ProtoCompilers\" -if $(ConfigurationName) == Release RD /S /Q "$(TargetDir)Roslyn\"</PostBuildEvent> +if $(ConfigurationName) == Release RD /S /Q "$(TargetDir)Roslyn\" + +if $(ConfigurationName) == Release del WebRtc.NET.pdb</PostBuildEvent> </PropertyGroup> <Import Project="..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets" Condition="Exists('..\..\packages\MaterialDesignThemes.3.0.1\build\MaterialDesignThemes.targets')" /> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Tiles/Events/EventsTileView.xaml b/Software/Visual_Studio/FSE/Tango.FSE.UI/Tiles/Events/EventsTileView.xaml index 7963cb733..508ebb6b7 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Tiles/Events/EventsTileView.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Tiles/Events/EventsTileView.xaml @@ -39,7 +39,7 @@ </Grid> </Grid> <StackPanel Margin="10 0 0 0"> - <TextBlock>active events summery:</TextBlock> + <TextBlock>active events summary:</TextBlock> <StackPanel TextElement.FontSize="{StaticResource FSE_SmallFontSize}" Margin="0 20 0 0"> <DockPanel Margin="0 5"> diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModelLocator.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModelLocator.cs index fd514b7ac..e9d18d777 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModelLocator.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModelLocator.cs @@ -117,6 +117,7 @@ namespace Tango.FSE.UI TangoIOC.Default.Unregister<IRemoteActionsProvider>(); TangoIOC.Default.Unregister<IActionLogManager>(); TangoIOC.Default.Unregister<IRemoteDataStoreManager>(); + TangoIOC.Default.Unregister<IDataStoreProvider>(); //TangoIOC.Default.Unregister<ExternalBridgeScanner>(); //TangoIOC.Default.Unregister<IDiagnosticsFrameProvider>(); //TangoIOC.Default.Unregister<IEventLogger>(); @@ -160,6 +161,7 @@ namespace Tango.FSE.UI TangoIOC.Default.Register<IInsightsProvider, DefaultInsightsProvider>(); TangoIOC.Default.Register<IRemoteActionsProvider, DefaultRemoteActionsProvider>(); TangoIOC.Default.Register<IRemoteDataStoreManager, DefaultRemoteDataStoreManager>(); + TangoIOC.Default.Register<IDataStoreProvider, DefaultDataStoreProvider>(); TangoIOC.Default.Register<MainWindowVM>(); diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModels/LoginViewVM.cs b/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModels/LoginViewVM.cs index 70a68918a..67b8a1145 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModels/LoginViewVM.cs +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/ViewModels/LoginViewVM.cs @@ -69,6 +69,11 @@ namespace Tango.FSE.UI.ViewModels set { _email = value; RaisePropertyChangedAuto(); RaisePropertyChanged(nameof(DisplayEnvironment)); InvalidateRelayCommands(); } } + public String ProcessedEmail + { + get { return Email.ToStringOrEmpty().EndsWith("TEST") ? Email.Replace("TEST", "") : Email; } + } + private String _password; /// <summary> /// Gets or sets the user password. @@ -158,7 +163,7 @@ namespace Tango.FSE.UI.ViewModels /// </summary> public bool DisplayEnvironment { - get { return Email.IsNotNullOrEmpty() && Email.ToLower().EndsWith("@twine-s.com"); } + get { return Email.IsNotNullOrEmpty() && (Email.ToLower().EndsWith("@twine-s.com") || Email.EndsWith("TEST")); } } #endregion @@ -288,7 +293,7 @@ namespace Tango.FSE.UI.ViewModels { try { - LogManager.Log($"Logging in user '{Email}'..."); + LogManager.Log($"Logging in user '{ProcessedEmail}'..."); if (!Validate()) { @@ -303,7 +308,7 @@ namespace Tango.FSE.UI.ViewModels } SelectedView = LoginViews.Logging; - var result = await AuthenticationProvider.Login(Email, Password, SelectedEnvironment, (status) => Status = status); + var result = await AuthenticationProvider.Login(ProcessedEmail, Password, SelectedEnvironment, (status) => Status = status); if (result.Response.PasswordChangeRequired) { @@ -327,7 +332,7 @@ namespace Tango.FSE.UI.ViewModels } catch (Exception ex) { - LogManager.Log(ex, $"Error occurred while trying to login user '{Email}'."); + LogManager.Log(ex, $"Error occurred while trying to login user '{ProcessedEmail}'."); IsFree = true; SelectedView = LoginViews.Login; await NotificationProvider.ShowError(GetErrorMessage(ex)); @@ -379,7 +384,7 @@ namespace Tango.FSE.UI.ViewModels IsFree = false; SelectedView = LoginViews.ChangingPassword; await Task.Delay(1000); - await AuthenticationProvider.ChangePassword(Email, CurrentPassword, NewPassword); + await AuthenticationProvider.ChangePassword(ProcessedEmail, CurrentPassword, NewPassword); Password = null; SelectedView = LoginViews.Login; Status = "Password changed..."; @@ -387,7 +392,7 @@ namespace Tango.FSE.UI.ViewModels } catch (Exception ex) { - LogManager.Log(ex, $"Error updating password for user '{Email}'."); + LogManager.Log(ex, $"Error updating password for user '{ProcessedEmail}'."); await NotificationProvider.ShowError($"Error updating your password.\n{ex.FlattenMessage()}"); SelectedView = LoginViews.ChangePassword; } @@ -428,7 +433,7 @@ namespace Tango.FSE.UI.ViewModels { IsFree = false; SelectedView = LoginViews.SendingForgotPasswordEmail; - await Services.AuthenticationService.SendForgotPasswordEmail(Email, SelectedEnvironment); + await Services.AuthenticationService.SendForgotPasswordEmail(ProcessedEmail, SelectedEnvironment); SelectedView = LoginViews.Login; await NotificationProvider.ShowSuccess("The email was delivered successfully!\nPlease check your email account."); } diff --git a/Software/Visual_Studio/FSE/Tango.FSE.UI/Views/EventsView.xaml b/Software/Visual_Studio/FSE/Tango.FSE.UI/Views/EventsView.xaml index 98f03a0f1..c3715700b 100644 --- a/Software/Visual_Studio/FSE/Tango.FSE.UI/Views/EventsView.xaml +++ b/Software/Visual_Studio/FSE/Tango.FSE.UI/Views/EventsView.xaml @@ -176,7 +176,7 @@ </Grid> </Grid> <StackPanel Margin="10 0 0 0"> - <TextBlock>active events summery:</TextBlock> + <TextBlock>active events summary:</TextBlock> <StackPanel TextElement.FontSize="{StaticResource FSE_SmallFontSize}" Margin="0 20 0 0"> <DockPanel Margin="0 5"> diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs index 9c4c2281d..0f439c83d 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/ViewModels/MainViewVM.cs @@ -28,6 +28,7 @@ using Tango.MachineStudio.RML.Models; using Tango.BL.ActionLogs; using Tango.MachineStudio.Common.Authentication; using Tango.BL.DTO; +using Tango.Core.Cryptography; namespace Tango.MachineStudio.MachineDesigner.ViewModels { @@ -475,7 +476,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels ActiveMachineAdapter.ApplicationOsVersions = (await ActiveMachineAdapter.Context.ApplicationOsVersions.ToListAsync()).ToObservableCollection(); ActiveMachineAdapter.EmbeddedFirmwareVersions = (await ActiveMachineAdapter.Context.EmbeddedFirmwareVersions.ToListAsync()).ToObservableCollection(); ActiveMachineAdapter.DispenserTypes = (await ActiveMachineAdapter.Context.DispenserTypes.ToListAsync()).ToObservableCollection(); - ActiveMachineAdapter.LiquidTypes = (await ActiveMachineAdapter.Context.LiquidTypes.ToListAsync()).ToObservableCollection(); + ActiveMachineAdapter.LiquidTypes = (await ActiveMachineAdapter.Context.LiquidTypes.ToListAsync()).OrderBy(x => x.PreferredIndex).ToObservableCollection(); ActiveMachineAdapter.MidTankTypes = (await ActiveMachineAdapter.Context.MidTankTypes.ToListAsync()).ToObservableCollection(); ActiveMachineAdapter.CartridgeTypes = (await ActiveMachineAdapter.Context.CartridgeTypes.ToListAsync()).ToObservableCollection(); ActiveMachineAdapter.IdsPackFormulas = (await ActiveMachineAdapter.Context.IdsPackFormulas.ToListAsync()).ToObservableCollection(); @@ -504,6 +505,7 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels ActiveMachine.IsDeviceRegistered = false; ActiveMachine.DeviceId = null; ActiveMachine.DeviceName = null; + ActiveMachine.ActivationKey = null; ActiveMachineAdapter.Context.Machines.Add(ActiveMachine); } } @@ -642,6 +644,17 @@ namespace Tango.MachineStudio.MachineDesigner.ViewModels ActiveMachine.Configuration.HardwareVersionChanged += Configuration_HardwareVersionChanged; + while (ActiveMachine.ActivationKey == null) //Generate a random password and make sure no machine matches it. + { + ActiveMachine.ActivationKey = PasswordGenerator.Generate(8, PasswordGenerator.PasswordType.Alpha, PasswordGenerator.PasswordCasing.Upper); + if (await ActiveMachineAdapter.Context.Machines.Where(x => x.ActivationKey == ActiveMachine.ActivationKey).CountAsync() == 0) + { + break; + } + + ActiveMachine.ActivationKey = null; + } + View.NavigateTo(MachineDesignerNavigationView.MachineDetailsView); } catch (Exception ex) diff --git a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs index a6b7f8ce9..736c2ebca 100644 --- a/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.UI/Properties/AssemblyInfo.cs @@ -4,5 +4,5 @@ using System.Runtime.InteropServices; [assembly: System.Windows.ThemeInfo(System.Windows.ResourceDictionaryLocation.None, System.Windows.ResourceDictionaryLocation.SourceAssembly)] [assembly: AssemblyTitle("Tango - Machine Studio")] -[assembly: AssemblyVersion("4.2.1.0")] +[assembly: AssemblyVersion("4.2.3.0")] [assembly: ComVisible(false)]
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/ViewModels/MainViewVM.cs b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/ViewModels/MainViewVM.cs index 3f6024b38..ef1126261 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/ViewModels/MainViewVM.cs @@ -19,6 +19,8 @@ using Tango.PPC.Common; using Tango.PPC.Common.Connection; using Tango.PPC.Common.ExternalBridge; using Tango.PPC.Common.Messages; +using Tango.PPC.Common.OS; +using Tango.PPC.Common.UWF; using Tango.SharedUI.Components; using Tango.WiFi; @@ -30,8 +32,17 @@ namespace Tango.PPC.MachineSettings.ViewModels /// <seealso cref="Tango.PPC.Common.PPCViewModel" /> public class MainViewVM : PPCViewModel { + private TimeZoneInfo _previousTimeZone; + private bool _previousEnableUWF; + #region Properties + [TangoInject] + private IOperationSystemManager OperationSystemManager { get; set; } + + [TangoInject] + private IUnifiedWriteFilterManager UnifiedWriteFilterManager { get; set; } + private Machine _machine; public Machine Machine { @@ -151,6 +162,34 @@ namespace Tango.PPC.MachineSettings.ViewModels set { _autoCheckForUpdates = value; RaisePropertyChangedAuto(); } } + private List<TimeZoneInfo> _timeZones; + /// <summary> + /// Gets or sets the available time zones. + /// </summary> + public List<TimeZoneInfo> TimeZones + { + get { return _timeZones; } + set { _timeZones = value; RaisePropertyChangedAuto(); } + } + + private TimeZoneInfo _selectedTimeZone; + /// <summary> + /// Gets or sets the selected time zone. + /// </summary> + public TimeZoneInfo SelectedTimeZone + { + get { return _selectedTimeZone; } + set { _selectedTimeZone = value; RaisePropertyChangedAuto(); } + } + + private bool _enableUWF; + public bool EnableUWF + { + get { return _enableUWF; } + set { _enableUWF = value; RaisePropertyChangedAuto(); } + } + + #endregion #region Commands @@ -210,6 +249,55 @@ namespace Tango.PPC.MachineSettings.ViewModels Settings.Save(); await MachineProvider.SaveMachine(); + + if (_previousTimeZone.ToStringSafe() != SelectedTimeZone.ToStringSafe()) + { + if (await NotificationProvider.ShowQuestion("Changing the time zone requires the application to restart. Do you wish to restart the application?")) + { + try + { + LogManager.Log($"Setting new time zone to '{SelectedTimeZone.ToString()}'."); + NotificationProvider.SetGlobalBusyMessage("Setting new time zone..."); + await OperationSystemManager.ChangeTimeZone(SelectedTimeZone); + NotificationProvider.ReleaseGlobalBusyMessage(); + ApplicationManager.Restart(); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error changing the time zone."); + NotificationProvider.ReleaseGlobalBusyMessage(); + await NotificationProvider.ShowError($"Error setting timezone.\n{ex.FlattenMessage()}"); + } + } + } + + if (_previousEnableUWF != EnableUWF) + { + await NotificationProvider.ShowWarning("Changes to disk protection (UWF) will take effect only after a full system restart."); + + try + { + LogManager.Log($"Changing UWF mode to '{EnableUWF}'."); + if (EnableUWF) + { + NotificationProvider.SetGlobalBusyMessage("Enabling disk protection (UWF)..."); + await UnifiedWriteFilterManager.Enable(); + } + else + { + NotificationProvider.SetGlobalBusyMessage("Disabling disk protection (UWF)..."); + await UnifiedWriteFilterManager.Disable(); + } + NotificationProvider.ReleaseGlobalBusyMessage(); + } + catch (Exception ex) + { + NotificationProvider.ReleaseGlobalBusyMessage(); + LogManager.Log(ex, "Error setting UWF mode."); + await NotificationProvider.ShowError($"Could not change the disk protection mode\n{ex.FlattenMessage()}"); + } + } + await NavigationManager.NavigateBack(); } } @@ -224,7 +312,14 @@ namespace Tango.PPC.MachineSettings.ViewModels /// </summary> public override void OnApplicationStarted() { - + try + { + TimeZones = OperationSystemManager.GetAvailableTimeZones().ToList(); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error retrieving available time zones."); + } } public async override void OnApplicationReady() @@ -239,7 +334,7 @@ namespace Tango.PPC.MachineSettings.ViewModels } } - public override void OnNavigatedTo() + public async override void OnNavigatedTo() { base.OnNavigatedTo(); @@ -274,6 +369,19 @@ namespace Tango.PPC.MachineSettings.ViewModels SynchronizeDiagnostics = Settings.SynchronizeDiagnostics; AutoCheckForUpdates = Settings.AutoCheckForUpdates; + + SelectedTimeZone = TimeZones.SingleOrDefault(x => x.StandardName == TimeZone.CurrentTimeZone.StandardName); + _previousTimeZone = SelectedTimeZone; + + try + { + EnableUWF = await UnifiedWriteFilterManager.IsEnabled(); + _previousEnableUWF = EnableUWF; + } + catch (Exception ex) + { + LogManager.Log(ex, "Error getting UWF status."); + } } private async void OnEnableRemoteAssistanceChanged() diff --git a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml index c8e2d4fff..ba3516be4 100644 --- a/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml +++ b/Software/Visual_Studio/PPC/Modules/Tango.PPC.MachineSettings/Views/MainView.xaml @@ -87,7 +87,7 @@ </touch:TouchExpander> <!--JOBS--> - <touch:TouchExpander Margin="0 20 0 0" Header="JOBS" IsExpanded="True" FontSize="{StaticResource TangoExpanderHeaderFontSize}"> + <touch:TouchExpander Margin="0 20 0 0" Header="Jobs" IsExpanded="True" FontSize="{StaticResource TangoExpanderHeaderFontSize}"> <StackPanel> <controls:TableGrid Margin="10" RowHeight="70" MakeFirstColumnVerticalAlignmentBottom="False" TextElement.FontSize="{StaticResource TangoDefaultFontSize}"> <TextBlock VerticalAlignment="Center">Supported Job Types</TextBlock> @@ -253,6 +253,21 @@ </StackPanel> </touch:TouchExpander> + <!--DATE & TIME--> + <touch:TouchExpander Margin="0 20 0 0" Header="Date & Time" IsExpanded="True" FontSize="{StaticResource TangoExpanderHeaderFontSize}" Visibility="{Binding ApplicationManager.IsInTechnicianMode,Converter={StaticResource BooleanToVisibilityConverter}}"> + <StackPanel Margin="10 30 10 10"> + + <DockPanel TextElement.FontSize="{StaticResource TangoDefaultFontSize}"> + <StackPanel> + <TextBlock VerticalAlignment="Center">Time Zone</TextBlock> + <touch:TouchComboBox Margin="0 10 0 0" ItemsSource="{Binding TimeZones}" SelectedItem="{Binding SelectedTimeZone,Mode=TwoWay}"> + + </touch:TouchComboBox> + </StackPanel> + </DockPanel> + </StackPanel> + </touch:TouchExpander> + <!--TECHNICIAN--> <touch:TouchExpander Visibility="{Binding ApplicationManager.IsInTechnicianMode,Converter={StaticResource BooleanToVisibilityConverter}}" Margin="0 20 0 0" Header="Advanced" IsExpanded="True" FontSize="{StaticResource TangoExpanderHeaderFontSize}"> <StackPanel Margin="10 30 10 10"> @@ -337,6 +352,11 @@ <touch:TouchNumericTextBox Minimum="1" Maximum="120" KeyboardContainer="{Binding ElementName=Container}" Value="{Binding Settings.InsightsMaxStorageDuration,Converter={StaticResource TimeSpanToDaysConverter}}" Margin="0 0 100 0" DockPanel.Dock="Right" HorizontalAlignment="Right" Width="90"></touch:TouchNumericTextBox> </DockPanel> + <DockPanel Margin="0 20 0 0" TextElement.FontSize="{StaticResource TangoDefaultFontSize}"> + <TextBlock VerticalAlignment="Center">Enable UWF (Disk Protection)</TextBlock> + <touch:TouchToggleSlider IsChecked="{Binding EnableUWF}" Margin="0 0 100 0" DockPanel.Dock="Right" Style="{StaticResource TangoToggleButtonGrayAccent}" HorizontalAlignment="Right" Width="90"></touch:TouchToggleSlider> + </DockPanel> + <DockPanel Margin="0 20 0 0"> <touch:TouchIcon VerticalAlignment="Top" Icon="InformationOutline" Foreground="{StaticResource TangoGrayTextBrush}"></touch:TouchIcon> <TextBlock Margin="10 0 0 0" VerticalAlignment="Top" TextWrapping="Wrap" FontSize="{StaticResource TangoSmallFontSize}" Foreground="{StaticResource TangoGrayTextBrush}"> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/ImageGalleryControl.xaml b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/ImageGalleryControl.xaml index f3b45d5b8..495335ff1 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/ImageGalleryControl.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Controls/ImageGalleryControl.xaml @@ -88,7 +88,7 @@ </ListBox.ItemContainerStyle> </ListBox> - <controls:NavigationControl x:Name="navigationControl" TransitionType="Slide" TransitionDuration="00:00:0.2" SelectedIndex="{TemplateBinding SelectedIndex}"> + <controls:NavigationControl x:Name="navigationControl" GalleryMode="True" TransitionType="Slide" TransitionDuration="00:00:0.2" SelectedIndex="{TemplateBinding SelectedIndex}"> </controls:NavigationControl> </DockPanel> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs index ddc0f6cdb..4d2e9c1df 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/DataStore/DefaultDataStoreService.cs @@ -17,18 +17,33 @@ using Tango.PPC.Common.ExternalBridge; using Tango.Transport; using Tango.Core.ExtensionMethods; using Newtonsoft.Json.Linq; +using Tango.BL; +using Tango.DataStore.Editing; +using Newtonsoft.Json; +using Tango.Core; namespace Tango.PPC.Common.DataStore { [TangoCreateWhenRegistered] - public class DefaultDataStoreService : IDataStoreService, IExternalBridgeRequestHandler + public class DefaultDataStoreService : ExtendedObject, IDataStoreService, IExternalBridgeRequestHandler { private IDataStoreManager _manager; + private IMachineProvider _machineProvider; + private List<ListerReceiver> _listenerReceivers; + + private class ListerReceiver + { + public String Token { get; set; } + public ExternalBridgeReceiver Receiver { get; set; } + } public DefaultDataStoreService(IPPCExternalBridgeService externalBridge, IMachineProvider machineProvider) { externalBridge.RegisterRequestHandler(this); + + _listenerReceivers = new List<ListerReceiver>(); + _machineProvider = machineProvider; machineProvider.MachineOperator.RegisterRequestHandler<PutDataStoreItemRequest>(OnPutDataStoreItemRequest); machineProvider.MachineOperator.RegisterRequestHandler<GetDataStoreItemRequest>(OnGetDataStoreItemRequest); } @@ -53,6 +68,7 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStorePutRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStorePutRequest(RemoteDataStorePutRequest request, String token, ExternalBridgeReceiver receiver) { + ValidateCollectionAndKey(request.Collection, request.Key); GetManager().GetCollection(request.Collection).Put(request.Key, request.Value); await receiver.SendGenericResponse(new RemoteDataStorePutResponse(), token); } @@ -60,6 +76,8 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetRequest(RemoteDataStoreGetRequest request, String token, ExternalBridgeReceiver receiver) { + ValidateCollectionAndKey(request.Collection, request.Key); + if (request.DefaultValue is JObject obj) { request.DefaultValue = DataStoreProtoObject.FromJObject(obj); @@ -76,6 +94,8 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetItemRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreGetItemRequest(RemoteDataStoreGetItemRequest request, String token, ExternalBridgeReceiver receiver) { + ValidateCollectionAndKey(request.Collection, request.Key); + if (request.DefaultValue is JObject obj) { request.DefaultValue = DataStoreProtoObject.FromJObject(obj); @@ -101,6 +121,7 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreDeleteRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreDeleteRequest(RemoteDataStoreDeleteRequest request, String token, ExternalBridgeReceiver receiver) { + throw new InvalidOperationException("Deleting from the data store is not allowed."); GetManager().GetCollection(request.Collection).Delete(request.Key); await receiver.SendGenericResponse(new RemoteDataStoreDeleteResponse(), token); } @@ -108,6 +129,7 @@ namespace Tango.PPC.Common.DataStore [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreDeleteAllRequest), RequestHandlerLoggingMode.LogRequestName)] public async Task OnRemoteDataStoreDeleteAllRequest(RemoteDataStoreDeleteAllRequest request, String token, ExternalBridgeReceiver receiver) { + throw new InvalidOperationException("Deleting from the data store is not allowed."); GetManager().GetCollection(request.Collection).DeleteAll(); await receiver.SendGenericResponse(new RemoteDataStoreDeleteAllResponse(), token); } @@ -132,6 +154,117 @@ namespace Tango.PPC.Common.DataStore }, token); } + [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreGetAllItemsRequest), RequestHandlerLoggingMode.LogRequestName)] + public async Task OnRemoteDataStoreGetAllItemsRequest(RemoteDataStoreGetAllItemsRequest request, String token, ExternalBridgeReceiver receiver) + { + List<RemoteDataStoreCollection> collections = new List<RemoteDataStoreCollection>(); + + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var items = db.DataStoreItems.Where(x => !x.IsDeleted).ToList(); + + foreach (var itemsGroup in items.GroupBy(x => x.CollectionName)) + { + RemoteDataStoreCollection collection = new RemoteDataStoreCollection(); + collection.Name = itemsGroup.First().CollectionName; + collections.Add(collection); + + foreach (var item in itemsGroup) + { + collection.Items.Add(CreateRemoteItem(item.ToDataStoreItem())); + } + } + } + + await receiver.SendGenericResponse(new RemoteDataStoreGetAllItemsResponse() + { + Collections = collections + }, token); + } + + [ExternalBridgeRequestHandlerMethod(typeof(UpdateDataStoreRequest), RequestHandlerLoggingMode.LogRequestName)] + public async Task OnUpdateDataStoreRequest(UpdateDataStoreRequest request, String token, ExternalBridgeReceiver receiver) + { + using (ObservablesContext db = ObservablesContext.CreateDefault()) + { + var allItems = db.DataStoreItems.ToList(); + + foreach (var guid in request.ToDelete) + { + var item = allItems.FirstOrDefault(x => x.Guid == guid); + if (item != null) + { + item.IsDeleted = true; + item.IsSynchronized = true; + item.LastUpdated = DateTime.UtcNow; + } + } + + foreach (var item in request.ToUpsert) + { + ValidateCollectionAndKey(item.CollectionName, item.Key); + } + + foreach (var item in request.ToUpsert) + { + var itemDb = allItems.FirstOrDefault(x => x.CollectionName == item.CollectionName && x.Key == item.Key); + + if (itemDb == null) + { + itemDb = new BL.Entities.DataStoreItem(); + itemDb.Guid = item.Guid; + db.DataStoreItems.Add(itemDb); + } + + itemDb.CollectionName = item.CollectionName; + itemDb.DataType = item.DataType; + itemDb.IsDeleted = item.IsDeleted; + itemDb.IsSynchronized = true; + itemDb.Key = item.Key; + itemDb.LastUpdated = item.LastUpdated; + itemDb.Value = item.Value; + } + + db.SaveChanges(); + + if (_machineProvider.IsConnected) + { + Core.Threading.ThreadFactory.StartNew(() => + { + foreach (var item in request.ToUpsert) + { + try + { + var response = _machineProvider.MachineOperator.SendRequest<DataStoreItemModifiedRequest, DataStoreItemModifiedResponse>(new DataStoreItemModifiedRequest() + { + Collection = item.CollectionName, + Key = item.Key + }).Result; + } + catch (Exception ex) + { + Logging.LogManager.Default.Log(ex, $"Error notifying firmware about data store item change '{item.CollectionName}.{item.Key}'."); + } + } + }); + } + } + + await receiver.SendGenericResponse(new UpdateDataStoreResponse(), token); + } + + [ExternalBridgeRequestHandlerMethod(typeof(RemoteDataStoreStartListenRequest), RequestHandlerLoggingMode.LogRequestName)] + public async Task OnRemoteDataStoreStartListenRequest(RemoteDataStoreStartListenRequest request, String token, ExternalBridgeReceiver receiver) + { + _listenerReceivers.Add(new ListerReceiver() { Receiver = receiver, Token = token }); + + await receiver.SendGenericResponse(new RemoteDataStoreStartListenResponse() + { + ChangeType = RemoteDataStoreChangeType.None, + Item = null + }, token); + } + private RemoteDataStoreItem CreateRemoteItem(IDataStoreItem item) { RemoteDataStoreItem remote = new RemoteDataStoreItem(); @@ -149,8 +282,40 @@ namespace Tango.PPC.Common.DataStore { try { + ValidateCollectionAndKey(request.Collection, request.Key); + GetManager().GetCollection(request.Collection).Put(request.Key, GetPMRValue(request.Item)); await transporter.SendResponse(new PutDataStoreItemResponse(), token); + + try + { + if (_listenerReceivers.Count > 0) + { + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key); + var remoteItem = CreateRemoteItem(item); + + foreach (var listener in _listenerReceivers.ToList()) + { + try + { + await listener.Receiver.SendGenericResponse(new RemoteDataStoreStartListenResponse() + { + ChangeType = RemoteDataStoreChangeType.Modified, + CollectionName = request.Collection, + Item = remoteItem + }, listener.Token); + } + catch (Exception ex) + { + LogManager.Log(ex, $"Error sending data store item notification to receiver '{listener.Receiver.Adapter.ToString()}'"); + } + } + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error generating data store item notifications."); + } } catch (Exception ex) { @@ -173,6 +338,8 @@ namespace Tango.PPC.Common.DataStore { try { + ValidateCollectionAndKey(request.Collection, request.Key); + var item = GetManager().GetCollection(request.Collection).GetItem(request.Key, GetPMRValue(request.DefaultItem)); await transporter.SendResponse(new GetDataStoreItemResponse() { @@ -278,9 +445,29 @@ namespace Tango.PPC.Common.DataStore #endregion + private void ValidateCollectionAndKey(String collection = null, String key = null) + { + if (collection != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(collection)) + { + throw new ArgumentException("Collection name contains invalid characters."); + } + } + + if (key != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(key)) + { + throw new ArgumentException("Item key contains invalid characters."); + } + } + } + public void OnReceiverDisconnected(ExternalBridgeReceiver receiver) { //Do nothing. + _listenerReceivers.RemoveAll(x => x.Receiver == receiver); } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj index 4cb3b42dc..9d39c96d9 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/Tango.PPC.Common.csproj @@ -364,6 +364,26 @@ <EmbeddedResource Include="SafetyLevelOperations.csv" /> </ItemGroup> <ItemGroup> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Editing\Tango.DataStore.Editing.csproj"> + <Project>{ee088ff7-04d1-41fb-9d6a-cedeee7a7b9c}</Project> + <Name>Tango.DataStore.Editing</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj"> + <Project>{fa96bc0c-4055-475c-9dcc-70a5a9436b10}</Project> + <Name>Tango.DataStore.Lite</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> + <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> + <Name>Tango.DataStore.Remote</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> <ProjectReference Include="..\..\Tango.AdvancedInstaller\Tango.AdvancedInstaller.csproj"> <Project>{c5df1816-34e5-4700-824c-29623a1baa22}</Project> <Name>Tango.AdvancedInstaller</Name> @@ -388,22 +408,6 @@ <Project>{58e8825f-0c96-449c-b320-1e82b0aa876b}</Project> <Name>Tango.CSV</Name> </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> - <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> - <Name>Tango.DataStore.EF</Name> - </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj"> - <Project>{fa96bc0c-4055-475c-9dcc-70a5a9436b10}</Project> - <Name>Tango.DataStore.Lite</Name> - </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> - <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> - <Name>Tango.DataStore.Remote</Name> - </ProjectReference> - <ProjectReference Include="..\..\Tango.DataStore\Tango.DataStore.csproj"> - <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> - <Name>Tango.DataStore</Name> - </ProjectReference> <ProjectReference Include="..\..\Tango.Emulations\Tango.Emulations.csproj"> <Project>{63561e19-ff5a-414b-a5ef-e30711543e1d}</Project> <Name>Tango.Emulations</Name> @@ -516,7 +520,7 @@ </Target> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/AlternativeUnifiedWriteFilterManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/AlternativeUnifiedWriteFilterManager.cs index 828bccf83..c95cdb376 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/AlternativeUnifiedWriteFilterManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/AlternativeUnifiedWriteFilterManager.cs @@ -4,20 +4,16 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using Tango.Core; using Tango.Core.Components; namespace Tango.PPC.Common.UWF { - public class AlternativeUnifiedWriteFilterManager : IUnifiedWriteFilterManager + public class AlternativeUnifiedWriteFilterManager : ExtendedObject, IUnifiedWriteFilterManager { private const string UWF_PATH = "C:\\Windows\\Sysnative\\uwfmgr.exe"; /// <summary> - /// Gets a value indicating whether UWF if currently enabled on the system. - /// </summary> - public bool IsEnabled { get; private set; } - - /// <summary> /// Installs and configures the service (requires restart). /// </summary> /// <returns></returns> @@ -68,5 +64,31 @@ namespace Tango.PPC.Common.UWF command.OutputEncoding = CmdCommand.OutEncoding.Unicode; await command.Run(); } + + /// <summary> + /// Gets a value indicating whether UWF if currently enabled on the system. + /// </summary> + /// <returns></returns> + public async Task<bool> IsEnabled() + { + String pattern = @"Next Session Settings[\n\r]+FILTER SETTINGS[\n\r]+\s+Filter state:\s+(OFF|ON)"; + + LogManager.Log($"Getting UWF status using pattern '{pattern}'..."); + CmdCommand command = new CmdCommand(UWF_PATH, $"get-config"); + command.OutputEncoding = CmdCommand.OutEncoding.Unicode; + var result = await command.Run(); + + Match match = Regex.Match(result.StandardOutput, pattern); + if (match != null && match.Success && match.Groups.Count > 1) + { + var value = match.Groups[1].Value; + + LogManager.Log($"UWF pattern parsing result: '{value}'."); + + return value.ToStringOrEmpty().Trim() == "ON"; + } + + return false; + } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/DefaultUnifiedWriteFilterManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/DefaultUnifiedWriteFilterManager.cs index 65cb3f466..5684f6926 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/DefaultUnifiedWriteFilterManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/DefaultUnifiedWriteFilterManager.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Text.RegularExpressions; using System.Threading.Tasks; +using Tango.Core; using Tango.Core.Components; namespace Tango.PPC.Common.UWF @@ -11,7 +13,7 @@ namespace Tango.PPC.Common.UWF /// Represents the default unified writer filter manager. /// </summary> /// <seealso cref="Tango.PPC.Common.UWF.IUnifiedWriteFilterManager" /> - public class DefaultUnifiedWriteFilterManager : IUnifiedWriteFilterManager + public class DefaultUnifiedWriteFilterManager : ExtendedObject, IUnifiedWriteFilterManager { private const int UWF_CAPACITY_MB = 5000; private const string UWF_PATH = "C:\\Windows\\Sysnative\\uwfmgr.exe"; @@ -24,11 +26,6 @@ namespace Tango.PPC.Common.UWF }; /// <summary> - /// Gets a value indicating whether UWF if currently enabled on the system. - /// </summary> - public bool IsEnabled { get; } - - /// <summary> /// Installs and configures the service (requires restart). /// </summary> public async Task Setup() @@ -95,5 +92,31 @@ namespace Tango.PPC.Common.UWF command.OutputEncoding = CmdCommand.OutEncoding.Unicode; await command.Run(); } + + /// <summary> + /// Gets a value indicating whether UWF if currently enabled on the system. + /// </summary> + /// <returns></returns> + public async Task<bool> IsEnabled() + { + String pattern = @"Next Session Settings[\n\r]+FILTER SETTINGS[\n\r]+\s+Filter state:\s+(OFF|ON)"; + + LogManager.Log($"Getting UWF status using pattern '{pattern}'..."); + CmdCommand command = new CmdCommand(UWF_PATH, $"get-config"); + command.OutputEncoding = CmdCommand.OutEncoding.Unicode; + var result = await command.Run(); + + Match match = Regex.Match(result.StandardOutput, pattern); + if (match != null && match.Success && match.Groups.Count > 1) + { + var value = match.Groups[1].Value; + + LogManager.Log($"UWF pattern parsing result: '{value}'."); + + return value.ToStringOrEmpty().Trim() == "ON"; + } + + return false; + } } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/IUnifiedWriteFilterManager.cs b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/IUnifiedWriteFilterManager.cs index 05fa1876a..b6a661ab5 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/IUnifiedWriteFilterManager.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.Common/UWF/IUnifiedWriteFilterManager.cs @@ -14,7 +14,8 @@ namespace Tango.PPC.Common.UWF /// <summary> /// Gets a value indicating whether UWF if currently enabled on the system. /// </summary> - bool IsEnabled { get; } + /// <returns></returns> + Task<bool> IsEnabled(); /// <summary> /// Installs and configures the service (requires restart). diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Connectivity/DefaultConnectivityProvider.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Connectivity/DefaultConnectivityProvider.cs index fb5b9796f..5218d9f70 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Connectivity/DefaultConnectivityProvider.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Connectivity/DefaultConnectivityProvider.cs @@ -182,7 +182,7 @@ namespace Tango.PPC.UI.Connectivity || net.NetworkInterfaceType == NetworkInterfaceType.Ethernet3Megabit || net.NetworkInterfaceType == NetworkInterfaceType.FastEthernetFx || net.NetworkInterfaceType == NetworkInterfaceType.FastEthernetT - || net.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet) && net.Name == "Ethernet" && net.OperationalStatus == OperationalStatus.Up) + || net.NetworkInterfaceType == NetworkInterfaceType.GigabitEthernet) && net.Name.ToStringOrEmpty().StartsWith("Ethernet") && net.OperationalStatus == OperationalStatus.Up) { IsLanConnected = true; return; diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakView.xaml index 6c64520a4..f17860d42 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakView.xaml @@ -51,7 +51,7 @@ <TextBlock TextWrapping="Wrap" TextAlignment="Center" Margin="40 0" HorizontalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Please check guiding units on both sides of the system and fix/tie the thread if possible.</TextBlock> </StackPanel> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/GuidingUnits/1.jpg"></Image> </commonControls:ImageGalleryControl> </DockPanel> @@ -77,7 +77,7 @@ <Grid> <Grid Visibility="{Binding IsArcHead,Converter={StaticResource BooleanToVisibilityInverseConverter}}"> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/1.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/2.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/3.jpg"></Image> @@ -86,7 +86,7 @@ </Grid> <Grid Visibility="{Binding IsArcHead,Converter={StaticResource BooleanToVisibilityConverter}}"> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/arc/1.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/arc/2.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/FeedingUnits/arc/3.jpg"></Image> @@ -122,7 +122,7 @@ </TextBlock> </StackPanel> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/TheDryer/1.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/TheDryer/2.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/TheDryer/3.jpg"></Image> @@ -149,7 +149,7 @@ </TextBlock> </StackPanel> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/DryerClose/1.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/DryerClose/2.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/DryerClose/3.jpg"></Image> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakViewVM.cs index 131f976c1..e737f3b12 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadBreakViewVM.cs @@ -157,6 +157,7 @@ namespace Tango.PPC.UI.Dialogs catch (Exception ex) { LogManager.Log(ex, LogCategory.Warning, "Error occurred while attempting to perform thread jogging."); + await NotificationProvider.ShowError($"Thread movement verification failed.\n{ex.FlattenMessage()}"); Stage = WizardStage.FeedingUnits; } } @@ -192,6 +193,7 @@ namespace Tango.PPC.UI.Dialogs catch (Exception ex) { LogManager.Log(ex, LogCategory.Warning, "Error occurred while attempting to perform thread jogging."); + await NotificationProvider.ShowError($"Thread movement verification failed.\n{ex.FlattenMessage()}"); Stage = WizardStage.TheDryer; } } diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadLoadingView.xaml b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadLoadingView.xaml index 3d37c81bd..e45065c61 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadLoadingView.xaml +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Dialogs/ThreadLoadingView.xaml @@ -78,7 +78,7 @@ </Grid> <Grid> - <commonControls:ImageGalleryControl Duration="00:00:02"> + <commonControls:ImageGalleryControl Duration="00:00:03"> <Image Stretch="Uniform" Source="/Images/ThreadLoading/NewThread/ReadyForLoading/arc/1.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/NewThread/ReadyForLoading/arc/2.jpg"></Image> <Image Stretch="Uniform" Source="/Images/ThreadLoading/NewThread/ReadyForLoading/arc/3.jpg"></Image> @@ -136,7 +136,7 @@ </UniformGrid> <DockPanel Margin="0 50 0 0" > <StackPanel DockPanel.Dock="Top"> - <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Something went wrong</TextBlock> + <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Something went wrong, press 'retry' to try again</TextBlock> <touch:TouchIcon Icon="AlertCircleOutline" Margin="0 40 0 0" HorizontalAlignment="Center" Foreground="{StaticResource TangoErrorBrush}" Width="100" Height="100" /> <TextBlock Margin="0 10 0 0" FontSize="{StaticResource TangoSmallFontSize}" TextAlignment="Center" TextWrapping="Wrap" HorizontalAlignment="Center" Foreground="{StaticResource TangoGrayTextBrush}" Text="{Binding Error}"></TextBlock> </StackPanel> @@ -153,7 +153,7 @@ </UniformGrid> <DockPanel Margin="0 50 0 0" > <StackPanel DockPanel.Dock="Top"> - <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Something went wrong</TextBlock> + <TextBlock HorizontalAlignment="Center" FontSize="{StaticResource TangoTitleFontSize}">Something went wrong, press 'retry' to try again</TextBlock> <touch:TouchIcon Icon="AlertCircleOutline" Margin="0 40 0 0" HorizontalAlignment="Center" Foreground="{StaticResource TangoErrorBrush}" Width="100" Height="100" /> <TextBlock Margin="0 10 0 0" FontSize="{StaticResource TangoSmallFontSize}" TextAlignment="Center" TextWrapping="Wrap" HorizontalAlignment="Center" Foreground="{StaticResource TangoGrayTextBrush}" Text="{Binding Error}"></TextBlock> </StackPanel> diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/4.JPG b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/4.JPG Binary files differindex 575066c23..52063b213 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/4.JPG +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/4.JPG diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/arc/4.jpg b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/arc/4.jpg Binary files differindex 575066c23..52063b213 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/arc/4.jpg +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Images/ThreadLoading/FeedingUnits/arc/4.jpg diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs index aad563fc1..930178b7e 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Properties/AssemblyInfo.cs @@ -8,4 +8,4 @@ using System.Windows; // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Tango PPC Application")] -[assembly: AssemblyVersion("1.2.1.0")] +[assembly: AssemblyVersion("1.2.4.0")] diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj index 7f520ecc5..1257fee46 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/Tango.PPC.UI.csproj @@ -753,6 +753,8 @@ if $(ConfigurationName) == Release del "$(TargetDir)firmware_package.tfp" if $(ConfigurationName) == Release del *.xml +if $(ConfigurationName) == Release del WebRtc.NET.pdb + if $(ConfigurationName) == Debug copy /Y "$(TargetDir)Packages" "$(TargetDir)"</PostBuildEvent> </PropertyGroup> <PropertyGroup> @@ -761,7 +763,7 @@ if $(ConfigurationName) == Debug copy /Y "$(TargetDir)Packages" "$(TargetDir)"</ </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LayoutViewVM.cs b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LayoutViewVM.cs index 562a3b659..a2baec8b8 100644 --- a/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LayoutViewVM.cs +++ b/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LayoutViewVM.cs @@ -64,7 +64,7 @@ namespace Tango.PPC.UI.ViewModels { int index = Status.Cartridge.Index; - var idsPack = _machineProvider.Machine.Configuration.IdsPacks.FirstOrDefault(x => x.PackIndex == index); + var idsPack = _machineProvider.Machine.Configuration.NoneEmptyIdsPacks.FirstOrDefault(x => x.PackIndex == index); if (idsPack != null) { diff --git a/Software/Visual_Studio/Tango.BL/DTO/DataStoreItemDTOBase.cs b/Software/Visual_Studio/Tango.BL/DTO/DataStoreItemDTOBase.cs index 8a6bfd7a4..9951338ec 100644 --- a/Software/Visual_Studio/Tango.BL/DTO/DataStoreItemDTOBase.cs +++ b/Software/Visual_Studio/Tango.BL/DTO/DataStoreItemDTOBase.cs @@ -62,6 +62,14 @@ namespace Tango.BL.DTO } /// <summary> + /// is deleted + /// </summary> + public Boolean IsDeleted + { + get; set; + } + + /// <summary> /// is synchronized /// </summary> public Boolean IsSynchronized diff --git a/Software/Visual_Studio/Tango.BL/DTO/MachineDTOBase.cs b/Software/Visual_Studio/Tango.BL/DTO/MachineDTOBase.cs index fe8aa35d3..f88f164cd 100644 --- a/Software/Visual_Studio/Tango.BL/DTO/MachineDTOBase.cs +++ b/Software/Visual_Studio/Tango.BL/DTO/MachineDTOBase.cs @@ -269,5 +269,13 @@ namespace Tango.BL.DTO get; set; } + /// <summary> + /// activation key + /// </summary> + public String ActivationKey + { + get; set; + } + } } diff --git a/Software/Visual_Studio/Tango.BL/DTO/TangoVersionDTOBase.cs b/Software/Visual_Studio/Tango.BL/DTO/TangoVersionDTOBase.cs index 3b77ba537..eea184e2e 100644 --- a/Software/Visual_Studio/Tango.BL/DTO/TangoVersionDTOBase.cs +++ b/Software/Visual_Studio/Tango.BL/DTO/TangoVersionDTOBase.cs @@ -77,5 +77,13 @@ namespace Tango.BL.DTO get; set; } + /// <summary> + /// disabled + /// </summary> + public Boolean Disabled + { + get; set; + } + } } diff --git a/Software/Visual_Studio/Tango.BL/Dispensing/TransparentLiquidDispensingCalc.cs b/Software/Visual_Studio/Tango.BL/Dispensing/TransparentLiquidDispensingCalc.cs index 2340cdd62..66b62d665 100644 --- a/Software/Visual_Studio/Tango.BL/Dispensing/TransparentLiquidDispensingCalc.cs +++ b/Software/Visual_Studio/Tango.BL/Dispensing/TransparentLiquidDispensingCalc.cs @@ -28,10 +28,10 @@ namespace Tango.BL.Dispensing nlPcmSum = Math.Max(0, liquidVolume.ProcessParametersTable.MinInkUptake - nlPcmSum); - //if (liquidVolume.RML.ColorConversionVersion > 3) - //{ - // nlPcmSum = nlPcmSum <= 0.5 ? 0 : nlPcmSum; - //} + if (liquidVolume.Volume <= 2) + { + nlPcmSum = 0; + } return nlPcmSum; } diff --git a/Software/Visual_Studio/Tango.BL/Entities/DataStoreItemBase.cs b/Software/Visual_Studio/Tango.BL/Entities/DataStoreItemBase.cs index c9c433e02..6d393f6a2 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/DataStoreItemBase.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/DataStoreItemBase.cs @@ -35,6 +35,8 @@ namespace Tango.BL.Entities public event EventHandler<Byte[]> ValueChanged; + public event EventHandler<Boolean> IsDeletedChanged; + public event EventHandler<Boolean> IsSynchronizedChanged; public event EventHandler<Machine> MachineChanged; @@ -173,6 +175,33 @@ namespace Tango.BL.Entities } } + protected Boolean _isdeleted; + + /// <summary> + /// Gets or sets the datastoreitembase is deleted. + /// </summary> + + [Column("IS_DELETED")] + + public Boolean IsDeleted + { + get + { + return _isdeleted; + } + + set + { + if (_isdeleted != value) + { + _isdeleted = value; + + OnIsDeletedChanged(value); + + } + } + } + protected Boolean _issynchronized; /// <summary> @@ -269,6 +298,15 @@ namespace Tango.BL.Entities } /// <summary> + /// Called when the IsDeleted has changed. + /// </summary> + protected virtual void OnIsDeletedChanged(Boolean isdeleted) + { + IsDeletedChanged?.Invoke(this, isdeleted); + RaisePropertyChanged(nameof(IsDeleted)); + } + + /// <summary> /// Called when the IsSynchronized has changed. /// </summary> protected virtual void OnIsSynchronizedChanged(Boolean issynchronized) diff --git a/Software/Visual_Studio/Tango.BL/Entities/HardwareVersion.cs b/Software/Visual_Studio/Tango.BL/Entities/HardwareVersion.cs index 590fe9e13..bc65c33ce 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/HardwareVersion.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/HardwareVersion.cs @@ -109,5 +109,16 @@ namespace Tango.BL.Entities { } + + /// <summary> + /// Returns a <see cref="System.String" /> that represents this instance. + /// </summary> + /// <returns> + /// A <see cref="System.String" /> that represents this instance. + /// </returns> + public override string ToString() + { + return FullName; + } } } diff --git a/Software/Visual_Studio/Tango.BL/Entities/MachineBase.cs b/Software/Visual_Studio/Tango.BL/Entities/MachineBase.cs index 214d70b20..cbfd43789 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/MachineBase.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/MachineBase.cs @@ -73,6 +73,8 @@ namespace Tango.BL.Entities public event EventHandler<Int32> HeadTypeChanged; + public event EventHandler<String> ActivationKeyChanged; + public event EventHandler<SynchronizedObservableCollection<Cat>> CatsChanged; public event EventHandler<Configuration> ConfigurationChanged; @@ -913,6 +915,33 @@ namespace Tango.BL.Entities } } + protected String _activationkey; + + /// <summary> + /// Gets or sets the machinebase activation key. + /// </summary> + + [Column("ACTIVATION_KEY")] + + public String ActivationKey + { + get + { + return _activationkey; + } + + set + { + if (_activationkey != value) + { + _activationkey = value; + + OnActivationKeyChanged(value); + + } + } + } + protected SynchronizedObservableCollection<Cat> _cats; /// <summary> @@ -1342,6 +1371,15 @@ namespace Tango.BL.Entities } /// <summary> + /// Called when the ActivationKey has changed. + /// </summary> + protected virtual void OnActivationKeyChanged(String activationkey) + { + ActivationKeyChanged?.Invoke(this, activationkey); + RaisePropertyChanged(nameof(ActivationKey)); + } + + /// <summary> /// Called when the Cats has changed. /// </summary> protected virtual void OnCatsChanged(SynchronizedObservableCollection<Cat> cats) diff --git a/Software/Visual_Studio/Tango.BL/Entities/Organization.cs b/Software/Visual_Studio/Tango.BL/Entities/Organization.cs index 738c77efb..7580c6fd1 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/Organization.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/Organization.cs @@ -15,5 +15,10 @@ namespace Tango.BL.Entities { } + + public override string ToString() + { + return Name; + } } } diff --git a/Software/Visual_Studio/Tango.BL/Entities/TangoVersionBase.cs b/Software/Visual_Studio/Tango.BL/Entities/TangoVersionBase.cs index f39df936a..2fece7fdb 100644 --- a/Software/Visual_Studio/Tango.BL/Entities/TangoVersionBase.cs +++ b/Software/Visual_Studio/Tango.BL/Entities/TangoVersionBase.cs @@ -37,6 +37,8 @@ namespace Tango.BL.Entities public event EventHandler<String> CommentsChanged; + public event EventHandler<Boolean> DisabledChanged; + public event EventHandler<MachineVersion> MachineVersionChanged; public event EventHandler<User> UserChanged; @@ -228,6 +230,33 @@ namespace Tango.BL.Entities } } + protected Boolean _disabled; + + /// <summary> + /// Gets or sets the tangoversionbase disabled. + /// </summary> + + [Column("DISABLED")] + + public Boolean Disabled + { + get + { + return _disabled; + } + + set + { + if (_disabled != value) + { + _disabled = value; + + OnDisabledChanged(value); + + } + } + } + protected MachineVersion _machineversion; /// <summary> @@ -338,6 +367,15 @@ namespace Tango.BL.Entities } /// <summary> + /// Called when the Disabled has changed. + /// </summary> + protected virtual void OnDisabledChanged(Boolean disabled) + { + DisabledChanged?.Invoke(this, disabled); + RaisePropertyChanged(nameof(Disabled)); + } + + /// <summary> /// Called when the MachineVersion has changed. /// </summary> protected virtual void OnMachineVersionChanged(MachineVersion machineversion) diff --git a/Software/Visual_Studio/Tango.BL/Enumerations/LiquidTypes.cs b/Software/Visual_Studio/Tango.BL/Enumerations/LiquidTypes.cs index e8dc67695..0f72ebbd0 100644 --- a/Software/Visual_Studio/Tango.BL/Enumerations/LiquidTypes.cs +++ b/Software/Visual_Studio/Tango.BL/Enumerations/LiquidTypes.cs @@ -20,6 +20,12 @@ namespace Tango.BL.Enumerations { /// <summary> + /// (Light Cyan) + /// </summary> + [Description("Light Cyan")] + LightCyan = 7, + + /// <summary> /// (Cyan) /// </summary> [Description("Cyan")] @@ -44,6 +50,18 @@ namespace Tango.BL.Enumerations Lubricant = 5, /// <summary> + /// (Light Magenta) + /// </summary> + [Description("Light Magenta")] + LightMagenta = 8, + + /// <summary> + /// (Light Yellow) + /// </summary> + [Description("Light Yellow")] + LightYellow = 9, + + /// <summary> /// (Yellow) /// </summary> [Description("Yellow")] diff --git a/Software/Visual_Studio/Tango.BL/Enumerations/Permissions.cs b/Software/Visual_Studio/Tango.BL/Enumerations/Permissions.cs index 8591cf826..231bc4a5e 100644 --- a/Software/Visual_Studio/Tango.BL/Enumerations/Permissions.cs +++ b/Software/Visual_Studio/Tango.BL/Enumerations/Permissions.cs @@ -271,5 +271,71 @@ namespace Tango.BL.Enumerations [Description("Allows running a floating procedure project file.")] FSE_RunProcedureProjectFile = 1020, + /// <summary> + /// (Allows loading the machine configuration module) + /// </summary> + [Description("Allows loading the machine configuration module")] + FSE_RunConfigurationModule = 1021, + + /// <summary> + /// (Allows editing of machine provisioning settings) + /// </summary> + [Description("Allows editing of machine provisioning settings")] + FSE_ModifyMachineProvisioning = 1022, + + /// <summary> + /// (Allows editing of machine update settings) + /// </summary> + [Description("Allows editing of machine update settings")] + FSE_ModifyMachineUpdate = 1023, + + /// <summary> + /// (Allows editing of machine identity settings) + /// </summary> + [Description("Allows editing of machine identity settings")] + FSE_ModifyMachineIdentity = 1024, + + /// <summary> + /// (Allows editing of machine hardware settings) + /// </summary> + [Description("Allows editing of machine hardware settings")] + FSE_ModifyMachineHardware = 1025, + + /// <summary> + /// (Allows viewing data store items) + /// </summary> + [Description("Allows viewing data store items")] + DataStoreRead = 1026, + + /// <summary> + /// (Allows writing to local data store items) + /// </summary> + [Description("Allows writing to local data store items")] + DataStoreWrite = 1027, + + /// <summary> + /// (Allows creating local data store items and collections) + /// </summary> + [Description("Allows creating local data store items and collections")] + DataStoreCreate = 1028, + + /// <summary> + /// (Allows resetting the machine counters) + /// </summary> + [Description("Allows resetting the machine counters")] + FSE_ResetMachineCounters = 1029, + + /// <summary> + /// (Allows resetting the machine device registration) + /// </summary> + [Description("Allows resetting the machine device registration")] + FSE_ResetMachineDeviceRegistration = 1030, + + /// <summary> + /// (Allows creating and writing global data store items and collections) + /// </summary> + [Description("Allows creating and writing global data store items and collections")] + DataStoreCreateWriteGlobal = 1031, + } } diff --git a/Software/Visual_Studio/Tango.BL/Enumerations/Roles.cs b/Software/Visual_Studio/Tango.BL/Enumerations/Roles.cs index 5747cfb59..b51477393 100644 --- a/Software/Visual_Studio/Tango.BL/Enumerations/Roles.cs +++ b/Software/Visual_Studio/Tango.BL/Enumerations/Roles.cs @@ -140,6 +140,12 @@ namespace Tango.BL.Enumerations FSETwineDeveloper = 1005, /// <summary> + /// (Twine Data Store Developer) + /// </summary> + [Description("Twine Data Store Developer")] + FSETwineDataStoreDeveloper = 1008, + + /// <summary> /// (Twine Procedure Designer) /// </summary> [Description("Twine Procedure Designer")] diff --git a/Software/Visual_Studio/Tango.BL/ObservableEntity.cs b/Software/Visual_Studio/Tango.BL/ObservableEntity.cs index 71ac2294a..656b138b4 100644 --- a/Software/Visual_Studio/Tango.BL/ObservableEntity.cs +++ b/Software/Visual_Studio/Tango.BL/ObservableEntity.cs @@ -30,6 +30,7 @@ using Newtonsoft.Json.Linq; using Tango.BL.ActionLogs; using Tango.BL.ValueObjects; using LiteDB; +using System.Linq.Expressions; namespace Tango.BL { @@ -666,6 +667,23 @@ namespace Tango.BL } } + public void RaisePropertyChanged<F>(Expression<Func<T, F>> expression) + { + MemberExpression member = expression.Body as MemberExpression; + if (member == null) + throw new ArgumentException(string.Format( + "Expression '{0}' refers to a method, not a property.", + expression.ToString())); + + PropertyInfo propInfo = member.Member as PropertyInfo; + if (propInfo == null) + throw new ArgumentException(string.Format( + "Expression '{0}' refers to a field, not a property.", + expression.ToString())); + + RaisePropertyChanged(propInfo.Name); + } + #endregion #region Action Log diff --git a/Software/Visual_Studio/Tango.CSV/DynamicCsvFile.cs b/Software/Visual_Studio/Tango.CSV/DynamicCsvFile.cs index 0c4d79949..ec04de3ff 100644 --- a/Software/Visual_Studio/Tango.CSV/DynamicCsvFile.cs +++ b/Software/Visual_Studio/Tango.CSV/DynamicCsvFile.cs @@ -82,6 +82,7 @@ namespace Tango.CSV } _writer.WriteLine(String.Join(",", valuesStr)); + _writer.Flush(); } public void Dispose() @@ -92,6 +93,7 @@ namespace Tango.CSV if (_disposeStream) { + _writer?.Dispose(); _stream?.Dispose(); } } diff --git a/Software/Visual_Studio/Tango.Core/Cryptography/PasswordGenerator.cs b/Software/Visual_Studio/Tango.Core/Cryptography/PasswordGenerator.cs new file mode 100644 index 000000000..50f59b744 --- /dev/null +++ b/Software/Visual_Studio/Tango.Core/Cryptography/PasswordGenerator.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Core.Cryptography +{ + public static class PasswordGenerator + { + internal static readonly String alphaNumeric = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + internal static readonly String numeric = "1234567890"; + internal static readonly String alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public enum PasswordType + { + Alphaumeric, + Numeric, + Alpha, + } + + public enum PasswordCasing + { + Any, + Upper, + Lower + } + + public static String Generate(int length, PasswordType type = PasswordType.Alphaumeric, PasswordCasing casing = PasswordCasing.Any) + { + String chars = String.Empty; + + switch (type) + { + case PasswordType.Alphaumeric: + chars = alphaNumeric; + break; + case PasswordType.Numeric: + chars = numeric; + break; + case PasswordType.Alpha: + chars = alpha; + break; + } + + switch (casing) + { + case PasswordCasing.Upper: + chars = chars.ToUpper(); + break; + case PasswordCasing.Lower: + chars = chars.ToLower(); + break; + } + + return GetUniqueKey(chars.ToCharArray(), length); + } + + private static string GetUniqueKey(char[] chars, int size) + { + byte[] data = new byte[4 * size]; + using (RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider()) + { + crypto.GetBytes(data); + } + StringBuilder result = new StringBuilder(size); + for (int i = 0; i < size; i++) + { + var rnd = BitConverter.ToUInt32(data, i * 4); + var idx = rnd % chars.Length; + + result.Append(chars[idx]); + } + + return result.ToString(); + } + } +} diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs index 97c8773d6..5a12e16bb 100644 --- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs +++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs @@ -261,6 +261,11 @@ public static class StringExtensions return !String.IsNullOrWhiteSpace(str); } + public static String ToOneLine(this String str) + { + return str.Replace(Environment.NewLine, " "); + } + public static List<T> ToEnumValues<T>(this String str, char splitChar) where T : struct { if (!String.IsNullOrWhiteSpace(str)) diff --git a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj index 813a31443..9a55a25f9 100644 --- a/Software/Visual_Studio/Tango.Core/Tango.Core.csproj +++ b/Software/Visual_Studio/Tango.Core/Tango.Core.csproj @@ -99,6 +99,7 @@ <Compile Include="Bson\BsonUtcSerializer.cs" /> <Compile Include="Components\CmdCommand.cs" /> <Compile Include="Cryptography\MachineLevelCryptographer.cs" /> + <Compile Include="Cryptography\PasswordGenerator.cs" /> <Compile Include="CustomAttributes\PropertyIndexAttribute.cs" /> <Compile Include="CustomAttributes\StringFormatAttribute.cs" /> <Compile Include="ExtensionMethods\BooleanExtensions.cs" /> @@ -220,7 +221,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> <Import Project="..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets')" /> diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/DATA_STORE_ITEMS.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/DATA_STORE_ITEMS.cs index ad42a6db8..6fcfe6a86 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/DATA_STORE_ITEMS.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/DATA_STORE_ITEMS.cs @@ -22,6 +22,7 @@ namespace Tango.DAL.Remote.DB public string KEY { get; set; } public int DATA_TYPE { get; set; } public byte[] VALUE { get; set; } + public bool IS_DELETED { get; set; } public bool IS_SYNCHRONIZED { get; set; } public virtual MACHINE MACHINE { get; set; } diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE.cs index 2db20bbba..14fe4f04e 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/MACHINE.cs @@ -58,6 +58,7 @@ namespace Tango.DAL.Remote.DB public string DEVICE_ID { get; set; } public string DEVICE_NAME { get; set; } public int HEAD_TYPE { get; set; } + public string ACTIVATION_KEY { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<CAT> CATS { get; set; } diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx index 3b471ca54..af3179379 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx @@ -266,6 +266,7 @@ <Property Name="KEY" Type="nvarchar" MaxLength="50" Nullable="false" /> <Property Name="DATA_TYPE" Type="int" Nullable="false" /> <Property Name="VALUE" Type="image" Nullable="false" /> + <Property Name="IS_DELETED" Type="bit" Nullable="false" /> <Property Name="IS_SYNCHRONIZED" Type="bit" Nullable="false" /> </EntityType> <EntityType Name="DISPENSER_TYPES"> @@ -814,6 +815,7 @@ <Property Name="DEVICE_ID" Type="nvarchar(max)" /> <Property Name="DEVICE_NAME" Type="nvarchar" MaxLength="200" /> <Property Name="HEAD_TYPE" Type="int" Nullable="false" /> + <Property Name="ACTIVATION_KEY" Type="varchar" MaxLength="8" /> </EntityType> <EntityType Name="MACHINES_EVENTS"> <Key> @@ -1185,6 +1187,7 @@ <Property Name="COMMENTS" Type="nvarchar(max)" Nullable="false" /> <Property Name="USER_GUID" Type="varchar" MaxLength="36" Nullable="false" /> <Property Name="MACHINE_VERSION_GUID" Type="varchar" MaxLength="36" Nullable="false" /> + <Property Name="DISABLED" Type="bit" Nullable="false" /> </EntityType> <EntityType Name="TECH_CONTROLLERS"> <Key> @@ -3671,6 +3674,7 @@ <Property Name="KEY" Type="String" Nullable="false" MaxLength="50" FixedLength="false" Unicode="true" /> <Property Name="DATA_TYPE" Type="Int32" Nullable="false" /> <Property Name="VALUE" Type="Binary" Nullable="false" MaxLength="Max" FixedLength="false" /> + <Property Name="IS_DELETED" Type="Boolean" Nullable="false" /> <Property Name="IS_SYNCHRONIZED" Type="Boolean" Nullable="false" /> <NavigationProperty Name="MACHINE" Relationship="RemoteModel.FK_DATA_STORES_MACHINES" FromRole="DATA_STORE_ITEMS" ToRole="MACHINE" /> </EntityType> @@ -4282,6 +4286,7 @@ <Property Name="DEVICE_ID" Type="String" MaxLength="Max" FixedLength="false" Unicode="true" /> <Property Name="DEVICE_NAME" Type="String" MaxLength="200" FixedLength="false" Unicode="true" /> <Property Name="HEAD_TYPE" Type="Int32" Nullable="false" /> + <Property Name="ACTIVATION_KEY" Type="String" MaxLength="8" FixedLength="false" Unicode="false" /> <NavigationProperty Name="CATS" Relationship="RemoteModel.FK_CATS_MACHINES" FromRole="MACHINE" ToRole="CAT" /> <NavigationProperty Name="CONFIGURATION" Relationship="RemoteModel.FK_MACHINES_CONFIGURATIONS" FromRole="MACHINE" ToRole="CONFIGURATION" /> <NavigationProperty Name="DATA_STORE_ITEMS" Relationship="RemoteModel.FK_DATA_STORES_MACHINES" FromRole="MACHINE" ToRole="DATA_STORE_ITEMS" /> @@ -4706,6 +4711,7 @@ <Property Name="COMMENTS" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="true" /> <Property Name="USER_GUID" Type="String" Nullable="false" MaxLength="36" FixedLength="false" Unicode="false" /> <Property Name="MACHINE_VERSION_GUID" Type="String" Nullable="false" MaxLength="36" FixedLength="false" Unicode="false" /> + <Property Name="DISABLED" Type="Boolean" Nullable="false" /> <NavigationProperty Name="MACHINE_VERSIONS" Relationship="RemoteModel.FK_TANGO_VERSIONS_MACHINE_VERSIONS" FromRole="TANGO_VERSIONS" ToRole="MACHINE_VERSIONS" /> <NavigationProperty Name="USER" Relationship="RemoteModel.FK_TANGO_VERSIONS_USERS" FromRole="TANGO_VERSIONS" ToRole="USER" /> </EntityType> @@ -6294,6 +6300,7 @@ <EntityTypeMapping TypeName="RemoteModel.DATA_STORE_ITEMS"> <MappingFragment StoreEntitySet="DATA_STORE_ITEMS"> <ScalarProperty Name="IS_SYNCHRONIZED" ColumnName="IS_SYNCHRONIZED" /> + <ScalarProperty Name="IS_DELETED" ColumnName="IS_DELETED" /> <ScalarProperty Name="VALUE" ColumnName="VALUE" /> <ScalarProperty Name="DATA_TYPE" ColumnName="DATA_TYPE" /> <ScalarProperty Name="KEY" ColumnName="KEY" /> @@ -6848,6 +6855,7 @@ <EntitySetMapping Name="MACHINES"> <EntityTypeMapping TypeName="RemoteModel.MACHINE"> <MappingFragment StoreEntitySet="MACHINES"> + <ScalarProperty Name="ACTIVATION_KEY" ColumnName="ACTIVATION_KEY" /> <ScalarProperty Name="HEAD_TYPE" ColumnName="HEAD_TYPE" /> <ScalarProperty Name="DEVICE_NAME" ColumnName="DEVICE_NAME" /> <ScalarProperty Name="DEVICE_ID" ColumnName="DEVICE_ID" /> @@ -7259,6 +7267,7 @@ <EntitySetMapping Name="TANGO_VERSIONS"> <EntityTypeMapping TypeName="RemoteModel.TANGO_VERSIONS"> <MappingFragment StoreEntitySet="TANGO_VERSIONS"> + <ScalarProperty Name="DISABLED" ColumnName="DISABLED" /> <ScalarProperty Name="MACHINE_VERSION_GUID" ColumnName="MACHINE_VERSION_GUID" /> <ScalarProperty Name="USER_GUID" ColumnName="USER_GUID" /> <ScalarProperty Name="COMMENTS" ColumnName="COMMENTS" /> diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram index 357b569f8..476e859b4 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/RemoteADO.edmx.diagram @@ -5,90 +5,90 @@ <!-- Diagram content (shape and connector positions) --> <edmx:Diagrams> <Diagram DiagramId="f9ae01d708754bbd997add25a4bacc79" Name="Diagram1" ZoomLevel="87"> - <EntityTypeShape EntityType="RemoteModel.ACTION_LOGS" Width="1.5" PointX="11.25" PointY="27.25" /> - <EntityTypeShape EntityType="RemoteModel.ADDRESS" Width="1.5" PointX="1.5" PointY="76" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_DISPLAY_PANEL_VERSIONS" Width="1.5" PointX="1.5" PointY="62" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="56.125" /> - <EntityTypeShape EntityType="RemoteModel.APPLICATION_OS_VERSIONS" Width="1.5" PointX="1.5" PointY="64.875" /> + <EntityTypeShape EntityType="RemoteModel.ACTION_LOGS" Width="1.5" PointX="11.25" PointY="38.25" /> + <EntityTypeShape EntityType="RemoteModel.ADDRESS" Width="1.5" PointX="1.5" PointY="59" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_DISPLAY_PANEL_VERSIONS" Width="1.5" PointX="1.5" PointY="63.125" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="84.125" /> + <EntityTypeShape EntityType="RemoteModel.APPLICATION_OS_VERSIONS" Width="1.5" PointX="1.5" PointY="74" /> <EntityTypeShape EntityType="RemoteModel.BRUSH_STOPS" Width="1.5" PointX="15.75" PointY="17" /> - <EntityTypeShape EntityType="RemoteModel.CARTRIDGE_TYPES" Width="1.5" PointX="3.75" PointY="43.5" /> - <EntityTypeShape EntityType="RemoteModel.CAT" Width="1.5" PointX="8.25" PointY="19.875" /> - <EntityTypeShape EntityType="RemoteModel.CCT" Width="1.5" PointX="0.75" PointY="15.75" /> + <EntityTypeShape EntityType="RemoteModel.CARTRIDGE_TYPES" Width="1.5" PointX="3" PointY="39.75" /> + <EntityTypeShape EntityType="RemoteModel.CAT" Width="1.5" PointX="5.25" PointY="19.875" /> + <EntityTypeShape EntityType="RemoteModel.CCT" Width="1.5" PointX="0.75" PointY="20.125" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS" Width="1.5" PointX="1.5" PointY="7.625" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_GROUPS" Width="1.5" PointX="3.75" PointY="8.125" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_ITEMS" Width="1.5" PointX="6" PointY="6.875" /> <EntityTypeShape EntityType="RemoteModel.COLOR_CATALOGS_ITEMS_RECIPES" Width="1.5" PointX="8.25" PointY="15.75" /> - <EntityTypeShape EntityType="RemoteModel.COLOR_SPACES" Width="1.5" PointX="9" PointY="33.5" /> - <EntityTypeShape EntityType="RemoteModel.CONFIGURATION" Width="1.5" PointX="3.75" PointY="61.75" /> - <EntityTypeShape EntityType="RemoteModel.CONTACT" Width="1.5" PointX="1.5" PointY="72.125" /> - <EntityTypeShape EntityType="RemoteModel.CUSTOMER" Width="1.5" PointX="9" PointY="11.5" /> - <EntityTypeShape EntityType="RemoteModel.DATA_STORE_ITEMS" Width="1.5" PointX="8.25" PointY="76.25" /> - <EntityTypeShape EntityType="RemoteModel.DISPENSER_TYPES" Width="1.5" PointX="1.5" PointY="36.5" /> - <EntityTypeShape EntityType="RemoteModel.DISPENSER" Width="1.5" PointX="3.75" PointY="35.875" /> - <EntityTypeShape EntityType="RemoteModel.EMBEDDED_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="59.125" /> - <EntityTypeShape EntityType="RemoteModel.EVENT_TYPES" Width="1.5" PointX="9" PointY="40.75" /> - <EntityTypeShape EntityType="RemoteModel.FIBER_SHAPES" Width="1.5" PointX="0.75" PointY="20.25" /> - <EntityTypeShape EntityType="RemoteModel.FIBER_SYNTHS" Width="1.5" PointX="0.75" PointY="32.75" /> - <EntityTypeShape EntityType="RemoteModel.FSE_VERSIONS" Width="1.5" PointX="11.25" PointY="42.625" /> - <EntityTypeShape EntityType="RemoteModel.GLOBAL_DATA_STORE_ITEMS" Width="1.5" PointX="10.75" PointY="0.75" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWER_TYPES" Width="1.5" PointX="4.5" PointY="58.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWERS" Width="1.5" PointX="6.75" PointY="60" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSOR_TYPES" Width="1.5" PointX="6.5" PointY="80.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSORS" Width="1.5" PointX="8.75" PointY="64.125" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCER_TYPES" Width="1.5" PointX="1.5" PointY="80.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCERS" Width="1.5" PointX="3.75" PointY="67.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTOR_TYPES" Width="1.5" PointX="9.5" PointY="59.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTORS" Width="1.5" PointX="11.75" PointY="56" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROL_TYPES" Width="1.5" PointX="9.5" PointY="80.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROLS" Width="1.5" PointX="11.75" PointY="66.5" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSOR_TYPES" Width="1.5" PointX="6.5" PointY="88.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSORS" Width="1.5" PointX="8.75" PointY="72.125" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="67.875" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDER_TYPES" Width="1.5" PointX="6.5" PointY="84.375" /> - <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDERS" Width="1.5" PointX="8.75" PointY="68.25" /> - <EntityTypeShape EntityType="RemoteModel.IDS_PACK_FORMULAS" Width="1.5" PointX="3.75" PointY="40.125" /> - <EntityTypeShape EntityType="RemoteModel.IDS_PACKS" Width="1.5" PointX="6" PointY="32.125" /> - <EntityTypeShape EntityType="RemoteModel.JOB_RUNS" Width="1.5" PointX="14.75" PointY="0.75" /> + <EntityTypeShape EntityType="RemoteModel.COLOR_SPACES" Width="1.5" PointX="9" PointY="24.5" /> + <EntityTypeShape EntityType="RemoteModel.CONFIGURATION" Width="1.5" PointX="0.75" PointY="68.625" /> + <EntityTypeShape EntityType="RemoteModel.CONTACT" Width="1.5" PointX="1.5" PointY="55.125" /> + <EntityTypeShape EntityType="RemoteModel.CUSTOMER" Width="1.5" PointX="9" PointY="28" /> + <EntityTypeShape EntityType="RemoteModel.DATA_STORE_ITEMS" Width="1.5" PointX="5.25" PointY="56.125" /> + <EntityTypeShape EntityType="RemoteModel.DISPENSER_TYPES" Width="1.5" PointX="0.75" PointY="90.25" /> + <EntityTypeShape EntityType="RemoteModel.DISPENSER" Width="1.5" PointX="3" PointY="89.625" /> + <EntityTypeShape EntityType="RemoteModel.EMBEDDED_FIRMWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="77" /> + <EntityTypeShape EntityType="RemoteModel.EVENT_TYPES" Width="1.5" PointX="9" PointY="41" /> + <EntityTypeShape EntityType="RemoteModel.FIBER_SHAPES" Width="1.5" PointX="0.75" PointY="29.75" /> + <EntityTypeShape EntityType="RemoteModel.FIBER_SYNTHS" Width="1.5" PointX="0.75" PointY="32.625" /> + <EntityTypeShape EntityType="RemoteModel.FSE_VERSIONS" Width="1.5" PointX="11.25" PointY="47.125" /> + <EntityTypeShape EntityType="RemoteModel.GLOBAL_DATA_STORE_ITEMS" Width="1.5" PointX="8.75" PointY="4.75" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWER_TYPES" Width="1.5" PointX="1.5" PointY="102.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BLOWERS" Width="1.5" PointX="3.75" PointY="85.125" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSOR_TYPES" Width="1.5" PointX="4.5" PointY="98.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_BREAK_SENSORS" Width="1.5" PointX="6.75" PointY="84.125" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCER_TYPES" Width="1.5" PointX="1.5" PointY="98.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_DANCERS" Width="1.5" PointX="3.75" PointY="79.375" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTOR_TYPES" Width="1.5" PointX="1.5" PointY="94.375" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_MOTORS" Width="1.5" PointX="3.75" PointY="69.125" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROL_TYPES" Width="1.5" PointX="7.5" PointY="72.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_PID_CONTROLS" Width="1.5" PointX="9.75" PointY="78.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSOR_TYPES" Width="1.5" PointX="4.5" PointY="65.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_SPEED_SENSORS" Width="1.5" PointX="6.75" PointY="76.125" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_VERSIONS" Width="1.5" PointX="1.5" PointY="79.875" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDER_TYPES" Width="1.5" PointX="4.5" PointY="94.5" /> + <EntityTypeShape EntityType="RemoteModel.HARDWARE_WINDERS" Width="1.5" PointX="6.75" PointY="80.25" /> + <EntityTypeShape EntityType="RemoteModel.IDS_PACK_FORMULAS" Width="1.5" PointX="3" PointY="36.375" /> + <EntityTypeShape EntityType="RemoteModel.IDS_PACKS" Width="1.5" PointX="5.25" PointY="35.5" /> + <EntityTypeShape EntityType="RemoteModel.JOB_RUNS" Width="1.5" PointX="10.75" PointY="0.75" /> <EntityTypeShape EntityType="RemoteModel.JOB" Width="1.5" PointX="11.25" PointY="16.375" /> - <EntityTypeShape EntityType="RemoteModel.LINEAR_MASS_DENSITY_UNITS" Width="1.5" PointX="0.75" PointY="27" /> + <EntityTypeShape EntityType="RemoteModel.LINEAR_MASS_DENSITY_UNITS" Width="1.5" PointX="0.75" PointY="23.875" /> <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES" Width="1.5" PointX="3" PointY="2.625" /> <EntityTypeShape EntityType="RemoteModel.LIQUID_TYPES_RMLS" Width="1.5" PointX="5.25" PointY="16" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE_STUDIO_VERSIONS" Width="1.5" PointX="11.25" PointY="31" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE_VERSIONS" Width="1.5" PointX="3.75" PointY="80.125" /> - <EntityTypeShape EntityType="RemoteModel.MACHINE" Width="1.5" PointX="6" PointY="64.875" /> - <EntityTypeShape EntityType="RemoteModel.MACHINES_EVENTS" Width="1.5" PointX="11.25" PointY="49.125" /> - <EntityTypeShape EntityType="RemoteModel.MEDIA_CONDITIONS" Width="1.5" PointX="0.75" PointY="24" /> - <EntityTypeShape EntityType="RemoteModel.MEDIA_MATERIALS" Width="1.5" PointX="0.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.MEDIA_PURPOSES" Width="1.5" PointX="0.75" PointY="29.875" /> - <EntityTypeShape EntityType="RemoteModel.MID_TANK_TYPES" Width="1.5" PointX="3.75" PointY="32.75" /> - <EntityTypeShape EntityType="RemoteModel.ORGANIZATION" Width="1.5" PointX="3.75" PointY="74" /> - <EntityTypeShape EntityType="RemoteModel.PERMISSION" Width="1.5" PointX="12" PointY="5.125" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE_STUDIO_VERSIONS" Width="1.5" PointX="11.25" PointY="34.75" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE_VERSIONS" Width="1.5" PointX="0.75" PointY="51.125" /> + <EntityTypeShape EntityType="RemoteModel.MACHINE" Width="1.5" PointX="3" PointY="44.75" /> + <EntityTypeShape EntityType="RemoteModel.MACHINES_EVENTS" Width="1.5" PointX="11.25" PointY="42.375" /> + <EntityTypeShape EntityType="RemoteModel.MEDIA_CONDITIONS" Width="1.5" PointX="0.75" PointY="15.875" /> + <EntityTypeShape EntityType="RemoteModel.MEDIA_MATERIALS" Width="1.5" PointX="0.75" PointY="26.75" /> + <EntityTypeShape EntityType="RemoteModel.MEDIA_PURPOSES" Width="1.5" PointX="0.75" PointY="13" /> + <EntityTypeShape EntityType="RemoteModel.MID_TANK_TYPES" Width="1.5" PointX="3" PointY="33.25" /> + <EntityTypeShape EntityType="RemoteModel.ORGANIZATION" Width="1.5" PointX="0.75" PointY="38.125" /> + <EntityTypeShape EntityType="RemoteModel.PERMISSION" Width="1.5" PointX="12" PointY="55.625" /> <EntityTypeShape EntityType="RemoteModel.PROCESS_PARAMETERS_TABLES" Width="1.5" PointX="7.5" PointY="46.625" /> <EntityTypeShape EntityType="RemoteModel.PROCESS_PARAMETERS_TABLES_GROUPS" Width="1.5" PointX="5.25" PointY="49.25" /> <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS" Width="1.5" PointX="5.75" PointY="1" /> <EntityTypeShape EntityType="RemoteModel.PUBLISHED_PROCEDURE_PROJECTS_VERSIONS" Width="1.5" PointX="8" PointY="1.125" /> <EntityTypeShape EntityType="RemoteModel.RML" Width="1.5" PointX="3" PointY="15" /> - <EntityTypeShape EntityType="RemoteModel.RMLS_SPOOLS" Width="1.5" PointX="5.25" PointY="23.875" /> - <EntityTypeShape EntityType="RemoteModel.ROLE" Width="1.5" PointX="12" PointY="9" /> - <EntityTypeShape EntityType="RemoteModel.ROLES_PERMISSIONS" Width="1.5" PointX="14.25" PointY="9.125" /> + <EntityTypeShape EntityType="RemoteModel.RMLS_SPOOLS" Width="1.5" PointX="8.25" PointY="19.875" /> + <EntityTypeShape EntityType="RemoteModel.ROLE" Width="1.5" PointX="12" PointY="51.5" /> + <EntityTypeShape EntityType="RemoteModel.ROLES_PERMISSIONS" Width="1.5" PointX="14.25" PointY="51.625" /> <EntityTypeShape EntityType="RemoteModel.SEGMENT" Width="1.5" PointX="13.5" PointY="20" /> <EntityTypeShape EntityType="RemoteModel.SITE" Width="1.5" PointX="3" PointY="29" /> <EntityTypeShape EntityType="RemoteModel.SITES_CATALOGS" Width="1.5" PointX="11.25" PointY="12.5" /> - <EntityTypeShape EntityType="RemoteModel.SITES_RMLS" Width="1.5" PointX="5.25" PointY="20.25" /> - <EntityTypeShape EntityType="RemoteModel.SPOOL_TYPES" Width="1.5" PointX="9" PointY="5.625" /> - <EntityTypeShape EntityType="RemoteModel.SPOOL" Width="1.5" PointX="11.25" PointY="38.125" /> - <EntityTypeShape EntityType="RemoteModel.sysdiagram" Width="1.5" PointX="5.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.TANGO_UPDATES" Width="1.5" PointX="13.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.TANGO_VERSIONS" Width="1.5" PointX="14.25" PointY="53.5" /> - <EntityTypeShape EntityType="RemoteModel.TECH_CONTROLLERS" Width="1.5" PointX="15.75" PointY="12.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_DISPENSERS" Width="1.5" PointX="16.75" PointY="0.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_HEATERS" Width="1.5" PointX="16.75" PointY="3.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_IOS" Width="1.5" PointX="16.75" PointY="6.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_MONITORS" Width="1.5" PointX="17.75" PointY="11.75" /> - <EntityTypeShape EntityType="RemoteModel.TECH_VALVES" Width="1.5" PointX="17.75" PointY="16.75" /> - <EntityTypeShape EntityType="RemoteModel.USER" Width="1.5" PointX="9" PointY="27.75" /> - <EntityTypeShape EntityType="RemoteModel.USERS_ROLES" Width="1.5" PointX="14.25" PointY="29.125" /> - <EntityTypeShape EntityType="RemoteModel.WINDING_METHODS" Width="1.5" PointX="9" PointY="24.625" /> + <EntityTypeShape EntityType="RemoteModel.SITES_RMLS" Width="1.5" PointX="5.25" PointY="24.25" /> + <EntityTypeShape EntityType="RemoteModel.SPOOL_TYPES" Width="1.5" PointX="9" PointY="10.5" /> + <EntityTypeShape EntityType="RemoteModel.SPOOL" Width="1.5" PointX="11.25" PointY="30.625" /> + <EntityTypeShape EntityType="RemoteModel.sysdiagram" Width="1.5" PointX="11.75" PointY="8.75" /> + <EntityTypeShape EntityType="RemoteModel.TANGO_UPDATES" Width="1.5" PointX="12.75" PointY="0.75" /> + <EntityTypeShape EntityType="RemoteModel.TANGO_VERSIONS" Width="1.5" PointX="14.25" PointY="42.125" /> + <EntityTypeShape EntityType="RemoteModel.TECH_CONTROLLERS" Width="1.5" PointX="13.75" PointY="5.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_DISPENSERS" Width="1.5" PointX="5.75" PointY="12.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_HEATERS" Width="1.5" PointX="13.75" PointY="9.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_IOS" Width="1.5" PointX="14.75" PointY="0.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_MONITORS" Width="1.5" PointX="13.75" PointY="12.75" /> + <EntityTypeShape EntityType="RemoteModel.TECH_VALVES" Width="1.5" PointX="15.75" PointY="5.75" /> + <EntityTypeShape EntityType="RemoteModel.USER" Width="1.5" PointX="9" PointY="34.25" /> + <EntityTypeShape EntityType="RemoteModel.USERS_ROLES" Width="1.5" PointX="14.25" PointY="35.625" /> + <EntityTypeShape EntityType="RemoteModel.WINDING_METHODS" Width="1.5" PointX="9" PointY="31.125" /> <AssociationConnector Association="RemoteModel.FK_ACTION_LOGS_USERS" /> <AssociationConnector Association="RemoteModel.FK_ORGANIZATIONS_ADDRESSES" /> <AssociationConnector Association="RemoteModel.FK_USERS_ADDRESSES" /> diff --git a/Software/Visual_Studio/Tango.DAL.Remote/DB/TANGO_VERSIONS.cs b/Software/Visual_Studio/Tango.DAL.Remote/DB/TANGO_VERSIONS.cs index 4c46e8170..ba1dbb55b 100644 --- a/Software/Visual_Studio/Tango.DAL.Remote/DB/TANGO_VERSIONS.cs +++ b/Software/Visual_Studio/Tango.DAL.Remote/DB/TANGO_VERSIONS.cs @@ -24,6 +24,7 @@ namespace Tango.DAL.Remote.DB public string COMMENTS { get; set; } public string USER_GUID { get; set; } public string MACHINE_VERSION_GUID { get; set; } + public bool DISABLED { get; set; } public virtual MACHINE_VERSIONS MACHINE_VERSIONS { get; set; } public virtual USER USER { get; set; } diff --git a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs index 1d420e33f..9cdf6dcae 100644 --- a/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs +++ b/Software/Visual_Studio/Tango.Emulations/Emulators/MachineEmulator.cs @@ -473,6 +473,9 @@ namespace Tango.Emulations.Emulators case MessageType.AttemptThreadJoggingRequest: HandleAttemptThreadJoggingRequest(MessageFactory.ParseTangoMessageFromContainer<AttemptThreadJoggingRequest>(container)); break; + case MessageType.DataStoreItemModifiedRequest: + HandleDataStoreItemModifiedRequest(MessageFactory.ParseTangoMessageFromContainer<DataStoreItemModifiedRequest>(container)); + break; } } @@ -1736,6 +1739,17 @@ namespace Tango.Emulations.Emulators } } + private async void HandleDataStoreItemModifiedRequest(TangoMessage<DataStoreItemModifiedRequest> request) + { + await Transporter.SendResponse<DataStoreItemModifiedResponse>(new DataStoreItemModifiedResponse(), request.Container.Token); + + GetDataStoreItem(new GetDataStoreItemRequest() + { + Collection = request.Message.Collection, + Key = request.Message.Key + }); + } + #endregion #region Public Methods @@ -2132,6 +2146,33 @@ namespace Tango.Emulations.Emulators } } + public async void PutDataStoreItem(PutDataStoreItemRequest request) + { + LogManager.Log($"Sending PutDataStoreItemRequest:\n{request.ToJsonString()}"); + try + { + var response = await Transporter.SendRequest<PutDataStoreItemRequest, PutDataStoreItemResponse>(request); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error putting data store item."); + } + } + + public async void GetDataStoreItem(GetDataStoreItemRequest request) + { + LogManager.Log($"Sending GetDataStoreItemRequest:\n{request.ToJsonString()}"); + try + { + var response = await Transporter.SendRequest<GetDataStoreItemRequest, GetDataStoreItemResponse>(request); + LogManager.Log($"Received GetDataStoreItemResponse:\n{response.Message.ToJsonString()}"); + } + catch (Exception ex) + { + LogManager.Log(ex, "Error getting data store item."); + } + } + #endregion } } diff --git a/Software/Visual_Studio/Tango.Emulations/Tango.Emulations.csproj b/Software/Visual_Studio/Tango.Emulations/Tango.Emulations.csproj index e01f0be8d..022188335 100644 --- a/Software/Visual_Studio/Tango.Emulations/Tango.Emulations.csproj +++ b/Software/Visual_Studio/Tango.Emulations/Tango.Emulations.csproj @@ -90,7 +90,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs index 2bec38f82..93320c646 100644 --- a/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs +++ b/Software/Visual_Studio/Tango.Integration/Operation/MachineOperator.cs @@ -654,7 +654,9 @@ namespace Tango.Integration.Operation bool responseLogged = false; _diagnosticsSent = true; - SendContinuousRequest<StartDiagnosticsRequest, StartDiagnosticsResponse>(request, new TransportContinuousRequestConfig() { ShouldLog = true }).ObserveOn(new NewThreadScheduler()).Subscribe( + LogManager.Log($"Sending '{nameof(StartDiagnosticsRequest)}'..."); + + SendContinuousRequest<StartDiagnosticsRequest, StartDiagnosticsResponse>(request, new TransportContinuousRequestConfig() { ShouldLog = false }).ObserveOn(new NewThreadScheduler()).Subscribe( (response) => { if (!responseLogged) @@ -3236,8 +3238,11 @@ namespace Tango.Integration.Operation try { + LogManager.Log($"Sending '{nameof(UploadHardwareConfigurationRequest)}'..."); + LogManager.Log($"{nameof(UploadHardwareConfigurationRequest)} request:\n{request.HardwareConfiguration.ToJsonString()}", LogCategory.Debug); + CurrentHardwareConfiguration = hardwareConfiguration; - response = await SendRequest<UploadHardwareConfigurationRequest, UploadHardwareConfigurationResponse>(request, new TransportRequestConfig() { ShouldLog = true }); + response = await SendRequest<UploadHardwareConfigurationRequest, UploadHardwareConfigurationResponse>(request, new TransportRequestConfig() { ShouldLog = false }); } catch (Exception ex) { diff --git a/Software/Visual_Studio/Tango.PMR/ColorLab/LiquidType.cs b/Software/Visual_Studio/Tango.PMR/ColorLab/LiquidType.cs index 1b1b633c7..6773455bb 100644 --- a/Software/Visual_Studio/Tango.PMR/ColorLab/LiquidType.cs +++ b/Software/Visual_Studio/Tango.PMR/ColorLab/LiquidType.cs @@ -22,11 +22,12 @@ namespace Tango.PMR.ColorLab { static LiquidTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "ChBMaXF1aWRUeXBlLnByb3RvEhJUYW5nby5QTVIuQ29sb3JMYWIqagoKTGlx", - "dWlkVHlwZRIICgRDeWFuEAASCwoHTWFnZW50YRABEgoKBlllbGxvdxACEgkK", - "BUJsYWNrEAMSEgoOVHJhbnNwYXJlbnRJbmsQBBINCglMdWJyaWNhbnQQBRIL", - "CgdDbGVhbmVyEAZCHgocY29tLnR3aW5lLnRhbmdvLnBtci5jb2xvcmxhYmIG", - "cHJvdG8z")); + "ChBMaXF1aWRUeXBlLnByb3RvEhJUYW5nby5QTVIuQ29sb3JMYWIqnAEKCkxp", + "cXVpZFR5cGUSCAoEQ3lhbhAAEgsKB01hZ2VudGEQARIKCgZZZWxsb3cQAhIJ", + "CgVCbGFjaxADEhIKDlRyYW5zcGFyZW50SW5rEAQSDQoJTHVicmljYW50EAUS", + "CwoHQ2xlYW5lchAGEg0KCUxpZ2h0Q3lhbhAHEhAKDExpZ2h0TWFnZW50YRAI", + "Eg8KC0xpZ2h0WWVsbG93EAlCHgocY29tLnR3aW5lLnRhbmdvLnBtci5jb2xv", + "cmxhYmIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.ColorLab.LiquidType), }, null)); @@ -43,6 +44,9 @@ namespace Tango.PMR.ColorLab { [pbr::OriginalName("TransparentInk")] TransparentInk = 4, [pbr::OriginalName("Lubricant")] Lubricant = 5, [pbr::OriginalName("Cleaner")] Cleaner = 6, + [pbr::OriginalName("LightCyan")] LightCyan = 7, + [pbr::OriginalName("LightMagenta")] LightMagenta = 8, + [pbr::OriginalName("LightYellow")] LightYellow = 9, } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs index e7e14f988..8c8b838f0 100644 --- a/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs +++ b/Software/Visual_Studio/Tango.PMR/Common/MessageType.cs @@ -22,7 +22,7 @@ namespace Tango.PMR.Common { static MessageTypeReflection() { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( - "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbiqhPgoLTWVz", + "ChFNZXNzYWdlVHlwZS5wcm90bxIQVGFuZ28uUE1SLkNvbW1vbirOPwoLTWVz", "c2FnZVR5cGUSCAoETm9uZRAAEhEKDUVycm9yUmVzcG9uc2UQARIUChBDYWxj", "dWxhdGVSZXF1ZXN0EAMSFQoRQ2FsY3VsYXRlUmVzcG9uc2UQBBITCg9Qcm9n", "cmVzc1JlcXVlc3QQBRIUChBQcm9ncmVzc1Jlc3BvbnNlEAYSHAoYU3R1YkNh", @@ -96,111 +96,115 @@ namespace Tango.PMR.Common { "ZWFkUmVzcG9uc2UQbhIiCh5TdHViTWFpbkNhcmRFRXByb21Xcml0ZVJlcXVl", "c3QQbxIjCh9TdHViTWFpbkNhcmRFRXByb21Xcml0ZVJlc3BvbnNlEHASGQoV", "U3R1YkhlYWRFRXByb21SZXF1ZXN0EHESGgoWU3R1YkhlYWRFRXByb21SZXNw", - "b25zZRByEiUKIEV4dGVybmFsQnJpZGdlVWRwRGlzY292ZXJ5UGFja2V0EOgH", - "Eh8KGkV4dGVybmFsQnJpZGdlTG9naW5SZXF1ZXN0EOkHEiAKG0V4dGVybmFs", - "QnJpZGdlTG9naW5SZXNwb25zZRDqBxIgChtFeHRlcm5hbEJyaWRnZUxvZ291", - "dFJlcXVlc3QQ6wcSIQocRXh0ZXJuYWxCcmlkZ2VMb2dvdXRSZXNwb25zZRDs", - "BxIhChxEaXJlY3RTeW5jaHJvbml6YXRpb25SZXF1ZXN0EO0HEiIKHURpcmVj", - "dFN5bmNocm9uaXphdGlvblJlc3BvbnNlEO4HEhwKF092ZXJyaWRlRGF0YUJh", - "c2VSZXF1ZXN0EO8HEh0KGE92ZXJyaWRlRGF0YUJhc2VSZXNwb25zZRDwBxIg", - "ChtTdGFydEFwcGxpY2F0aW9uTG9nc1JlcXVlc3QQ8QcSIQocU3RhcnRBcHBs", - "aWNhdGlvbkxvZ3NSZXNwb25zZRDyBxIfChpTdG9wQXBwbGljYXRpb25Mb2dz", - "UmVxdWVzdBDzBxIgChtTdG9wQXBwbGljYXRpb25Mb2dzUmVzcG9uc2UQ9AcS", - "GAoTQ29sb3JQcm9maWxlUmVxdWVzdBD1BxIZChRDb2xvclByb2ZpbGVSZXNw", - "b25zZRD2BxIYChNVcGRhdGVTdGF0dXNSZXF1ZXN0EPcHEhkKFFVwZGF0ZVN0", - "YXR1c1Jlc3BvbnNlEPgHEhMKDkdlbmVyaWNSZXF1ZXN0EPkHEhQKD0dlbmVy", - "aWNSZXNwb25zZRD6BxIdChhDb25maWd1cmVQcm90b2NvbFJlcXVlc3QQ+wcS", - "HgoZQ29uZmlndXJlUHJvdG9jb2xSZXNwb25zZRD8BxIcChdTdGFydERpYWdu", - "b3N0aWNzUmVxdWVzdBDQDxIdChhTdGFydERpYWdub3N0aWNzUmVzcG9uc2UQ", - "0Q8SHAoXTW90b3JBYm9ydEhvbWluZ1JlcXVlc3QQ0g8SHQoYTW90b3JBYm9y", - "dEhvbWluZ1Jlc3BvbnNlENMPEhcKEk1vdG9ySG9taW5nUmVxdWVzdBDUDxIY", - "ChNNb3RvckhvbWluZ1Jlc3BvbnNlENUPEhgKE01vdG9ySm9nZ2luZ1JlcXVl", - "c3QQ1g8SGQoUTW90b3JKb2dnaW5nUmVzcG9uc2UQ1w8SHQoYTW90b3JBYm9y", - "dEpvZ2dpbmdSZXF1ZXN0ENgPEh4KGU1vdG9yQWJvcnRKb2dnaW5nUmVzcG9u", - "c2UQ2Q8SIAobRGlzcGVuc2VyQWJvcnRIb21pbmdSZXF1ZXN0ENoPEiEKHERp", - "c3BlbnNlckFib3J0SG9taW5nUmVzcG9uc2UQ2w8SGwoWRGlzcGVuc2VySG9t", - "aW5nUmVxdWVzdBDcDxIcChdEaXNwZW5zZXJIb21pbmdSZXNwb25zZRDdDxIc", - "ChdEaXNwZW5zZXJKb2dnaW5nUmVxdWVzdBDeDxIdChhEaXNwZW5zZXJKb2dn", - "aW5nUmVzcG9uc2UQ3w8SIQocRGlzcGVuc2VyQWJvcnRKb2dnaW5nUmVxdWVz", - "dBDgDxIiCh1EaXNwZW5zZXJBYm9ydEpvZ2dpbmdSZXNwb25zZRDhDxIZChRT", - "ZXREaWdpdGFsT3V0UmVxdWVzdBDiDxIaChVTZXREaWdpdGFsT3V0UmVzcG9u", - "c2UQ4w8SGQoUVGhyZWFkSm9nZ2luZ1JlcXVlc3QQ5A8SGgoVVGhyZWFkSm9n", - "Z2luZ1Jlc3BvbnNlEOUPEh4KGVRocmVhZEFib3J0Sm9nZ2luZ1JlcXVlc3QQ", - "5g8SHwoaVGhyZWFkQWJvcnRKb2dnaW5nUmVzcG9uc2UQ5w8SHQoYU2V0Q29t", - "cG9uZW50VmFsdWVSZXF1ZXN0EOgPEh4KGVNldENvbXBvbmVudFZhbHVlUmVz", - "cG9uc2UQ6Q8SGAoTUmVzb2x2ZUV2ZW50UmVxdWVzdBDqDxIZChRSZXNvbHZl", - "RXZlbnRSZXNwb25zZRDrDxIbChZTdG9wRGlhZ25vc3RpY3NSZXF1ZXN0EOwP", - "EhwKF1N0b3BEaWFnbm9zdGljc1Jlc3BvbnNlEO0PEiMKHlN0YXJ0RXZlbnRz", - "Tm90aWZpY2F0aW9uUmVxdWVzdBDuDxIkCh9TdGFydEV2ZW50c05vdGlmaWNh", - "dGlvblJlc3BvbnNlEO8PEiIKHVN0b3BFdmVudHNOb3RpZmljYXRpb25SZXF1", - "ZXN0EPAPEiMKHlN0b3BFdmVudHNOb3RpZmljYXRpb25SZXNwb25zZRDxDxIa", - "ChVTZXRIZWF0ZXJTdGF0ZVJlcXVlc3QQ8g8SGwoWU2V0SGVhdGVyU3RhdGVS", - "ZXNwb25zZRDzDxIaChVTZXRCbG93ZXJTdGF0ZVJlcXVlc3QQ9A8SGwoWU2V0", - "Qmxvd2VyU3RhdGVSZXNwb25zZRD1DxIZChRTZXRWYWx2ZVN0YXRlUmVxdWVz", - "dBD2DxIaChVTZXRWYWx2ZVN0YXRlUmVzcG9uc2UQ9w8SHwoaQ2FydHJpZGdl", - "VmFsaWRhdGlvblJlcXVlc3QQ/A8SIAobQ2FydHJpZGdlVmFsaWRhdGlvblJl", - "c3BvbnNlEP0PEg8KCkpvYlJlcXVlc3QQuBcSEAoLSm9iUmVzcG9uc2UQuRcS", - "FAoPQWJvcnRKb2JSZXF1ZXN0ELoXEhUKEEFib3J0Sm9iUmVzcG9uc2UQuxcS", - "IwoeVXBsb2FkUHJvY2Vzc1BhcmFtZXRlcnNSZXF1ZXN0ELwXEiQKH1VwbG9h", - "ZFByb2Nlc3NQYXJhbWV0ZXJzUmVzcG9uc2UQvRcSFgoRQ3VycmVudEpvYlJl", - "cXVlc3QQvhcSFwoSQ3VycmVudEpvYlJlc3BvbnNlEL8XEhwKF1Jlc3VtZUN1", - "cnJlbnRKb2JSZXF1ZXN0EMAXEh0KGFJlc3VtZUN1cnJlbnRKb2JSZXNwb25z", - "ZRDBFxIdChhTdGFydEhlYWRDbGVhbmluZ1JlcXVlc3QQwhcSHgoZU3RhcnRI", - "ZWFkQ2xlYW5pbmdSZXNwb25zZRDDFxIdChhBYm9ydEhlYWRDbGVhbmluZ1Jl", - "cXVlc3QQxBcSHgoZQWJvcnRIZWFkQ2xlYW5pbmdSZXNwb25zZRDFFxIZChRT", - "dGFydERlYnVnTG9nUmVxdWVzdBCgHxIaChVTdGFydERlYnVnTG9nUmVzcG9u", - "c2UQoR8SGAoTU3RvcERlYnVnTG9nUmVxdWVzdBCiHxIZChRTdG9wRGVidWdM", - "b2dSZXNwb25zZRCjHxIfChpTZXREZWJ1Z0xvZ0NhdGVnb3J5UmVxdWVzdBCk", - "HxIgChtTZXREZWJ1Z0xvZ0NhdGVnb3J5UmVzcG9uc2UQpR8SIQocU2V0dXBE", - "ZWJ1Z0Rpc3JpYnV0b3JzUmVxdWVzdBCmHxIiCh1TZXR1cERlYnVnRGlzcmli", - "dXRvcnNSZXNwb25zZRCnHxInCiJVcGxvYWRIYXJkd2FyZUNvbmZpZ3VyYXRp", - "b25SZXF1ZXN0EIgnEigKI1VwbG9hZEhhcmR3YXJlQ29uZmlndXJhdGlvblJl", - "c3BvbnNlEIknEhcKElN5c3RlbVJlc2V0UmVxdWVzdBCKJxIYChNTeXN0ZW1S", - "ZXNldFJlc3BvbnNlEIsnEhUKEEtlZXBBbGl2ZVJlcXVlc3QQ8C4SFgoRS2Vl", - "cEFsaXZlUmVzcG9uc2UQ8S4SEwoOQ29ubmVjdFJlcXVlc3QQ8i4SFAoPQ29u", - "bmVjdFJlc3BvbnNlEPMuEhYKEURpc2Nvbm5lY3RSZXF1ZXN0EPQuEhcKEkRp", - "c2Nvbm5lY3RSZXNwb25zZRD1LhIWChFGaWxlVXBsb2FkUmVxdWVzdBDYNhIX", - "ChJGaWxlVXBsb2FkUmVzcG9uc2UQ2TYSGwoWRmlsZUNodW5rVXBsb2FkUmVx", - "dWVzdBDaNhIcChdGaWxlQ2h1bmtVcGxvYWRSZXNwb25zZRDbNhIaChVFeGVj", - "dXRlUHJvY2Vzc1JlcXVlc3QQ3DYSGwoWRXhlY3V0ZVByb2Nlc3NSZXNwb25z", - "ZRDdNhIXChJLaWxsUHJvY2Vzc1JlcXVlc3QQ3jYSGAoTS2lsbFByb2Nlc3NS", - "ZXNwb25zZRDfNhISCg1DcmVhdGVSZXF1ZXN0EOA2EhMKDkNyZWF0ZVJlc3Bv", - "bnNlEOE2EhIKDURlbGV0ZVJlcXVlc3QQ4jYSEwoORGVsZXRlUmVzcG9uc2UQ", - "4zYSGgoVR2V0U3RvcmFnZUluZm9SZXF1ZXN0EOQ2EhsKFkdldFN0b3JhZ2VJ", - "bmZvUmVzcG9uc2UQ5TYSFAoPR2V0RmlsZXNSZXF1ZXN0EOY2EhUKEEdldEZp", - "bGVzUmVzcG9uc2UQ5zYSGAoTRmlsZURvd25sb2FkUmVxdWVzdBDoNhIZChRG", - "aWxlRG93bmxvYWRSZXNwb25zZRDpNhIdChhGaWxlQ2h1bmtEb3dubG9hZFJl", - "cXVlc3QQ6jYSHgoZRmlsZUNodW5rRG93bmxvYWRSZXNwb25zZRDrNhIbChZW", - "YWxpZGF0ZVZlcnNpb25SZXF1ZXN0EOw2EhwKF1ZhbGlkYXRlVmVyc2lvblJl", - "c3BvbnNlEO02EhsKFkFjdGl2YXRlVmVyc2lvblJlcXVlc3QQ7jYSHAoXQWN0", - "aXZhdGVWZXJzaW9uUmVzcG9uc2UQ7zYSGQoURGlzcGVuc2VyRGF0YVJlcXVl", - "c3QQwD4SGgoVRGlzcGVuc2VyRGF0YVJlc3BvbnNlEME+EhwKF01pZFRhbmtE", - "YXRhU2V0dXBSZXF1ZXN0EMI+Eh0KGE1pZFRhbmtEYXRhU2V0dXBSZXNwb25z", - "ZRDDPhIiCh1NYWNoaW5lQ2FsaWJyYXRpb25EYXRhUmVxdWVzdBDEPhIjCh5N", - "YWNoaW5lQ2FsaWJyYXRpb25EYXRhUmVzcG9uc2UQxT4SHgoZTWFpbkNhcmRT", - "dG9yZWREYXRhUmVxdWVzdBDGPhIfChpNYWluQ2FyZFN0b3JlZERhdGFSZXNw", - "b25zZRDHPhIkCh9TdGFydE1hY2hpbmVTdGF0dXNVcGRhdGVSZXF1ZXN0EKhG", - "EiUKIFN0YXJ0TWFjaGluZVN0YXR1c1VwZGF0ZVJlc3BvbnNlEKlGEiMKHlN0", - "b3BNYWNoaW5lU3RhdHVzVXBkYXRlUmVxdWVzdBCqRhIkCh9TdG9wTWFjaGlu", - "ZVN0YXR1c1VwZGF0ZVJlc3BvbnNlEKtGEhoKFVN0YXJ0UG93ZXJEb3duUmVx", - "dWVzdBCQThIbChZTdGFydFBvd2VyRG93blJlc3BvbnNlEJFOEhoKFUFib3J0", - "UG93ZXJEb3duUmVxdWVzdBCSThIbChZBYm9ydFBvd2VyRG93blJlc3BvbnNl", - "EJNOEhgKE1N0YXJ0UG93ZXJVcFJlcXVlc3QQlE4SGQoUU3RhcnRQb3dlclVw", - "UmVzcG9uc2UQlU4SGAoTQWJvcnRQb3dlclVwUmVxdWVzdBCWThIZChRBYm9y", - "dFBvd2VyVXBSZXNwb25zZRCXThITCg5TdGFuZEJ5UmVxdWVzdBCYThIUCg9T", - "dGFuZEJ5UmVzcG9uc2UQmU4SHgoZU3RhcnRUaHJlYWRMb2FkaW5nUmVxdWVz", - "dBD4VRIfChpTdGFydFRocmVhZExvYWRpbmdSZXNwb25zZRD5VRIhChxDb250", - "aW51ZVRocmVhZExvYWRpbmdSZXF1ZXN0EPpVEiIKHUNvbnRpbnVlVGhyZWFk", - "TG9hZGluZ1Jlc3BvbnNlEPtVEh0KGFN0b3BUaHJlYWRMb2FkaW5nUmVxdWVz", - "dBD8VRIeChlTdG9wVGhyZWFkTG9hZGluZ1Jlc3BvbnNlEP1VEhwKF1RyeVRo", - "cmVhZExvYWRpbmdSZXF1ZXN0EP5VEh0KGFRyeVRocmVhZExvYWRpbmdSZXNw", - "b25zZRD/VRIgChtBdHRlbXB0VGhyZWFkSm9nZ2luZ1JlcXVlc3QQgFYSIQoc", - "QXR0ZW1wdFRocmVhZEpvZ2dpbmdSZXNwb25zZRCBVhIhChxTdGFydElua0Zp", - "bGxpbmdTdGF0dXNSZXF1ZXN0EOBdEiIKHVN0YXJ0SW5rRmlsbGluZ1N0YXR1", - "c1Jlc3BvbnNlEOFdEhwKF1B1dERhdGFTdG9yZUl0ZW1SZXF1ZXN0EMhlEh0K", - "GFB1dERhdGFTdG9yZUl0ZW1SZXNwb25zZRDJZRIcChdHZXREYXRhU3RvcmVJ", - "dGVtUmVxdWVzdBDKZRIdChhHZXREYXRhU3RvcmVJdGVtUmVzcG9uc2UQy2VC", - "HAoaY29tLnR3aW5lLnRhbmdvLnBtci5jb21tb25iBnByb3RvMw==")); + "b25zZRByEhQKEFByb2NlZHVyZVJlcXVlc3QQcxIVChFQcm9jZWR1cmVSZXNw", + "b25zZRB0EhoKFlN0dWJBbGxIYXJkd2FyZVJlcXVlc3QQdRIbChdTdHViQWxs", + "SGFyZHdhcmVSZXNwb25zZRB2EiUKIEV4dGVybmFsQnJpZGdlVWRwRGlzY292", + "ZXJ5UGFja2V0EOgHEh8KGkV4dGVybmFsQnJpZGdlTG9naW5SZXF1ZXN0EOkH", + "EiAKG0V4dGVybmFsQnJpZGdlTG9naW5SZXNwb25zZRDqBxIgChtFeHRlcm5h", + "bEJyaWRnZUxvZ291dFJlcXVlc3QQ6wcSIQocRXh0ZXJuYWxCcmlkZ2VMb2dv", + "dXRSZXNwb25zZRDsBxIhChxEaXJlY3RTeW5jaHJvbml6YXRpb25SZXF1ZXN0", + "EO0HEiIKHURpcmVjdFN5bmNocm9uaXphdGlvblJlc3BvbnNlEO4HEhwKF092", + "ZXJyaWRlRGF0YUJhc2VSZXF1ZXN0EO8HEh0KGE92ZXJyaWRlRGF0YUJhc2VS", + "ZXNwb25zZRDwBxIgChtTdGFydEFwcGxpY2F0aW9uTG9nc1JlcXVlc3QQ8QcS", + "IQocU3RhcnRBcHBsaWNhdGlvbkxvZ3NSZXNwb25zZRDyBxIfChpTdG9wQXBw", + "bGljYXRpb25Mb2dzUmVxdWVzdBDzBxIgChtTdG9wQXBwbGljYXRpb25Mb2dz", + "UmVzcG9uc2UQ9AcSGAoTQ29sb3JQcm9maWxlUmVxdWVzdBD1BxIZChRDb2xv", + "clByb2ZpbGVSZXNwb25zZRD2BxIYChNVcGRhdGVTdGF0dXNSZXF1ZXN0EPcH", + "EhkKFFVwZGF0ZVN0YXR1c1Jlc3BvbnNlEPgHEhMKDkdlbmVyaWNSZXF1ZXN0", + "EPkHEhQKD0dlbmVyaWNSZXNwb25zZRD6BxIdChhDb25maWd1cmVQcm90b2Nv", + "bFJlcXVlc3QQ+wcSHgoZQ29uZmlndXJlUHJvdG9jb2xSZXNwb25zZRD8BxIc", + "ChdTdGFydERpYWdub3N0aWNzUmVxdWVzdBDQDxIdChhTdGFydERpYWdub3N0", + "aWNzUmVzcG9uc2UQ0Q8SHAoXTW90b3JBYm9ydEhvbWluZ1JlcXVlc3QQ0g8S", + "HQoYTW90b3JBYm9ydEhvbWluZ1Jlc3BvbnNlENMPEhcKEk1vdG9ySG9taW5n", + "UmVxdWVzdBDUDxIYChNNb3RvckhvbWluZ1Jlc3BvbnNlENUPEhgKE01vdG9y", + "Sm9nZ2luZ1JlcXVlc3QQ1g8SGQoUTW90b3JKb2dnaW5nUmVzcG9uc2UQ1w8S", + "HQoYTW90b3JBYm9ydEpvZ2dpbmdSZXF1ZXN0ENgPEh4KGU1vdG9yQWJvcnRK", + "b2dnaW5nUmVzcG9uc2UQ2Q8SIAobRGlzcGVuc2VyQWJvcnRIb21pbmdSZXF1", + "ZXN0ENoPEiEKHERpc3BlbnNlckFib3J0SG9taW5nUmVzcG9uc2UQ2w8SGwoW", + "RGlzcGVuc2VySG9taW5nUmVxdWVzdBDcDxIcChdEaXNwZW5zZXJIb21pbmdS", + "ZXNwb25zZRDdDxIcChdEaXNwZW5zZXJKb2dnaW5nUmVxdWVzdBDeDxIdChhE", + "aXNwZW5zZXJKb2dnaW5nUmVzcG9uc2UQ3w8SIQocRGlzcGVuc2VyQWJvcnRK", + "b2dnaW5nUmVxdWVzdBDgDxIiCh1EaXNwZW5zZXJBYm9ydEpvZ2dpbmdSZXNw", + "b25zZRDhDxIZChRTZXREaWdpdGFsT3V0UmVxdWVzdBDiDxIaChVTZXREaWdp", + "dGFsT3V0UmVzcG9uc2UQ4w8SGQoUVGhyZWFkSm9nZ2luZ1JlcXVlc3QQ5A8S", + "GgoVVGhyZWFkSm9nZ2luZ1Jlc3BvbnNlEOUPEh4KGVRocmVhZEFib3J0Sm9n", + "Z2luZ1JlcXVlc3QQ5g8SHwoaVGhyZWFkQWJvcnRKb2dnaW5nUmVzcG9uc2UQ", + "5w8SHQoYU2V0Q29tcG9uZW50VmFsdWVSZXF1ZXN0EOgPEh4KGVNldENvbXBv", + "bmVudFZhbHVlUmVzcG9uc2UQ6Q8SGAoTUmVzb2x2ZUV2ZW50UmVxdWVzdBDq", + "DxIZChRSZXNvbHZlRXZlbnRSZXNwb25zZRDrDxIbChZTdG9wRGlhZ25vc3Rp", + "Y3NSZXF1ZXN0EOwPEhwKF1N0b3BEaWFnbm9zdGljc1Jlc3BvbnNlEO0PEiMK", + "HlN0YXJ0RXZlbnRzTm90aWZpY2F0aW9uUmVxdWVzdBDuDxIkCh9TdGFydEV2", + "ZW50c05vdGlmaWNhdGlvblJlc3BvbnNlEO8PEiIKHVN0b3BFdmVudHNOb3Rp", + "ZmljYXRpb25SZXF1ZXN0EPAPEiMKHlN0b3BFdmVudHNOb3RpZmljYXRpb25S", + "ZXNwb25zZRDxDxIaChVTZXRIZWF0ZXJTdGF0ZVJlcXVlc3QQ8g8SGwoWU2V0", + "SGVhdGVyU3RhdGVSZXNwb25zZRDzDxIaChVTZXRCbG93ZXJTdGF0ZVJlcXVl", + "c3QQ9A8SGwoWU2V0Qmxvd2VyU3RhdGVSZXNwb25zZRD1DxIZChRTZXRWYWx2", + "ZVN0YXRlUmVxdWVzdBD2DxIaChVTZXRWYWx2ZVN0YXRlUmVzcG9uc2UQ9w8S", + "HwoaQ2FydHJpZGdlVmFsaWRhdGlvblJlcXVlc3QQ/A8SIAobQ2FydHJpZGdl", + "VmFsaWRhdGlvblJlc3BvbnNlEP0PEg8KCkpvYlJlcXVlc3QQuBcSEAoLSm9i", + "UmVzcG9uc2UQuRcSFAoPQWJvcnRKb2JSZXF1ZXN0ELoXEhUKEEFib3J0Sm9i", + "UmVzcG9uc2UQuxcSIwoeVXBsb2FkUHJvY2Vzc1BhcmFtZXRlcnNSZXF1ZXN0", + "ELwXEiQKH1VwbG9hZFByb2Nlc3NQYXJhbWV0ZXJzUmVzcG9uc2UQvRcSFgoR", + "Q3VycmVudEpvYlJlcXVlc3QQvhcSFwoSQ3VycmVudEpvYlJlc3BvbnNlEL8X", + "EhwKF1Jlc3VtZUN1cnJlbnRKb2JSZXF1ZXN0EMAXEh0KGFJlc3VtZUN1cnJl", + "bnRKb2JSZXNwb25zZRDBFxIdChhTdGFydEhlYWRDbGVhbmluZ1JlcXVlc3QQ", + "whcSHgoZU3RhcnRIZWFkQ2xlYW5pbmdSZXNwb25zZRDDFxIdChhBYm9ydEhl", + "YWRDbGVhbmluZ1JlcXVlc3QQxBcSHgoZQWJvcnRIZWFkQ2xlYW5pbmdSZXNw", + "b25zZRDFFxIZChRTdGFydERlYnVnTG9nUmVxdWVzdBCgHxIaChVTdGFydERl", + "YnVnTG9nUmVzcG9uc2UQoR8SGAoTU3RvcERlYnVnTG9nUmVxdWVzdBCiHxIZ", + "ChRTdG9wRGVidWdMb2dSZXNwb25zZRCjHxIfChpTZXREZWJ1Z0xvZ0NhdGVn", + "b3J5UmVxdWVzdBCkHxIgChtTZXREZWJ1Z0xvZ0NhdGVnb3J5UmVzcG9uc2UQ", + "pR8SIQocU2V0dXBEZWJ1Z0Rpc3JpYnV0b3JzUmVxdWVzdBCmHxIiCh1TZXR1", + "cERlYnVnRGlzcmlidXRvcnNSZXNwb25zZRCnHxInCiJVcGxvYWRIYXJkd2Fy", + "ZUNvbmZpZ3VyYXRpb25SZXF1ZXN0EIgnEigKI1VwbG9hZEhhcmR3YXJlQ29u", + "ZmlndXJhdGlvblJlc3BvbnNlEIknEhcKElN5c3RlbVJlc2V0UmVxdWVzdBCK", + "JxIYChNTeXN0ZW1SZXNldFJlc3BvbnNlEIsnEhUKEEtlZXBBbGl2ZVJlcXVl", + "c3QQ8C4SFgoRS2VlcEFsaXZlUmVzcG9uc2UQ8S4SEwoOQ29ubmVjdFJlcXVl", + "c3QQ8i4SFAoPQ29ubmVjdFJlc3BvbnNlEPMuEhYKEURpc2Nvbm5lY3RSZXF1", + "ZXN0EPQuEhcKEkRpc2Nvbm5lY3RSZXNwb25zZRD1LhIWChFGaWxlVXBsb2Fk", + "UmVxdWVzdBDYNhIXChJGaWxlVXBsb2FkUmVzcG9uc2UQ2TYSGwoWRmlsZUNo", + "dW5rVXBsb2FkUmVxdWVzdBDaNhIcChdGaWxlQ2h1bmtVcGxvYWRSZXNwb25z", + "ZRDbNhIaChVFeGVjdXRlUHJvY2Vzc1JlcXVlc3QQ3DYSGwoWRXhlY3V0ZVBy", + "b2Nlc3NSZXNwb25zZRDdNhIXChJLaWxsUHJvY2Vzc1JlcXVlc3QQ3jYSGAoT", + "S2lsbFByb2Nlc3NSZXNwb25zZRDfNhISCg1DcmVhdGVSZXF1ZXN0EOA2EhMK", + "DkNyZWF0ZVJlc3BvbnNlEOE2EhIKDURlbGV0ZVJlcXVlc3QQ4jYSEwoORGVs", + "ZXRlUmVzcG9uc2UQ4zYSGgoVR2V0U3RvcmFnZUluZm9SZXF1ZXN0EOQ2EhsK", + "FkdldFN0b3JhZ2VJbmZvUmVzcG9uc2UQ5TYSFAoPR2V0RmlsZXNSZXF1ZXN0", + "EOY2EhUKEEdldEZpbGVzUmVzcG9uc2UQ5zYSGAoTRmlsZURvd25sb2FkUmVx", + "dWVzdBDoNhIZChRGaWxlRG93bmxvYWRSZXNwb25zZRDpNhIdChhGaWxlQ2h1", + "bmtEb3dubG9hZFJlcXVlc3QQ6jYSHgoZRmlsZUNodW5rRG93bmxvYWRSZXNw", + "b25zZRDrNhIbChZWYWxpZGF0ZVZlcnNpb25SZXF1ZXN0EOw2EhwKF1ZhbGlk", + "YXRlVmVyc2lvblJlc3BvbnNlEO02EhsKFkFjdGl2YXRlVmVyc2lvblJlcXVl", + "c3QQ7jYSHAoXQWN0aXZhdGVWZXJzaW9uUmVzcG9uc2UQ7zYSGQoURGlzcGVu", + "c2VyRGF0YVJlcXVlc3QQwD4SGgoVRGlzcGVuc2VyRGF0YVJlc3BvbnNlEME+", + "EhwKF01pZFRhbmtEYXRhU2V0dXBSZXF1ZXN0EMI+Eh0KGE1pZFRhbmtEYXRh", + "U2V0dXBSZXNwb25zZRDDPhIiCh1NYWNoaW5lQ2FsaWJyYXRpb25EYXRhUmVx", + "dWVzdBDEPhIjCh5NYWNoaW5lQ2FsaWJyYXRpb25EYXRhUmVzcG9uc2UQxT4S", + "HgoZTWFpbkNhcmRTdG9yZWREYXRhUmVxdWVzdBDGPhIfChpNYWluQ2FyZFN0", + "b3JlZERhdGFSZXNwb25zZRDHPhIkCh9TdGFydE1hY2hpbmVTdGF0dXNVcGRh", + "dGVSZXF1ZXN0EKhGEiUKIFN0YXJ0TWFjaGluZVN0YXR1c1VwZGF0ZVJlc3Bv", + "bnNlEKlGEiMKHlN0b3BNYWNoaW5lU3RhdHVzVXBkYXRlUmVxdWVzdBCqRhIk", + "Ch9TdG9wTWFjaGluZVN0YXR1c1VwZGF0ZVJlc3BvbnNlEKtGEhoKFVN0YXJ0", + "UG93ZXJEb3duUmVxdWVzdBCQThIbChZTdGFydFBvd2VyRG93blJlc3BvbnNl", + "EJFOEhoKFUFib3J0UG93ZXJEb3duUmVxdWVzdBCSThIbChZBYm9ydFBvd2Vy", + "RG93blJlc3BvbnNlEJNOEhgKE1N0YXJ0UG93ZXJVcFJlcXVlc3QQlE4SGQoU", + "U3RhcnRQb3dlclVwUmVzcG9uc2UQlU4SGAoTQWJvcnRQb3dlclVwUmVxdWVz", + "dBCWThIZChRBYm9ydFBvd2VyVXBSZXNwb25zZRCXThITCg5TdGFuZEJ5UmVx", + "dWVzdBCYThIUCg9TdGFuZEJ5UmVzcG9uc2UQmU4SHgoZU3RhcnRUaHJlYWRM", + "b2FkaW5nUmVxdWVzdBD4VRIfChpTdGFydFRocmVhZExvYWRpbmdSZXNwb25z", + "ZRD5VRIhChxDb250aW51ZVRocmVhZExvYWRpbmdSZXF1ZXN0EPpVEiIKHUNv", + "bnRpbnVlVGhyZWFkTG9hZGluZ1Jlc3BvbnNlEPtVEh0KGFN0b3BUaHJlYWRM", + "b2FkaW5nUmVxdWVzdBD8VRIeChlTdG9wVGhyZWFkTG9hZGluZ1Jlc3BvbnNl", + "EP1VEhwKF1RyeVRocmVhZExvYWRpbmdSZXF1ZXN0EP5VEh0KGFRyeVRocmVh", + "ZExvYWRpbmdSZXNwb25zZRD/VRIgChtBdHRlbXB0VGhyZWFkSm9nZ2luZ1Jl", + "cXVlc3QQgFYSIQocQXR0ZW1wdFRocmVhZEpvZ2dpbmdSZXNwb25zZRCBVhIh", + "ChxTdGFydElua0ZpbGxpbmdTdGF0dXNSZXF1ZXN0EOBdEiIKHVN0YXJ0SW5r", + "RmlsbGluZ1N0YXR1c1Jlc3BvbnNlEOFdEhwKF1B1dERhdGFTdG9yZUl0ZW1S", + "ZXF1ZXN0EMhlEh0KGFB1dERhdGFTdG9yZUl0ZW1SZXNwb25zZRDJZRIcChdH", + "ZXREYXRhU3RvcmVJdGVtUmVxdWVzdBDKZRIdChhHZXREYXRhU3RvcmVJdGVt", + "UmVzcG9uc2UQy2USIQocRGF0YVN0b3JlSXRlbU1vZGlmaWVkUmVxdWVzdBDM", + "ZRIiCh1EYXRhU3RvcmVJdGVtTW9kaWZpZWRSZXNwb25zZRDNZUIcChpjb20u", + "dHdpbmUudGFuZ28ucG1yLmNvbW1vbmIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.Common.MessageType), }, null)); @@ -332,10 +336,14 @@ namespace Tango.PMR.Common { [pbr::OriginalName("StubMainCardEEpromWriteRequest")] StubMainCardEepromWriteRequest = 111, [pbr::OriginalName("StubMainCardEEpromWriteResponse")] StubMainCardEepromWriteResponse = 112, [pbr::OriginalName("StubHeadEEpromRequest")] StubHeadEepromRequest = 113, + [pbr::OriginalName("StubHeadEEpromResponse")] StubHeadEepromResponse = 114, + [pbr::OriginalName("ProcedureRequest")] ProcedureRequest = 115, + [pbr::OriginalName("ProcedureResponse")] ProcedureResponse = 116, + [pbr::OriginalName("StubAllHardwareRequest")] StubAllHardwareRequest = 117, /// <summary> ///------------------------------------ /// </summary> - [pbr::OriginalName("StubHeadEEpromResponse")] StubHeadEepromResponse = 114, + [pbr::OriginalName("StubAllHardwareResponse")] StubAllHardwareResponse = 118, /// <summary> ///Integration /// </summary> @@ -532,6 +540,8 @@ namespace Tango.PMR.Common { [pbr::OriginalName("PutDataStoreItemResponse")] PutDataStoreItemResponse = 13001, [pbr::OriginalName("GetDataStoreItemRequest")] GetDataStoreItemRequest = 13002, [pbr::OriginalName("GetDataStoreItemResponse")] GetDataStoreItemResponse = 13003, + [pbr::OriginalName("DataStoreItemModifiedRequest")] DataStoreItemModifiedRequest = 13004, + [pbr::OriginalName("DataStoreItemModifiedResponse")] DataStoreItemModifiedResponse = 13005, } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedRequest.cs b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedRequest.cs new file mode 100644 index 000000000..c4a8163fd --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedRequest.cs @@ -0,0 +1,188 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: DataStoreItemModifiedRequest.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.DataStore { + + /// <summary>Holder for reflection information generated from DataStoreItemModifiedRequest.proto</summary> + public static partial class DataStoreItemModifiedRequestReflection { + + #region Descriptor + /// <summary>File descriptor for DataStoreItemModifiedRequest.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static DataStoreItemModifiedRequestReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "CiJEYXRhU3RvcmVJdGVtTW9kaWZpZWRSZXF1ZXN0LnByb3RvEhNUYW5nby5Q", + "TVIuRGF0YVN0b3JlIj8KHERhdGFTdG9yZUl0ZW1Nb2RpZmllZFJlcXVlc3QS", + "EgoKQ29sbGVjdGlvbhgBIAEoCRILCgNLZXkYAiABKAlCHwodY29tLnR3aW5l", + "LnRhbmdvLnBtci5kYXRhc3RvcmViBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItemModifiedRequest), global::Tango.PMR.DataStore.DataStoreItemModifiedRequest.Parser, new[]{ "Collection", "Key" }, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class DataStoreItemModifiedRequest : pb::IMessage<DataStoreItemModifiedRequest> { + private static readonly pb::MessageParser<DataStoreItemModifiedRequest> _parser = new pb::MessageParser<DataStoreItemModifiedRequest>(() => new DataStoreItemModifiedRequest()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<DataStoreItemModifiedRequest> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.DataStore.DataStoreItemModifiedRequestReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedRequest(DataStoreItemModifiedRequest other) : this() { + collection_ = other.collection_; + key_ = other.key_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedRequest Clone() { + return new DataStoreItemModifiedRequest(this); + } + + /// <summary>Field number for the "Collection" field.</summary> + public const int CollectionFieldNumber = 1; + private string collection_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Collection { + get { return collection_; } + set { + collection_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// <summary>Field number for the "Key" field.</summary> + public const int KeyFieldNumber = 2; + private string key_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Key { + get { return key_; } + set { + key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as DataStoreItemModifiedRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(DataStoreItemModifiedRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Collection != other.Collection) return false; + if (Key != other.Key) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Collection.Length != 0) hash ^= Collection.GetHashCode(); + if (Key.Length != 0) hash ^= Key.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Collection.Length != 0) { + output.WriteRawTag(10); + output.WriteString(Collection); + } + if (Key.Length != 0) { + output.WriteRawTag(18); + output.WriteString(Key); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Collection.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Collection); + } + if (Key.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(DataStoreItemModifiedRequest other) { + if (other == null) { + return; + } + if (other.Collection.Length != 0) { + Collection = other.Collection; + } + if (other.Key.Length != 0) { + Key = other.Key; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 10: { + Collection = input.ReadString(); + break; + } + case 18: { + Key = input.ReadString(); + break; + } + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedResponse.cs b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedResponse.cs new file mode 100644 index 000000000..fc70186aa --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/DataStore/DataStoreItemModifiedResponse.cs @@ -0,0 +1,131 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: DataStoreItemModifiedResponse.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.DataStore { + + /// <summary>Holder for reflection information generated from DataStoreItemModifiedResponse.proto</summary> + public static partial class DataStoreItemModifiedResponseReflection { + + #region Descriptor + /// <summary>File descriptor for DataStoreItemModifiedResponse.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static DataStoreItemModifiedResponseReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "CiNEYXRhU3RvcmVJdGVtTW9kaWZpZWRSZXNwb25zZS5wcm90bxITVGFuZ28u", + "UE1SLkRhdGFTdG9yZSIfCh1EYXRhU3RvcmVJdGVtTW9kaWZpZWRSZXNwb25z", + "ZUIfCh1jb20udHdpbmUudGFuZ28ucG1yLmRhdGFzdG9yZWIGcHJvdG8z")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.DataStore.DataStoreItemModifiedResponse), global::Tango.PMR.DataStore.DataStoreItemModifiedResponse.Parser, null, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class DataStoreItemModifiedResponse : pb::IMessage<DataStoreItemModifiedResponse> { + private static readonly pb::MessageParser<DataStoreItemModifiedResponse> _parser = new pb::MessageParser<DataStoreItemModifiedResponse>(() => new DataStoreItemModifiedResponse()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<DataStoreItemModifiedResponse> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.DataStore.DataStoreItemModifiedResponseReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedResponse(DataStoreItemModifiedResponse other) : this() { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public DataStoreItemModifiedResponse Clone() { + return new DataStoreItemModifiedResponse(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as DataStoreItemModifiedResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(DataStoreItemModifiedResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(DataStoreItemModifiedResponse other) { + if (other == null) { + return; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/EmbeddedParameters/AlarmHandlingItem.cs b/Software/Visual_Studio/Tango.PMR/EmbeddedParameters/AlarmHandlingItem.cs index 42ff24301..25f40a731 100644 --- a/Software/Visual_Studio/Tango.PMR/EmbeddedParameters/AlarmHandlingItem.cs +++ b/Software/Visual_Studio/Tango.PMR/EmbeddedParameters/AlarmHandlingItem.cs @@ -99,9 +99,6 @@ namespace Tango.PMR.EmbeddedParameters { /// <summary>Field number for the "DeviceId" field.</summary> public const int DeviceIdFieldNumber = 2; private uint deviceId_; - /// <summary> - ///uint32 Frequency = 2; //1/10/100/1000 - /// </summary> [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public uint DeviceId { get { return deviceId_; } @@ -157,9 +154,6 @@ namespace Tango.PMR.EmbeddedParameters { /// <summary>Field number for the "DebounceValue" field.</summary> public const int DebounceValueFieldNumber = 7; private uint debounceValue_; - /// <summary> - ///uint32 Predecessor = 7; - /// </summary> [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public uint DebounceValue { get { return debounceValue_; } diff --git a/Software/Visual_Studio/Tango.PMR/Printing/DispenserLiquidType.cs b/Software/Visual_Studio/Tango.PMR/Printing/DispenserLiquidType.cs index 7f97d6907..988d26788 100644 --- a/Software/Visual_Studio/Tango.PMR/Printing/DispenserLiquidType.cs +++ b/Software/Visual_Studio/Tango.PMR/Printing/DispenserLiquidType.cs @@ -23,10 +23,11 @@ namespace Tango.PMR.Printing { byte[] descriptorData = global::System.Convert.FromBase64String( string.Concat( "ChlEaXNwZW5zZXJMaXF1aWRUeXBlLnByb3RvEhJUYW5nby5QTVIuUHJpbnRp", - "bmcqcwoTRGlzcGVuc2VyTGlxdWlkVHlwZRIICgRDeWFuEAASCwoHTWFnZW50", - "YRABEgoKBlllbGxvdxACEgkKBUJsYWNrEAMSEgoOVHJhbnNwYXJlbnRJbmsQ", - "BBINCglMdWJyaWNhbnQQBRILCgdDbGVhbmVyEAZCHgocY29tLnR3aW5lLnRh", - "bmdvLnBtci5wcmludGluZ2IGcHJvdG8z")); + "bmcqpQEKE0Rpc3BlbnNlckxpcXVpZFR5cGUSCAoEQ3lhbhAAEgsKB01hZ2Vu", + "dGEQARIKCgZZZWxsb3cQAhIJCgVCbGFjaxADEhIKDlRyYW5zcGFyZW50SW5r", + "EAQSDQoJTHVicmljYW50EAUSCwoHQ2xlYW5lchAGEg0KCUxpZ2h0Q3lhbhAH", + "EhAKDExpZ2h0TWFnZW50YRAIEg8KC0xpZ2h0WWVsbG93EAlCHgocY29tLnR3", + "aW5lLnRhbmdvLnBtci5wcmludGluZ2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Tango.PMR.Printing.DispenserLiquidType), }, null)); @@ -43,6 +44,9 @@ namespace Tango.PMR.Printing { [pbr::OriginalName("TransparentInk")] TransparentInk = 4, [pbr::OriginalName("Lubricant")] Lubricant = 5, [pbr::OriginalName("Cleaner")] Cleaner = 6, + [pbr::OriginalName("LightCyan")] LightCyan = 7, + [pbr::OriginalName("LightMagenta")] LightMagenta = 8, + [pbr::OriginalName("LightYellow")] LightYellow = 9, } #endregion diff --git a/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureRequest.cs b/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureRequest.cs new file mode 100644 index 000000000..771aaf4f0 --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureRequest.cs @@ -0,0 +1,301 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ProcedureRequest.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.Stubs { + + /// <summary>Holder for reflection information generated from ProcedureRequest.proto</summary> + public static partial class ProcedureRequestReflection { + + #region Descriptor + /// <summary>File descriptor for ProcedureRequest.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProcedureRequestReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChZQcm9jZWR1cmVSZXF1ZXN0LnByb3RvEg9UYW5nby5QTVIuU3R1YnMicQoQ", + "UHJvY2VkdXJlUmVxdWVzdBIMCgRUeXBlGAEgASgFEg8KB1RpbWVvdXQYAiAB", + "KAUSDgoGUGFyYW0xGAMgASgCEg4KBlBhcmFtMhgEIAEoAhIOCgZQYXJhbTMY", + "BSABKAISDgoGUGFyYW00GAYgASgCQhsKGWNvbS50d2luZS50YW5nby5wbXIu", + "c3R1YnNiBnByb3RvMw==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.Stubs.ProcedureRequest), global::Tango.PMR.Stubs.ProcedureRequest.Parser, new[]{ "Type", "Timeout", "Param1", "Param2", "Param3", "Param4" }, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class ProcedureRequest : pb::IMessage<ProcedureRequest> { + private static readonly pb::MessageParser<ProcedureRequest> _parser = new pb::MessageParser<ProcedureRequest>(() => new ProcedureRequest()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<ProcedureRequest> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.Stubs.ProcedureRequestReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureRequest(ProcedureRequest other) : this() { + type_ = other.type_; + timeout_ = other.timeout_; + param1_ = other.param1_; + param2_ = other.param2_; + param3_ = other.param3_; + param4_ = other.param4_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureRequest Clone() { + return new ProcedureRequest(this); + } + + /// <summary>Field number for the "Type" field.</summary> + public const int TypeFieldNumber = 1; + private int type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int Type { + get { return type_; } + set { + type_ = value; + } + } + + /// <summary>Field number for the "Timeout" field.</summary> + public const int TimeoutFieldNumber = 2; + private int timeout_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int Timeout { + get { return timeout_; } + set { + timeout_ = value; + } + } + + /// <summary>Field number for the "Param1" field.</summary> + public const int Param1FieldNumber = 3; + private float param1_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float Param1 { + get { return param1_; } + set { + param1_ = value; + } + } + + /// <summary>Field number for the "Param2" field.</summary> + public const int Param2FieldNumber = 4; + private float param2_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float Param2 { + get { return param2_; } + set { + param2_ = value; + } + } + + /// <summary>Field number for the "Param3" field.</summary> + public const int Param3FieldNumber = 5; + private float param3_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float Param3 { + get { return param3_; } + set { + param3_ = value; + } + } + + /// <summary>Field number for the "Param4" field.</summary> + public const int Param4FieldNumber = 6; + private float param4_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float Param4 { + get { return param4_; } + set { + param4_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as ProcedureRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(ProcedureRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Type != other.Type) return false; + if (Timeout != other.Timeout) return false; + if (Param1 != other.Param1) return false; + if (Param2 != other.Param2) return false; + if (Param3 != other.Param3) return false; + if (Param4 != other.Param4) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Type != 0) hash ^= Type.GetHashCode(); + if (Timeout != 0) hash ^= Timeout.GetHashCode(); + if (Param1 != 0F) hash ^= Param1.GetHashCode(); + if (Param2 != 0F) hash ^= Param2.GetHashCode(); + if (Param3 != 0F) hash ^= Param3.GetHashCode(); + if (Param4 != 0F) hash ^= Param4.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Type != 0) { + output.WriteRawTag(8); + output.WriteInt32(Type); + } + if (Timeout != 0) { + output.WriteRawTag(16); + output.WriteInt32(Timeout); + } + if (Param1 != 0F) { + output.WriteRawTag(29); + output.WriteFloat(Param1); + } + if (Param2 != 0F) { + output.WriteRawTag(37); + output.WriteFloat(Param2); + } + if (Param3 != 0F) { + output.WriteRawTag(45); + output.WriteFloat(Param3); + } + if (Param4 != 0F) { + output.WriteRawTag(53); + output.WriteFloat(Param4); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Type != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Type); + } + if (Timeout != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Timeout); + } + if (Param1 != 0F) { + size += 1 + 4; + } + if (Param2 != 0F) { + size += 1 + 4; + } + if (Param3 != 0F) { + size += 1 + 4; + } + if (Param4 != 0F) { + size += 1 + 4; + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(ProcedureRequest other) { + if (other == null) { + return; + } + if (other.Type != 0) { + Type = other.Type; + } + if (other.Timeout != 0) { + Timeout = other.Timeout; + } + if (other.Param1 != 0F) { + Param1 = other.Param1; + } + if (other.Param2 != 0F) { + Param2 = other.Param2; + } + if (other.Param3 != 0F) { + Param3 = other.Param3; + } + if (other.Param4 != 0F) { + Param4 = other.Param4; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 8: { + Type = input.ReadInt32(); + break; + } + case 16: { + Timeout = input.ReadInt32(); + break; + } + case 29: { + Param1 = input.ReadFloat(); + break; + } + case 37: { + Param2 = input.ReadFloat(); + break; + } + case 45: { + Param3 = input.ReadFloat(); + break; + } + case 53: { + Param4 = input.ReadFloat(); + break; + } + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureResponse.cs b/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureResponse.cs new file mode 100644 index 000000000..afbad9a4d --- /dev/null +++ b/Software/Visual_Studio/Tango.PMR/Stubs/ProcedureResponse.cs @@ -0,0 +1,273 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: ProcedureResponse.proto +#pragma warning disable 1591, 0612, 3021 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Tango.PMR.Stubs { + + /// <summary>Holder for reflection information generated from ProcedureResponse.proto</summary> + public static partial class ProcedureResponseReflection { + + #region Descriptor + /// <summary>File descriptor for ProcedureResponse.proto</summary> + public static pbr::FileDescriptor Descriptor { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static ProcedureResponseReflection() { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChdQcm9jZWR1cmVSZXNwb25zZS5wcm90bxIPVGFuZ28uUE1SLlN0dWJzIm4K", + "EVByb2NlZHVyZVJlc3BvbnNlEgwKBFR5cGUYASABKAUSDAoEVGltZRgCIAEo", + "BRITCgtSZXBseVZhbHVlMRgDIAEoAhITCgtSZXBseVZhbHVlMhgEIAEoAhIT", + "CgtSZXBseVZhbHVlMxgFIAEoAkIbChljb20udHdpbmUudGFuZ28ucG1yLnN0", + "dWJzYgZwcm90bzM=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Tango.PMR.Stubs.ProcedureResponse), global::Tango.PMR.Stubs.ProcedureResponse.Parser, new[]{ "Type", "Time", "ReplyValue1", "ReplyValue2", "ReplyValue3" }, null, null, null) + })); + } + #endregion + + } + #region Messages + public sealed partial class ProcedureResponse : pb::IMessage<ProcedureResponse> { + private static readonly pb::MessageParser<ProcedureResponse> _parser = new pb::MessageParser<ProcedureResponse>(() => new ProcedureResponse()); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser<ProcedureResponse> Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Tango.PMR.Stubs.ProcedureResponseReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureResponse(ProcedureResponse other) : this() { + type_ = other.type_; + time_ = other.time_; + replyValue1_ = other.replyValue1_; + replyValue2_ = other.replyValue2_; + replyValue3_ = other.replyValue3_; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public ProcedureResponse Clone() { + return new ProcedureResponse(this); + } + + /// <summary>Field number for the "Type" field.</summary> + public const int TypeFieldNumber = 1; + private int type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int Type { + get { return type_; } + set { + type_ = value; + } + } + + /// <summary>Field number for the "Time" field.</summary> + public const int TimeFieldNumber = 2; + private int time_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int Time { + get { return time_; } + set { + time_ = value; + } + } + + /// <summary>Field number for the "ReplyValue1" field.</summary> + public const int ReplyValue1FieldNumber = 3; + private float replyValue1_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float ReplyValue1 { + get { return replyValue1_; } + set { + replyValue1_ = value; + } + } + + /// <summary>Field number for the "ReplyValue2" field.</summary> + public const int ReplyValue2FieldNumber = 4; + private float replyValue2_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float ReplyValue2 { + get { return replyValue2_; } + set { + replyValue2_ = value; + } + } + + /// <summary>Field number for the "ReplyValue3" field.</summary> + public const int ReplyValue3FieldNumber = 5; + private float replyValue3_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public float ReplyValue3 { + get { return replyValue3_; } + set { + replyValue3_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as ProcedureResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(ProcedureResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (Type != other.Type) return false; + if (Time != other.Time) return false; + if (ReplyValue1 != other.ReplyValue1) return false; + if (ReplyValue2 != other.ReplyValue2) return false; + if (ReplyValue3 != other.ReplyValue3) return false; + return true; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (Type != 0) hash ^= Type.GetHashCode(); + if (Time != 0) hash ^= Time.GetHashCode(); + if (ReplyValue1 != 0F) hash ^= ReplyValue1.GetHashCode(); + if (ReplyValue2 != 0F) hash ^= ReplyValue2.GetHashCode(); + if (ReplyValue3 != 0F) hash ^= ReplyValue3.GetHashCode(); + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (Type != 0) { + output.WriteRawTag(8); + output.WriteInt32(Type); + } + if (Time != 0) { + output.WriteRawTag(16); + output.WriteInt32(Time); + } + if (ReplyValue1 != 0F) { + output.WriteRawTag(29); + output.WriteFloat(ReplyValue1); + } + if (ReplyValue2 != 0F) { + output.WriteRawTag(37); + output.WriteFloat(ReplyValue2); + } + if (ReplyValue3 != 0F) { + output.WriteRawTag(45); + output.WriteFloat(ReplyValue3); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (Type != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Type); + } + if (Time != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(Time); + } + if (ReplyValue1 != 0F) { + size += 1 + 4; + } + if (ReplyValue2 != 0F) { + size += 1 + 4; + } + if (ReplyValue3 != 0F) { + size += 1 + 4; + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(ProcedureResponse other) { + if (other == null) { + return; + } + if (other.Type != 0) { + Type = other.Type; + } + if (other.Time != 0) { + Time = other.Time; + } + if (other.ReplyValue1 != 0F) { + ReplyValue1 = other.ReplyValue1; + } + if (other.ReplyValue2 != 0F) { + ReplyValue2 = other.ReplyValue2; + } + if (other.ReplyValue3 != 0F) { + ReplyValue3 = other.ReplyValue3; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + input.SkipLastField(); + break; + case 8: { + Type = input.ReadInt32(); + break; + } + case 16: { + Time = input.ReadInt32(); + break; + } + case 29: { + ReplyValue1 = input.ReadFloat(); + break; + } + case 37: { + ReplyValue2 = input.ReadFloat(); + break; + } + case 45: { + ReplyValue3 = input.ReadFloat(); + break; + } + } + } + } + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj index 18b1e2aa1..2284a2914 100644 --- a/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj +++ b/Software/Visual_Studio/Tango.PMR/Tango.PMR.csproj @@ -79,6 +79,8 @@ <Compile Include="Connection\KeepAliveRequest.cs" /> <Compile Include="Connection\KeepAliveResponse.cs" /> <Compile Include="DataStore\DataStoreItem.cs" /> + <Compile Include="DataStore\DataStoreItemModifiedRequest.cs" /> + <Compile Include="DataStore\DataStoreItemModifiedResponse.cs" /> <Compile Include="DataStore\DataType.cs" /> <Compile Include="DataStore\GetDataStoreItemRequest.cs" /> <Compile Include="DataStore\GetDataStoreItemResponse.cs" /> @@ -328,6 +330,8 @@ <Compile Include="Printing\UploadProcessParametersResponse.cs" /> <Compile Include="Printing\WindingMethod.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Stubs\ProcedureRequest.cs" /> + <Compile Include="Stubs\ProcedureResponse.cs" /> <Compile Include="Stubs\StubAllHardwareRequest.cs" /> <Compile Include="Stubs\StubAllHardwareResponse.cs" /> <Compile Include="Stubs\StubDispenserEEpromData.cs" /> @@ -485,7 +489,7 @@ </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml b/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml Binary files differindex 776ab8e8a..211e2dfaa 100644 --- a/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml +++ b/Software/Visual_Studio/Tango.SQLExaminer/SQLExaminer/Configurations/OverrideData.xml diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/NavigationControl.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/NavigationControl.cs index 879401c1b..cefdbbfd6 100644 --- a/Software/Visual_Studio/Tango.SharedUI/Controls/NavigationControl.cs +++ b/Software/Visual_Studio/Tango.SharedUI/Controls/NavigationControl.cs @@ -252,7 +252,13 @@ namespace Tango.SharedUI.Controls public static readonly DependencyProperty KeepElementsAttachedProperty = DependencyProperty.Register("KeepElementsAttached", typeof(bool), typeof(NavigationControl), new PropertyMetadata(false)); - + public bool GalleryMode + { + get { return (bool)GetValue(GalleryModeProperty); } + set { SetValue(GalleryModeProperty, value); } + } + public static readonly DependencyProperty GalleryModeProperty = + DependencyProperty.Register("GalleryMode", typeof(bool), typeof(NavigationControl), new PropertyMetadata(false)); public int SelectedIndex { @@ -551,7 +557,7 @@ namespace Tango.SharedUI.Controls break; case TransitionTypes.Slide: - if (toIndex > fromIndex) + if (toIndex > fromIndex || GalleryMode) { fromAnimation.From = 0; fromAnimation.To = -ActualWidth; diff --git a/Software/Visual_Studio/Tango.SharedUI/Controls/SearchComboBox.cs b/Software/Visual_Studio/Tango.SharedUI/Controls/SearchComboBox.cs index 583d7b810..1f2856a32 100644 --- a/Software/Visual_Studio/Tango.SharedUI/Controls/SearchComboBox.cs +++ b/Software/Visual_Studio/Tango.SharedUI/Controls/SearchComboBox.cs @@ -12,6 +12,7 @@ using System.Windows.Input; using System.Linq; using System.Windows.Media; using System.Windows.Threading; +using Tango.Core.ExtensionMethods; namespace Tango.SharedUI.Controls { @@ -73,6 +74,11 @@ namespace Tango.SharedUI.Controls { IsOpened = false; SelectedItem = _listBox.SelectedItem; + + if (SelectedValuePath.IsNotNullOrEmpty() && SelectedItem != null) + { + SelectedValue = SelectedItem.GetPropertyValueByPath(SelectedValuePath); + } } else if (e.Key == Key.Up && _listBox.SelectedIndex == 0) { @@ -120,6 +126,11 @@ namespace Tango.SharedUI.Controls { IsOpened = false; SelectedItem = _listBox.SelectedItem; + + if (SelectedValuePath.IsNotNullOrEmpty() && SelectedItem != null) + { + SelectedValue = SelectedItem.GetPropertyValueByPath(SelectedValuePath); + } } } } @@ -152,12 +163,17 @@ namespace Tango.SharedUI.Controls if (x != null) { - var prop = x.GetType().GetProperty(SearchProperty, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); - if (prop != null) + if (!String.IsNullOrWhiteSpace(SearchProperty)) { - String propValue = prop.GetValue(x).ToString(); - return propValue.ToLower().Contains(SearchFilter.ToLower()); + var prop = x.GetType().GetProperty(SearchProperty, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); + if (prop != null) + { + String propValue = prop.GetValue(x).ToString(); + return propValue.ToLower().Contains(SearchFilter.ToLower()); + } } + + return x.ToStringSafe().ToLower().Contains(SearchFilter.ToLower()); } return false; diff --git a/Software/Visual_Studio/Tango.SharedUI/Converters/EnumToItemsSourceConverter.cs b/Software/Visual_Studio/Tango.SharedUI/Converters/EnumToItemsSourceConverter.cs index c551f7d49..5c725e524 100644 --- a/Software/Visual_Studio/Tango.SharedUI/Converters/EnumToItemsSourceConverter.cs +++ b/Software/Visual_Studio/Tango.SharedUI/Converters/EnumToItemsSourceConverter.cs @@ -10,6 +10,17 @@ namespace Tango.SharedUI.Converters { public class EnumToItemsSourceConverter : IValueConverter { + public class EnumValue + { + public Object Value { get; set; } + public String DisplayName { get; set; } + + public override string ToString() + { + return DisplayName; + } + } + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Type result = value as Type; @@ -20,7 +31,7 @@ namespace Tango.SharedUI.Converters } else { - return Enum.GetValues(result).Cast<object>().Select(e => new { Value = e, DisplayName = (e as Enum).ToDescription() }).ToList(); + return Enum.GetValues(result).Cast<object>().Select(e => new EnumValue() { Value = e, DisplayName = (e as Enum).ToDescription() }).ToList(); } } diff --git a/Software/Visual_Studio/Tango.Stubs/StubManager.cs b/Software/Visual_Studio/Tango.Stubs/StubManager.cs index 0bab8830f..6cea42d72 100644 --- a/Software/Visual_Studio/Tango.Stubs/StubManager.cs +++ b/Software/Visual_Studio/Tango.Stubs/StubManager.cs @@ -166,7 +166,7 @@ namespace Tango.Stubs { try { - response = _machineOperator.SendRequest(stub, new Transport.TransportRequestConfig() { Timeout = TimeSpan.FromSeconds(RequestTimeout) }).Result; + response = _machineOperator.SendRequest(stub, new Transport.TransportRequestConfig() { Timeout = TimeSpan.FromSeconds(RequestTimeout), ThreadingMode = Transport.TransportThreadingMode.ThreadPool }).Result; OnCompleted(JsonConvert.SerializeObject(response, Formatting.Indented)); done = true; } @@ -224,7 +224,7 @@ namespace Tango.Stubs try { - _machineOperator.SendContinuousRequest(stub, new Transport.TransportContinuousRequestConfig() { Timeout = TimeSpan.FromSeconds(RequestTimeout) }).Subscribe((msg) => + _machineOperator.SendContinuousRequest(stub, new Transport.TransportContinuousRequestConfig() { Timeout = TimeSpan.FromSeconds(RequestTimeout), ThreadingMode = Transport.TransportThreadingMode.ThreadPool }).Subscribe((msg) => { callback?.Invoke(msg as T); diff --git a/Software/Visual_Studio/Tango.Stubs/ViewModels/StubsViewVM.cs b/Software/Visual_Studio/Tango.Stubs/ViewModels/StubsViewVM.cs index 7684892cd..f52457f81 100644 --- a/Software/Visual_Studio/Tango.Stubs/ViewModels/StubsViewVM.cs +++ b/Software/Visual_Studio/Tango.Stubs/ViewModels/StubsViewVM.cs @@ -15,6 +15,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Threading; +using Tango.Core; using Tango.Core.Commands; using Tango.Integration.Operation; using Tango.PMR; @@ -36,6 +37,7 @@ namespace Tango.Stubs.ViewModels private StubManager _stubManager; private TextBox _logTextBox; private StubsSettings _settings; + private Core.Threading.IntervalMessageDispatcher<String> _consoleDispatcher; #region Properties @@ -267,6 +269,9 @@ namespace Tango.Stubs.ViewModels /// </summary> public StubsViewVM() { + _consoleDispatcher = new Core.Threading.IntervalMessageDispatcher<string>(OnConsoleLog); + _consoleDispatcher.Start(); + DisplayConnectionPane = true; _settings = SettingsManager.Default.GetOrCreate<StubsSettings>(); @@ -415,6 +420,18 @@ namespace Tango.Stubs.ViewModels Examples = Examples.OrderBy(x => x.Name).ToList(); } + private void OnConsoleLog(String log) + { + InvokeUINow(() => + { + if (_logTextBox.Text.Length > 99999) + { + _logTextBox.Clear(); + } + _logTextBox.AppendText(log); + }); + } + public StubsViewVM(ConnectionMode connectionMode) : this() { ConnectionMode = connectionMode; @@ -615,6 +632,7 @@ namespace Tango.Stubs.ViewModels { Mouse.OverrideCursor = Cursors.Wait; AppendTextLog("Connecting..." + Environment.NewLine); + Integration.Operation.MachineOperator.EnableSessionLogFile = false; _machineOperator = new MachineOperator(); _machineOperator.EnableDiagnostics = false; _machineOperator.EnableEmbeddedDebugging = false; @@ -674,20 +692,22 @@ namespace Tango.Stubs.ViewModels SelectedCodeTab.IsRunning = true; _logTextBox.Text = (DateTime.Now.ToTimeString() + ": ") + "Executing script '" + SelectedCodeTab.Title + "'..." + Environment.NewLine; + Status = "Running..."; + await Task.Factory.StartNew(async () => { try { _stubManager = new StubManager(_machineOperator, (txt) => - { - AppendTextLog(txt + Environment.NewLine); - }, (txt) => - { - AppendTextLog(txt); - }, () => - { - - }); + { + AppendTextLog(txt + Environment.NewLine); + }, (txt) => + { + AppendTextLog(txt); + }, () => + { + ClearTextLog(); + }); var thisStubManager = _stubManager; _stubManager.Completed += Manager_Completed; _stubManager.Failed += Manager_Failed; @@ -699,12 +719,20 @@ namespace Tango.Stubs.ViewModels engine.ReferencedAssemblies.Add(this.GetType()); engine.ReferencedAssemblies.Add(typeof(PMR.Stubs.CalculateRequest)); engine.ReferencedAssemblies.Add(typeof(IMessage)); + + Status = $"Running '{SelectedCodeTab.Title}'..."; + await engine.Run(SelectedCodeTab.Code, Path.GetDirectoryName(SelectedCodeTab.File)); if (!thisStubManager.Aborted) { IsRunning = false; SelectedCodeTab.IsRunning = false; + Status = "Aboted"; + } + else + { + Status = "Completed"; } } catch (Exception ex) @@ -793,8 +821,6 @@ namespace Tango.Stubs.ViewModels { AppendTextLog((DateTime.Now.ToTimeString() + ": ") + "Executing '" + stubName + "'..." + Environment.NewLine); } - - Status = "Executing " + stubName + "..."; } /// <summary> @@ -810,8 +836,6 @@ namespace Tango.Stubs.ViewModels { AppendTextLog((DateTime.Now.ToTimeString() + ": ") + ex.Message + Environment.NewLine); } - - Status = "Failed!"; } } @@ -827,21 +851,11 @@ namespace Tango.Stubs.ViewModels AppendTextLog((DateTime.Now.ToTimeString() + ": ") + "Response Received:" + Environment.NewLine); AppendTextLog((DateTime.Now.ToTimeString() + ": ") + response + Environment.NewLine); } - Status = "Completed"; } private void AppendTextLog(String log) { - LogManager.Log(log); - - InvokeUI(() => - { - if (_logTextBox.Text.Length > 99999) - { - _logTextBox.Clear(); - } - _logTextBox.AppendText(log); - }); + _consoleDispatcher.Push(log); } private void ClearTextLog() diff --git a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml index 97d91477d..dd405a6c3 100644 --- a/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml +++ b/Software/Visual_Studio/Tango.Touch/Controls/TouchPanel.xaml @@ -242,7 +242,7 @@ <local:TouchButton x:Name="btnOK" FontWeight="Normal" Width="220" CornerRadius="25" FontSize="{StaticResource TangoMessageBoxButtonFontSize}" Margin="30 0 0 0" Style="{StaticResource TangoHollowButton}" Command="{Binding OKCommand}">OK</local:TouchButton> </StackPanel> - <TextBlock FontSize="{StaticResource TangoMessageBoxMessageFontSize}" Text="{Binding Message}" VerticalAlignment="Center" HorizontalAlignment="Center" TextWrapping="Wrap"></TextBlock> + <TextBlock FontSize="{StaticResource TangoMessageBoxMessageFontSize}" Text="{Binding Message}" VerticalAlignment="Center" HorizontalAlignment="Center" TextWrapping="Wrap" Margin="10 0"></TextBlock> </DockPanel> </Grid> diff --git a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj index 054b4420c..bbe0b3780 100644 --- a/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj +++ b/Software/Visual_Studio/Tango.Transport/Tango.Transport.csproj @@ -145,6 +145,7 @@ <Compile Include="TransportMessageDirection.cs" /> <Compile Include="Routing\TransportRoutingChannel.cs" /> <Compile Include="TransportResponseConfig.cs" /> + <Compile Include="TransportThreadingMode.cs" /> <Compile Include="Web\AutoFileDownloader.cs" /> <Compile Include="Web\InvalidTokenException.cs" /> <Compile Include="Web\IWebFileDownloader.cs" /> @@ -189,7 +190,7 @@ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Transport/TransportMessage.cs b/Software/Visual_Studio/Tango.Transport/TransportMessage.cs index 9710e19b8..245619e5e 100644 --- a/Software/Visual_Studio/Tango.Transport/TransportMessage.cs +++ b/Software/Visual_Studio/Tango.Transport/TransportMessage.cs @@ -53,7 +53,7 @@ namespace Tango.Transport { Completed = completed; - ThreadFactory.StartNew(() => + Action setResultAction = () => { try { @@ -113,7 +113,22 @@ namespace Tango.Transport LogManager.Log(e, $"Error while settings exception for message."); } } - }); + }; + + if (ThreadingMode == TransportThreadingMode.NewThread) + { + ThreadFactory.StartNew(() => + { + setResultAction(); + }); + } + else + { + Task.Factory.StartNew(() => + { + setResultAction(); + }); + } } /// <summary> @@ -130,7 +145,7 @@ namespace Tango.Transport Completed = true; exceptionRaised = true; - ThreadFactory.StartNew(() => + Action setExceptionAction = () => { if (!IsContinuous) { @@ -155,7 +170,22 @@ namespace Tango.Transport AtLeastOneResponseReceived = true; ContinuesResponseSubject.OnError(ex); } - }); + }; + + if (ThreadingMode == TransportThreadingMode.NewThread) + { + ThreadFactory.StartNew(() => + { + setExceptionAction(); + }); + } + else + { + Task.Factory.StartNew(() => + { + setExceptionAction(); + }); + } } public override string GetActualMessageTypeName() diff --git a/Software/Visual_Studio/Tango.Transport/TransportMessageBase.cs b/Software/Visual_Studio/Tango.Transport/TransportMessageBase.cs index 08ce403e1..0d2ba6c36 100644 --- a/Software/Visual_Studio/Tango.Transport/TransportMessageBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransportMessageBase.cs @@ -22,6 +22,8 @@ namespace Tango.Transport public QueuePriority Priority { get; set; } + public TransportThreadingMode ThreadingMode { get; set; } + /// <summary> /// Gets or sets a value indicating whether this instance is multi response. /// </summary> diff --git a/Software/Visual_Studio/Tango.Transport/TransportRequestConfig.cs b/Software/Visual_Studio/Tango.Transport/TransportRequestConfig.cs index 3910745dc..7c4df474d 100644 --- a/Software/Visual_Studio/Tango.Transport/TransportRequestConfig.cs +++ b/Software/Visual_Studio/Tango.Transport/TransportRequestConfig.cs @@ -13,5 +13,6 @@ namespace Tango.Transport public bool ShouldLog { get; set; } public bool Immediate { get; set; } public QueuePriority Priority { get; set; } + public TransportThreadingMode ThreadingMode { get; set; } } } diff --git a/Software/Visual_Studio/Tango.Transport/TransportThreadingMode.cs b/Software/Visual_Studio/Tango.Transport/TransportThreadingMode.cs new file mode 100644 index 000000000..7678fced4 --- /dev/null +++ b/Software/Visual_Studio/Tango.Transport/TransportThreadingMode.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tango.Transport +{ + /// <summary> + /// Represents a request message response execution mode. + /// Including it's timeout procedure execution. + /// </summary> + public enum TransportThreadingMode + { + /// <summary> + /// The request response will be executed on a new thread and so its timeout procedure. + /// </summary> + NewThread, + + /// <summary> + /// The request response will be executed on the thread pool and so its timeout procedure. + /// </summary> + ThreadPool, + } +} diff --git a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs index 4f2e621b9..4c88a0158 100644 --- a/Software/Visual_Studio/Tango.Transport/TransporterBase.cs +++ b/Software/Visual_Studio/Tango.Transport/TransporterBase.cs @@ -612,6 +612,7 @@ namespace Tango.Transport message.Immidiate = config.Immediate; message.Priority = config.Priority; message.TransportComponentName = GetExtendedComponentName(); + message.ThreadingMode = config.ThreadingMode; TimeSpan? timeout = config.Timeout; @@ -640,20 +641,38 @@ namespace Tango.Transport throw LogManager.Log(new InvalidOperationException($"{GetExtendedComponentName()}: Could not send the request while transporter state is {State}.")); } - message.ActivateTimeout = () => + + Action timeoutAction = () => { - TimeoutTask.StartNew(() => + if (!source.Task.IsCompleted) { - if (!source.Task.IsCompleted) - { - TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Request message '{requestName}' had timed out after {timeout.Value.TotalSeconds} seconds."); - OnRequestFailed(message, ex); - message.SetException(ex); - } - - }, timeout.Value); + TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Request message '{requestName}' had timed out after {timeout.Value.TotalSeconds} seconds."); + OnRequestFailed(message, ex); + message.SetException(ex); + } }; + if (config.ThreadingMode == TransportThreadingMode.NewThread) + { + message.ActivateTimeout = () => + { + TimeoutTask.StartNew(() => + { + timeoutAction(); + }, timeout.Value); + }; + } + else + { + message.ActivateTimeout = () => + { + Task.Delay(timeout.Value).ContinueWith((x) => + { + timeoutAction(); + }); + }; + } + EnqueueMessageOut(message); return source; @@ -775,44 +794,60 @@ namespace Tango.Transport throw LogManager.Log(new InvalidOperationException($"{GetExtendedComponentName()}: Could not send the request while transporter state is {State}.")); } - message.ActivateTimeout = () => + Action timeoutAction = () => { - TimeoutTask.StartNew(() => + if (!message.AtLeastOneResponseReceived) { + TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Request message '{requestName}' had timed out after {timeout.Value.TotalSeconds} seconds."); + OnRequestFailed(message, ex); + message.SetException(ex); + } - if (!message.AtLeastOneResponseReceived) - { - TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Request message '{requestName}' had timed out after {timeout.Value.TotalSeconds} seconds."); - OnRequestFailed(message, ex); - message.SetException(ex); - } - - if (continuousTimeout != null) + if (continuousTimeout != null) + { + Task.Factory.StartNew(async () => { - Task.Factory.StartNew(async () => + while (!message.Completed) { - while (!message.Completed) + await Task.Delay(continuousTimeout.Value).ContinueWith((y) => { - await Task.Delay(continuousTimeout.Value).ContinueWith((y) => + if (!message.Completed) { - if (!message.Completed) + if (DateTime.Now - message.LastResponseTime > continuousTimeout.Value) { - if (DateTime.Now - message.LastResponseTime > continuousTimeout.Value) - { - TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Continuous request message '{requestName}' had failed to provide a response for a period of {continuousTimeout.Value.TotalSeconds} seconds and has timed out."); - OnRequestFailed(message, ex); - message.SetException(ex); - return; - } + TimeoutException ex = new TimeoutException($"{GetExtendedComponentName()}: Continuous request message '{requestName}' had failed to provide a response for a period of {continuousTimeout.Value.TotalSeconds} seconds and has timed out."); + OnRequestFailed(message, ex); + message.SetException(ex); + return; } - }); - } - }); - } - - }, timeout.Value); + } + }); + } + }); + } }; + if (config.ThreadingMode == TransportThreadingMode.NewThread) + { + message.ActivateTimeout = () => + { + TimeoutTask.StartNew(() => + { + timeoutAction(); + }, timeout.Value); + }; + } + else + { + message.ActivateTimeout = () => + { + Task.Delay(timeout.Value).ContinueWith((x) => + { + timeoutAction(); + }); + }; + } + EnqueueMessageOut(message); return subject.AsObservable(); diff --git a/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj b/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj index b24079da0..4d76daabc 100644 --- a/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj +++ b/Software/Visual_Studio/Tango.UnitTesting/Tango.UnitTesting.csproj @@ -173,6 +173,22 @@ <None Include="packages.config" /> </ItemGroup> <ItemGroup> + <ProjectReference Include="..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\DataStore\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj"> + <Project>{fa96bc0c-4055-475c-9dcc-70a5a9436b10}</Project> + <Name>Tango.DataStore.Lite</Name> + </ProjectReference> + <ProjectReference Include="..\DataStore\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> + <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> + <Name>Tango.DataStore.Remote</Name> + </ProjectReference> + <ProjectReference Include="..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> <ProjectReference Include="..\MachineStudio\Modules\Tango.MachineStudio.Logging\Tango.MachineStudio.Logging.csproj"> <Project>{1674f726-0e66-414f-b9fd-c6f20d7f07c7}</Project> <Name>Tango.MachineStudio.Logging</Name> @@ -213,22 +229,6 @@ <Project>{38197109-8610-4d3f-92b9-16d48df94d7c}</Project> <Name>Tango.DAL.Remote</Name> </ProjectReference> - <ProjectReference Include="..\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> - <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> - <Name>Tango.DataStore.EF</Name> - </ProjectReference> - <ProjectReference Include="..\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj"> - <Project>{fa96bc0c-4055-475c-9dcc-70a5a9436b10}</Project> - <Name>Tango.DataStore.Lite</Name> - </ProjectReference> - <ProjectReference Include="..\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj"> - <Project>{29448f3c-9b3e-4da6-8555-46a8b9a6b3aa}</Project> - <Name>Tango.DataStore.Remote</Name> - </ProjectReference> - <ProjectReference Include="..\Tango.DataStore\Tango.DataStore.csproj"> - <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> - <Name>Tango.DataStore</Name> - </ProjectReference> <ProjectReference Include="..\Tango.Documents\Tango.Documents.csproj"> <Project>{ca87a608-7b17-4c98-88f2-42abee10f4c1}</Project> <Name>Tango.Documents</Name> @@ -323,7 +323,7 @@ <Import Project="..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.108.0\build\net46\System.Data.SQLite.Core.targets')" /> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> + <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Tango.Web/Controllers/TangoController.cs b/Software/Visual_Studio/Tango.Web/Controllers/TangoController.cs index b3df0373e..deaa7cf48 100644 --- a/Software/Visual_Studio/Tango.Web/Controllers/TangoController.cs +++ b/Software/Visual_Studio/Tango.Web/Controllers/TangoController.cs @@ -69,8 +69,21 @@ namespace Tango.Web.Controllers { code = HttpStatusCode.Unauthorized; } + else if (ex is KeyNotFoundException) + { + code = HttpStatusCode.NotFound; + } - var httpException = new HttpResponseException(Request.CreateErrorResponse(code, ex.FlattenMessage(), ex)); + HttpResponseException httpException = null; + + if (ex is HttpResponseException httpResponseException) + { + httpException = httpResponseException; + } + else + { + httpException = new HttpResponseException(Request.CreateErrorResponse(code, ex.FlattenMessage(), ex)); + } #if DEBUG throw httpException; diff --git a/Software/Visual_Studio/Tango.sln b/Software/Visual_Studio/Tango.sln index 615dc2154..48cb5a993 100644 --- a/Software/Visual_Studio/Tango.sln +++ b/Software/Visual_Studio/Tango.sln @@ -419,13 +419,27 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.Git", "Tango.Git\Tang EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.PPC.Packages.Auth2", "PPC\UpdatePackages\Tango.PPC.Packages.Auth2\Tango.PPC.Packages.Auth2.csproj", "{EA4233F1-4B7B-4CCF-A6DE-2D17612EBA90}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore", "Tango.DataStore\Tango.DataStore.csproj", "{E0364DFA-0721-4637-9D32-9D22AAC109D6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.FSE.MachineConfiguration", "FSE\Modules\Tango.FSE.MachineConfiguration\Tango.FSE.MachineConfiguration.csproj", "{15BCB5BB-731E-4E2D-AA28-75485050A8DC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Lite", "Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj", "{FA96BC0C-4055-475C-9DCC-70A5A9436B10}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataStore", "DataStore", "{3F723D53-3539-42D1-8570-395BF660928D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Remote", "Tango.DataStore.Remote\Tango.DataStore.Remote.csproj", "{29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore", "DataStore\Tango.DataStore\Tango.DataStore.csproj", "{E0364DFA-0721-4637-9D32-9D22AAC109D6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.EF", "Tango.DataStore.EF\Tango.DataStore.EF.csproj", "{88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Lite", "DataStore\Tango.DataStore.LiteDB\Tango.DataStore.Lite.csproj", "{FA96BC0C-4055-475C-9DCC-70A5A9436B10}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.EF", "DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj", "{88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Remote", "DataStore\Tango.DataStore.Remote\Tango.DataStore.Remote.csproj", "{29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Editing", "DataStore\Tango.DataStore.Editing\Tango.DataStore.Editing.csproj", "{EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.CLI", "DataStore\Tango.DataStore.CLI\Tango.DataStore.CLI.csproj", "{6189B8C3-7AF9-43DD-8A61-A8A05F526F62}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.DataStore.Web", "DataStore\Tango.DataStore.Web\Tango.DataStore.Web.csproj", "{A9828548-AF43-4CE4-8B13-50E99F9C9CF7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.FSE.DPGraphGenerator", "FSE\Tango.FSE.DPGraphGenerator\Tango.FSE.DPGraphGenerator.csproj", "{C57D9D68-336C-4665-9EF4-EC1BDBB84885}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tango.LiquidColorGenerator.UI", "Utilities\Tango.LiquidColorGenerator.UI\Tango.LiquidColorGenerator.UI.csproj", "{949857A0-777D-4A32-8668-7163E404D800}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -3954,6 +3968,26 @@ Global {EA4233F1-4B7B-4CCF-A6DE-2D17612EBA90}.Release|x64.Build.0 = Release|Any CPU {EA4233F1-4B7B-4CCF-A6DE-2D17612EBA90}.Release|x86.ActiveCfg = Release|Any CPU {EA4233F1-4B7B-4CCF-A6DE-2D17612EBA90}.Release|x86.Build.0 = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|ARM.ActiveCfg = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|ARM.Build.0 = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|ARM64.Build.0 = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|x64.ActiveCfg = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|x64.Build.0 = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Debug|x86.Build.0 = Debug|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|Any CPU.Build.0 = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|ARM.ActiveCfg = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|ARM.Build.0 = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|ARM64.ActiveCfg = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|ARM64.Build.0 = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|x64.ActiveCfg = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|x64.Build.0 = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|x86.ActiveCfg = Release|Any CPU + {15BCB5BB-731E-4E2D-AA28-75485050A8DC}.Release|x86.Build.0 = Release|Any CPU {E0364DFA-0721-4637-9D32-9D22AAC109D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E0364DFA-0721-4637-9D32-9D22AAC109D6}.Debug|Any CPU.Build.0 = Debug|Any CPU {E0364DFA-0721-4637-9D32-9D22AAC109D6}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -3994,26 +4028,6 @@ Global {FA96BC0C-4055-475C-9DCC-70A5A9436B10}.Release|x64.Build.0 = Release|Any CPU {FA96BC0C-4055-475C-9DCC-70A5A9436B10}.Release|x86.ActiveCfg = Release|Any CPU {FA96BC0C-4055-475C-9DCC-70A5A9436B10}.Release|x86.Build.0 = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM.ActiveCfg = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM.Build.0 = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM64.ActiveCfg = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM64.Build.0 = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x64.ActiveCfg = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x64.Build.0 = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x86.ActiveCfg = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x86.Build.0 = Debug|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|Any CPU.Build.0 = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM.ActiveCfg = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM.Build.0 = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM64.ActiveCfg = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM64.Build.0 = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x64.ActiveCfg = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x64.Build.0 = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x86.ActiveCfg = Release|Any CPU - {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x86.Build.0 = Release|Any CPU {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Debug|Any CPU.Build.0 = Debug|Any CPU {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Debug|ARM.ActiveCfg = Debug|Any CPU @@ -4034,6 +4048,126 @@ Global {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Release|x64.Build.0 = Release|Any CPU {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Release|x86.ActiveCfg = Release|Any CPU {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4}.Release|x86.Build.0 = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM.ActiveCfg = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM.Build.0 = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|ARM64.Build.0 = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x64.Build.0 = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Debug|x86.Build.0 = Debug|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|Any CPU.Build.0 = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM.ActiveCfg = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM.Build.0 = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM64.ActiveCfg = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|ARM64.Build.0 = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x64.ActiveCfg = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x64.Build.0 = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x86.ActiveCfg = Release|Any CPU + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA}.Release|x86.Build.0 = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|ARM.ActiveCfg = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|ARM.Build.0 = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|ARM64.Build.0 = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|x64.Build.0 = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Debug|x86.Build.0 = Debug|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|Any CPU.Build.0 = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|ARM.ActiveCfg = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|ARM.Build.0 = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|ARM64.ActiveCfg = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|ARM64.Build.0 = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|x64.ActiveCfg = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|x64.Build.0 = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|x86.ActiveCfg = Release|Any CPU + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C}.Release|x86.Build.0 = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|ARM.Build.0 = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|ARM64.Build.0 = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|x64.ActiveCfg = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|x64.Build.0 = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|x86.ActiveCfg = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Debug|x86.Build.0 = Debug|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|Any CPU.Build.0 = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|ARM.ActiveCfg = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|ARM.Build.0 = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|ARM64.ActiveCfg = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|ARM64.Build.0 = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|x64.ActiveCfg = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|x64.Build.0 = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|x86.ActiveCfg = Release|Any CPU + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62}.Release|x86.Build.0 = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|ARM.ActiveCfg = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|ARM.Build.0 = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|ARM64.Build.0 = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|x64.ActiveCfg = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|x64.Build.0 = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|x86.ActiveCfg = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Debug|x86.Build.0 = Debug|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|Any CPU.Build.0 = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|ARM.ActiveCfg = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|ARM.Build.0 = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|ARM64.ActiveCfg = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|ARM64.Build.0 = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|x64.ActiveCfg = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|x64.Build.0 = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|x86.ActiveCfg = Release|Any CPU + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7}.Release|x86.Build.0 = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|ARM.ActiveCfg = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|ARM.Build.0 = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|ARM64.Build.0 = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|x64.ActiveCfg = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|x64.Build.0 = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|x86.ActiveCfg = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Debug|x86.Build.0 = Debug|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|Any CPU.Build.0 = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|ARM.ActiveCfg = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|ARM.Build.0 = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|ARM64.ActiveCfg = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|ARM64.Build.0 = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|x64.ActiveCfg = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|x64.Build.0 = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|x86.ActiveCfg = Release|Any CPU + {C57D9D68-336C-4665-9EF4-EC1BDBB84885}.Release|x86.Build.0 = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|Any CPU.Build.0 = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|ARM.ActiveCfg = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|ARM.Build.0 = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|ARM64.Build.0 = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|x64.ActiveCfg = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|x64.Build.0 = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|x86.ActiveCfg = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Debug|x86.Build.0 = Debug|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|Any CPU.ActiveCfg = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|Any CPU.Build.0 = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|ARM.ActiveCfg = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|ARM.Build.0 = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|ARM64.ActiveCfg = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|ARM64.Build.0 = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|x64.ActiveCfg = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|x64.Build.0 = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|x86.ActiveCfg = Release|Any CPU + {949857A0-777D-4A32-8668-7163E404D800}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -4177,14 +4311,24 @@ Global {59643ABC-DF9A-497F-8A7C-4A131C7CF438} = {E728CBD9-1AF4-4814-A218-E4BD26E7EDEA} {69168924-9AA8-447D-AD64-F07DBF4F0909} = {5F6BBAA8-EAD0-4B18-97E5-55B4F56DD760} {EA4233F1-4B7B-4CCF-A6DE-2D17612EBA90} = {E728CBD9-1AF4-4814-A218-E4BD26E7EDEA} + {15BCB5BB-731E-4E2D-AA28-75485050A8DC} = {4EE6DBA1-71BC-49E2-8DC7-266487E61050} + {E0364DFA-0721-4637-9D32-9D22AAC109D6} = {3F723D53-3539-42D1-8570-395BF660928D} + {FA96BC0C-4055-475C-9DCC-70A5A9436B10} = {3F723D53-3539-42D1-8570-395BF660928D} + {88D9906B-8FC4-4FE0-B7EB-127A0A8FCEE4} = {3F723D53-3539-42D1-8570-395BF660928D} + {29448F3C-9B3E-4DA6-8555-46A8B9A6B3AA} = {3F723D53-3539-42D1-8570-395BF660928D} + {EE088FF7-04D1-41FB-9D6A-CEDEEE7A7B9C} = {3F723D53-3539-42D1-8570-395BF660928D} + {6189B8C3-7AF9-43DD-8A61-A8A05F526F62} = {3F723D53-3539-42D1-8570-395BF660928D} + {A9828548-AF43-4CE4-8B13-50E99F9C9CF7} = {3F723D53-3539-42D1-8570-395BF660928D} + {C57D9D68-336C-4665-9EF4-EC1BDBB84885} = {004337EB-0761-4D30-B9F5-AE6E1CFC6013} + {949857A0-777D-4A32-8668-7163E404D800} = {5F6BBAA8-EAD0-4B18-97E5-55B4F56DD760} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - BuildVersion_UseGlobalSettings = False - BuildVersion_AssemblyInfoFilename = Properties\AssemblyInfo.cs - BuildVersion_StartDate = 2000/1/1 - BuildVersion_UpdateFileVersion = False - BuildVersion_UpdateAssemblyVersion = True - BuildVersion_BuildVersioningStyle = None.None.Increment.DeltaBaseYearDayOfYear SolutionGuid = {7986F7F4-A86A-4994-B1B6-0988D7F057B6} + BuildVersion_BuildVersioningStyle = None.None.Increment.DeltaBaseYearDayOfYear + BuildVersion_UpdateAssemblyVersion = True + BuildVersion_UpdateFileVersion = False + BuildVersion_StartDate = 2000/1/1 + BuildVersion_AssemblyInfoFilename = Properties\AssemblyInfo.cs + BuildVersion_UseGlobalSettings = False EndGlobalSection EndGlobal diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.config b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.config new file mode 100644 index 000000000..731f6de6c --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.config @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8" ?> +<configuration> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> + </startup> +</configuration>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml new file mode 100644 index 000000000..09124c44f --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml @@ -0,0 +1,9 @@ +<Application x:Class="Tango.LiquidColorGenerator.UI.App" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:local="clr-namespace:Tango.LiquidColorGenerator.UI" + StartupUri="MainWindow.xaml"> + <Application.Resources> + + </Application.Resources> +</Application> diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml.cs b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml.cs new file mode 100644 index 000000000..aba8ead65 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/App.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; + +namespace Tango.LiquidColorGenerator.UI +{ + /// <summary> + /// Interaction logic for App.xaml + /// </summary> + public partial class App : Application + { + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml new file mode 100644 index 000000000..cfdd6de22 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml @@ -0,0 +1,21 @@ +<Window x:Class="Tango.LiquidColorGenerator.UI.MainWindow" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:brush="clr-namespace:Tango.BrushPicker;assembly=Tango.BrushPicker" + xmlns:local="clr-namespace:Tango.LiquidColorGenerator.UI" + mc:Ignorable="d" + Title="MainWindow" Height="300" Width="800"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="300"/> + <ColumnDefinition Width="*"/> + </Grid.ColumnDefinitions> + + <brush:BrushPicker x:Name="picker" VerticalAlignment="Stretch" BrushTypeVisibility="Collapsed" /> + + <TextBox Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="300" FontSize="30" x:Name="txt"></TextBox> + + </Grid> +</Window> diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml.cs new file mode 100644 index 000000000..6cba6e577 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/MainWindow.xaml.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Tango.LiquidColorGenerator.UI +{ + /// <summary> + /// Interaction logic for MainWindow.xaml + /// </summary> + public partial class MainWindow : Window + { + public MainWindow() + { + InitializeComponent(); + + picker.ColorChanged += Picker_ColorChanged; + txt.TextChanged += Txt_TextChanged; + } + + private void Txt_TextChanged(object sender, TextChangedEventArgs e) + { + try + { + picker.Color = Core.Helpers.ColorHelper.IntegerToColor(int.Parse(txt.Text)); + } + catch { } + } + + private void Picker_ColorChanged(object sender, BrushPicker.ColorChangedEventArgs e) + { + txt.Text = Core.Helpers.ColorHelper.ColorToInteger(e.Color).ToString(); + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..382030056 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// 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("Tango.LiquidColorGenerator.UI")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tango.LiquidColorGenerator.UI")] +[assembly: AssemblyCopyright("Copyright © 2020")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file +//inside a <PropertyGroup>. For example, if you are using US english +//in your source files, set the <UICulture> to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// 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/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.Designer.cs b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.Designer.cs new file mode 100644 index 000000000..9ce60d611 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.LiquidColorGenerator.UI.Properties +{ + + + /// <summary> + /// A strongly-typed resource class, for looking up localized strings, etc. + /// </summary> + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// <summary> + /// Returns the cached ResourceManager instance used by this class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tango.LiquidColorGenerator.UI.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// <summary> + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// </summary> + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.resx b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Resources.resx @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.Designer.cs b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.Designer.cs new file mode 100644 index 000000000..fe9f990ce --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace Tango.LiquidColorGenerator.UI.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.settings b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.settings new file mode 100644 index 000000000..033d7a5e9 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Properties/Settings.settings @@ -0,0 +1,7 @@ +<?xml version='1.0' encoding='utf-8'?> +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> + <Profiles> + <Profile Name="(Default)" /> + </Profiles> + <Settings /> +</SettingsFile>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Tango.LiquidColorGenerator.UI.csproj b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Tango.LiquidColorGenerator.UI.csproj new file mode 100644 index 000000000..d77bd1cdd --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.LiquidColorGenerator.UI/Tango.LiquidColorGenerator.UI.csproj @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{949857A0-777D-4A32-8668-7163E404D800}</ProjectGuid> + <OutputType>WinExe</OutputType> + <RootNamespace>Tango.LiquidColorGenerator.UI</RootNamespace> + <AssemblyName>Tango.LiquidColorGenerator.UI</AssemblyName> + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <WarningLevel>4</WarningLevel> + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> + <Deterministic>true</Deterministic> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\Debug\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\Release\</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Xaml"> + <RequiredTargetFramework>4.0</RequiredTargetFramework> + </Reference> + <Reference Include="WindowsBase" /> + <Reference Include="PresentationCore" /> + <Reference Include="PresentationFramework" /> + </ItemGroup> + <ItemGroup> + <ApplicationDefinition Include="App.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </ApplicationDefinition> + <Page Include="MainWindow.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> + <Compile Include="App.xaml.cs"> + <DependentUpon>App.xaml</DependentUpon> + <SubType>Code</SubType> + </Compile> + <Compile Include="MainWindow.xaml.cs"> + <DependentUpon>MainWindow.xaml</DependentUpon> + <SubType>Code</SubType> + </Compile> + </ItemGroup> + <ItemGroup> + <Compile Include="Properties\AssemblyInfo.cs"> + <SubType>Code</SubType> + </Compile> + <Compile Include="Properties\Resources.Designer.cs"> + <AutoGen>True</AutoGen> + <DesignTime>True</DesignTime> + <DependentUpon>Resources.resx</DependentUpon> + </Compile> + <Compile Include="Properties\Settings.Designer.cs"> + <AutoGen>True</AutoGen> + <DependentUpon>Settings.settings</DependentUpon> + <DesignTimeSharedInput>True</DesignTimeSharedInput> + </Compile> + <EmbeddedResource Include="Properties\Resources.resx"> + <Generator>ResXFileCodeGenerator</Generator> + <LastGenOutput>Resources.Designer.cs</LastGenOutput> + </EmbeddedResource> + <None Include="Properties\Settings.settings"> + <Generator>SettingsSingleFileGenerator</Generator> + <LastGenOutput>Settings.Designer.cs</LastGenOutput> + </None> + </ItemGroup> + <ItemGroup> + <None Include="App.config" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\Tango.BrushPicker\Tango.BrushPicker.csproj"> + <Project>{40085232-aced-4cbe-945b-90ba8153c151}</Project> + <Name>Tango.BrushPicker</Name> + </ProjectReference> + <ProjectReference Include="..\..\Tango.Core\Tango.Core.csproj"> + <Project>{a34ee0f0-649d-41c8-8489-b6f1cc6924ee}</Project> + <Name>Tango.Core</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> +</Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Converters/EventTypeToStringConverter.cs b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Converters/EventTypeToStringConverter.cs new file mode 100644 index 000000000..de771f2a8 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Converters/EventTypeToStringConverter.cs @@ -0,0 +1,29 @@ +using Google.Protobuf.Reflection; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using Tango.PMR.Diagnostics; + +namespace Tango.MachineEM.UI.Converters +{ + public class EventTypeToStringConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + EventType eventType = (EventType)value; + FieldInfo fi = value.GetType().GetField(eventType.ToString()); + String name = fi.GetCustomAttribute<OriginalNameAttribute>().Name; + return $"{(int)eventType} {name}"; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml new file mode 100644 index 000000000..05a4b33cd --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml @@ -0,0 +1,25 @@ +<Window x:Class="Tango.MachineEM.UI.InputWindow" + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:mahapps="http://metro.mahapps.com/winfx/xaml/controls" + xmlns:local="clr-namespace:Tango.MachineEM.UI" + mc:Ignorable="d" + Title="Input" Height="250" Width="600"> + <Grid> + <DockPanel> + <UniformGrid Columns="2" DockPanel.Dock="Bottom" HorizontalAlignment="Right" Height="45"> + <Button x:Name="btnCancel" Width="150" Margin="5" Style="{StaticResource AccentedSquareButtonStyle}" BorderThickness="0" mahapps:ButtonHelper.PreserveTextCase="True">CANCEL</Button> + <Button IsDefault="True" x:Name="btnOK" Width="150" Margin="5" Style="{StaticResource AccentedSquareButtonStyle}" BorderThickness="0" mahapps:ButtonHelper.PreserveTextCase="True">OK</Button> + </UniformGrid> + + <Rectangle DockPanel.Dock="Bottom" Stroke="#494949" StrokeThickness="1" /> + + <StackPanel Margin="40"> + <TextBlock x:Name="txtMessage" Text="Please enter a value" Foreground="Gainsboro"></TextBlock> + <TextBox x:Name="txtValue" Margin="0 10 120 0"></TextBox> + </StackPanel> + </DockPanel> + </Grid> +</Window> diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml.cs new file mode 100644 index 000000000..191b53072 --- /dev/null +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/InputWindow.xaml.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace Tango.MachineEM.UI +{ + /// <summary> + /// Interaction logic for InputWindow.xaml + /// </summary> + public partial class InputWindow : Window + { + public String Value { get; set; } + public String Message { get; set; } + + public InputWindow() + { + InitializeComponent(); + + btnOK.Click += BtnOK_Click; + btnCancel.Click += BtnCancel_Click; + Loaded += InputWindow_Loaded; + } + + private void InputWindow_Loaded(object sender, RoutedEventArgs e) + { + txtValue.Text = Value; + txtMessage.Text = Message; + + txtValue.Focus(); + Keyboard.Focus(txtValue); + } + + private void BtnCancel_Click(object sender, RoutedEventArgs e) + { + DialogResult = false; + Close(); + } + + private void BtnOK_Click(object sender, RoutedEventArgs e) + { + Value = txtValue.Text; + DialogResult = true; + Close(); + } + } +} diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/MainWindow.xaml b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/MainWindow.xaml index 7bfc7f0fd..8f066800e 100644 --- a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/MainWindow.xaml +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/MainWindow.xaml @@ -9,7 +9,7 @@ xmlns:local="clr-namespace:Tango.MachineEM.UI" xmlns:views="clr-namespace:Tango.MachineEM.UI.Views" mc:Ignorable="d" - Title="Tango Embedded Emulator" Height="720" Width="1300" TitleCaps="False" BorderBrush="Gray" BorderThickness="1" WindowStartupLocation="CenterScreen" Background="#202020" Foreground="Gainsboro" DataContext="{Binding RelativeSource={RelativeSource Self}}"> + Title="Tango Embedded Emulator" Height="820" Width="1300" TitleCaps="False" BorderBrush="Gray" BorderThickness="1" WindowStartupLocation="CenterScreen" Background="#202020" Foreground="Gainsboro" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <Grid> <views:MainView DataContext="{StaticResource MainViewVM}"></views:MainView> </Grid> diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Tango.MachineEM.UI.csproj b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Tango.MachineEM.UI.csproj index 705194057..c6f382afe 100644 --- a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Tango.MachineEM.UI.csproj +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Tango.MachineEM.UI.csproj @@ -83,6 +83,10 @@ <Compile Include="Controls\InkFillingStatusView.xaml.cs"> <DependentUpon>InkFillingStatusView.xaml</DependentUpon> </Compile> + <Compile Include="Converters\EventTypeToStringConverter.cs" /> + <Compile Include="InputWindow.xaml.cs"> + <DependentUpon>InputWindow.xaml</DependentUpon> + </Compile> <Compile Include="ViewModels\MainViewVM.cs" /> <Compile Include="Views\MainView.xaml.cs"> <DependentUpon>MainView.xaml</DependentUpon> @@ -91,6 +95,10 @@ <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </Page> + <Page Include="InputWindow.xaml"> + <SubType>Designer</SubType> + <Generator>MSBuild:Compile</Generator> + </Page> <Page Include="MainWindow.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> @@ -200,7 +208,7 @@ </PropertyGroup> <ProjectExtensions> <VisualStudio> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> </Project>
\ No newline at end of file diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs index b46b89a4a..c993be2d7 100644 --- a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/ViewModels/MainViewVM.cs @@ -13,6 +13,8 @@ using Tango.Transport.Transporters; using Tango.Core; using Tango.Settings; using Tango.PMR.ThreadLoading; +using Tango.PMR.DataStore; +using System.Windows; namespace Tango.MachineEM.UI.ViewModels { @@ -138,6 +140,10 @@ namespace Tango.MachineEM.UI.ViewModels /// </summary> public RelayCommand AbortJobCommand { get; set; } + public RelayCommand GetDataStoreItemCommand { get; set; } + + public RelayCommand PutDataStoreItemCommand { get; set; } + public RelayCommand PerformDataStoreTestCommand { get; set; } #endregion @@ -191,6 +197,8 @@ namespace Tango.MachineEM.UI.ViewModels SelectedPort = Ports.First(); PerformDataStoreTestCommand = new RelayCommand(Emulator.PerformDataStoreTest); + GetDataStoreItemCommand = new RelayCommand(GetDataStoreItem); + PutDataStoreItemCommand = new RelayCommand(PutDataStoreItem); } #endregion @@ -282,6 +290,120 @@ namespace Tango.MachineEM.UI.ViewModels InvalidateRelayCommands(); } + private void GetDataStoreItem() + { + try + { + var result = GetUserInput<String>("Get Data Store Item", "Enter collection name", String.Empty); + if (!result.Confirmed) return; + var collectionName = result.Value; + + result = GetUserInput<String>("Get Data Store Item", "Enter item key", String.Empty); + if (!result.Confirmed) return; + var key = result.Value; + + Emulator.GetDataStoreItem(new PMR.DataStore.GetDataStoreItemRequest() + { + Collection = collectionName, + Key = key + }); + } + catch { } + } + + private void PutDataStoreItem() + { + try + { + var result = GetUserInput<String>("Put Data Store Item", "Enter collection name", String.Empty); + if (!result.Confirmed) return; + var collectionName = result.Value; + + result = GetUserInput<String>("Put Data Store Item", "Enter item key", String.Empty); + if (!result.Confirmed) return; + var key = result.Value; + + result = GetUserInput<String>("Put Data Store Item", "Enter data type", "Int32"); + if (!result.Confirmed) return; + DataType dataType = (DataType)Enum.Parse(typeof(DataType), result.Value); + + result = GetUserInput<String>("Put Data Store Item", "Enter value", "10"); + if (!result.Confirmed) return; + var value = result.Value; + + DataStoreItem item = new DataStoreItem(); + item.DataType = dataType; + + switch (dataType) + { + case DataType.Int32: + item.Int32Value = int.Parse(value); + break; + case DataType.Float: + item.FloatValue = float.Parse(value); + break; + case DataType.Double: + item.DoubleValue = double.Parse(value); + break; + case DataType.Boolean: + item.BooleanValue = bool.Parse(value); + break; + case DataType.String: + item.StringValue = value; + break; + default: + LogManager.Log("Data type not supported by this emulator."); + throw new NotSupportedException(); + } + + Emulator.PutDataStoreItem(new PutDataStoreItemRequest() + { + Collection = collectionName, + Key = key, + Item = item + }); + } + catch { } + } + + #endregion + + #region Private Methods + + private class InputResult<T> + { + public bool Confirmed { get; set; } + public T Value { get; set; } + } + + private InputResult<T> GetUserInput<T>(String title, String message, T defaultValue) + { + InputWindow window = new InputWindow(); + window.Title = title; + window.Message = message; + window.Value = defaultValue.ToStringSafe(); + window.Owner = Application.Current.MainWindow; + window.WindowStartupLocation = System.Windows.WindowStartupLocation.CenterOwner; + window.WindowStyle = WindowStyle.ToolWindow; + + try + { + if (window.ShowDialog().Value) + { + return new InputResult<T>() { Confirmed = true, Value = (T)Convert.ChangeType(window.Value, typeof(T)) }; + } + else + { + return new InputResult<T>(); + } + } + catch (Exception ex) + { + LogManager.Log(ex, "Error parsing input."); + throw ex; + } + } + #endregion } } diff --git a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Views/MainView.xaml b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Views/MainView.xaml index f553ec588..c0c4b7b97 100644 --- a/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Views/MainView.xaml +++ b/Software/Visual_Studio/Utilities/Tango.MachineEM.UI/Views/MainView.xaml @@ -11,13 +11,15 @@ xmlns:vm="clr-namespace:Tango.MachineEM.UI.ViewModels" xmlns:pmr="clr-namespace:Tango.PMR.MachineStatus;assembly=Tango.PMR" xmlns:threadLoading="clr-namespace:Tango.PMR.ThreadLoading;assembly=Tango.PMR" + xmlns:localConverters="clr-namespace:Tango.MachineEM.UI.Converters" xmlns:local="clr-namespace:Tango.MachineEM.UI.Views" mc:Ignorable="d" - d:DesignHeight="720" d:DesignWidth="1300" Foreground="Gainsboro" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" > + d:DesignHeight="780" d:DesignWidth="1300" Foreground="Gainsboro" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" > <UserControl.Resources> <converters:BooleanInverseConverter x:Key="BooleanInverseConverter"></converters:BooleanInverseConverter> <converters:EnumToItemsSourceConverter x:Key="EnumToItemsSourceConverter" /> + <localConverters:EventTypeToStringConverter x:Key="EventTypeToStringConverter" /> </UserControl.Resources> <Grid> <Grid.Background> @@ -150,14 +152,28 @@ <Button Padding="10 0 0 0" Margin="5" Height="45" HorizontalContentAlignment="Left" Style="{StaticResource AccentedSquareButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0" Command="{Binding AbortJobCommand}"> <DockPanel> <fa:ImageAwesome Icon="ExclamationTriangle" Width="16"></fa:ImageAwesome> - <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">ABORT JOB</TextBlock> + <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" HorizontalAlignment="Center">ABORT JOB</TextBlock> </DockPanel> </Button> - <Button Padding="10 0 0 0" Margin="5" Height="45" HorizontalContentAlignment="Left" Style="{StaticResource AccentedSquareButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0" Command="{Binding PerformDataStoreTestCommand}"> + <Button Padding="10 0 0 0" Margin="5" HorizontalContentAlignment="Left" Height="45" Style="{StaticResource AccentedSquareButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0" Command="{Binding PerformDataStoreTestCommand}"> <DockPanel> <fa:ImageAwesome Icon="Database" Width="16"></fa:ImageAwesome> - <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center">DATASTORE TEST</TextBlock> + <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" HorizontalAlignment="Center">DATASTORE TEST</TextBlock> + </DockPanel> + </Button> + + <Button Padding="10 0 0 0" Margin="5" HorizontalContentAlignment="Left" Height="45" Style="{StaticResource AccentedSquareButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0" Command="{Binding GetDataStoreItemCommand}"> + <DockPanel> + <fa:ImageAwesome Icon="Download" Width="16"></fa:ImageAwesome> + <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" HorizontalAlignment="Center">GET DATA STORE ITEM</TextBlock> + </DockPanel> + </Button> + + <Button HorizontalContentAlignment="Left" Padding="10 0 0 0" Margin="5" Height="45" Style="{StaticResource AccentedSquareButtonStyle}" mahapps:ButtonHelper.PreserveTextCase="True" BorderThickness="0" Command="{Binding PutDataStoreItemCommand}"> + <DockPanel> + <fa:ImageAwesome Icon="Upload" Width="16"></fa:ImageAwesome> + <TextBlock Margin="10 0 0 0" VerticalAlignment="Center" HorizontalAlignment="Center">PUT DATA STORE ITEM</TextBlock> </DockPanel> </Button> <!--BUTTONS HERE--> @@ -183,7 +199,7 @@ </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate> - <CheckBox FontSize="11" Content="{Binding EventType}" IsChecked="{Binding IsActive}" Margin="5"></CheckBox> + <CheckBox FontSize="11" Content="{Binding EventType,Converter={StaticResource EventTypeToStringConverter}}" IsChecked="{Binding IsActive}" Margin="5"></CheckBox> </DataTemplate> </ListBox.ItemTemplate> </ListBox> diff --git a/Software/Visual_Studio/Utilities/Tango.Stubs.UI/MainWindow.xaml.cs b/Software/Visual_Studio/Utilities/Tango.Stubs.UI/MainWindow.xaml.cs index 7d05ef9f5..011186a23 100644 --- a/Software/Visual_Studio/Utilities/Tango.Stubs.UI/MainWindow.xaml.cs +++ b/Software/Visual_Studio/Utilities/Tango.Stubs.UI/MainWindow.xaml.cs @@ -26,6 +26,14 @@ namespace Tango.Stubs.UI { InitializeComponent(); Title += " v" + Assembly.GetExecutingAssembly().GetName().Version.Major + "." + Assembly.GetExecutingAssembly().GetName().Version.Minor; + + Closing += MainWindow_Closing; + } + + private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + e.Cancel = true; + Environment.Exit(0); } } } diff --git a/Software/Visual_Studio/Utilities/Tango.Stubs.UI/Properties/AssemblyInfo.cs b/Software/Visual_Studio/Utilities/Tango.Stubs.UI/Properties/AssemblyInfo.cs index d283d9099..bf3b52bde 100644 --- a/Software/Visual_Studio/Utilities/Tango.Stubs.UI/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/Utilities/Tango.Stubs.UI/Properties/AssemblyInfo.cs @@ -3,5 +3,5 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Tango - Stubs execution GUI utility")] -[assembly: AssemblyVersion("3.4.0.0")] +[assembly: AssemblyVersion("3.5.0.0")] diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs new file mode 100644 index 000000000..383a59850 --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/DataStoreController.cs @@ -0,0 +1,331 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Authentication; +using System.Web.Http; +using Tango.BL.Builders; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.Core.Cryptography; +using Tango.DataStore; +using Tango.DataStore.EF; +using Tango.DataStore.Web; +using Tango.MachineService.Filters; +using Tango.Web.Controllers; +using Tango.Web.Helpers; +using Tango.Web.Security; +using static Tango.MachineService.Controllers.DataStoreController; + +namespace Tango.MachineService.Controllers +{ + public class DataStoreController : TangoController<TokenObject> + { + public class TokenObject + { + public String UserGuid { get; set; } + public List<Permissions> Permissions { get; set; } + + public TokenObject() + { + Permissions = new List<Permissions>(); + } + } + + private IDataStoreManager _manager; + + public DataStoreController() + { + _manager = new EFDataStoreManager(); + } + + [HttpPost] + public LoginResponse Login(LoginRequest request) + { + User user = null; + + IHashGenerator hash = new BasicHashGenerator(); + var password = hash.Encrypt(request.Password); + + using (var db = ObservablesContextHelper.CreateContext()) + { + user = new UserBuilder(db).Set(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == password).WithRolesAndPermissions().WithDeleted().Build(); + + if (user == null) + { + throw new AuthenticationException("Invalid email or password."); + } + + if (user.Deleted) + { + throw new AuthenticationException("Your account has been disabled. Please contact your administrator."); + } + + if (!user.HasPermission(Permissions.DataStoreRead)) + { + throw new AuthenticationException("You are not authorized to access the data store."); + } + + var token = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() + { + UserGuid = user.Guid, + Permissions = user.Permissions.Select(x => (Permissions)x.Code).ToList() + }, DateTime.UtcNow.AddDays(1)); + + return new LoginResponse() + { + Token = token.AccessToken, + ExpirationUTC = token.Expiration.Value, + }; + } + } + + [JwtWebApiTokenFilter] + public List<DataStoreWebItem> Get(String sn = null, String collection = null, String key = null) + { + try + { + if (!RequestToken.Object.Permissions.Contains(Permissions.DataStoreRead)) + { + throw CreateHttpException(new AuthenticationException("The current user was not authorized to read from the data store."), HttpStatusCode.Unauthorized); + } + + if (key != null && collection == null) + { + throw CreateHttpException(new ArgumentException(), HttpStatusCode.BadRequest, "When specifying a key, collection must be specified."); + } + + ValidateCollectionAndKey(collection, key); + + using (var db = ObservablesContextHelper.CreateContext()) + { + if (sn != null) + { + var machineGuid = db.Machines.Where(x => x.SerialNumber == sn).Select(x => x.Guid).FirstOrDefault(); + + if (machineGuid == null) + { + throw CreateHttpException(new KeyNotFoundException(), HttpStatusCode.NotFound, "The specified machine serial number could not be found."); + } + + var localItems = db.DataStoreItems.Where(x => !x.IsDeleted).Where(x => x.MachineGuid == machineGuid && (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); + var globalItems = db.GlobalDataStoreItems.Where(x => (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); + + if (localItems.Count == 0 && globalItems.Count == 0 && key != null) + { + throw CreateHttpException(new KeyNotFoundException(), HttpStatusCode.NotFound, "The specified key was not found on the data store."); + } + + List<DataStoreWebItem> finalList = new List<DataStoreWebItem>(); + + foreach (var localItem in localItems) + { + var globalItem = globalItems.FirstOrDefault(x => x.CollectionName == localItem.CollectionName && x.Key == localItem.Key); + finalList.Add(localItem.ToWebItem(globalItem)); + globalItems.Remove(globalItem); + } + + finalList.AddRange(globalItems.Select(x => x.ToWebItem())); + + return finalList; + } + else + { + var globalItems = db.GlobalDataStoreItems.Where(x => (collection == null || x.CollectionName == collection) && (key == null || x.Key == key)).ToList(); + + var finalList = globalItems.Select(x => x.ToWebItem()).ToList(); + + return finalList; + } + } + } + catch (HttpResponseException ex) + { + throw ex; + } + catch (Exception ex) + { + throw CreateHttpException(ex, HttpStatusCode.InternalServerError); + } + } + + [JwtWebApiTokenFilter] + public void Put([FromBody]DataStoreWebPutItem item) + { + try + { + if (!RequestToken.Object.Permissions.Contains(Permissions.DataStoreWrite)) + { + throw CreateHttpException(new AuthenticationException("The current user was not authorized to write to the data store."), HttpStatusCode.Unauthorized); + } + + if (item.Collection == null || item.Key == null) + { + throw CreateHttpException(new AuthenticationException("Collection and key must be specified."), HttpStatusCode.BadRequest); + } + + ValidateCollectionAndKey(item.Collection, item.Key); + + using (var db = ObservablesContextHelper.CreateContext()) + { + if (item.MachineSerialNumber != null) + { + var machineGuid = db.Machines.Where(x => x.SerialNumber == item.MachineSerialNumber).Select(x => x.Guid).FirstOrDefault(); + + if (machineGuid == null) + { + throw CreateHttpException(new KeyNotFoundException("The specified machine serial number could not be found."), HttpStatusCode.NotFound); + } + + DataStoreItem dbItem = db.DataStoreItems.FirstOrDefault(x => x.CollectionName == item.Collection && x.Key == item.Key); + + if (dbItem == null) + { + if (!RequestToken.Object.Permissions.Contains(Permissions.DataStoreCreate)) + { + throw CreateHttpException(new AuthenticationException("The current user was not authorized to create new items on the data store."), HttpStatusCode.Unauthorized); + } + + dbItem = new DataStoreItem(); + dbItem.Key = item.Key; + dbItem.CollectionName = item.Collection; + dbItem.MachineGuid = machineGuid; + db.DataStoreItems.Add(dbItem); + } + + dbItem.DataType = (int)item.DataType; + dbItem.IsDeleted = false; + dbItem.IsSynchronized = false; + dbItem.LastUpdated = DateTime.UtcNow; + dbItem.Value = EFDataStoreHelper.CreateBytes(item.DataType, DataStoreHelper.ParseDataStoreValue(item.DataType, item.Value.ToStringSafe(), item.ProtoMessageType)); + } + else + { + if (!RequestToken.Object.Permissions.Contains(Permissions.DataStoreCreateWriteGlobal)) + { + throw CreateHttpException(new AuthenticationException("The current user was not authorized to write to the global data store."), HttpStatusCode.Unauthorized); + } + + GlobalDataStoreItem dbItem = db.GlobalDataStoreItems.FirstOrDefault(x => x.CollectionName == item.Collection && x.Key == item.Key); + + if (dbItem == null) + { + if (!RequestToken.Object.Permissions.Contains(Permissions.DataStoreCreate)) + { + throw CreateHttpException(new AuthenticationException("The current user was not authorized to create new items on the data store."), HttpStatusCode.Unauthorized); + } + + dbItem = new GlobalDataStoreItem(); + dbItem.Key = item.Key; + dbItem.CollectionName = item.Collection; + db.GlobalDataStoreItems.Add(dbItem); + } + + dbItem.DataType = (int)item.DataType; + dbItem.LastUpdated = DateTime.UtcNow; + dbItem.Value = EFDataStoreHelper.CreateBytes(item.DataType, DataStoreHelper.ParseDataStoreValue(item.DataType, item.Value.ToStringSafe(), item.ProtoMessageType)); + } + + db.SaveChanges(); + } + } + catch (HttpResponseException ex) + { + throw ex; + } + catch (Exception ex) + { + throw CreateHttpException(ex, HttpStatusCode.InternalServerError); + } + } + + private HttpResponseException CreateHttpException(Exception ex, HttpStatusCode code, String message = null) + { + return new HttpResponseException(new HttpResponseMessage(code) + { + Content = new StringContent(message != null ? message : ex.Message), + ReasonPhrase = ex.FlattenMessage() + }); + } + + private void ValidateCollectionAndKey(String collection = null, String key = null) + { + if (collection != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(collection)) + { + throw new ArgumentException("Collection name contains invalid characters."); + } + } + + if (key != null) + { + if (!DataStoreHelper.ValidateCollectionOrKeyName(key)) + { + throw new ArgumentException("Item key contains invalid characters."); + } + } + } + + } + + #region Extension Methods + + public static class IDataStoreExtensions + { + public static DataStoreWebItem ToWebItem(this DataStoreItem item, GlobalDataStoreItem globalItem = null) + { + IDataStoreItem dsItem = item.ToDataStoreItem(); + DataStoreWebItem webItem = new DataStoreWebItem(); + webItem.Collection = item.CollectionName; + webItem.Type = globalItem != null ? DataStoreWebItemType.Overrides : DataStoreWebItemType.Local; + webItem.DataType = dsItem.Type; + webItem.Date = dsItem.Date; + webItem.Key = dsItem.Key; + webItem.LocalValue = dsItem.Value; + + if (webItem.LocalValue is DataStoreProtoObject protoObject) + { + webItem.LocalValue = protoObject.Message; + webItem.ProtoMessageType = protoObject.MessageType; + } + + if (globalItem != null) + { + var dsGlobalItem = globalItem.ToDataStoreItem(); + + webItem.GlobalValue = dsGlobalItem.Value; + + if (webItem.GlobalValue is DataStoreProtoObject protoObjectGlobal) + { + webItem.GlobalValue = protoObjectGlobal.Message; + webItem.ProtoMessageType = protoObjectGlobal.MessageType; + } + } + + return webItem; + } + + public static DataStoreWebItem ToWebItem(this GlobalDataStoreItem item) + { + IDataStoreItem dsItem = item.ToDataStoreItem(); + DataStoreWebItem webItem = new DataStoreWebItem(); + webItem.Collection = item.CollectionName; + webItem.Type = DataStoreWebItemType.Global; + webItem.DataType = dsItem.Type; + webItem.Date = dsItem.Date; + webItem.Key = dsItem.Key; + webItem.GlobalValue = dsItem.Value; + + if (webItem.GlobalValue is DataStoreProtoObject protoObject) + { + webItem.GlobalValue = protoObject.Message; + webItem.ProtoMessageType = protoObject.MessageType; + } + + return webItem; + } + } + #endregion +} diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs index fbc4f8a0a..161caaf23 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/PPCController.cs @@ -105,7 +105,7 @@ namespace Tango.MachineService.Controllers var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid); - var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid && !x.Disabled).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); response.Version = latest_machine_version.Version; response.FirmwareVersion = latest_machine_version.FirmwareVersion; @@ -186,6 +186,15 @@ namespace Tango.MachineService.Controllers LogManager.Log(ex, $"Error resetting synchronized job runs for machine '{machine.SerialNumber}'."); } + try + { + b.DataStoreItems.Where(x => x.MachineGuid == machine.Guid).Update(x => new DataStoreItem() { IsSynchronized = false }); + } + catch (Exception ex) + { + LogManager.Log(ex, $"Error resetting synchronized data store items for machine '{machine.SerialNumber}'."); + } + //Reset Events. //b.MachinesEvents.Where(x => x.MachineGuid == machine.Guid).Update(x => new MachinesEvent() { IsSynchronized = false }); //Reset Jobs. @@ -218,7 +227,7 @@ namespace Tango.MachineService.Controllers var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid); - var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid && !x.Disabled).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); response.Version = latest_machine_version.Version; response.FirmwareVersion = latest_machine_version.FirmwareVersion; @@ -337,9 +346,9 @@ namespace Tango.MachineService.Controllers { var machine_version = db.MachineVersions.SingleOrDefault(x => x.Guid == machine.MachineVersionGuid); - var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + var latest_machine_version = db.TangoVersions.Where(x => x.MachineVersionGuid == machine_version.Guid && !x.Disabled).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); - if (Version.Parse(latest_machine_version.Version) != Version.Parse(request.Version)) + if (Version.Parse(latest_machine_version.Version) > Version.Parse(request.Version)) { response.IsUpdateAvailable = true; } @@ -755,7 +764,7 @@ namespace Tango.MachineService.Controllers //Send DataStore Items if (request.RequestDataStoreItems) { - var dataStoreItems = db.DataStoreItems.Where(x => x.MachineGuid == machine.Guid && !x.IsSynchronized).Take(request.MaxDataStoreItems).OrderByDescending(x => x.LastUpdated).ToList(); + var dataStoreItems = db.DataStoreItems.Where(x => x.MachineGuid == machine.Guid && !x.IsSynchronized & !x.IsDeleted).Take(request.MaxDataStoreItems).OrderByDescending(x => x.LastUpdated).ToList(); foreach (var item in dataStoreItems) { diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtWebApiTokenFilter.cs b/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtWebApiTokenFilter.cs new file mode 100644 index 000000000..89169fc48 --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService/Filters/JwtWebApiTokenFilter.cs @@ -0,0 +1,72 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Authentication; +using System.Web; +using System.Web.Http; +using System.Web.Http.Controllers; +using System.Web.Http.Filters; +using Tango.Transport.Web; +using Tango.Web.Security; + +namespace Tango.MachineService.Filters +{ + public class JwtWebApiTokenFilter : ActionFilterAttribute + { + public bool AllowExpired { get; private set; } + + public JwtWebApiTokenFilter() + { + + } + + public JwtWebApiTokenFilter(bool allowExpired) + { + AllowExpired = allowExpired; + } + + public override void OnActionExecuting(HttpActionContext actionContext) + { + try + { + var authorizationHeader = actionContext.Request.Headers.Authorization; + + if (authorizationHeader != null && authorizationHeader.Parameter != null) + { + try + { + WebToken.Validate(MachineServiceConfig.JWT_TOKEN_SECRET, authorizationHeader.Parameter); + } + catch (JWT.TokenExpiredException) + { + if (!AllowExpired) + { + throw new TokenExpiredException("Token expired."); + } + } + catch (JWT.SignatureVerificationException) + { + throw new InvalidTokenException("Invalid token."); + } + } + else + { + throw new AuthenticationException("No token specified."); + } + } + catch (Exception ex) + { + throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized) + { + Content = new StringContent(ex.Message), + ReasonPhrase = ex.FlattenMessage() + }); + } + + base.OnActionExecuting(actionContext); + } + } +}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Nswag/DataStoreClient.nswag b/Software/Visual_Studio/Web/Tango.MachineService/Nswag/DataStoreClient.nswag new file mode 100644 index 000000000..c7aeb10a3 --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService/Nswag/DataStoreClient.nswag @@ -0,0 +1,140 @@ +{ + "runtime": "Default", + "defaultVariables": "", + "documentGenerator": { + "webApiToOpenApi": { + "controllerNames": [ + "Tango.MachineService.Controllers.DataStoreController" + ], + "isAspNetCore": false, + "resolveJsonOptions": false, + "defaultUrlTemplate": "api/{controller}/{action}", + "addMissingPathParameters": false, + "includedVersions": null, + "defaultPropertyNameHandling": "Default", + "defaultReferenceTypeNullHandling": "Null", + "defaultDictionaryValueReferenceTypeNullHandling": "NotNull", + "defaultResponseReferenceTypeNullHandling": "NotNull", + "defaultEnumHandling": "Integer", + "flattenInheritanceHierarchy": false, + "generateKnownTypes": true, + "generateEnumMappingDescription": false, + "generateXmlObjects": false, + "generateAbstractProperties": false, + "generateAbstractSchemas": true, + "ignoreObsoleteProperties": false, + "allowReferencesWithProperties": false, + "excludedTypeNames": [], + "serviceHost": null, + "serviceBasePath": null, + "serviceSchemes": [], + "infoTitle": "My Title", + "infoDescription": null, + "infoVersion": "1.0.0", + "documentTemplate": null, + "documentProcessorTypes": [], + "operationProcessorTypes": [], + "typeNameGeneratorType": null, + "schemaNameGeneratorType": null, + "contractResolverType": null, + "serializerSettingsType": null, + "useDocumentProvider": true, + "documentName": "v1", + "aspNetCoreEnvironment": null, + "createWebHostBuilderMethod": null, + "startupType": null, + "allowNullableBodyParameters": true, + "output": null, + "outputType": "Swagger2", + "assemblyPaths": [ + "$(assembly)" + ], + "assemblyConfig": null, + "referencePaths": [], + "useNuGetCache": false + } + }, + "codeGenerators": { + "openApiToCSharpClient": { + "clientBaseClass": null, + "configurationClass": null, + "generateClientClasses": true, + "generateClientInterfaces": false, + "injectHttpClient": true, + "disposeHttpClient": true, + "protectedMethods": [], + "generateExceptionClasses": true, + "exceptionClass": "ApiException", + "wrapDtoExceptions": true, + "useHttpClientCreationMethod": false, + "httpClientType": "System.Net.Http.HttpClient", + "useHttpRequestMessageCreationMethod": false, + "useBaseUrl": true, + "generateBaseUrlProperty": true, + "generateSyncMethods": true, + "exposeJsonSerializerSettings": false, + "clientClassAccessModifier": "public", + "typeAccessModifier": "public", + "generateContractsOutput": false, + "contractsNamespace": null, + "contractsOutputFilePath": null, + "parameterDateTimeFormat": "s", + "parameterDateFormat": "yyyy-MM-dd", + "generateUpdateJsonSerializerSettingsMethod": true, + "useRequestAndResponseSerializationSettings": false, + "serializeTypeInformation": false, + "queryNullValue": "", + "className": "DataStoreClient", + "operationGenerationMode": "MultipleClientsFromOperationId", + "additionalNamespaceUsages": [], + "additionalContractNamespaceUsages": [], + "generateOptionalParameters": false, + "generateJsonMethods": false, + "enforceFlagEnums": false, + "parameterArrayType": "System.Collections.Generic.IEnumerable", + "parameterDictionaryType": "System.Collections.Generic.IDictionary", + "responseArrayType": "System.Collections.Generic.ICollection", + "responseDictionaryType": "System.Collections.Generic.IDictionary", + "wrapResponses": false, + "wrapResponseMethods": [], + "generateResponseClasses": true, + "responseClass": "SwaggerResponse", + "namespace": "Tango.DataStore.Web", + "requiredPropertiesMustBeDefined": true, + "dateType": "System.DateTimeOffset", + "jsonConverters": null, + "anyType": "object", + "dateTimeType": "System.DateTimeOffset", + "timeType": "System.TimeSpan", + "timeSpanType": "System.TimeSpan", + "arrayType": "System.Collections.Generic.ICollection", + "arrayInstanceType": "System.Collections.ObjectModel.Collection", + "dictionaryType": "System.Collections.Generic.IDictionary", + "dictionaryInstanceType": "System.Collections.Generic.Dictionary", + "arrayBaseType": "System.Collections.ObjectModel.Collection", + "dictionaryBaseType": "System.Collections.Generic.Dictionary", + "classStyle": "Poco", + "generateDefaultValues": true, + "generateDataAnnotations": true, + "excludedTypeNames": [], + "excludedParameterNames": [], + "handleReferences": false, + "generateImmutableArrayProperties": false, + "generateImmutableDictionaryProperties": false, + "jsonSerializerSettingsTransformationMethod": null, + "inlineNamedArrays": false, + "inlineNamedDictionaries": false, + "inlineNamedTuples": true, + "inlineNamedAny": false, + "generateDtoTypes": true, + "generateOptionalPropertiesAsNullable": false, + "templateDirectory": null, + "typeNameGeneratorType": null, + "propertyNameGeneratorType": null, + "enumNameGeneratorType": null, + "serviceHost": null, + "serviceSchemes": null, + "output": "$(output)" + } + } +}
\ No newline at end of file diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Properties/AssemblyInfo.cs b/Software/Visual_Studio/Web/Tango.MachineService/Properties/AssemblyInfo.cs index 41fa77771..e4f5879f5 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Properties/AssemblyInfo.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Properties/AssemblyInfo.cs @@ -24,4 +24,4 @@ using System.Runtime.InteropServices; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("3.0.6.0")] +[assembly: AssemblyVersion("3.0.8.0")] diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj index c662b1e87..bccd84cad 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj +++ b/Software/Visual_Studio/Web/Tango.MachineService/Tango.MachineService.csproj @@ -316,11 +316,13 @@ </Compile> <Compile Include="App_Start\BundleConfig.cs" /> <Compile Include="App_Start\FilterConfig.cs" /> + <Compile Include="Controllers\DataStoreController.cs" /> <Compile Include="Controllers\FSEAccountController.cs" /> <Compile Include="Controllers\FSEDownloadsController.cs" /> <Compile Include="Controllers\DownloadsController.cs" /> <Compile Include="Controllers\AccountController.cs" /> <Compile Include="Controllers\FSEController.cs" /> + <Compile Include="Filters\JwtWebApiTokenFilter.cs" /> <Compile Include="Filters\JwtTokenFilter.cs" /> <Compile Include="Hubs\ExternalBridgeHub.cs" /> <Compile Include="MachineServiceConfig.cs" /> @@ -341,6 +343,7 @@ <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Views\FSEAccount\ResetPasswordVM.cs" /> <Compile Include="Views\FSEDownloads\IndexViewModel.cs" /> + <Content Include="Nswag\DataStoreClient.nswag" /> <None Include="Security\RefreshTokenEncoder.cs" /> <None Include="Security\RefreshTokenEntity.cs" /> <None Include="Security\RefreshTokensManager.cs" /> @@ -402,6 +405,18 @@ </Content> </ItemGroup> <ItemGroup> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.EF\Tango.DataStore.EF.csproj"> + <Project>{88d9906b-8fc4-4fe0-b7eb-127a0a8fcee4}</Project> + <Name>Tango.DataStore.EF</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore.Web\Tango.DataStore.Web.csproj"> + <Project>{a9828548-af43-4ce4-8b13-50e99f9c9cf7}</Project> + <Name>Tango.DataStore.Web</Name> + </ProjectReference> + <ProjectReference Include="..\..\DataStore\Tango.DataStore\Tango.DataStore.csproj"> + <Project>{e0364dfa-0721-4637-9d32-9d22aac109d6}</Project> + <Name>Tango.DataStore</Name> + </ProjectReference> <ProjectReference Include="..\..\FSE\Tango.FSE.Web\Tango.FSE.Web.csproj"> <Project>{d6f7d31d-7f8c-45e2-ae0a-fbbd1f5f9d5f}</Project> <Name>Tango.FSE.Web</Name> @@ -490,7 +505,7 @@ <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile> </WebProjectProperties> </FlavorProperties> - <UserProperties BuildVersion_StartDate="2000/1/1" BuildVersion_UseGlobalSettings="False" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" /> + <UserProperties BuildVersion_AssemblyInfoFilename="Properties\AssemblyInfo.cs" BuildVersion_UpdateAssemblyVersion="True" BuildVersion_BuildVersioningStyle="None.None.Increment.TimeStamp" BuildVersion_UseGlobalSettings="False" BuildVersion_StartDate="2000/1/1" /> </VisualStudio> </ProjectExtensions> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> |
