From a07633f96b41d97635ff7a33fc5b806fe67e58a3 Mon Sep 17 00:00:00 2001 From: Corn Date: Fri, 10 Nov 2017 11:23:00 -0500 Subject: [PATCH] Initial Project commit --- ZSDK_DevDemos_.NET/App.config | 6 + .../DeveloperDemo_Windows.csproj | 308 ++++++++++++++++++ ZSDK_DevDemos_.NET/Properties/AssemblyInfo.cs | 55 ++++ .../Properties/Resources.Designer.cs | 63 ++++ ZSDK_DevDemos_.NET/Properties/Resources.resx | 117 +++++++ .../Properties/Settings.Designer.cs | 26 ++ .../Properties/Settings.settings | 7 + .../Resources/Images/Zebra_Logo_K.png | Bin 0 -> 1899155 bytes .../Resources/Images/Zebra_Logo_W.png | Bin 0 -> 1898897 bytes .../Zebra/Windows/DevDemo/App.xaml | 59 ++++ .../Zebra/Windows/DevDemo/App.xaml.cs | 24 ++ .../ConnectionBuilderView.xaml | 40 +++ .../ConnectionBuilderView.xaml.cs | 163 +++++++++ .../ConnectionBuilderViewModel.cs | 56 ++++ .../ConnectionBuilder/ConnectionPrefix.cs | 27 ++ .../Demos/Connectivity/ConnectivityView.xaml | 18 + .../Connectivity/ConnectivityView.xaml.cs | 170 ++++++++++ .../Connectivity/ConnectivityViewModel.cs | 24 ++ .../Demos/Discovery/DiscoveryView.xaml | 74 +++++ .../Demos/Discovery/DiscoveryView.xaml.cs | 192 +++++++++++ .../Demos/Discovery/DiscoveryViewModel.cs | 92 ++++++ .../Windows/DevDemo/Demos/IDemoViewModel.cs | 30 ++ .../Demos/ImagePrint/ImagePrintView.xaml | 40 +++ .../Demos/ImagePrint/ImagePrintView.xaml.cs | 82 +++++ .../Demos/ImagePrint/ImagePrintViewModel.cs | 48 +++ .../Demos/ListFormats/ListFormatsView.xaml | 37 +++ .../Demos/ListFormats/ListFormatsView.xaml.cs | 100 ++++++ .../Demos/ListFormats/ListFormatsViewModel.cs | 31 ++ .../DevDemo/Demos/MagCard/MagCardView.xaml | 30 ++ .../DevDemo/Demos/MagCard/MagCardView.xaml.cs | 106 ++++++ .../DevDemo/Demos/MagCard/MagCardViewModel.cs | 35 ++ .../PrinterStatus/PrinterStatusView.xaml | 27 ++ .../PrinterStatus/PrinterStatusView.xaml.cs | 106 ++++++ .../PrinterStatus/PrinterStatusViewModel.cs | 23 ++ .../DevDemo/Demos/Profile/ProfileView.xaml | 32 ++ .../DevDemo/Demos/Profile/ProfileView.xaml.cs | 144 ++++++++ .../DevDemo/Demos/Profile/ProfileViewModel.cs | 23 ++ .../DevDemo/Demos/SendFile/SendFileView.xaml | 24 ++ .../Demos/SendFile/SendFileView.xaml.cs | 104 ++++++ .../Demos/SendFile/SendFileViewModel.cs | 23 ++ .../Windows/DevDemo/Demos/Settings/Setting.cs | 31 ++ .../DevDemo/Demos/Settings/SettingsView.xaml | 42 +++ .../Demos/Settings/SettingsView.xaml.cs | 180 ++++++++++ .../Demos/Settings/SettingsViewModel.cs | 37 +++ .../Demos/SmartCard/SmartCardView.xaml | 34 ++ .../Demos/SmartCard/SmartCardView.xaml.cs | 102 ++++++ .../Demos/SmartCard/SmartCardViewModel.cs | 23 ++ .../Demos/StoredFormat/FormatVariable.cs | 27 ++ .../Demos/StoredFormat/StoredFormatView.xaml | 30 ++ .../StoredFormat/StoredFormatView.xaml.cs | 230 +++++++++++++ .../StoredFormat/StoredFormatViewModel.cs | 31 ++ .../Windows/DevDemo/Dialogs/AboutDialog.xaml | 17 + .../DevDemo/Dialogs/AboutDialog.xaml.cs | 28 ++ .../DevDemo/Dialogs/StoredFormatDialog.xaml | 22 ++ .../Dialogs/StoredFormatDialog.xaml.cs | 35 ++ .../Dialogs/StoredFormatDialogViewModel.cs | 40 +++ .../Windows/DevDemo/Enums/ConnectionState.cs | 23 ++ .../Windows/DevDemo/Enums/ConnectionType.cs | 29 ++ .../Windows/DevDemo/Enums/DiscoveryMethod.cs | 37 +++ .../Zebra/Windows/DevDemo/MainWindow.xaml | 119 +++++++ .../Zebra/Windows/DevDemo/MainWindow.xaml.cs | 66 ++++ .../Windows/DevDemo/MainWindowViewModel.cs | 81 +++++ .../UserControls/ConnectionSelectorView.xaml | 52 +++ .../ConnectionSelectorView.xaml.cs | 158 +++++++++ .../ConnectionSelectorViewModel.cs | 121 +++++++ .../UserControls/FileSelectorView.xaml | 20 ++ .../UserControls/FileSelectorView.xaml.cs | 45 +++ .../UserControls/FileSelectorViewModel.cs | 40 +++ .../Windows/DevDemo/Utils/BluetoothHelper.cs | 29 ++ ...ConnectionTypeDescriptionValueConverter.cs | 35 ++ .../Utils/DemoViewModelNameValueConverter.cs | 32 ++ ...iscoveryMethodDescriptionValueConverter.cs | 35 ++ .../DevDemo/Utils/MessageBoxCreator.cs | 29 ++ .../Zebra/Windows/DevDemo/zebralogo.ico | Bin 0 -> 22147 bytes ZSDK_DevDemos_.NET/app.manifest | 76 +++++ 75 files changed, 4502 insertions(+) create mode 100644 ZSDK_DevDemos_.NET/App.config create mode 100644 ZSDK_DevDemos_.NET/DeveloperDemo_Windows.csproj create mode 100644 ZSDK_DevDemos_.NET/Properties/AssemblyInfo.cs create mode 100644 ZSDK_DevDemos_.NET/Properties/Resources.Designer.cs create mode 100644 ZSDK_DevDemos_.NET/Properties/Resources.resx create mode 100644 ZSDK_DevDemos_.NET/Properties/Settings.Designer.cs create mode 100644 ZSDK_DevDemos_.NET/Properties/Settings.settings create mode 100644 ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_K.png create mode 100644 ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_W.png create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/App.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/App.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionPrefix.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/IDemoViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/Setting.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/FormatVariable.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialogViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionState.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionType.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/DiscoveryMethod.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindowViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorViewModel.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/BluetoothHelper.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/ConnectionTypeDescriptionValueConverter.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DemoViewModelNameValueConverter.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DiscoveryMethodDescriptionValueConverter.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/MessageBoxCreator.cs create mode 100644 ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/zebralogo.ico create mode 100644 ZSDK_DevDemos_.NET/app.manifest diff --git a/ZSDK_DevDemos_.NET/App.config b/ZSDK_DevDemos_.NET/App.config new file mode 100644 index 0000000..9d2c7ad --- /dev/null +++ b/ZSDK_DevDemos_.NET/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ZSDK_DevDemos_.NET/DeveloperDemo_Windows.csproj b/ZSDK_DevDemos_.NET/DeveloperDemo_Windows.csproj new file mode 100644 index 0000000..333e79c --- /dev/null +++ b/ZSDK_DevDemos_.NET/DeveloperDemo_Windows.csproj @@ -0,0 +1,308 @@ + + + + + Debug + AnyCPU + {8B42A994-831D-4EAF-B40F-436166CD5B6A} + WinExe + Zebra.Windows.DevDemo + DeveloperDemo_Windows + v4.7 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + Zebra\Windows\DevDemo\zebralogo.ico + + + app.manifest + + + + Sdk\BouncyCastle.Crypto.dll + + + Sdk\CoreFtp.dll + + + Sdk\CsvHelper.dll + + + Sdk\Microsoft.Extensions.Caching.Abstractions.dll + + + Sdk\Microsoft.Extensions.Caching.Memory.dll + + + Sdk\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + Sdk\Microsoft.Extensions.Logging.Abstractions.dll + + + Sdk\Microsoft.Extensions.Options.dll + + + Sdk\Microsoft.Extensions.Primitives.dll + + + False + Sdk\Newtonsoft.Json.dll + + + Sdk\SdkApi_Core.dll + + + Sdk\SdkApi_Desktop.dll + + + Sdk\SdkApi_Desktop_Usb.dll + + + + + + Sdk\System.Runtime.dll + + + False + Sdk\System.Runtime.WindowsRuntime.dll + + + + + + + + + 4.0 + + + False + Sdk\Windows.winmd + + + + + + + + MSBuild:Compile + Designer + + + ConnectionBuilderView.xaml + + + + + ImagePrintView.xaml + + + + ListFormatsView.xaml + + + + MagCardView.xaml + + + + PrinterStatusView.xaml + + + + ProfileView.xaml + + + + SendFileView.xaml + + + + + SettingsView.xaml + + + + SmartCardView.xaml + + + + + StoredFormatView.xaml + + + + AboutDialog.xaml + + + StoredFormatDialog.xaml + + + + + + + + ConnectionSelectorView.xaml + + + FileSelectorView.xaml + + + + + + + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + App.xaml + Code + + + ConnectivityView.xaml + + + + DiscoveryView.xaml + + + + + MainWindow.xaml + Code + + + Designer + MSBuild:Compile + + + MSBuild:Compile + Designer + + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + Designer + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ZSDK_DevDemos_.NET/Properties/AssemblyInfo.cs b/ZSDK_DevDemos_.NET/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3758294 --- /dev/null +++ b/ZSDK_DevDemos_.NET/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("DeveloperDemo_Windows")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DeveloperDemo_Windows")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[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 +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the 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/ZSDK_DevDemos_.NET/Properties/Resources.Designer.cs b/ZSDK_DevDemos_.NET/Properties/Resources.Designer.cs new file mode 100644 index 0000000..b2ccb05 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace Zebra.Windows.DevDemo.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // 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() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Zebra.Windows.DevDemo.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [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/ZSDK_DevDemos_.NET/Properties/Resources.resx b/ZSDK_DevDemos_.NET/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/ZSDK_DevDemos_.NET/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ZSDK_DevDemos_.NET/Properties/Settings.Designer.cs b/ZSDK_DevDemos_.NET/Properties/Settings.Designer.cs new file mode 100644 index 0000000..a841441 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 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. +// +//------------------------------------------------------------------------------ + +namespace Zebra.Windows.DevDemo.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.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/ZSDK_DevDemos_.NET/Properties/Settings.settings b/ZSDK_DevDemos_.NET/Properties/Settings.settings new file mode 100644 index 0000000..033d7a5 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_K.png b/ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_K.png new file mode 100644 index 0000000000000000000000000000000000000000..fd3a651d9bc29b79be1ec730a4f6573052c6c371 GIT binary patch literal 1899155 zcmeF437i~7+5e}3mmArrfQtA|0xBX&W^-@Mv73ZT2qYv(;>B)~O|p_?H_2iGD%pr! z>T80iTtXIom77FR6aljwf{KuUuP10$0TKN}_62?Mg85hVOwIK4^ikDaRbAcltIub* zd#bCR=c#W!UHx=bPtT=uPCenE{ol5KE|)v#q!VYIp3Cj^U%8z1`F-~$|MRyj>L&;G z>p5}Z+Fb6iH_|_A*_J0ssr^sunmKdMoaNoU-D{V3_vBBSIWyn0rh94Eiq2ea{cohJzKFzI1Z;>4)r_KYhmM`rdrmyN(&YU(@?98Gik*51D)au;Y%~ z>+m1-U$W;HzR>siL*^cP;Ai*$)jrP-|JoNW`1&QE{mH+6|B0`k{fm2F{o`Y=f9IFe zp1<{#Ywz5#&%nM1e&ximbI11`c+-q`3>&=Qk%u1s{j;N5H|~E_Pp)a-JC_V!``VFK z?(gSMneyHd1N;0SXRZI)0sH0#W?wTBf0ga16^st;RzpRopdFPn7ozI|`bwVwBd z8Q;vc9&hzsd*!?4<@)!^wLiLe(KER@BXjNV-tfnt<@&Du`&FN?av%EA@I$Qr%X0ZQ zbzU+nxBPv%TX%fmv&ZEY6moA~dh$apxnGUU6;3*H>4~{*-^~p?-gLknxqT1J73N-Y z;d^p>eInQXqa%-8pZm;Jxi=sG@|jcq_r13_J%0=#b=4hH?mnvJxQ!p$cjW4Q&OCF} zJC1(*q{H6(<_R5pbX?s!>Vb2wdh3{t;|?Bt<)^t^|7C}e*1q!E`p4gJ`{R#K_`+Rp zIBVpex9?pXv1rjVuRpirmY&vJ?)SatKk@ppqwjoM-~0CNTlxCe-ucpA%RhQR|2eOI zZs{Edw|*zr|H5z1e5Hr7Iqv$+cmMj=&prF>uipRAj1P7Ed|Y*WU*p_~~Cy`NrFKd~v_eEPDEnn@;%mcMmB3`-q>7c<7`> zcP}{R&Ckqz5Hp#xsT2| zYSjFn+&TS`eRH{4{Tq+j)^_+`?|;j&1AD*y{{MLT{saEqKH)Pnj(X^U8BH_xU()yX zHSO=Y_0uzszUZ-SM;y~W`hQxF7&kC?`9+uaykXP>XMFDsQ+p2nXUD$R-GB7G8~59* z?MM5*sblzWF0mGUcEOQf*!QrjF8urO`%m2Kjh{Oz|Km&EJa@#&myJKM`Sj1u&!2JP z5id_&vq#ItA3py3m%Z;txiO#q_eJ-f(EO#1cg&soKL>ti=G`|=eA{P^|JngNm-IGY zz3I^YYj&>r_S>d@e!}(7@4RLC!N1uwZRR6|fj_-vpRo_ED2#ge!5QD0bnJeYFMjk} zBW^wLmWSWA?E|;&dC#SPTfF02>-Ku%#^VO|o3Piq8TpQPw4J!%lm(~$>ckuKZ$E0> zu;1)Aalbu3GxvdakGTBClfV70?+^ROLvL9$rupIpCmws`FW$K6O{1GWammbwCLZ<1 zOJ|OG_uZTKIO$veJ^#r!K6(6;t4=@ig=25JX55KyJM!`$|7OYAckI*hrDOB&{n3Tb zUi<8W&yIce@Mnj={Gt7?UDUezzyCh(4@aN=laIast_)Q<2aohEGoxXMM#W%ib+&NdbJa)mMC!PF_+rIYYpS^AQVas3b+WM#7?+^R! zm)~*f6+6#-^3fMg_|p}C+VijL4m{|hLoRsal4VD~^_sWr^Oj|AUH6u)SDy0CxBl#N zZ+&EbVPf-Nu6+KggRkm7W5F?Z9rMXUF8j&;Uw;3W-}U9gj~PAxrklTc^Y3mx;EY$! zcy#`zn?5@4Q@0;~#@Kn!+_c~SeC3uiZoYQTU*;V?Z`n=nyYb?im)+PsfBJu)zwot7 z_g?tmDG#1D^S|fzf9tGg?tM6az~Z;wx&GMUXCHLSMdxfB|IoX>_1LdJ`SD}!x$?Cm z?)lu*n{T?lW#-uTk3I9w(_i`0(&_s=bLHy4f3^42{hmMihAUn<|Fge)^X~Wj;XQ|c zbKEI+H+O#c?3=%G#a9;Ga^fv>Z#m&F_f5F{#T%~u=6%QAv+!RV-_Z8R```WHcb~9q z)8qef?ep_~J@2_dv!_n}+wG%nKKmPoUw_Z6b=z0n@Y0pn{otd0*PYUR!|%?$ z@A-ee{Zpe~oB!I%f8Ox76AoOk_nikGwf9p8KK_;|KODchd&&``A9?D3=g$1dgRL{a z(edSuD}Mi(%kF++%GZB>{C^#P@aMZ8{_rzLJ+t!Rl@EXYU3{V?TZDYmfcns`1xMZT{t$=dXGGnqOYC>$~kAT>rsi@4E4>?{%JZ z$Fm>&=E9fmx_8xuA8c9pjRj|X@FRB~f7`XUz4I6M+;-0m!*00y)XPu3<+@)idvM$T z-u2_VZu;(9w>|f(y`Q@Mu9bIvs$c3u_y3auu|N0HL z9Pz;;&R_fOHE*8$fyuwS`th&6H2qUQ{Oea<7`<%4j;0;I8vD#$Z+i4S4|QET@0y>T zuB*mdbkr5oMqP9G!@vE}eb2tX_iw8|^853i{M)tH+agb zM_+d4ZNJ?1-EXYB`PGiyhfVvxX=}DTGwqov6Mr}6cMH$@>BNEW{^+}pp7vn(b!T0; zYvzU{i%W{<6`#o6(DzPj*`AkfY}@#uJ^uCg^FBFz`xmB9eya2T?)deKZJ+PIyX}y+ zO`pE))6d<1+wkQ-`hS~m8~*C^S3Z8(<6UpKaL)OE`o+$DI{w)4xd+cb@ZA?)eBqfF zP5(mAB@5p6MDrEn*FEv{%(c5_{d3k=X8rD(WzDCxY#sUj@yATNdDO?I{AS|!$9;eL z!=sii{OQjZT)W_;6(_&FWz;dZPgu3$2fP0L;wu;b;o3hO@XRL;yK?l8KGJjU^^ZUB z*9&hr^rlg7Ja+O|T2Hy;)Jb0&YHK>?#zQ~<&X?b`?ww!Q|J()wE5ms4m#zx*G#_d(5pY5UpZ## z~qJm&NG*8f9%qqw0z~3>)!j=i$A^dCr@pj_|@H8iZ8zLfj9pC zi+6qFqLa@YdBlQ0-goQATJD&#`rN1Xf98#n|=1ikKX^2Pv8F?>+HWAaK`@6UHGZLJpIcTKXTfF(F=Edr{kX&U3>VnLoWU7 z?QeeSuqzJP@T;SrUjN+T7kB?;`&CbW>DxEm^3dH&b}W5z=?j1S-N@@c^oFn8e8nHH zc*ClLe*K$oAGGTO-+u9L|99L|qpx`E=%?e|`Iu@7>#Z!;c?-?0wVc|M&dA z&j0892`@eQ+wXMz^6#sjc4^`p~_vzBcX0KX~d4>x|hyU;6XTf1UKN zJ71lC`=vL(@b|C$Yvo67J9Xvi7a!U4$vt1&=g2qQ^~<~e=jTT}Id%T&n||@$znt)f zNB;8%uV1@+-N=I`9CXHief8l#9N9DL+-F~Sb-!J&zT=?Dzxnv*KXL2t_xag>e*B1K zM~wd1jH_S1`uJ<+UHz{QE&9;+Py6Y#Cw}qg-<|jG6Q26dgTFd%%EEKs|H}Lycm3vt zPyg)lWiRje{Iy@c_EYDN`p47lPkrsKPdvZ)@m(J~xO?~an|go$E_UoCyz4+(TKlJ+3zuNuuhK~)b>wo2mr%!lw?+Y*3@%m+d+jQ{E|JZcZ zrbjP2=%T+|H)&c+%O9q%dF_RN-!OB>k{$25?y%Rt_WGl@A9m>I^Z)+yzx?v?C$4g)5{cYaP8~%0qTQ9%7xYwRnzVh$IV@E!f%RTs>uK5dk7tB6o^5X85qdJy! zFX|k%eq|2{M02?*)7STOEIzxlH@~QJS=XwmBX-}jeMG)%$8(S=E)#}q~uS|*Pl zJGn3>Urr;Y?N9cmtXZ;j^69gVFRLS;rjA(N+uJjF^yqc#){R;>c2xJ8Wuu#0T3SXI z#*7{_W+W*wa_zaRdOOyST($Pdk`N|mR_EHqYr1-RySi89soai5-RJa99WjC`s-#l8 zmMpI5={aZ33R}yP#iKh{bgt}N)w_0d^Qh+0UiAo_O2t)c%ghP=(d#>UNTq^brP;HC ztF2t=S#xdg>77*~o(k8_KewlI^y!^zyU$s(xRVq=(#!6(y~ll=peUo|5Omzf2?tM6 zT`N|cv$l6lM{oBUZ-I^iK}hD$S>|1zq3j*qv&@Ietge;8bxTx8vCdU%i8~Na@o)mt znI{B`@z&qt@X{KT!z|WW8NWeO!Sa@vYXmzRRZ?JyNP>pNge3 zWXh7olb3d{S=rG$t!rh+vd+;xtCmd}UCpdwq$PX1dRKHhY7-gu8Qr#`w>Fm@SkXn# z^vNqaR*}wMKXOUu(vEXh^p2SJ!Olf%I?g(!ds+8cCr=qoPu>+>wGv9XwSsNK+%`-h z-8y+T8LO6b^mfeZ=|@SP*^^INwYIlo)#A>RW=$i_9M#peWb(vGot+cMEm}NsLd%3n zBPWd+w|Hbrp<~j>=CP9|c65wcJZ8e8MYiPH>UE-LbuT`L4x&VK>C&;JdodATaq!6< zV;6Ny9KU4J$VHut3L~4FJI9S|SyUJ|a`D8Dr4uGB88dOwxDKYsA*@c(X=}R3m91li zqs%$y5KZG}jVVlO88fbB?2O}Q&1i0JX&%=$X?#mz*4XCpg-J6fG1(sV>vWvnxoSxl zy`aoo(Xn>zG%|71y>v1;&6y0>@w)o6I@ff4ymQI%Yr0q3m!zJKHETQRh&^=#8?r0c zu<{9LkNK0k>N|*b!T8RlEhCpqDoh%=v}GLOM%p=Y+{8sK6BmywOc=AYdCKUz>Q$TQ zNmx2ex`g!+?fxZ%nuv5qbua1Nkvpbjokx8yHEVqPrXM@t zwU%7r&UGAMW7xdT)wQ|o02$oq$Q9nlm7XRS<;fk3seesd+d=$ACN(!t8Z)MC(wMR1$a!$waWiHSx38<}FMr+g&Q;ZMvoODT z!sM~dlgG8N(W)fMF6A#|ZTHgNbscLu+m?~xpge4yRE-|;Gv`gnA3eKcan~w3H%f-B zlGNI2{^A!eCs&cqCDTT;iY&uj#ruL{Mz2jMOc*zA=7jMr$B${2+-u}&=eowA*GlKw z;_g)+?_AR>aK4dqx`W*Rbgo%DZ7ChgJ9>InbS>_nXYS~p?zO$88;^W%cg>NHuUb;R zMW|f;n6EknrpaA-uM%_+bBs~$CRPWs+JUA%K#T0Mf$>rL1{#$v>j?BqV3KjpC8b!2 zogwAxqQC1ntgO(<*PWdn=O8^z4QX@it3F@UUg}nykfkuH6c5yfaV#dR5BsJ#<})VG z>+M+6drr@s(gNttDqe=c>i$`iiP4R4?t+Ipk)4?KE-&Q8u%jQD1U)$9h_JUe|e@ zoZ&8sS;QOrEIV^vsqIc+w1m~@oN^^Q$G6hV?iJnSgz0rPvnrZ) zZ7ssevC@t`#U*&NR}oRNe65Y!MsVixuHMqQf5K!(wuk*L87sS&bWWQ&dm))HvuW6$ z!>jdDUUN=AZRTZJo6K9`RsGOO$QadlaDxFFsr+~XQ%MKTCu6=H}>z8xG zt1qJGjJtLz)3>tsDOTwOvLn|K%ICF>6^`KKT-q<4IZ_;iH;OzJ*wRvZoa2Pa+Fhf?<(q<| zMRU3Om@;zHt{+ni#5agnESx%NJaLT_d4{WB1RcZOt-=?PN#kp0$OQeuWxbJZG07e= z8p zuO@B-jGMzC(^|8qjU2n{^cSjhNFIZvDo&M&*J+c2YHs zk?{4ztv+LSCS=C5d^s7HGQV(7TnY{t?y+2Wz!>L>b28=_6K%(!^IIvK_MGUtwGj0S z*YcaNU%1p~%q{Hj)1D7cnOnq+J>9pvaEqGTReG07R#oY6k+RE3-93Tec;Sv4g&o5+ z@tU#mqU0F#|H7$bsB4TFpQ1-G+)vXB`bM2^2|LG_ctM7{x|w$+CGSYt^~8N&pxrgH z9cS1R&LPMts+PX}Bkv1YINc<;4AP zh@fk@$2{X)!@fHqK}Pxe&0`zq_GE%9P!PVJxF0kWbPcy>o9PK1GTox^=eGtN2en^)U8>`ThT6#0gmt#03lc}a2mW<1yMdLL@#3nk?V zIsf;8`n~`%%6lJ6uivP?`SgS}9p{p_*4i&(spfjTjM7ojez7V0>Y-gJU9UQwX}?s0 zj=3~YBcn)qo^f&A9|@jSuG+!_uB*P_a9cNA$2+OW2^8f7sGfK3mk-stMGL&5f~syu z;`_@c*$Wfn3M?iz+9@W%De8Qok|EJ4$Zt22S1L_xNrh9SDJ*l1;HkQPOt43ai3K)+ zW%Nif0V73aV5r-XI8uzaouawG7O9MOiZtEar+K7s-+UVF6lq#_OtVvzW~;^(*o~{v zPLZbXf~VOj#@K=8q;$j-V-Qo+g%Xtvi7`d#A0b?V@EoF)rSXwvVVPnuMa;}Qn15zHVzq`kbiF;@vnUuvWO8|Z5Ybu;zC zD+P5D1Wzs3mBPr;mOKH*R_z-mFmpe|1;?oUJtTW&(SF|>dAmYGjToi3&9k{#VZU&H z^C@HFh5J2#DHsOuTQXgBhp5@)W-D{V3_e{1QQ=3hH@|oQB zdS!doI%(!i_FMI9Pd{Ns{-on(PH1kKFk$4FQB-S1x}%&!PH)%JrISxv(?x%}xwor( z75#bmx;%IJ1*dne?Ot(Csr-2RSKLRF0gFEDW!H5cch_AQQrCIhUAJ2G4EnS1Bp|ZY zxw0L#I@fnCEn%J4)3LadHqM>pEqG*2K?K6WklA3&I?!0&Aa(x%%a{nlj?F+fwIfY#A&+WO~ zf4!BPvF5)2vWi7g6bS@k64)bVeN+blo4{U-gJoH4 zH|Ex&L)@@jt~eA^P+fJ5o^?o!$*5e~Bs)^Mfkj!~Y0HBn8RIu~h6r5R?2)EUKyXHs zI>8cg)Jy`Lj>H^-ZABUrrH+Vvlr@0>rz1H{rH)}WIdiZN0-TOi7whbXGr@VB1UMau zR)I4)!C}9afR7{DmoJZ*N;p$3K73*XJRHdx96R?}6;WrZE6)UBn;`-oj^yt6SkBau zAy#Ng0D;QPc5NBzOil-)`)&twm&wrpoXlvmq+mExzLC!a~O`fA(EQRmrwwjfcxCaHbIY&&>~JI+=`$qJX_bR>sK;T0W)gLXB|fXA^{2W%zMv?|+ zVx8l+t+6NK2S3>?UsNou7bh{jZ0jd0s2_ul`N{LncQ{gUCn?fVTTGfF>P#MY9ktr@ ze~R0gu`TY8EukVnZCfmBk0O0$&HcyJI~<8-75m9QMb6~aP-%`zjrU19boi(a&(4Pz z(O!ZMD8k9*NVLA~O#QWzWOYVT&Q#l)(kCxlyvixfYgH;eP`F>87F{7uppeQz4@aWM zigZ-!r+e~~R|onvDz0{!a;dDKKM`Bmq^D<{jh?w$GrjtV8W6yf%~X09vUYgGbGOO~ z*m=x1zmLcjemIWV>fAcD)$cp?JNN5LR&!VtjxRYN!-g4GfcgfP{ zFu7sJOHx>0xJD#*L+oKL(lyiD_?leBcXRHx)aW+w104nYMglK$-5u>!hUOLL)*ta> zBci`ns>_k+LAMgynTBesN&BSOnY`?b4$DiLygWB|DUt`GOY!66ZKsDLQPu9kMY^i5 z(3zq)*Sn_M{z@rTZKx=Sw?pl=+T+P^)-JX=KdIbzI+6>ryEANOQfZ3@*>T!H&(NU1 zF!R0Yde+(EnJbjZba_>>$W_2E*^cbEsqiaTpYL!auTiJYnFvhPDSBf{mbq=N*gH_! zGiHZ&xL2Y9zp~U6UvfQTha*w(rZ|(csr5!XkJj#6t+k(>pY#p$POTC5H-y*obHebN zDoVHesX?LJaEeDX7z?Z?a7rK-Umjzm?Z(V47G{*dh1djG?T9r5dM zUW0;0B~RITUdiF*T=Ln3l6OTKn9&N(Kd+L`<1PhW#q09i^}RncTbT- zN+IR@`0BW2)yQx$bC(VK%p;4HvB)UwCy$k3Ti$Z4Jlp!$V}0Q>A~6BnBa>@=hAP&X z)D77>TMS^mrU+>aUeA{3$P7qf#O0 z@=z(HaVLsBTy+ZGjVKO!=kw%N{eZ)fs6el!lB$rBO8a>xI&m2x*^9&>_55JD?FbQ5 zdw8JsW741e+8D>KSbWNg!|f7$(Uv_tx;)#h#9oXoPkOnJ@c^l7cpGu#0a}w@kCDtI zAm~W65hBhM#gY6$!IAvgBz=VQ(&jXi>oPY)YDB!uIdx$_Ed(NrNUUi*BNHntXNwU@ z4o4MIB8*7P44#pRmBlve1Y$T6MFVHbx`XhxFQy~GnRr2Gy_^I`f-_~^NqE{P$&vh= ziN^$#$pV4OU7M`NkZ)wtH644>vRHiG=fN#m+91ai0uo0g)+Db0oE^h9s{|A{5=8}P z%BsWowM+V?%}){XvrRzJh?H$;Xq^WE{EVar6l6ssfMF>bH`H-Dbm3fVZMe+#BOy^e0S-rUjxKNv^<9!q4IGZ- zZkVVu(Jx;iWt~7}Rx&u)_HrJtfZD4ZMd(#l94&%vab~(|_>4$yhwyR)cNtwKLyw6B zJRFI=c+l-AQJu-Fo{1=6Qyc;wm$onmav!JanX?2Pi(_V~E-r2H8LE=tF(SEDxt)VK zjkBD)3_IpkmL0=3O9VU|$*c3-juKjiyp+hROqS50ElvU+mo|3T?L0K!?HpcZSpCYD zd}Gpn8$~4}>W=%;R)43-Wsi?~*0xA8D&H-SHlxpUyG;|eWjJ9y=#~=xIY>{*HaB~> zOvi}i7UtDBo-%F~xh4X){6c`bV-hpmwuy-LYO6^7xMivBaqO??-&K<1`yQK0!Rk(! z-k`UbRi!u_iDtTmdI5HqsR|3&)8tG67Np`(B(`2HBM;6?lhxy;z@6uEBzo9wfR{75 z#jww`Ec?sR;ok9C&gG41s@=M6u00z3Nu+(jk{bD_ha*uO?v9BH+byS&Q9DnnAPzE_ zg~&=+}^1CE=f_oVq{yB{&U9 zRvR>!8d*hgC~{TKiu9!Q`eW4{jzqImI#ZqO0&y-)&cvGQ+}7FSJeb0L(f0VBV5_|w zZ?${pmviam!hOl`7(HAgic_R>q^Zeot(C)$Im_Go+|I;oWm_iEe_N-^(GI^_es%oH zyYofrdzNjlO7uJ)a5?fSUzJw7=T(;G(G+y7RD%6yec>9BDu>D4ma0^D<|HsO)!D$& zSUUOm7(Q*VlIoE^xnzgNc8OwI-M!BG2Rx(&W+kxu@#315V4E0bN+>h z7C!7d=jR)SI305=d9!0_p0SQ?%Zc(oq5iEdffThxzFnQZJlMK?pI~A zzHp65b;DuOBU9Nis)mQ`?e;nDbN2g`PIWeQ4!;z1%&(4DK0RS;lgp9lK^|wS6{7wV z4*;v(-;QFR|FN_lsp}_4LzMn7F4a?i!m^>sVMTejZrJm<%+aFma!eBaky+<4mQS}l z`OY$>eP%1$IwjW1tf|{tTQ2NVOb_NY}Dhlo>%gd7bU+WztR_#9WT8# z9d0Z0a3(J!JcapWde!&NW45wwRbbFhDSFGQb-b#i+I*h6cA3_y1nxQxCw13h(%kv% zGdoVVEYEApQ_fk&Yu`&Q%_}9=7ao^3R)lWrhEL9zsjA2+&1c_dkf>i-$^Ze|o?c)$fq5|s#QD<^pBkRhLdbNt2rq%8jH`jjl`{bpAmUY|W zSKl*#$TK%pnf9+P`dG}{2R_vWvN;@yN~`O{ruq)7DzOOidi1CME$%mo}#raz`PjWbB(uK!GFC#=@D*?Q%7iRbnJH z;vuzB2q+qn8U-KPSt0PrYc5!VVX1-xJ0Ji8NfW^3E$JSBeh>hG3W3U;B+Id<71@Wx zx7GPghbiRy0=$oUJ8Eg(#eA%0;82$d0(G}+DHxC(;LV--#DL`JChUR$Cjp7KZ1fic zX+-1v z5fU8?!Ulv&)D+{})j@s2J8%Wbz%dX2fuspY7?4;Kcm^i=o-ccFQZz6zTd)NI5J)2d zfdQ!!<%GNsB$0tB)|Ira0NYs$9frpmi z860@z}EuFc>YMa8!2N2{IepH=;=bZ<53%boQa=ubLGN%s>e14IY;laZv@ zCE2E^?TXwMVt@5Vet7&o$ifH%5);QWpfv8l#M3eU1Cq6iP|h>bdbjRAvj@fvnrvwE z9xQl#O`3&+#D?K~(sbJ8?iW4_`AWrYN7XhSzYns>XAX%P7-l3jqH2h@5?(ppwFPs@ zqXf1-*UzH}N=dx9%{`xh88p%)ecJFTU-lz%4w#hKxn%o?Nrn+yE7l@Xm2Mv`CX3G>b5C6!DKl`Fj0@A{easHQNn8(6OLF)NkKOE&9Gi<~VBFMQ*J_Kj-=N(ZMcM zo)RHO_IlO# z$`g@E%X%dlGQ8x{JQ3M`GW_zR$QG$X%km}ndEs%(<|T;EGuUBnzt_=f9={>gIx6=n zVQ`QV67t%xl?+TlisK!#c9Z(8Vlr$VLt=HZSX$IiZQs`j!hQ}-kv`G3SIpQ}+2h)= z=5Q5r74jI6f+oo-1Jh2I9K%1_4z-aO8MG?bYeddzJPuqWh@$N(YgJ6^8?3Ngp?u-G$P zK?4#K&oeNQ(bR^M(t(LJ)#RXy{UioYtm)%N2=!i;% z1paZ1e9rn+^Xm7U<(&KVCCm1;`rGDPr!PXCAO?Z$cXRdn>}P3hzLN*X)8pQ{W$=EE;|x*jx@{Nz%-goGa-w=`%D09|kAK|isrI*!w7Ej1 zxe8O?6HSy?SQ35G+wZ*K%@4E3c|6#D!2yX0mOe1~tlBYs%xT%@tZsulOI@p@oEYk? zi6@!)ir+T3DVqG^wrKUjYDHmhx2-Qgaz5ag0f+qkJmP@F+9YdWqAzy0J0_ulDT-4t z2434J^87o=OM|?;D7MPeo(@T>8AX!sGubWbN0D^9x=n_RlE@eX(s8rCe@~5FmC=ce zF21Qyj+Xj;JR^Y+_xtD7MxK$#4ecql-~gJx<>V`ZB6#H+6XC zM#~&7R?TU5wPuV_sVbzp$Mr?GCV_#8JcFP!#c{x>b-g=AeXFCM0O~DEPy-3mSwAMh z$JRM0-u{XYk&C`aD)x(%4lYY)>qS$=?n=cNzlBth5wK&A*kO={h!cbiJoXpQT#=Pd zhq1quLnk0w$=?9^+emDtTi-;V`a%K$5D+7vctB#ts2G@Z4oIvW{96o2{H#zC1Q-Fy zw`@$Tdn@f$jz&}DzMj6^2nhs0AZr9PMM!RJvLYt8Tys7nLNcc>U`cuiXo`^BKx9Qs zZn^jj0w9oP0tpRB3>gL{Mgm(90D)XC;Q@(t0R|>U0$UJhWC97zA%!95nPb8#TNp(g z2Z6K^s2h+>Y5@5u%pJrY&*zwm#nFQcR$30y}zJDwEA+ z5%ja_`5hfPq7y+)5C8#w0umx477ckRbq`QpW#Z;pt#KuwJ_vw7@&sb8rrGm09JfnR zBP8CzEUJ8U9e~v|b!;Iyn*?G;M)uEHayU_c7Tj1nLK z0$~Is3`SH12Ba|1I1U0J5KJKEoRM3&{V*bZp>;^&o#WxXz2lV^VwS|im@|?H6QUY| zfIwtKf6l`SnXE4EB-EP2$?*;{;gV1S1VA7g1UMrjtBEvsce%;^;a^&n6(R8sT8NCY z;f`oUBNO0_jMzX#S+yG$Aq_Qh2cqpDkQD+Pk&$n7(yu;3^40C&Z(dYHjl-Ogql>T$ z0vrT*BO@UE%+r+f|xQBf5(_CO%j1VSPsp2#FeCavl32?eF7b4X$O&5VjD z2}DLg{(xg3P){HvGO|zhu;`;eA|$fX7L-&(NahYiK_qYt1VF%>K*(T3D;0;4eVr=IPP2*Y+8Y-}~ti9E_+K3`l-3o%uYS;y)PKPTuO2r*GdqxVxiM zm6o`5Q(d}PcKbyB$w}G>bEb~x*(2z$9OF8tLvHH z$|F&%42_IDb@}*cm~^XMOrEW~)my48yXX&*ipX-7^|mZL*C|8RKDi9I#uJgxB9Rem zA0i}1!k8^R!Gu!=BLyA?_Al9xWqYBtNvO1NVfyuyxVK!wN)=R~gIe_DF&J?{!GIK< zxr&-w#D&@?rFgYW)ChZisIHNPx*R1LT<4xkbCd~ob+>4A9+dab)sURWU_^^>K{0Va z;tc8C7}EUN{*t3;1KLC@pu9E$qF<3}k6@Wmt7y!ApTUS8PV0cgV|To8lEE`%yFuIz zS>IY0*Nhrr1j4@c5LRFMalyec`neS_7|}-YoY*|iAxQ@mB9O=K=+HuxYdmZ(dyDED zE?NQQa~re6z!Hp#^bL+7gAwflo)bIs15#fxLj0l2fm_8D6$i!ZGp4PNj3^eHx7HKmx)i%0QsFR2>w)Pumu;c}-F3?Il);p4e$Tae3^f?cy1@#E7XW zEqp=|GqkjAJMoVgO;%;2{Z)6e1RN#ldgUUsO?ZiPGpot5HTD*b+Aa_ov8JkW7$#rk zmf9Zlr&706*^#b1QY|o67`>>t|LDYKl$40CZxFMzxLT|{cWL(^*UVkhE+~G%^cakI zBA-M$NsNVOX`Z%uRx~IxN*mJJUx{KDJo)0853dDRaP)(P*KLxmcWgqKncu^VP6BtRx#d3;`>1%aXyJ=eAc znpStv+EJI~lfgL{(b_znlPDygCT1a#}GwQnEc{g z5ox4sfw#QiLyxp`LX9OW5hivbFOp1@8%n4Zbb@ndLb}UpgZwj!U-J08t`-Ni&DRF9 zT9=L_I2h4J@pKM_7Nz6U0Zp%!Q8)^}K}=SY$UtQBJ4)Ee9EGVYL{a20yQ9<G!9@;z+;PH=x6^bn6iHO&)&_BO+d8xo*`w1|w<+4*;GH;*lf0;hF^Uv_G~fyTv8w{w|fcg@)8f;&yUSyzOGo z>bT^m<`#|G?K2qBLp%cs&k4yRhw4jX;%R@>c3JrdHTxsfY0xU+w+-^aMEd#OynH*7 zkVv024^9Dt5v|BGkno(4JaU2!HTNh_`y*MuOT1Q*JVA_PI04bsDAJrLK4x*<8fj!T zCrnq!U_`6)3?xxtg_)M7Zi}YW$_v&blg8;v9D@;U5C)|1 zZk0M9Z4cMyE|IBMqq-ZX;B%zK0ZDf7oKJPCB1Fn{G7`=R{%s}B!HBkj2cXmwGGTC0 z)XQjpq$k4LqFCGDbs{VdBu$KWGTXRYGzPAn?Raek1|wQs_kfh-)yoSPPhRW+X#u{iiKgH%)?Zp!fB4s|9`WN-Ey1xzZZ9J=yCPVM4HaqLJ2F^# zOOB9B{klo4p0snzp*9Y8QJ&Pty%$;pBO_)%kMW{LGTC)oIv@#lSe=ZZjO&9AYChJk zSzlQlPk$z3nYdQ!cR_#R64lj+`lP&-_qR#-7HylqEUqIRT&1do+N-;@dl3gCDul;@ zc?KjNIVyjgP00_>M_Im2WoTXNPFelL<)cv>zcE6^T>*6j{YdzWuP)W{&Yu{A5w(e@ zlhQCCx%kHZ7-{*o5L;~|0X%&eNiZsL5s119$~&3OWrXHJ)+R57F$W_mlE;~iACLyT z;ONUs!^^z%(J)IBkAKIun9Pd`r+j@4%OkJ8lp|-*u^(r*U$AnIS9z;gB)8a(WLZ%s zAY~0Wvg9}##kI?$mq$>^dEH#SYF1gx((R=sD39kv(`lQRJ#>K~*BaCcg~!NzNYHJF z2pg}qIV~5F<*etFD=NcT*C{i~zPN7pIU*r4VutfHjK^ReIZUV2ZIr8%+knmPjPTDq zOgyFZ6*qY13uO)pm2SMkA)}FOAW@xPc-C6B;SuH4|HQ4t@QB&ObB6JN50b-EpV=d_ zwc1JPEh04>WrxV6v@)u>hki%7%5Et<3TkJisDd3{hC1!@vMGu1$jc6|E)ZeEBU414 z(;h0@%9EU3uBCo&3`jS?WxI0O_#Mhu?!Ny?6vwq65GZHdy=%AKdm197vb^-Q400bz3ga#w38UqrgfCK^{ zP$H1vU_=eTfCNVb0T3t=NO&-!MqogKGlBpJBzl|X#E${VNdx;J(1-*Kh>RF^3`mRw zwjj`m1PmICD1Hn`jp&4EGYC)uh7Cs4B%T3@mO}yo5Xce%0|z6D7Xwn3oD6LN0UiQ% zKPzj{t1rk~S@$Syj600@8p2!McQ0(CEebn7Q?VsvNWvrWMAd_koH&PMVTyFSNf z>`EYj7l2BD2oWFv0w4eafdoPy$VPDF$1gNEa#h5;2wXrSeME2+2^%Vb00@8p2nZ0s zvYG&_ctvS2W&gFulY`nI00JNY0w4eaDhZ?{II^~s0t=NWw8<{F#VTmi2t^tCI|pqy$IhMkUz}FRte1AviL(Z(tb+fB*<&g@6IeYSxbOl3Bn^ksogM9FO1e zwB*YSw9?XM*a-q400JNY0%j60AUMih79UL(f+TBBd=8KR0w4eaAOHd&5SM^S%WCbU zG2~%oDTzGCQzXyxs7xwmd$7C~)?-*!3nPT%AOHd&00MCdm@soxZbPx31T^%GlO1sz zMe36!I(s&WKG=-}0w4eaAOHd&00P_u3<{2z%?Oeh32Z?C1V8`;KmY{v6Hpi&(RUNY zNtGa}IgXTaUCbm&fCv#F00JNY0wB-`1QY~ER!{lcXYJ*st++wb&hm0w)`O&hMsPT^ z5d=U01V8`;OeY}uf$YGCl>14LBjI@>`_0ni>;FJ#vUG?90w4eaAOHd&U;=@d%WBqk(umfW4WZ8zNtij&z1$W$Q^tV>OKBXC zYKmZ4tp*1^fB*=900<}`5Oe0JNM=1^r$TuqDduxTboRv#HY5aE%HNYjp1nd~6x(wk z00ck)1V8`;6cC6xbL6zhB43x!H92!4?x$oXDbmal3EZ%R7SS*4YM42SLl1R900ck) z1b7I!3m00ck)1k5KOaaql;v6)_O^J}zdKACN!K_yZc0a?pxmPO*$ zNGZ~CY9vjDRB9u>IpA-L)kltP@IRi~BO&c}woA$vQ=9^I?e8RtzD4@CPnW`~p46O2 zWNgm$lfUZ;C(0|sDXBj3fBsh1cps(H6wDmC&B*jjlDn}{KR1<^66teWNX8OKYVb%5 zh(Lgln2k^zoj`$9C4nvV>$<;P(Zyz}CK;P^J>-vkVW^G~b zw_6}Mit7Nz21zE(*pQRVJ^>LV`TJ}FNBWBN3R3Qz1oS7Ta(M8xQF4YsvlasR@_@vm zr#V`*rcX(Mm`n!kn&^qJOI>PD(BdR@`!<_1LZTsZ#R15LB2F?cQW}cW8bx&pV?;`d z*b0iZ?+h9(VkLJC#X&((D4uNsTQMeacQBcHs{~6iub139V-%#eCY?;Mp_Tz>aFi=J zs<9|JW~ZALBsp4W&MtzaMEkTxexp^~VJNS5gF2$eAX{=A!BH+Onlmj((!|%kkXU5-f%7j%o^Z|4NJG$*H%`Wq4mh!QYwIYhJtddpK@z7r05O|h5$G^-3%XO2Jd z1V^FGDHmwaAc+@`T}~1sA)P2JM8N)j`WB%osV|JcDD_>KXamf-pe2fdUpbj@u-^f} zUqgCHvzD-Gn`cJwxL2)FQa;fDfC{3sBr&Gw>2h0UPdZ7Ar1TerR0!AuhEY?y71NaM zATUyfR*v9}0b&j&#|q`Yrhsx94$&{|$oLg;4W^o*qLp0V$W2(WBO!B49_Ka@CYuxD zQc=tCCdfU=G+?Y0BS?x897P%Ib?C95VcG6OG6o|bi5bn7^=7c>Z-UeTHi|z+u`9~C z;?|?|O^|Km;xXXXXx?X)Z-R{5N7CNJ%Yj|QR+T=^YllSx%Q@ulEb^Bpe@Ud_#K#Bq zDptu}W=o2p@rg`rZdo#y)!ee#XF5wl0xbJ0(JT+!S^{8H%cFrm=^D6rFCY!v6`5#y z)3TGMK1z0ZjUza+2hnB;{e}P_ z93mKnGsZ47%pm^!w z2##nqJHjTBb*{rph+rN9fN)@76wWAPB@h^8tV0cKj{OYikb#C7Y7*sT2T7`#`8{qS znTxJ5MxNQ0wMUUY0-@qB%u3GSh>0oomz@Pc5<{YPyR{^qI<=I)9cs;m^k@Wh4O;d< zAI(J6$_jzYveFQJ?VwAOX-`U*s1yf}R(lfk1%o4IB7!7FLeG|7)TCV43gsXRL6V-1 zPw(L<0FM#%i*-Y0usQU0}yMn`GC?KQtYQ)8j(HHtJx5vl1!K|@uqsnLg$ zE2+P-r)0;PqeQHaP)QLIlTP1iWrvadEGNd6L`q1(1Q00&^D*_PcXTA#+Cc7@Q<`yBB-RVnL%kJh5Sy20QvmV5DH6)nGYPq>VuN1}tr6 zi`YwNDU=6B#2_WVle0ynrDA2n0%GMqw6|5v-e{#cf+JgSp?tB88zhk#2^%beq-gym zS_?svC^6~f?N{LH2#m;#q4G6<>2x44bp*;mQ5GM*wwJxhxoY277D>M)=%~zwMB!v4l=-Q)}RL}8iN20v{@j;wtbD!bgiu<=d6+&8kJ+ta4|w*%Wq=R zJW9umKRhHlvZ4k@OoZ$pX^08NRw)4lNlNk3Zwcj84pPkeHZs8Wvk%yUfCK`Ys>@21 znHM@okm0X3R6jIq29Z?K&)FG1|O4BYC(q#un%ti!Bj0Cm~LcrQi z8rrU*v2=EIP=g+*0D&+9?d2e;DXd_F9^YA72~qv*jp`R8#$CEs{_Z2cxfKd28Dam_Z?Kd+7^dl|QCHm)tg) z!7Fhq1{^+1mcCUd`-O;#gVV~hXT@?b9ATRyv4GM(^r zPyvm{NKmaU^*e$ga;?<WiomF^xIw+)&|n?`x<;bHp(-sk#INjcE6`~(9jRT15^o)<*VMeVnw@J& zix@d0B!&Z#5+i|aECNmC>BJOAO7?eWNjp?0r57{R#zVfD1Qf3Mm~z3kr_JcnhlXTN zrROy$a;VU;rshzWp4~a*+9G9K77UIUAp}W`1h%mVq%=sf1EW|C=c|msh>sIWi4jox zbw?=|Cb9MemDY9+k#!xdYm3rmNP_64^q7>J?ufw=LuO)-#B9ShMFd!oR5aga1V-lf z5iA4&Cjo5%5?NMM_h!Osi*)FyYD?!{{N=Tn!4bn|T9Cx-!Zv*b>?vwPgCqn->GLO8 z3<8vZ9Uu*AV3999GN4M6{T5E511W^SoRH(8hb09^Ob>!2MgrTo1WXH(5E#YnQPeku zfc?f&Q;gAQhyAMOemx46jTbxg*q;S0@%lh=aKwN%LXafqp)W=ZTR#FO1WEBuGQXD9 z=WCn(uUCzn1|eWCH?%iMV?CN_|Fpcy_Zm2K+GAJVkr8tj%W2{Oqu&VZC9X`Q1`U#E zvcJI)=Rv(fd8%?JnI2X6O^cGXod3x~U-p+FNE_|ffQD5gw&&Wy3b~FCxjyrJ9N;PB zDl?t5WxFfSu#c4hMbkG>So14-S%#`D@eQk0m2d&M^c;)gcLFN7ix$e~7m7R46J8a zGOtCkgCu4v9k?V0Nm4F=yg?FcgF#zu183|u7mKe;aY#PDmf{z&+pJMQghAZ?hRz0! zHtJHgVwufr1688!93Le9 zG(38+0P+F z^9MvLL@%#;Fp6%OqM9A??`{=Y*3e?@F@=sRA%8jg_2up4Zv**jC4WgI5?rS()n7Cf zwIClo5R3cs5}_?3H}**;w!);+2Jzpx(HtDH#+w!-(f5AXCrN_`NvwZN-RgQjf5Qbv zbe5#w)Lw^OsUR?r-r!nWfJ8b{bZoKmq!OJGRF&wpZ%CDJ0lBLM%0?;LBU&k;;E0)t zAc>JkeyekUh}2p#v!OcCSwGRiOSMhP^K;+lUX506Wde9{)523HB^t zo|D!t&TqEB#EvzJ5Z(nKRA8W;^WQiIV}=>*7^ojCr;94GE5zK{SfB0m%xIVqWZI2T81*CU12(s8IXq;M*ruL%6V&Csktlim=k8 zD^RY3NgDzEsU^@+8mo<1l933}o&h5_V_H%V36Olo9V<^PAUFFeQ*oP0=@DhCwuvz3 zONIqU%xGyrQd4;*$;SbizOb#-ASq0l0mtnCi3F;Nrk#2QU;FFxil?p<<>;ZD_OHH+ zT3?YqBaDY&&d^i$Z%{&Fxx10wo2l)^SdFxh?> zPvbc6ykIL|Q`;N?h|VfH#{QnL1{oe4G4qWJlE?sIUt~0%JdB0zEgdB6L6HoMIkK-R zF&(t8btJ2uXhC4412uG*Okj{0M=zG-Ca7`_vOtJ#J4`lSt!*?Aw8we1YAVw0r?p$j z$3i7b$&TsoZ=pBlIl^9P+7u>T^P3>U%;7z5N7gbNh;)GcBp$C~pK`oU^y)m(d`y*^ z9r+EC)cNUPEPMily}e6n^B@caKmY_lpdksQG&o{?m9`)$Yrzrg2Yp)vNBUSp69|9+ z2sA2zlq{?Hbq|)?{Kz051V8`;KmY_lAR2*`2S=>Y2$C2HY(W47KmY_l00iO@$VhO+ zARtI$B(Mbm5C8!X009t)Mj++S9ECO7v}cmS?8Wgg0(j;qj1Z2400@8p2*f3jv6&+` z4%23m-1gx!2!H?xfB*=9fN2CW9vm^;2$C2HY(W47KmY_l00e>wG)Qp7ARtI$B(Mbm z5C8!X009v2CeUEP5rcpriIKn-1V8`;KmY_lpq4;`21g76f+R))TMz&N5C8!X0D%&L z1`m#y8z4wxB(Md6^b+VRZb+~3up9(Hz%&AgkZO7akx~r~d;kFu009sHfd(Xi;K;Mn z5hQtHK_&=*00@8p2s8kJjK2v|Ru9U0qa=QPHg1pLO^|U3qCNb0P$3coKp@iu_B`m{FK4=eXdDQD03m<~32p!aAOHd&00JNY0<{E+#oTKz?{N?w zL8`@qPapsSAOHd&00Iq60P{x;-1%ra2!H?xfB*=9KrI0TMzuWf2?Rg@1V8`;K%jvM zATVm+&PUTh00ck)1V8`;Y6&1Ps^x)CAOHd&00JNY0u4+6fl&i@KAH{!AOHd&00JOT zO8|jUEf0JG0T2KI5C8!XXkY>ej2gJ}(R2_10T2KI5CDN%0(;edto>wJR&548l?hly z4-|tWZ*?wL+~#o%S&|48$qTrUKmY_l00cll6@kDPJR&gi!|oXvISUVx56vV<8ggc0 zKRy8jM)4U!0tkQr2!Mb;0R%?=Yyysi21cwd35<%v*avLm6F^`TpCKfG00@8p2>27g zGe-VwWE^SA(Rp-6#ISx6C2w7YQ%d`4g-01HJy00ck)1cV7-DNPtz+zN4ms<^sQ z9|S-E1V8`;Kp==f3IZc5Uw%$!OHf17b?Opg3{VdQKmY_l00cll5`lyRqudS&?P$+H zaFmsA+ezq7hyVc)009sHf#e7nu#_fkS*l;(vYIrT9X*fbGzSddT`Z;fqQLQ2#jbeqy-u~NpRFGflG)8Y4$qwATV;k@ZCjV^>0AsrmAD^VK+KmY_l00clFE&;;=BifvX4UVv$7T23m9|S-E1V8`; zViGVgFrqDL*x)E;ccMB7fB*=900@9U90G<0Mzl$Ga5NOBapk&XCMFe6W$%>GR)_!r z5C8!X009t)K|oPpWX*|TlcQ>J82QjB!O{OZ8jf8M009sH0T2Lz1PCa2nUVb)7rRSs zk+mddQF%=g_>fr{8816h@iL#PLN**#V z4hhw0(85?sYtW8Ivq1m^KtK}#Ni#-vpu%CYtbihG%W4RUIGhJXKmY_l00cllIROcQ zk=079Y~r^R!I6tqo9i<^f&d7B00@8p2qZ*6!ctn)Kqt-1YEj$l)yuLtc*)LQ9+uLw z*QaO^2!H?xm_#7vjFGh^dShsCVZZYzx(K^ws+ZO13oMa900ck)1dJijSKMHXEifc8 z0x_qJq)eYkdiq%BQ`u75-A|sn?ntcXQ>qx#Mk(z$m<<9T00Jo?5M$a%)^C60$g8az zZu*FP4Glq2O3o3O2?8Jh0wB;p1Y!h6Mfw6BSu-9D7981YfDPnkXetPR00@8p2&98R zjKGLCu-H%jAvmHaxD%eZ=0=5rAOHd&00JPOnLx~EjF`1nf$Z&IpJHxP@XS%9XN(3( zAUQlHn})BBXN(%&1poj9KmY`k5{Nlt#B8&F8orr*in-0=vf63{MKQes)j18!%L*wq#V2aEzA@LB9wUlOAWI``evbIO6mflMA`M3c8%qov!8-JG>#o&I2-9u!b z_8r*<^`WDNmR+lzs5wiEDt{$|m|6Kw@Vq1uy#9}lUfGbNGmQQLDPVL=R_C;NrXTN7yDT*8+6p=Xjc-g^oU$W*YD=G2zyWi@9*v*JJ5`1 z1jwDdJ&V*Dt$M@MVnNb&oh|MwZjh}`+K-<`G%RWT^=5NMM;7sbxXH)}i9Fzw8;sjB z$@LK-Nd_8UTtiM74aVmN2^kAn6i)H$c&!YWri8rtQaEe--Ft;K~b6r>?YTM zG+pqMWJ|~Iq-SC{+HcA-mRWwq5g1vm4!Q`A956KOA~@0j*>9rc-v|cC62%-*X=SG!I2Ay;*WG7BFvEzAkc`jMMDX2 zhRSpiF#Te05=|0B8XX)F`;16=BdjPJ!4nwG@i4eRI-6Xu<0d1YIf~mT74;Dush}Dt zvu36=uw-@)7Kdf0Eog~a0`!?9Bu)Y}I5O}i%amm_M$w!J0G_~zS?%7M7##Jujm*$z z1V?&1bGu%3iEA57+yWSoG6ME%tW#!lV&>*aaI_^c?cRz_vuCTfnfi0%1V+?a6N4lD z6!mFDaHNHGL(UfA*&;2zl_@0~GSwROjcF&rQ9fr*A~RV=rMxND#0`vSI~p-KY9rs= zvBdu9FFK0W@hnf|ASou$XtPBFig`kOW(g$m>!YcLxyuae%~`gpxoNVq5g#VSY*Cs#)KFVD8ETioW+k}|W`NChMze9%PO#qC%xg?#tA!!3N>+jdB59-7T1l=IA8`oBGv8a(S zfh7CP)MYf*CDgt|0>wVDD)w8c z>2mNKv3hY!(`WOF{c)u0%lw zczzYo(wm=a(}ZNBCOt9KB-tM^%ucjwaftZq+>+1ch)-)vaW96l3?=6euix0`TE8sC z5#-P)R&z3aEsf!@@@y}Ot;)cNwg(sf@LmO@a7K+(V!NKkicUx9u?kvb5}?yKG)T~r z@>;Y=RZ<)vd`R%f0;wGNocUz>S{mzsMC}XD-~;MzC4QxbATx(00xf{Na5JM&XRI zUP9Ad5@w6C?noZ(8}5;ZEKdUVb#JHVA^Djammt%!jK&~adA6r}8xj~%a}XS9>=Xn? z8eyBI%4*kS4_P`uYCHnP!NzNIoEF<(t=177kuhIe(sbh`tv#EhNfH#q5g1X4(tdgy z7yj@L0;6z7SuCOHK}>voD2vX+*(Sw7G560UaGINRvCO@9CZ9A>LH%KIrhZOdp3q5TdD_CecL zATXjfAvn_3Go^3zky!+*DCw_BqwP>7MnKbZ2J~AvNFV?L`~>Lh4|4QRVbU_wrfEi6 zI;KSI77UDNqY)fQ?|NT>_FMS+eGiKr*i8Z~1V>`bG?cb?D zVz1n$R=)ll`iOxM#em>Qtur{KBRF!>$j-jD-y#{F9cE|=2xN}Hbj2-F`E9h-#CH0p zGHG8;4^)6amI(}`xN!w_wih>R7+>b7 zv)@~C%)p2WMR4SeRz)s?BNbGWk!fw$q!+VAnn0VcM*ot8`AoPiBsUmoOjcf#)q`sF z==EI*ff2=l;7F}gIHe;va?(igeyaxC$zX1Ot44z=s7L_;l@I#&r=b0DOnf3vBN+gCeSHS)2`4? z)eoB}G@VQIbgoj-3aOluDnv7hr&iI?=f#~oHDZ)$k5N~+>R!S%0xQtqh`xL$cA}lB zutQ_pXMg}291+~PT)PBgb`x2{FvTE&B%g>pU$I!F2GO6f_+_lJ>NkmIetNQ1p+h{O zMz)n#BiC2z5INH1do)D{B+eMIR!f^XVgj-CC4iYDUo^%Z&^23B#B7nVKA_t$D^E0r zEFQ$NsXtb2R321>K;>H6HV>Q0&AQ5@?W?>w1%VL-gWyP|d(_HCa8%2~29uyH3#kqX8rMgsm3awYUjJ7j?hvR|lfKrhUsSZ+0hA9q=s1gK6 zk$ph8q8%I&r=`qe{|yPNM};5)^g^W}727l@feLK|go3&4#H=~mOv~k(HR?)8mA03T z$!=dkwm^qGk7YD=l)m**X=+z0y(~N=FrrRj-|5D+WmsGRsLxG+oDkLy?$Rizfq<3Q zpoFUE*Q5t(K!Es~iX|YEz}nAewJNq~K)!q_*X#hZvfl4Gu7|J5oo-yv_If0OqX1Wv zdJG0WwtNayv;-6fkR$1w?jGL}%bsr;Q2}Y*8SSi5y}(0o%<1 z$0QuGHc1c?C?aIWs8ScfQ3XY6b`TsH(N*>UtHTn-gOQFVKt~D)kPBnhAMU5mY2|bT zMMO<;KtZ3+Q6Q6vYp>OnA}#`!wv|?*HEZ6#a!8A(2Y)$&E!66YwAOT})EAY1j6 zc25MGxT?erjHnVB!O>142f-0nmq{s9z}lJ=j($Qm_#Kd&ujKo_a!rJ^v=W#@45wpz zk^J?gwGn38t>P8Ys)N`l-@{Mu+aP5GM%4EZ9GQ6r23dvRD2PtvW7;kvm@SIjN2n-B zfCTz>fYdHn55?;UDEpnPEp@8Q$QV*22esXvBb)yrv0##@u@>t zLJ9~76KE>U9tqcL^a>AI{% zJBK{@hXev963{kVG~C42E3~Oiq3o21j`A%g`-l4IU35W1Bb&(h+@65|Kqjg|!b8)! zs(KkMEz9L({3m4)DlQb00|K&u9W2IJjeXs}Sa3cRN&8d95E zbE&TVb>1-Dy0g={VqFpV{)GU|M8-dNTScEO5$yytv!4bK$h?DFo z$&NS@P!|N`6R>v4m+2)@*Bz*rZsetx0R08nD6>wYEml2q!EH}JcS*Sg$+gM;#oa-< zVj(RF0wIBs{q@4~okwi*5FEuuXp#W?g>OX?@QVD!4314|f5n!3Wl!DCpgPfz+!zFu z2S@FOaJ*i#9pw6G2Sojv^%8Z)1f%+!?x|7Ux6?ubBdQ(2k!K$uGYSD39Ot7{G_#Jb z2Tw6uWM==T%_`Nwku}E)p?cVufxdMR^6^!6W3@=It5J+)wWaUY_bPR_5L=O@OfIu_?1JSAp*CNjeXix3h zHKs$Mlvzu`z=)DDGC1l_N1wq;7lE_}N4jQ<$k$zvKtMWy0qGJe0__(mRX!!VqjR>^ zn1`&AMV=Au5dtIHa^r#{dI9ODmLa8%01b{>(_^)j*JNwICOuHocm(cO*yL7)vZILJ z7^PB#I$I;uiCD$j6tQB1RExiy7BMiQe2ol_wlzr4XRVprNpRGjl15>+C?y>QGkpmR z_#TOWV0wHJG9}QLIq6E;9>ng^)uNQ@*%H_87=aO0ZCr4)GcFL+PmBO@X48WsZ8KZC z?s60BY$(nwfmQ=sChLWKVND}#PvSxBFtc!6lt9eDh^jL!I1)vG@&*wwJviE~hn3E| zTs^j-*`9K5&|P?CW0fr&O#{;0)_@h@lG_3 zcC#Y%c{wByP)T6AO5uje9lzW3t4+h?;@mC{AafZVdqv@tg7z zGi^Z{W{YZE03T9FV9;EfwSIknyL=8=nc-H_lY*0gLu z`&@@GTjT?{G=EwGAgCpe^64tA2YzJEqP)J~dLfKUG{fgzs6tDG*4ZC9+i|X+RL|#r)6d2Lg zWI8x1kc;(>czuT20tDI<431P^NXi(B0|Goy6a*p=u!<2XiB{PrS|Ne*8gD|PFXz;9 z!7^Gc58hAF`0vFlK3X{%99i@o5;B4a5`A0bhXL(}=%Se;w^lhgD)PP~L+#1fSFE{! zZxnB|Ezyw3eHf&GO78w__1kIJTkh>UG6on51A2lPTiZ*=UN9eUxlC+pnNT@ zgSR2_%M~@~7N2?6Fk{3}V&;gEz&0uYU9)bsedHq3P-%5TwKg@4P0egBC92^fC$r;< z!^;7rOrd_VXpn089Sq6u2{|6~aB*8q0j5_cHw!t^*ZfJ-j1e=)#F-;|igSor7-L%? ze!n9|eN;7uKq{WOl1!_(S+YQgYd8Y-_@1^__v`P3O>cA{7+A__75jD@q z;E1lTHga&(PkRQbLZG#>*BCn~yVGxsPDxoSRbSi`;n1;^Q!zcl^1Sjl%$hJ$ticAW zQ0WDZodg0SY88Sbj=s@ZM1y0-Zq7h#30wlKU0lU7RS0jF%v5(K(wO4hMAXVrs?m1g z+2~Djn&>CRgqh;vpr3UT^M!)agaRYlTm(lFJ3Xc-W8Q-h)DB&<8u=h2GI*>lgKa{S z^b#1*t4_8ytlW>yome+10!lCf+La6Qe3uQvHY0gb=*~0yJH%e z!s=QdXip&@m>f>P=&z!On_ns+^l&b(P@i&~(niSBPrtseEpcC@wON$BA{p1)pjPCA z4myt+5*SgF?B`r$21g_yiJN2wM{#Y@QQycZ@ww_-Zsm!NCiQxZ(xCGqU{u3lj4T3L z0|{A1hso&=DQS{p?B13uiG2m=W4-Pw|>^H$(0qYF||!nSN#KxcU_g&(A75 zk@GdH41#)JgpXT})kktRxN{|aZX;vHKs;Gm`;$xtczyXrxeY#g( zApZkmAA@F$7*eS-M?1(eR)I;5zLhp}6x{@EHSKR`5a%%=)dodsEVA-yhbBE#jjTxkL6g0LF+maOEY1}V7#J8)+6a!4^|?|+E!l>?VuX7{ za$BP%HQED4gIcIUNfrrgBLj3wroZFh*Zp!YtG(7*OvQvfix4`j42S764spGar{1*lV02*2}lMja&$~seKksFm%zsXUwGlq*+ zh*5rvtL`S(XW1X;$`&Y3o|Y&2L!TEhI5489jSP;+MLX9>!O@UBr{|JH2Vh-%w{uyP zok9cIX$o4Ri2w-@=uMK28x>70;!?= zsP?%1P|7y7I+%2w1F(Dgn%R)$t&v|n%rfw_wrz7c7@`5uU|Jgy-)^lB&^l5C><5Gvl_C!>r#s31A(+vF1eh^C|zt6veSR6Vv zm%xQT2xN?7_8pC^lXrk{X%jIf=zEqTa!?ioKmY_l00g`Uq-4g3nU0wwMk2W_{l*5p ztIQ22e}m*NN+NeH_MNFvP!vTG>VNKmY_lz>`4AmeQPUz_OZ?2KGS!1V8`;KmY{d6G(AjL>rIbD836o0tkQr z2!H?xfB++q^1z5T1HlpNOl&~_1V8`;KmY{d5y(JbL;)Z;isuHX4FVtl0w4eaAV3LZ zBru{)L2yJVAb|h~fB*=900=}UkfFecLO^g7-4#$X*H_#C3LpRiAOHd&kW2A*_JexQ z#P9P5*^6Vm1n`}GUQ#Fr0w4eaAP|K>#-@!J0u!f?m~GgC00@8p2!H?xm`Wg{ff2=x z;K)>`gIyp10w4eaAYdwi31V8`;Od`-=fe}TI;K(Egge@Qd0w4eaAYc-K1`LcSegsD*IU#HT z0T2KI5C8#F2sCJ5MDZgyGQ|mD2MB-w2!H?xm_nd|10&i62#!o~MA!iWAOHd&00Jfu zXz;*@b^(GT6C4pXfB*=900@A92?P)r*}Z_^$OLDE4WR`3iW@@9pa2Mf00@9UTmp!W zDg+TBRZw6D1V8`;KmY_9lmG&wnvO?sRD%N_KmY_l00cmw!3ZEQs_SqBM|DV$0RkWZ z0w4ea4MG5ck!MFEIP%1TOb`G85C8!X$T$J3SSl2#&Z>p&$r=00@8p2&9w%0wbZ0 zLvSR73xz=d1V8`;Kp71(vbJb5*Ru8y{%$!I4y)5C#Gu00JNY0-6aRFp>@&!I5;N z5C{Sw00JNY0-6XQFj4{!I3hw5DWq!00JNY0*VMA zFj54zBo@JuQoIlj0w4eaAOHfA2_P_%476Sxf}?sS$N>Qm009sH0W%5Umt@WC7gz-X zAOHd&00JP800GPxB>){NK>!3m00ck)1k5CWz{t#gfmI*?0w4eaAOHdh5I|s*0CcDX z0T2KI5C8!XFp~fRBQyI2R)GKrC?T-$&~Lt=L@0HUKT^(NW^0w4eaAOHd& z5Q_i;qgeP*83aH81V8`;Kp;~DZg^qAq4?r{rn(f30Ra#I0T2KI5C8!X009sH0T2KI z5C8!=1hAwgha;qb00@8p2!H?xfB*=900@8p2!H?xfIy}QVA3d4-HFD400@8p2!H?x zfB*=900@8p2!H?xfPfqVm^6~Z5mG<^1V8`;KmY_l00ck)1V8`;KmY_lAX5Y|X_Tq% zL}Nez1V8`;KmY_l00ck)1V8`;KmY_lKn?*+8p+`ZDIfp>AOHd&00JNY0w4eaAOHd& z00JP8DFT=@%2aovF(3c}AOHd&00JNY0w4eaAOHd&00JN&hrnKO#8{T~|Jyr%?Z%ZY zKNEM|{Hm89VA!#PQ9r?#q$KMyOv`& zCvn=E7Z~`rs|B@0ks=9H0ksQXtpz~@>d)R^6@aQAtH3VFNjo|MRlVWzy*}S*v;E&6 z{@3Svt^WxSa8IDFH=DeBmv8_A5P$##AOHafKmY;|7!iT0%b*6)Xhba~imNX~qeF9D zD&p@FlWq=8Ks*TKK%mS0H3$2#0Rj+!00bZa0SG_<0uUHC0Ysy5*MHC6w-${y?X;Om zziGRYkYxW8Adn>iM58RL1*0GU0SG_<0uX=z1Rwx`0|_7+9SDkOF$hExjW&(B(}52X zkZezYKsE#rjk2i<41oXyAOHafKmY;|fB*zq5I{6)0gWVW2_zGZo*HDr(R<#D^b`sI z4@CgcXejcO3jqi~00Izz00bZa0SLq(z^|vpphzA$5jd4G-zF0isH%BRhG7c?AOHaf zKmY;|fB*y_;D^AXzVu@(mO>yU0hFVZbjf>Y0$)&&hOPq2hX4d1009U<00Izz00bZa z0j~rQjiT0ErKv8}Mbs?GECvC@qZky)0|F3$00bZa0SG_<0uX=z1V%*w(Wp~(S0@sQ zK0nN6(VD2qS8dH_2^ECQ2$*>EO`GbC009U<00Izz00bZa0SG_<0uX?}YXlIDUZb=1 zTs4#EAaN+X+4;Mo?3!6L{}HD`Jle`}u!B>Tta@Wc*kCn4!4QA|1Rwwb2tWV=5P$## zAmD-kKcRL|HC5+|X5vqm87fQtte1Wpe$1hlpHMpn@Qvz3KetAJKpF!4gjyP|p4CLm)i?l%w!wWPABgmq{@5s#OmJ z2*e@48nrka$pr!sfB*y_009U<00IyghQNqLBLiN|^(VI(Cd+cgqwGZ^HHXO?@xQl! z2oUH>0MV!`LDEA20uX=z1Rwwb2tWV=LlPMI@-&-OQdg>goPOGD{;+J#Ua*wn#Y#iA zHxFgAVAw+~VIu?}009U<00Izz00bZa0SF`~F!Gs3n|!mJd2}Z$^%Gwu%zkk((@403 zkhs}6_zZ!g2{6;>Xk;XS00bZa0SG_<0uX=z1TrEp@|i}PHIe1aBYQFTcg;Ft=Fw(# zCHq{>l4VWC5P$##AOHafKmY;|fB*y_00Aci5RJB06yniVEaN#i8;`4a3IPZ}00Izz z00bZa0SG|g7y^r$cX}MdtAMyDN3T{Q3eu~1%02l@xvt?E1Rwwb2tWV=5P$##AOHaf zK;SR}h(-r-LOePM6OkYQ0SG_<0uX=z1Rwwb2tWV=5GaNKqR~-R`6wQ}SF&7wo1GUQ z9aV=!h5!U0009U<00Izz00bZa0SG|g5CVushfsPEr@qn8Y`xLpciIq-Uhr{$;1Bm6 z-~a?5009U<00Izz00bZa0SG{#BLPREQKcC*mHm`ht?f%kzau5D?+}k7q0B3rRbJ*` z4Fn(n0SG_<0uX=z1Rwwb2tc5J0##j0gJ~J6s%n|?*kskUQk-u|wUlV{VaxG>4w@TvZ_8CqYpo%}q^e>(_V?KsY12tWV=5P$## zAOHafKmY;|$cw+U}V7OEL+>#?yN4x^3J0rg3;dg zKm-Ut00Izz00bZa0SG_<0uUG}fdOY4RZ}tlHZb>uvufISR+(UPtL>ys>O^TGGRkVE z(R&F-H;I^$Ed&AqW*X5DAOHafKmY;|fB*y_FdhPn`m#)C2bykF&4hDk)yQhpl$wmD z*3?pI>Nm3Kowj>zIfTp@bw(n_6EQ|L>P(UhAOHafKmY;|fB*y_009Uwp;|cL~fET1Rwwb2tWV=5P$##AOHafK%hH;fkY!S+S`H5RbNEIsTy9n6)+INq_(ZAOHafKmY;|fB*y_009U<;1B`>zSwBfywYFl zv*~Y}&)ymJ`eGxSP4r$u(W(t;(m)^v0bXnrgCcoA00Izz00bZa0SG_<0z(lPaHi3w z%gn0TB=Yhzj9xN%apXov?43ontzMkv00bZa0SG_<0uX=z1Rwwb2tWV=2NB3d(Nvq|LT=g~4+i$(LEB70ZS8G_Nv*1-`7KmY;|fB*y_009U<00IygDS<_O8O`&I zryFhh=xu7vru}_<&Ye-K=|*djvvp_xB6WzjS@+S5C?gsHrW-{=Nk$NW00bZa0SG_< z0uX?}00bO~Mh%_Zg^|Y2A@|ubI(>!8z0R2^^v5f4Qk=R$j7ou(JdFUN5$ym15P$## zAOHafKmY;|@Jzs=Xw=}&Rv5AMQYL_85VB;H0hbphSbbT&nP^3TKr{lmiAGgbMe}Wc zM%7GlZuiF{hGPP{XV&l9+g~k|Hs0Ln_J)x1Faq|RTpbqmm{^tFCuYZ_AnvOK);epO zg+G4mCM)gL*BNU+hkMOKJ2-Y{{bIG7(4PMFVZYYi?)`S0P#l5kyIeXc&aIaYsr}k7 zC$$T?_3ztxaa^iD9~V8R*x|va%Fap{ITayYY}K9i*11xH95Q6dXh5n|NeGgc{}0AxlO>L)lio)s@wm)t%KL0Rj*>ngD{)(a8KI zSn0WY=Fe;_h5!V15U@Vag|=(;f9j1*1FLXf-;tEV5O_vlrcamJZa3PIwX1L1K5Lum zJRvIr)w#@>XJt})W8`n}JAFw7lu&?Z)YL+j!iYVDO@R2S?WD1ExP6w4hQqPDWUDKy zGpjqRLjnXKa1eoNu4w8g5(*};LNF@0c5w{?FA2m**v5rdpj+|Duc&?UFuT9&mxT)He^=Sz^2t*Q%!kf)@6fr?O+C}E)@yrrdVC4hMJDjrUjO(1kOF3R?C^xm0Zv=}`F06+i&Z3#5}BomPAe*y$z5ja&w-_@>c zv;PT45nx%`7F-v!r7ct*4#g6U{-lJ}O})K}_q_8RgKL6UVPTk7|RCLkUJ@+4qCi8Gnz zX&Y8WBB1+JeG@4!vVi~uAh3&o_0{xDsov?HbGIuJ$05*xz!$ZzU)8?U#t2UcXk0=# zfWWolygeY^Xrgpfj;g6h*%l+5DwFTJ!0q7?K|$(j65>%;f?Lvm)XjUf<#@zHVa=q8 zeVMeQh^~pKtN+lo7y%padMp? ze`i^SwO3PTMh|7KI2kW~Lbj=Zu4~k0O-2#-jd=7`m30y^-f)aNXjZ%U<6=$1ygm_d?gB!q=%-Yca1Sk>$tq6opygFKwX{+QU@SkQW8)b8?|tBof2-rdBg3Ya=VH~zx2>ZG8^=VWoy6n;5S9Y zC6HM=it8M?K_D)HN5SYMZocG}839`sa+jG+m;(U_jE{i&X#8x^_^Q2kk4-qT@xaIe z%hEbjxZRsBI;1ZqX;;x`+9L_O$TOOG)T8GV6_Wt%C?-wvDv&@ml~cOc@*@CZP;%fs zA|=-@zV$$$t|Yof+`>y&&t&)~ZA)!;+Qt+#Fsr6xau{C+Az;GM$si>UQYg#PB4Gc_ zy=gM(_#*7dG(trjn?*C|w}+`7u3dj}?bzapUkCx(Q6UwH8_@|&m7@(@2tNsY(ZAE5 zA6@@dx8b?`+S*pH7qvb92-y?x z(3rA^h=C;$;3YTDYqPQ*=Jfe7x1a81IjT|j>bsNjw(6b@IY8hT0^ys|rBc|Y5R@c+ z4L+IMr$WM9eo2|-Tj7WLJnQFP6Q-ohROYYRrrJsm>igTeqx!0BM_HQ|v3^I=W_A_G*4+7o@)XRr~{*5=wx7hpFEyp<2I{}+bSxYzy0+NmQ?s_*NeSs1IiVfGrdN!P`{UtpPc(Sb8dfu=7;f~2}d^OyD7-Qd6^RpSeBNsjcR;2&Yx84C>k|Y@+cnJ z!z!1+pg)(I@NEa}$ano=Jp_&m{98>mEGFvQ(4E%qo#`3w}0X^pk5P-lq3Dj%#!B_Hqri}oBLph~9c+UD1X>gLLn&viQc?qsqXPoC#D@S*PbfG1H8eOfyn#5+DEp=LGEMy9j;=*t8?p zKe0CR!+NKs*E`STeZty~=U|fuMiF`vjT)ASM-2(~r4c|pDy>HGr*s0~F6Wwn zGWQ0)jlDgKMvaMxM-2(~r4c|pDy>HGr$hqPR9+z%l~}d-1OW&%1pdDygq7?sjG@dE-837kjFtIw?drO(1BD=L9i)ZEDI5CUG8rCq7- zvVP*=gMjqph_8Po9F-jg7L6LXkK$2IQyWiZ-FM!3)YK9Cb_5WQ+HoTl1X2(Pg3)b? zoCnI&1f#`3Wm7B!AdoGA$^@fnw&v|NY^{6RYWHc*WKQ6Z%^;>TV;RMG7esOHOGt;Z74EDM#?ZbB1K}cF}Kj-48*ZMdJZf2rUV{`5U?8#pm zOWC(1u&6IvrYs>@?hU;Bg}EiPB78WOK==x%q-jR#burE8*j7M%2#kclSNVD3(AOK? z*Om_L#$^8l{&48RwL_cDddWf4~w9J(@c0m9FLlLM>_57|?`gAA@I+S~_w7Rzu z{1T|9vVEqFkeqjh4;7eF+T1p8yFZuI{|p@d+?K|$>1=>)(^x}=%!jpw z(jgF&K$dOWIs@Nzz1?YVoxA&(9+MXY;u8ph(PjL62g}i}yVYQ&Q}8AM8?2A#dZxYE$dpN~53z1j4&8ZxdwPSC*^33hG{t=VfWfE{K*rT*-2P-5AFn0v!lEw(VT@(-uvD@EF$ZuXme;SlPYe!lUD|`9$`s z-hxiy)PfJkKy3h2+A2l=lyMe>cdyFrSlP^SbI^`#TbPi1FD7n~Dn zm^mT>s752IY+Qu^1pE=O4!Sz(Zbs_<2=`*Ky~LRR^Cef#jtdZrmY!@&m#K)^A9wQM)B=$$t8(Fr~Y*z}^ux38c0^kLKLda-#V zzt3T2hS#Y^OI`DK5tx36kjIc&d>*p!SY^i&jT(DS^-m_VArOz6N?~6lfsC%TBKhK! z8v@m>Og(pF?(2r$>$DB7)~`q7ECe6`f$Ry`{mg_S6T$6&f-3?hR@l2pY*tYai;5Wd zKB)pPLWEbrNY{LNQ;Dbg2l1$(!5#wX2xN4vrE`*; zA+Vi55R7Kq&$&CQ4%URhmAh)gUw>-ejKt|VEIw#3_>;$TBA}}q4!djgxx1ESW z>Hs$&0DmZKsWppV z5P(3I1ny*&4RR!I*VV)JM*D>}^`!|Aa6`b_u!A=1eOX%4_cDHP)7rKhdLa$ubo;5i zkM=DZH8c#C%{X9ppS{^Xv}n}u%4k4qKlfla7sR8c za@ZF|Afs!oD6Tk@jKHH{bds!yeluR_8FSWek(34j2tXh@fpg`k0q&!iWM2X=w3TwN zjt-0rdnfQo&s&=e;3NbQ)~+j$;YzIUdNllfk7cDO>O%L*(-aw}$}<G=MI%s6mDM+GC)!E~D+Hqwsu3R`0D&z8>^^;|&HC}Rwrd2W zEtELa2Z4JPVzY}DeH0d_4A;xj#Jle|JO_bl8HfE~xkz;P6LJ%c8gi%l2l1$(!5#wX z2sGE)B3%*W41qQTs;N?yBp59bj8vlp2tZ&g1kUAXBOuMk;xv8^PC!efTrEdyfVmP7 z8lxZfJuOSyD0Na>xe~10293e03oq8^DjGHX1QYS7fx#XE5P-lq2vk$~X@XHHVX02+ zK%J^m5aI^}AmEsQ2E<|Zk>`Q2WBj8q{YuZ-O54((x7E39w#{R>5p!*Wg^z=k9H-#V zx;IYaWR*6T+(o0t`&0eH%%g?|dk8=P0>u)jW^xU|sMz|&F$h3l#02IK;*kbQ1PDYS zpf6;CSmaqe@GPbd{DoK$35OJ|Vl?9G7@4Hb!;5Ita6mk2NU(=M4+IwVWe=rL1O%QD z2&&QTvqQc=d{U2g;9iw)fLIR!2oy=+;z2>073m#Lr6zE%0^U6+M$6QNrOm%G)#xN` z8Od^&T9?I7(|J}6t#TxC^#Haw3PKSZzTP8phjRoOjp+9{i1 z6I(y{-LNL?F5TN2wOyW^>VzIR)mLpNyCU^-+!k2c0^3Pu7gImpQwjti0D1gQ@icV%`m`asub8O7ZnKd9X;`y@zN5P-ng37Ck~ER}PAPyMETvtId7 zqDauHoobvFmfYC*rqr;KW521+Z%TFWrC+X>rM+~ABQXhl);&S&Cja~?o*gD0*;LuE7Vkb@zMXP9RqF4$+3Eqrvb9bmNelsh1e)vL?g92cAsYh4 z2}b%hm>EXdG%pN+z~~9oAB8}Ja+hJMXEuZCXH^$o6n^#Wknazwk}cAs#g(w(o6V!8?z(v*9QNULmlkJIzWtQP!p&qaeM)xW7|Hsz$5+ z_)!uBAOL|w2!!PTUe%*H-}r3SaZm$I5iBWuQ$1^xJeI)Pw6WB51V5#o4?XMUxfcnP zqox29q=v-yJqprxE*ynGG6IN4$4!z=wga85r4knOQdr2r7H9!!L8WP+0kK)mC z`+1H+00NN-ARa{qdRTTrFq$70*F~(i2u3dI2_qpeasokUxOWIaGf=9jL%S239KNW~ z^QWjFfv~zQ%A*&~ur}=l5)SMmVE4fJzDRwY??E(bTtPf)NNnHNA0F1OEw`WNCKZWT3mVD^f68@Aj875P$##vLdj|%9_KCnI9f?OfkdHE4`7&9>u_26*bcU`I|QD zn-vyVmR4AW_UVph8|86L^e7rNd=ZZt65IEPN87n@6avWzG~!X6lcJx@+ukz{-yY6; zFE&kq)cJMfr#fcupR|2R z;d4pO;7jiWBpeMN1`v%JrxA}D65IDdJX&l&$59ACAQ1sm^bwDu!3~1ZELwKMW`tlg zEPqOe00i0-ShY_&Xv*oJrMoD+wxwz-7p5L=n3%00_Hu&B zEL-!AGwfc`ZC#q}2@rq)1UwQLbj0Bim_M6snZo3gKf7PGSp6;6Z^@SWMSwsw0)wt~ z%t$$EfTAEZB-ld$0@)DQp&(^rUq*%m!DyP1L0wE)|9Ei(f>9TUq=f(k1}E^h!7adm z9thM66=LF1Nns}8NMA$^JJsTNpsYeyR;shhjFd{$z0ub;_pqk72sb>$c{TKrEQnAmDN#P*wR5pIsfZ6sA0&CM8 zRFYQ{2OEE6EE+X+iFnkIU=INZWJ6%C&P%Oru$y-_B!VIK4Pd1XT`>cbJIydcFv_cu zVGRTza5RB1JHzvHYIU^BBoKkxxRv+}`=-9eU^6X_Xj&{wI|3F_k0N0G?LqG84n(5{ zB;rv+f;|KvkPU&kZr=4!H}E_tgh7cqauYqsiU=!pxZf4w2~I!&0wX5ycyIR1KmtCY z9f5kSbZ@lXw@aUGDhV>xB3tVwEKAF`Zi=yNu4~}DZ*LrlMhzOoqlSdT{jD1LS8b&X zE*(|@CMO~=SGyjec=R|ZDdn18NiZsHT7RM@Pqq+%K)wXRk~EwB>HXgPd%lc4SZ43z zt4%n%^I+`}HeRaFr7=Zrfn{mA)kwkieCgXahoVt~2=S;P;cR~@d)1LaJaSfVn0pw3 z`FO;mYAPfp3`*oi2sa2u4GQ)UfPhZ|CKlNj7?a)y6lr*cWmajj9#yVk_N<<9MTME# z`ZsMS8F_V`ku8`~HUYK!ewV2^7LA&gfOyo9aJD~{y$Qr4>tNJX4_i;O5$u;R`tWD+ z%a4v`m@T6YXR5ukR@&a&xfrVMdI^jAvX^o;3#q0$q8?jO;XGaAPjyix&DU==PDi}a#Dx#y(pB%bSj@Rc~-e!o2J1{AA^pZ z%5cAabFTZo`mX(i0+gc$6be#9!rA^*_9jq}oKe8s5(%tJbm~D!C`~Xbv#Q#Ab+4pv z)qz~M&w`W?fIwUVw*IBM&~~j&0#UOCp=cVntSoZ-l!X;V8Bu?fJGPY;Of)?o&MEh6 z)0TSPuZH6{Sjis-D>+`lU*cu;dQJt2MvbG0M-2&Qdv%5oj|Qx>KL#wj)S}nrIabZ& z6M|8B75mhqdwnp$$o2#XKwu|=P1j?#AM64}SjELm535fnd}l?4gQUYoJ!*AYv$q~-czBE40{N1r<8bE7CbRS>+RbJZX9^QK2CcKJK}(NXcr{mcJ%4i-)d4cwPhf>$v>y^NAOL~n z1SA;oF16&89}BPnv&}A@tRD}R@y}Fl*s2BFrwqvl>M4y^-X(}75fFtXo8G@TpQ^nl z6);C68Z~VSVWc6kdk>@CY)U>8zHRV+)6AiQ^bjuPT?|1m`jP`wY)D36rS{4<`^oT< zF$5rRAc6O~7p)GAOSGs2!YtDg+1rex^QfpEGYiYoP9Hz|`^WmKYky`Zvsm{Z_u)eA zJz1L^p=i`J2!xS_#O^(ecC#t=41>pRRlCwd_^MkLxuk9<7%l3{TpYlT0|~59jSeJ5 zGzdT-B>|gebd$0G^4>=ve1ovu7t7&!O$mzqmh5UO4oRnWB<8#>r^6bHR8Y}M=)@CzQ`(s@O$PO-UA5kqGXM`AET$Q?YX@FZEz4=IUXWua1R$_M zK+nzalZ~s5<9r;1K=>)GPlFVlworYg74&@P@a_&%c`XWqYtq% zBOeGr00J!t+~_{^M%%hYT9PCq5PrU{#OK3IgXwSDPP(CUzcy{DYwoTagQ8QLaO6E) zsGXn2b^_7p1<^-gL=Un_E*F(m{C72guiB>if8g-Q=$#C?AJ~|t_$Q2-L+slVKsY*r z-CA+q>LHxVwQz*#n^6&rHi;DY`IFjei35THs|uGOP$U6+R;vG4zc13eBAf~@x;!hw zmFG@O_0h&tHfCrMs;LqsnZ?n&4i?i3Utwc21Ni_VdfQce+ zwB7BD*6#_s$(c&t;f5E};B3XCm`;v3uOJ**``1H;u!F#j9>AptMqlJ3GmLgrbRmaL zFj^Gi3vNIF0{#d{unx0}a_Lw5BiNh8p%1A3O_AZN#!~YZo<$#sx3Hm05?z0U0|emS|9K}cFq~(r+&{d?|yN=EbT_u zpEkmN0%7Gq2?E<^wejhGe-Dd+Xml7S#X>yVk1ETVNBhkt#sLJvbk=u@SYpTF0RNvw zxqImR7V_{#FnU(IWqz;$+f|va;S~fRkSPJ{FR0&uSd?k~9B9_#mxt>66c;WusJ`9r zRW(%{4ZvN85=4+5D(|s@u-9gZokW;i1ApjV}0=4tD4`c z18m}1At7{@=7l)((v3yUa=QmArW!3@65*Sf*?Q*>C<2eK% z&;x;$%6R*uUl5*?%O1+4h(QR1b@^9=6rHxv6J`HhgKG`2H-r1NX?MCdORTfaic0V~ ztkEoiouNdskpF|M-n{4+pY`q55cIo z*80*R6O2|b4|4As z+jaQh+WNtb5AA(DxEb9IxbB(-qET0ZkLj}%M(k#1H^A@P)$>Q=d-^9!Mm_mnaxu+} zvM~F|IuiGey)|*@ojSnQ5!Qp&+H7f|`X-NNrFn%v&j`F#+g&|7!UqUI00M^*u;<`X zn+-PYUQ#{T?DLhjwayVnOCZc#IV;rtr*FyD|E_~wt9CsTx)CTrBt4ZDaM1-rRo8Xv z^i`$j2w?|-pibZFq$(+!a4$=Alh5S_l8R9fFS3C?UPG#xe76VgR9nvBM#kxZ5Wf@L z<^GxiSXKSWLw%%heN1_NNYR$l01V&g{w+=3;D5t(sd>8xA(fWIT ze^RV{Zt70^62B06;_Zun-QH^wU2`u0wLDNwmC*VXB?h}@PJBCNvj7Qk2viH@^Glq( zhRda{|GjmaKr~8TZ>fZlPKMi!P>m)<=dX=ju^Ay6wW)>lX&yUmv-D-XTEbFif9s?D z=O!AxN`;dUfB*y_009U<00Izz00cG&AR27|N%t|fFcQVmLd7FQqbRMTmrTM-2WKkk zui8$v#rjrft-My+{?K+a)VHdLMxsxE00bZa0SG_<0uX=z1l$rpH0r(T5RdjF@5%_# zXg_0O^g#g8s1M3s%2?EwUQESK2tWV=5P$##AOHafJSFg_ryuyg4+2@f5!$AB@Yd`; zs-H3-009U<00Izz00bZa0SG_<0!|1Z8Vy!ah)4U;XUS;4*~EYV1Rwwb2tWV=5P$## zAOHaf6hHvcXz)tRQW#<8(ctX@10Vna2tWV=5P$##AOHafKmY>65mj9E|5s#k0 z*zs?cjCR<{VF*9~0uX=z1Rwwb2tWV=5P*Ph0*FT0)nAsv2s4keYbO{40SG_<0uX=z z1Rwwb2tWV=5J*b^(I_q74!I*9?T42oqy1(R0|F3$00bZa0SG_<0uX=z1R&sm0HRU$ zm6WA0!px)W+YJUn00I!$NnlZ5?mWi{2tWV=5P$##AOHafJSR}qb^ZLv5ud86IwCev z;}ED!wYk-H8YjOfx!fz4v&p2si;^3eK%fu;UGA@iAixa>KmY;|fB*y_009UO403jqi~00Izz00bZa0SG_<0uUI60HV<_+%qT@@hF2z zzyt_D00Izz00bZa0SG_<0uX>ewgeE3vaOoF3`0EXi!|jx00Izz00bZa0SG_<0uX=z z1UwNyH1bqiNo_?uN{W}vApijgKmY;|fB*y_009U<00PbkAR0NVu=M649;IhY2@rq) z1R#(lfkl0prCk^W0SG_<0uX=z1coGlax^6Utjk70%DQ?m4gwH>00bZa0SG_<0uX=z z1R#)@0HRT1!2YvGJn~(WrOiV<`~vXe>32pAdim1Rwwb2tWV=5P$##AW$X&M58k6H6yPOk20zZOo0Fd zAOHafKmY;|fB*y_009UbOrXKmY;|fB*y_009U<00Iygf&ik?5Y#DC z1Q3sC1`vP%1Rwwb2tWV=5P$##AOL}!2_PEfTsxz%4e@9c)r^x6fB*y_;F-XpzVvK9 zwnG2{5P$##Akc{b%26kLB#uV_1t}g&a)JN^AOHafKmY;|fB*y_009VeCxB?wogq0y zC4hJo6(^ZN00Izz00bZa0SG_<0uX=z1X>b6G-?TsWT^=t9;GHs{t$ow1Rwwb2tWV= z5P$##AOL~a2p}50Mu&455I{W2pb{_v0uX=z1Rwwb2tWV=5P$##Mo0kBXoQvS(`CdX zpY?{-5P$##AOHafKmY;|fB*y_;FSQPk=L3Vt=))6qpf-zhX4d1009U<00Izz00bZa zfnEt98uf~s!r~D?Jc`GXoFD)J2tWV=eh4h;OFzb9DFh$@0SG{#1Og~WCDh`meLz7P zb@k&s1Rwwb2tWV=5P$##AOHafBqLDOb)778GKK&IAOHafKmY;|fB*y_009U<00I#3 zNr0I~KI;vuApijgKmY;|fB*y_009U<00IzzKvDvTMoICKIRqd80SG_<0uX=z1Rwwb z2tWV=5b#L=(a2}LVKoFG009U<00Izz00bZa0SG_<0uV?_0MRHZUNVOO1Rwwb2tWV= z5P$##AOHafKmYRZ|MUM0Yy!nY00Izz00hz# zKsid!m=YiW0SG_<0uX=z1Rwwb2tWV=5P*O?0*FTLstki6009U<00Izz00bZa0SG_< p0uX>edIHsCQrEx!kN^E2{@efk`~S1z{_}tOFaP|%{%QW-|34voS33Xz literal 0 HcmV?d00001 diff --git a/ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_W.png b/ZSDK_DevDemos_.NET/Resources/Images/Zebra_Logo_W.png new file mode 100644 index 0000000000000000000000000000000000000000..e54838a1cecdfff0147fc5aaf32f98a44643a72e GIT binary patch literal 1898897 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 + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/App.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/App.xaml.cs new file mode 100644 index 0000000..1106bcf --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/App.xaml.cs @@ -0,0 +1,24 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Windows; + +namespace Zebra.Windows.DevDemo { + + /// + /// Interaction logic for App.xaml + /// + public partial class App : Application { + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml new file mode 100644 index 0000000..d9efeb0 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + Connection Builder + Address: + + Connection Prefix: + + Connection String: + + + + Log + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml.cs new file mode 100644 index 0000000..c4a9b08 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderView.xaml.cs @@ -0,0 +1,163 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; +using ZebraConnectionBuilder = Zebra.Sdk.Comm.ConnectionBuilder; +using ZebraPrinterStatus = Zebra.Sdk.Printer.PrinterStatus; + +namespace Zebra.Windows.DevDemo.Demos.ConnectionBuilder { + + /// + /// Interaction logic for ConnectionBuilderView.xaml + /// + public partial class ConnectionBuilderView : UserControl { + + private ConnectionBuilderViewModel viewModel; + private Connection connection = null; + + public ConnectionBuilderView() { + InitializeComponent(); + + viewModel = DataContext as ConnectionBuilderViewModel; + } + + private void TestConnectionString() { + Task.Run(() => { + try { + ClearProgress(); + connection = ZebraConnectionBuilder.Build(GetConnectionStringForSdk()); + PublishProgress("Connection string evaluated as class type " + connection.GetType().Name); + connection.Open(); + + PublishProgress("Connection opened successfully"); + + if (IsAttemptingStatusConnection()) { + ZebraPrinterLinkOs printer = ZebraPrinterFactory.GetLinkOsPrinter(connection); + PublishProgress("Created a printer, attempting to retrieve status"); + + ZebraPrinterStatus status = printer.GetCurrentStatus(); + PublishProgress("Is printer ready to print? " + status.isReadyToPrint); + } else { + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(connection); + PublishProgress("Created a printer, attempting to print a config label"); + printer.PrintConfigurationLabel(); + } + + PublishProgress("Closing connection"); + } catch (ConnectionException) { + MessageBoxCreator.ShowError("Connection could not be opened", "Error"); + } catch (ZebraPrinterLanguageUnknownException) { + MessageBoxCreator.ShowError("Could not create printer", "Error"); + } finally { + if (connection != null) { + try { + connection.Close(); + } catch (ConnectionException) { } finally { + connection = null; + SetTestButtonState(true); + } + } else { + SetTestButtonState(true); + } + } + }); + } + + private void SetTestButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + testConnectionStringButton.IsEnabled = state; + }); + } + + private void ClearProgress() { + Application.Current.Dispatcher.Invoke(() => { + logData.Text = "Log:\nTesting string: " + GetConnectionStringForSdk() + "\n"; + }); + } + + private string GetConnectionStringForSdk() { + string finalConnectionString = ""; + Application.Current.Dispatcher.Invoke(() => { + string selectedPrefix = ""; + if (connectionPrefixDropdown.SelectedIndex > 0) { + selectedPrefix = connectionPrefixDropdown.SelectedValue + ":"; + } + + string userSuppliedDescriptionString = usbDriverIpAddress.Text; + finalConnectionString = selectedPrefix + userSuppliedDescriptionString; + }); + return finalConnectionString; + } + + private bool IsAttemptingStatusConnection() { + return connection.GetType().Name.Contains("Status"); + } + + private void PublishProgress(string progress) { + Application.Current.Dispatcher.Invoke(() => { + logData.Text = logData.Text + progress + Environment.NewLine; + }); + } + + private void ConnectionPrefixDropdown_SelectionChanged(object sender, SelectionChangedEventArgs e) { + connectionString.Text = GetConnectionStringForSdk(); + SetAddressTextBlock(); + } + + private void SetAddressTextBlock() { + switch(connectionPrefixDropdown.SelectedValue) { + case ConnectionPrefix.Tcp: + case ConnectionPrefix.TcpMulti: + case ConnectionPrefix.TcpStatus: + AddressTextBlock.Text = "IP Address:"; + break; + case ConnectionPrefix.Bluetooth: + case ConnectionPrefix.BluetoothMulti: + AddressTextBlock.Text = "BT Address:"; + break; + case ConnectionPrefix.Usb: + AddressTextBlock.Text = "USB Driver:"; + break; + case ConnectionPrefix.UsbDirect: + AddressTextBlock.Text = "Symbolic Name:"; + break; + default: + AddressTextBlock.Text = "Address:"; + break; + }; + } + + private void TestConnectionStringButton_Click(object sender, RoutedEventArgs e) { + try { + viewModel.LogData = "Log:\n\n"; + SetTestButtonState(false); + + TestConnectionString(); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Connection Builder Error"); + } + } + + private void UsbDriverIpAddress_KeyUp(object sender, KeyEventArgs e) { + connectionString.Text = GetConnectionStringForSdk(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderViewModel.cs new file mode 100644 index 0000000..1f0ed2a --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionBuilderViewModel.cs @@ -0,0 +1,56 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.ObjectModel; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.ConnectionBuilder { + + public class ConnectionBuilderViewModel : IDemoViewModel { + + private string logData; + + private ObservableCollection connectionPrefixes = new ObservableCollection() { + ConnectionPrefix.None, + ConnectionPrefix.TcpMulti, + ConnectionPrefix.Tcp, + ConnectionPrefix.TcpStatus, + ConnectionPrefix.Usb, + ConnectionPrefix.UsbDirect + }; + + public string LogData { + get => logData; + set { + if (logData != value) { + logData = value; + OnPropertyChanged(); + } + } + } + + public ObservableCollection ConnectionPrefixes { + get => connectionPrefixes; + } + + public ConnectionBuilderViewModel() { + Name = "Connection Builder"; + logData = "Log:\n\n"; + if(BluetoothHelper.IsBluetoothSupported()) { + connectionPrefixes.Add(ConnectionPrefix.Bluetooth); + connectionPrefixes.Add(ConnectionPrefix.BluetoothMulti); + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionPrefix.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionPrefix.cs new file mode 100644 index 0000000..5067e54 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ConnectionBuilder/ConnectionPrefix.cs @@ -0,0 +1,27 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.ConnectionBuilder { + + public class ConnectionPrefix { + public const string None = ""; + public const string TcpMulti = "TCP_MULTI"; + public const string Tcp = "TCP"; + public const string TcpStatus = "TCP_STATUS"; + public const string Usb = "USB"; + public const string UsbDirect = "USB_DIRECT"; + public const string Bluetooth = "BT"; + public const string BluetoothMulti = "BT_MULTI"; + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml new file mode 100644 index 0000000..4fb8832 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml @@ -0,0 +1,18 @@ + + + Connectivity + + + + Connection Status + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml.cs new file mode 100644 index 0000000..feee547 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityView.xaml.cs @@ -0,0 +1,170 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer; +using Zebra.Sdk.Printer.Discovery; +using Zebra.Windows.DevDemo.Enums; + +namespace Zebra.Windows.DevDemo.Demos.Connectivity { + + /// + /// Interaction logic for Connectivity.xaml + /// + public partial class ConnectivityView : UserControl { + + public ConnectivityView() { + InitializeComponent(); + } + + private async void TestButton_Click(object sender, RoutedEventArgs e) { + SetTestButtonState(false); + Connection printerConnection = null; + if (connectionSelector.ConnectionType == ConnectionType.Network) { + try { + printerConnection = connectionSelector.GetConnection(); + } catch (ConnectionException) { + UpdateStatusBarOnGui("Invalid Address and/or Port", ConnectionState.Error); + await Task.Delay(1000); + UpdateStatusBarOnGui("Not Connected", ConnectionState.Error); + return; + } + } else if (connectionSelector.ConnectionType == ConnectionType.Bluetooth) { + try { + printerConnection = connectionSelector.GetConnection(); + } catch (ConnectionException) { + UpdateStatusBarOnGui("Invalid Mac Address", ConnectionState.Error); + await Task.Delay(1000); + UpdateStatusBarOnGui("Not Connected", ConnectionState.Error); + } + } else if (connectionSelector.SelectedUsbPrinter is DiscoveredPrinterDriver printer) { + try { + printerConnection = new DriverPrinterConnection(printer.PrinterName); + } catch (ConnectionException) { + return; + } + } else if (connectionSelector.ConnectionType == ConnectionType.UsbDirect) { + try { + printerConnection = connectionSelector.GetConnection(); + } catch (ConnectionException) { + UpdateStatusBarOnGui("Invalid Address", ConnectionState.Error); + await Task.Delay(1000); + UpdateStatusBarOnGui("Not Connected", ConnectionState.Error); + return; + } + } else { + return; + } + await Task.Run(async () => { + try { + UpdateStatusBarOnGui("Connecting...", ConnectionState.Progress); + await Task.Delay(1500); + + printerConnection.Open(); + + UpdateStatusBarOnGui("Connected", ConnectionState.Success); + await Task.Delay(1500); + + UpdateStatusBarOnGui("Determining Printer Language...", ConnectionState.Progress); + await Task.Delay(1500); + + PrinterLanguage printerLanguage = ZebraPrinterFactory.GetInstance(printerConnection).PrinterControlLanguage; + UpdateStatusBarOnGui("Printer Language " + printerLanguage.ToString(), ConnectionState.Info); + await Task.Delay(1500); + + UpdateStatusBarOnGui("Sending Data...", ConnectionState.Progress); + + printerConnection.Write(GetConfigLabel(printerLanguage)); + } catch (ConnectionException) { + UpdateStatusBarOnGui("Communications Error", ConnectionState.Error); + } catch (ZebraPrinterLanguageUnknownException) { + UpdateStatusBarOnGui("Invalid Printer Language", ConnectionState.Error); + } finally { + try { + await Task.Delay(1000); + UpdateStatusBarOnGui("Disconnecting...", ConnectionState.Progress); + if (printerConnection != null) { + printerConnection.Close(); + } + + await Task.Delay(1000); + UpdateStatusBarOnGui("Not Connected", ConnectionState.Error); + } catch (ConnectionException) { + } finally { + SetTestButtonState(true); + } + } + }); + } + + private void SetTestButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + testButton.IsEnabled = state; + }); + } + + private Brush GetBrushFromConnectionState(ConnectionState connectionState) { + switch (connectionState) { + case ConnectionState.Success: + return Brushes.Green; + + case ConnectionState.Progress: + return Brushes.Goldenrod; + + case ConnectionState.Info: + return Brushes.Blue; + + case ConnectionState.Error: + default: + return Brushes.Red; + } + } + + private void UpdateStatusBarOnGui(string statusMessage, ConnectionState connectionState) { + Application.Current.Dispatcher.Invoke(() => { + connectionStatus.Foreground = GetBrushFromConnectionState(connectionState); + connectionStatus.Text = statusMessage; + }); + } + + /* + * Returns the command for a test label depending on the printer control language + * The test label is a box with the word "TEST" inside of it + * + * _________________________ + * | | + * | | + * | TEST | + * | | + * | | + * |_______________________| + * + */ + private byte[] GetConfigLabel(PrinterLanguage printerLanguage) { + byte[] configLabel = null; + if (printerLanguage == PrinterLanguage.ZPL) { + configLabel = Encoding.UTF8.GetBytes("^XA^FO17,16^GB379,371,8^FS^FT65,255^A0N,135,134^FDTEST^FS^XZ"); + } else if (printerLanguage == PrinterLanguage.CPCL) { + string cpclConfigLabel = "! 0 200 200 406 1\r\n" + "ON-FEED IGNORE\r\n" + "BOX 20 20 380 380 8\r\n" + "T 0 6 137 177 TEST\r\n" + "PRINT\r\n"; + configLabel = Encoding.UTF8.GetBytes(cpclConfigLabel); + } + return configLabel; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityViewModel.cs new file mode 100644 index 0000000..57ed3de --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Connectivity/ConnectivityViewModel.cs @@ -0,0 +1,24 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + + +namespace Zebra.Windows.DevDemo.Demos.Connectivity { + + public class ConnectivityViewModel : IDemoViewModel { + + public ConnectivityViewModel() { + Name = "Connectivity"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml new file mode 100644 index 0000000..b5542f7 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + Discovery + + + + + + + + + + + + + Discovery Method: + + + + + + + + IP Address: + + Number of Hops: + + Subnet Range: + + + + + + + + + + + + + + Discovered Printers + + + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml.cs new file mode 100644 index 0000000..b1efb09 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryView.xaml.cs @@ -0,0 +1,192 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer.Discovery; +using Zebra.Windows.DevDemo.Enums; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.Discovery { + + /// + /// Interaction logic for Discovery.xaml + /// + public partial class DiscoveryView : UserControl { + + private DiscoveryViewModel viewModel; + + public DiscoveryView() { + InitializeComponent(); + + viewModel = DataContext as DiscoveryViewModel; + + discoveryMethodsDropdown.SelectedIndex = 0; + } + + private void ResetDiscoveredPrinterData() { + viewModel.DiscoveredPrinters.Clear(); + viewModel.DiscoveredPrinterInfo = ""; + } + + private void DiscoverPrintersButton_Click(object sender, RoutedEventArgs e) { + try { + ResetDiscoveredPrinterData(); + PerformDiscovery(); + } catch (Exception ex) { + ShowErrorMessage(ex.Message); + SetDiscoverButtonState(true); + } + } + + private void DiscoveryMethodsDropdown_SelectionChanged(object sender, SelectionChangedEventArgs e) { + var selectedItem = (sender as ComboBox).SelectedItem; + if (selectedItem != null) { + DiscoveryMethod discoveryMethod = (DiscoveryMethod)selectedItem; + ipAddressLabel.Visibility = discoveryMethod == DiscoveryMethod.DirectedBroadcast ? Visibility.Visible : Visibility.Collapsed; + ipAddressInput.Visibility = discoveryMethod == DiscoveryMethod.DirectedBroadcast ? Visibility.Visible : Visibility.Collapsed; + numberOfHopsLabel.Visibility = discoveryMethod == DiscoveryMethod.MulticastBroadcast ? Visibility.Visible : Visibility.Collapsed; + numberOfHopsInput.Visibility = discoveryMethod == DiscoveryMethod.MulticastBroadcast ? Visibility.Visible : Visibility.Collapsed; + subnetRangeLabel.Visibility = discoveryMethod == DiscoveryMethod.SubnetSearch ? Visibility.Visible : Visibility.Collapsed; + subnetRangeInput.Visibility = discoveryMethod == DiscoveryMethod.SubnetSearch ? Visibility.Visible : Visibility.Collapsed; + + ResetDiscoveredPrinterData(); + } + } + + private void DiscoveredPrintersList_SelectionChanged(object sender, SelectionChangedEventArgs e) { + ListBox discoveredPrintersList = sender as ListBox; + viewModel.DiscoveredPrinterInfo = ""; + + var selectedItem = discoveredPrintersList.SelectedItem; + if (selectedItem != null) { + DiscoveredPrinter printer = (DiscoveredPrinter)selectedItem; + Dictionary settings = printer.DiscoveryDataMap; + + StringBuilder sb = new StringBuilder(); + foreach (string key in settings.Keys) { + sb.AppendLine($"{key}: {settings[key]}"); + } + + viewModel.DiscoveredPrinterInfo = sb.ToString(); + } + } + + private void NumberOfHopsInput_PreviewTextInput(object sender, System.Windows.Input.TextCompositionEventArgs e) { + e.Handled = new Regex("[^0-9]+").IsMatch(e.Text); + } + + /// + /// + private void PerformDiscovery() { + DiscoveryHandlerImpl discoveryHandler = new DiscoveryHandlerImpl(this); + switch (discoveryMethodsDropdown.SelectedItem) { + case DiscoveryMethod.DirectedBroadcast: + NetworkDiscoverer.DirectedBroadcast(discoveryHandler, viewModel.IpAddress); + break; + + case DiscoveryMethod.FindPrintersNearMe: + NetworkDiscoverer.FindPrinters(discoveryHandler); + break; + + case DiscoveryMethod.LocalBroadcast: + NetworkDiscoverer.LocalBroadcast(discoveryHandler); + break; + + case DiscoveryMethod.MulticastBroadcast: + NetworkDiscoverer.Multicast(discoveryHandler, int.Parse(viewModel.NumberOfHops)); + break; + + case DiscoveryMethod.SubnetSearch: + NetworkDiscoverer.SubnetSearch(discoveryHandler, viewModel.SubnetRange); + break; + + case DiscoveryMethod.ZebraUsbDrivers: + try { + discoveryHandler = null; + discoverPrintersButton.IsEnabled = false; + viewModel.DiscoveredPrinters.Clear(); + + foreach (DiscoveredPrinterDriver printer in UsbDiscoverer.GetZebraDriverPrinters()) { + viewModel.DiscoveredPrinters.Add(printer); + } + } finally { + SetDiscoverButtonState(true); + } + break; + + case DiscoveryMethod.UsbDirect: + try { + discoveryHandler = null; + discoverPrintersButton.IsEnabled = false; + viewModel.DiscoveredPrinters.Clear(); + + foreach (DiscoveredUsbPrinter printer in UsbDiscoverer.GetZebraUsbPrinters()) { + viewModel.DiscoveredPrinters.Add(printer); + } + } finally { + SetDiscoverButtonState(true); + } + break; + + case DiscoveryMethod.Bluetooth: + BluetoothDiscoverer.FindPrinters(discoveryHandler); + break; + } + } + + private void SetDiscoverButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + discoverPrintersButton.IsEnabled = state; + }); + } + + private void ShowErrorMessage(string message) { + MessageBoxCreator.ShowError(message, "Discovery Error"); + } + + private void DiscoveredPrintersList_Click(object sender, RoutedEventArgs e) { + Clipboard.SetText(discoveredPrintersList.SelectedItem.ToString()); + } + + private class DiscoveryHandlerImpl : DiscoveryHandler { + + private DiscoveryView discoveryView; + + public DiscoveryHandlerImpl(DiscoveryView discoveryView) { + this.discoveryView = discoveryView; + discoveryView.SetDiscoverButtonState(false); + } + + public void DiscoveryError(string message) { + discoveryView.ShowErrorMessage(message); + } + + public void DiscoveryFinished() { + discoveryView.SetDiscoverButtonState(true); + } + + public void FoundPrinter(DiscoveredPrinter printer) { + Application.Current.Dispatcher.Invoke(() => { + discoveryView.viewModel.DiscoveredPrinters.Add(printer); + }); + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryViewModel.cs new file mode 100644 index 0000000..7c839cc --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Discovery/DiscoveryViewModel.cs @@ -0,0 +1,92 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using Zebra.Sdk.Printer.Discovery; +using Zebra.Windows.DevDemo.Enums; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.Discovery { + + public class DiscoveryViewModel : IDemoViewModel { + + private ObservableCollection discoveredPrinters = new ObservableCollection(); + private string discoveredPrinterInfo; + private string ipAddress; + private string numberOfHops; + private string subnetRange; + + public List DiscoveryMethods { + get { + List discoveryMethods = Enum.GetValues(typeof(DiscoveryMethod)).Cast().ToList(); + if(!BluetoothHelper.IsBluetoothSupported()) { + discoveryMethods.Remove(DiscoveryMethod.Bluetooth); + } + return discoveryMethods; + } + } + + public ObservableCollection DiscoveredPrinters { + get => discoveredPrinters; + } + + public string DiscoveredPrinterInfo { + get => discoveredPrinterInfo; + set { + if (discoveredPrinterInfo != value) { + discoveredPrinterInfo = value; + OnPropertyChanged(); + } + } + } + + public string IpAddress { + get => ipAddress; + set { + if (ipAddress != value) { + ipAddress = value; + OnPropertyChanged(); + } + } + } + + public string NumberOfHops { + get => numberOfHops; + set { + if (numberOfHops != value) { + numberOfHops = value; + OnPropertyChanged(); + } + } + } + + public string SubnetRange { + get => subnetRange; + set { + if (subnetRange != value) { + subnetRange = value; + OnPropertyChanged(); + } + } + } + + public DiscoveryViewModel() { + Name = "Discovery"; + NumberOfHops = "5"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/IDemoViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/IDemoViewModel.cs new file mode 100644 index 0000000..5d91a16 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/IDemoViewModel.cs @@ -0,0 +1,30 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace Zebra.Windows.DevDemo.Demos { + + public class IDemoViewModel : INotifyPropertyChanged { + + public string Name { get; set; } + + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged([CallerMemberName] string memberName = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName)); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintView.xaml new file mode 100644 index 0000000..f4849e4 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ImagePrint/ImagePrintView.xaml @@ -0,0 +1,40 @@ + + + + + + Image Print + + + + + + + + + + + + + + Image File: + + + + + + + + + + + + + Retrieved Files / Formats + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsView.xaml.cs new file mode 100644 index 0000000..35a3fad --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsView.xaml.cs @@ -0,0 +1,100 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Device; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.ListFormats { + + /// + /// Interaction logic for ListFormatsView.xaml + /// + public partial class ListFormatsView : UserControl { + + private ListFormatsViewModel viewModel; + + public ListFormatsView() { + InitializeComponent(); + + viewModel = DataContext as ListFormatsViewModel; + } + + private async void RunFormatDemo(bool isFormat) { + await Task.Run(() => { + SetButtonStates(false); + PerformListFiles(isFormat); + SetButtonStates(true); + }); + } + + private void PerformListFiles(bool isFormat) { + Connection printerConnection = null; + try { + Application.Current.Dispatcher.Invoke(() => { + printerConnection = connectionSelector.GetConnection(); + }); + + printerConnection.Open(); + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(printerConnection); + + string[] formatExtensions; + if (printer.PrinterControlLanguage == PrinterLanguage.ZPL) { + formatExtensions = new string[] { "ZPL" }; + } else { + formatExtensions = new string[] { "FMT", "LBL" }; + } + + string[] formats = isFormat ? printer.RetrieveFileNames(formatExtensions) : printer.RetrieveFileNames(); + + Application.Current.Dispatcher.Invoke(() => { + foreach (string format in formats) { + viewModel.FormatsList.Add(format); + } + }); + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraIllegalArgumentException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } finally { + if (printerConnection != null) { + printerConnection.Close(); + } + } + } + + private void SetButtonStates(bool enabled) { + Application.Current.Dispatcher.Invoke(() => { + retrieveFilesButton.IsEnabled = enabled; + retrieveFormatsButton.IsEnabled = enabled; + }); + } + + private void RetrieveFilesButton_Click(object sender, RoutedEventArgs e) { + viewModel.FormatsList.Clear(); + RunFormatDemo(false); + } + + private void RetrieveFormatsButton_Click(object sender, RoutedEventArgs e) { + viewModel.FormatsList.Clear(); + RunFormatDemo(true); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsViewModel.cs new file mode 100644 index 0000000..e7121b2 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/ListFormats/ListFormatsViewModel.cs @@ -0,0 +1,31 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.ObjectModel; + +namespace Zebra.Windows.DevDemo.Demos.ListFormats { + + class ListFormatsViewModel : IDemoViewModel { + + private ObservableCollection formatsList = new ObservableCollection(); + + public ObservableCollection FormatsList { + get => formatsList; + } + + public ListFormatsViewModel() { + Name = "List Formats"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml new file mode 100644 index 0000000..7718262 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + Mag Card + + + + Mag Card Data + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml.cs new file mode 100644 index 0000000..de700bf --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardView.xaml.cs @@ -0,0 +1,106 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Device; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.MagCard { + + /// + /// Interaction logic for MagCardView.xaml + /// + public partial class MagCardView : UserControl { + + private MagCardViewModel viewModel; + + public MagCardView() { + InitializeComponent(); + + viewModel = DataContext as MagCardViewModel; + } + + private void ReadMagCard() { + Connection connection = null; + Task t = Task.Run(() => { + try { + connection = connectionSelector.GetConnection(); + connection.Open(); + + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(connection); + MagCardReader magCardReader = MagCardReaderFactory.Create(printer); + + if (magCardReader != null) { + UpdateMagCardOutput(""); + SetButtonText("Swipe Card Now"); + string[] trackData = magCardReader.Read(30000); + + if (trackData[0].Equals("") && trackData[1].Equals("") && trackData[2].Equals("")) { + MessageBoxCreator.ShowError("Connection timed out", "Mag Card Error"); + } else { + UpdateMagCardOutput(trackData[0] + "\r\n" + trackData[1] + "\r\n" + trackData[2]); + } + } else { + MessageBoxCreator.ShowError("Printer does not have a mag card reader", "Mag Card Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } finally { + if (connection != null) { + try { + connection.Close(); + } catch (ConnectionException) { } + } + SetButtonText("Read Mag Card"); + SetButtonState(true); + } + }); + } + + private void UpdateMagCardOutput(string message) { + viewModel.MagCardData = message; + } + + delegate void ParametrizedMethodInvoker5(string arg); + + private void SetButtonText(string text) { + Application.Current.Dispatcher.Invoke(() => { + readMagCardButton.Content = text; + }); + } + + private void SetButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + readMagCardButton.IsEnabled = state; + }); + } + + private void ReadMagCardButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonState(false); + UpdateMagCardOutput(""); + ReadMagCard(); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Mag Card Data Error"); + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardViewModel.cs new file mode 100644 index 0000000..97b65db --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/MagCard/MagCardViewModel.cs @@ -0,0 +1,35 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.MagCard { + + class MagCardViewModel : IDemoViewModel { + + private string magCardData; + + public string MagCardData { + get => magCardData; + set { + if (magCardData != value) { + magCardData = value; + OnPropertyChanged(); + } + } + } + + public MagCardViewModel() { + Name = "Mag Card"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml new file mode 100644 index 0000000..fde4d34 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml @@ -0,0 +1,27 @@ + + + + + + + + + + + + Printer Status + + + + Printer Status + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml.cs new file mode 100644 index 0000000..1e82247 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusView.xaml.cs @@ -0,0 +1,106 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; +using ZebraPrinterStatus = Zebra.Sdk.Printer.PrinterStatus; + +namespace Zebra.Windows.DevDemo.Demos.PrinterStatus { + + /// + /// Interaction logic for PrinterStatusView.xaml + /// + public partial class PrinterStatusView : UserControl { + + public PrinterStatusView() { + InitializeComponent(); + } + + private void GetPrinterStatus() { + Connection printerConnection = null; + Task.Run(() => { + try { + printerConnection = connectionSelector.GetConnection(); + printerConnection.Open(); + + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(printerConnection); + ZebraPrinterLinkOs linkOsPrinter = ZebraPrinterFactory.CreateLinkOsPrinter(printer); + + ZebraPrinterStatus status = (linkOsPrinter != null) ? linkOsPrinter.GetCurrentStatus() : printer.GetCurrentStatus(); + + string[] printerStatusString = new PrinterStatusMessages(status).GetStatusMessage(); + List printerStatusPrefix = GetPrinterStatusPrefix(status); + + StringBuilder sb = new StringBuilder(); + foreach (string s in printerStatusPrefix) { + sb.AppendLine(s); + } + + foreach (string s in printerStatusString) { + sb.AppendLine(s); + } + + Application.Current.Dispatcher.Invoke(() => { + printerStatus.Text = sb.ToString(); + }); + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } finally { + if (printerConnection != null) { + try { + printerConnection.Close(); + } catch (ConnectionException) { + } finally { + SetTestButtonState(true); + } + } else { + SetTestButtonState(true); + } + } + }); + } + + private List GetPrinterStatusPrefix(ZebraPrinterStatus printerStatus) { + bool ready = printerStatus != null ? printerStatus.isReadyToPrint : false; + string readyString = "Printer " + (ready ? "ready" : "not ready"); + string labelsInBatch = "Labels in batch: " + Convert.ToString(printerStatus.labelsRemainingInBatch); + string labelsInRecvBuffer = "Labels in buffer: " + Convert.ToString(printerStatus.numberOfFormatsInReceiveBuffer); + return new List { readyString, labelsInBatch, labelsInRecvBuffer }; + } + + private void GetPrinterStatusButton_Click(object sender, RoutedEventArgs e) { + try { + SetTestButtonState(false); + GetPrinterStatus(); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Printer Status Error"); + } + } + + private void SetTestButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + getPrinterStatusButton.IsEnabled = state; + }); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusViewModel.cs new file mode 100644 index 0000000..de4f0e6 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/PrinterStatus/PrinterStatusViewModel.cs @@ -0,0 +1,23 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.PrinterStatus { + + public class PrinterStatusViewModel : IDemoViewModel { + + public PrinterStatusViewModel() { + Name = "Printer Status"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml new file mode 100644 index 0000000..6be5fc3 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml @@ -0,0 +1,32 @@ + + + Profile + + + + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml.cs new file mode 100644 index 0000000..6ac4cbd --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileView.xaml.cs @@ -0,0 +1,144 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using Microsoft.Win32; +using System; +using System.IO; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Device; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.Profile { + + /// + /// Interaction logic for ProfileView.xaml + /// + public partial class ProfileView : UserControl { + + public ProfileView() { + InitializeComponent(); + } + + private void CreateProfile(string profilePath, Connection connection) { + if (connection != null) { + try { + connection.Open(); + ZebraPrinter genericPrinter = ZebraPrinterFactory.GetInstance(connection); + ZebraPrinterLinkOs printer = ZebraPrinterFactory.CreateLinkOsPrinter(genericPrinter); + + if (printer != null) { + if (!profilePath.EndsWith(".zprofile")) { + profilePath += ".zprofile"; + } + printer.CreateProfile(profilePath); + MessageBoxCreator.ShowInformation($"Profile created successfully at location '{profilePath}'", "Profile Created Successfully"); + } else { + MessageBoxCreator.ShowError("Profile creation is only available on Link-OS(TM) printers", "Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (IOException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraIllegalArgumentException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Create Profile Error"); + } finally { + SetButtonStates(true); + try { + connection.Close(); + } catch (ConnectionException) { } + } + } + } + + private void UploadProfile(string profilePath, Connection connection) { + if (connection != null) { + try { + connection.Open(); + ZebraPrinter genericPrinter = ZebraPrinterFactory.GetInstance(connection); + ZebraPrinterLinkOs printer = ZebraPrinterFactory.CreateLinkOsPrinter(genericPrinter); + + if (printer != null) { + printer.LoadProfile(profilePath, FileDeletionOption.NONE, false); + string printerAddress = connectionSelector.getConnectionAddress(); + MessageBoxCreator.ShowInformation($"Profile loaded successfully to printer {printerAddress}", "Profile Uploaded Successfully"); + } else { + MessageBoxCreator.ShowError("Profile loading is only available on Link-OS(TM) printers", "Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (IOException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Upload Profile Error"); + } finally { + SetButtonStates(true); + try { + connection.Close(); + } catch (ConnectionException) { } + } + } + } + + private void SetButtonStates(bool enabled) { + Application.Current.Dispatcher.Invoke(() => { + createProfileButton.IsEnabled = enabled; + uploadProfileButton.IsEnabled = enabled; + }); + } + + private async void CreateProfileButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonStates(false); + SaveFileDialog saveFileDialog = new SaveFileDialog(); + if (saveFileDialog.ShowDialog() == true) { + string profilePath = saveFileDialog.FileName; + Connection connection = connectionSelector.GetConnection(); + await Task.Run(() => CreateProfile(profilePath, connection)); + } else { + SetButtonStates(true); + } + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Create Profile Error"); + SetButtonStates(true); + } + } + + private async void UploadProfileButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonStates(false); + OpenFileDialog openFileDialog = new OpenFileDialog(); + if (openFileDialog.ShowDialog() == true) { + string profilePath = openFileDialog.FileName; + Connection connection = connectionSelector.GetConnection(); + await Task.Run(() => UploadProfile(profilePath, connection)); + } else { + SetButtonStates(true); + } + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Upload Profile Error"); + SetButtonStates(true); + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileViewModel.cs new file mode 100644 index 0000000..00c052c --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Profile/ProfileViewModel.cs @@ -0,0 +1,23 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.Profile { + + class ProfileViewModel : IDemoViewModel { + + public ProfileViewModel() { + Name = "Profile"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml new file mode 100644 index 0000000..7e7e333 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + Send File + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml.cs new file mode 100644 index 0000000..fb604aa --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileView.xaml.cs @@ -0,0 +1,104 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.SendFile { + + /// + /// Interaction logic for SendFileView.xaml + /// + public partial class SendFileView : UserControl { + + public SendFileView() { + InitializeComponent(); + } + + private void SendFileToPrinter() { + string filePath = null; + Connection printerConnection = null; + Task.Run(() => { + try { + printerConnection = connectionSelector.GetConnection(); + printerConnection.Open(); + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(printerConnection); + + filePath = CreateDemoFile(printer.PrinterControlLanguage); + printer.SendFileContents(filePath); + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (IOException e) { + MessageBoxCreator.ShowError(e.Message, "IO Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Send File Error"); + } finally { + try { + if (printerConnection != null) + printerConnection.Close(); + } catch (ConnectionException) { } + + if (filePath != null) { + try { + new FileInfo(filePath).Delete(); + } catch { } + } + + SetSendFileButtonState(true); + } + }); + } + + private string CreateDemoFile(PrinterLanguage pl) { + string tempFilePath = $"{Path.GetTempPath()}TEST_ZEBRA.LBL"; + using (FileStream tmpFile = new FileStream(tempFilePath, FileMode.Create)) { + byte[] configLabel = null; + if (pl == PrinterLanguage.ZPL) { + configLabel = Encoding.UTF8.GetBytes("^XA^FO17,16^GB379,371,8^FS^FT65,255^A0N,135,134^FDTEST^FS^XZ"); + } else if (pl == PrinterLanguage.CPCL) { + string cpclConfigLabel = "! 0 200 200 406 1\r\n" + "ON-FEED IGNORE\r\n" + "BOX 20 20 380 380 8\r\n" + "T 0 6 137 177 TEST\r\n" + "PRINT\r\n"; + configLabel = Encoding.UTF8.GetBytes(cpclConfigLabel); + } + + tmpFile.Write(configLabel, 0, configLabel.Length); + tmpFile.Flush(); + } + return new FileInfo(tempFilePath).FullName; + } + + private void SendFileButton_Click(object sender, RoutedEventArgs e) { + try { + SetSendFileButtonState(false); + SendFileToPrinter(); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Send File Error"); + } + } + + private void SetSendFileButtonState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + sendFileButton.IsEnabled = state; + }); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileViewModel.cs new file mode 100644 index 0000000..475bfda --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SendFile/SendFileViewModel.cs @@ -0,0 +1,23 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.SendFile { + + class SendFileViewModel : IDemoViewModel { + + public SendFileViewModel() { + Name = "Send File"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/Setting.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/Setting.cs new file mode 100644 index 0000000..38db9b9 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/Setting.cs @@ -0,0 +1,31 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.Settings { + + public class Setting { + + public string Key { + get; set; + } + + public string Value { + get; set; + } + + public string Range { + get; set; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml new file mode 100644 index 0000000..e497721 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + Settings + + + + + + + + + + + Printer Settings + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml.cs new file mode 100644 index 0000000..5a5ca3c --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsView.xaml.cs @@ -0,0 +1,180 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer; +using Zebra.Sdk.Settings; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.Settings { + + /// + /// Interaction logic for SettingsView.xaml + /// + public partial class SettingsView : UserControl { + + private SettingsViewModel viewModel; + + public SettingsView() { + InitializeComponent(); + + viewModel = DataContext as SettingsViewModel; + } + + private void UpdateSettingsTable() { + Connection connection = null; + try { + connection = connectionSelector.GetConnection(); + connection.Open(); + + ZebraPrinter genericPrinter = ZebraPrinterFactory.GetInstance(connection); + ZebraPrinterLinkOs printer = ZebraPrinterFactory.CreateLinkOsPrinter(genericPrinter); + + if (printer != null) { + Dictionary settings = printer.GetAllSettings(); + + Application.Current.Dispatcher.Invoke(() => { + if (settings != null) { + foreach (string key in settings.Keys) { + viewModel.Settings.Add(new Setting { Key = key, Value = settings[key].Value, Range = printer.GetSettingRange(key) }); + } + } else { + MessageBoxCreator.ShowError("Error reading settings", "Settings Error"); + } + + printerSettingsGrid.UnselectAll(); + }); + } else { + MessageBoxCreator.ShowError("Connected printer does not support settings", "Connection Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (SettingsException e) { + MessageBoxCreator.ShowError(e.Message, "Settings Error"); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Save Settings Error"); + } finally { + SetButtonStates(true); + try { + if (connection != null) { + connection.Close(); + } + } catch (ConnectionException) { } + } + } + + private void ClearSettings() { + Application.Current.Dispatcher.Invoke(() => { + viewModel.Settings.Clear(); + }); + } + + private bool SaveModifiedSettingsToPrinter() { + bool result = false; + Connection connection = null; + try { + connection = connectionSelector.GetConnection(); + connection.Open(); + + ZebraPrinter genericPrinter = ZebraPrinterFactory.GetInstance(connection); + ZebraPrinterLinkOs printer = ZebraPrinterFactory.CreateLinkOsPrinter(genericPrinter); + + if (printer != null) { + foreach (string key in viewModel.ModifiedSettings.Keys) { + if (printer.IsSettingReadOnly(key) == false) { + printer.SetSetting(key, viewModel.ModifiedSettings[key]); + } + } + + viewModel.ModifiedSettings.Clear(); + result = true; + } else { + MessageBoxCreator.ShowError("Connected printer does not support settings", "Connection Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (SettingsException e) { + MessageBoxCreator.ShowError(e.Message, "Settings Error"); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Save Settings Error"); + } finally { + try { + if (connection != null) { + connection.Close(); + } + } catch (ConnectionException) { } + } + return result; + } + + private void SetButtonStates(bool enabled) { + Application.Current.Dispatcher.Invoke(() => { + saveSettingsButton.IsEnabled = enabled; + getSettingsButton.IsEnabled = enabled; + }); + } + + private async void SaveSettingsButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonStates(false); + if (await Task.Run(() => SaveModifiedSettingsToPrinter())) { + ClearSettings(); + await Task.Run(() => UpdateSettingsTable()); + } else { + SetButtonStates(true); + } + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Save Settings Error"); + SetButtonStates(true); + } + } + + private async void GetSettingsButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonStates(false); + ClearSettings(); + await Task.Run(() => UpdateSettingsTable()); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Get Settings Error"); + SetButtonStates(true); + } + } + + private void PrinterSettingsGrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) { + if (viewModel.Settings.Count > 0) { + TextBox textBox = e.EditingElement as TextBox; + string newValue = textBox.Text.ToString(); + + Setting setting = e.Row.Item as Setting; + string key = setting.Key; + if (key != null) { + if (viewModel.ModifiedSettings.ContainsKey(key)) { + viewModel.ModifiedSettings[key] = newValue; + } else { + viewModel.ModifiedSettings.Add(key, newValue); + } + } + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsViewModel.cs new file mode 100644 index 0000000..6050d2e --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/Settings/SettingsViewModel.cs @@ -0,0 +1,37 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.Generic; +using System.Collections.ObjectModel; + +namespace Zebra.Windows.DevDemo.Demos.Settings { + + class SettingsViewModel : IDemoViewModel { + + private ObservableCollection settings = new ObservableCollection(); + private Dictionary modifiedSettings = new Dictionary(); + + public ObservableCollection Settings { + get => settings; + } + + public Dictionary ModifiedSettings { + get => modifiedSettings; + } + + public SettingsViewModel() { + Name = "Settings"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml new file mode 100644 index 0000000..1e5346f --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + Smart Card + + + + + + + + + + + Response Data + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml.cs new file mode 100644 index 0000000..510070b --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardView.xaml.cs @@ -0,0 +1,102 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Linq; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Device; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.SmartCard { + + /// + /// Interaction logic for SmartCardView.xaml + /// + public partial class SmartCardView : UserControl { + public SmartCardView() { + InitializeComponent(); + } + + private void RunSmartCardDemo(bool sendData) { + try { + SetButtonStates(false); + ReadSmartCard(sendData); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Smart Card Error"); + } + } + + private void ReadSmartCard(bool sendData) { + Connection connection = null; + Task.Run(() => { + try { + UpdateSmartCardOutput(""); + + Application.Current.Dispatcher.Invoke(() => { + connection = connectionSelector.GetConnection(); + }); + + connection.Open(); + + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(connection); + SmartcardReader smartcardReader = SmartcardReaderFactory.Create(printer); + if (smartcardReader != null) { + byte[] response = sendData ? smartcardReader.DoCommand("8010000008") : smartcardReader.GetATR(); + + UpdateSmartCardOutput(string.Concat(response.Select(x => x.ToString("x2")))); + smartcardReader.Close(); + } else { + MessageBoxCreator.ShowError("Printer does not have a smart card reader", "Smart Card Error"); + } + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Connection Error"); + } finally { + if (connection != null) { + try { + connection.Close(); + } catch (ConnectionException) { } + } + SetButtonStates(true); + } + }); + } + + private void UpdateSmartCardOutput(string newMessage) { + Application.Current.Dispatcher.Invoke(() => { + responseData.Text = newMessage; + }); + } + + private void SetButtonStates(bool enabled) { + Application.Current.Dispatcher.Invoke(() => { + sendDataButton.IsEnabled = enabled; + sendAtrButton.IsEnabled = enabled; + }); + } + + private void SendDataButton_Click(object sender, RoutedEventArgs e) { + RunSmartCardDemo(true); + } + + private void SendAtrButton_Click(object sender, RoutedEventArgs e) { + RunSmartCardDemo(false); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardViewModel.cs new file mode 100644 index 0000000..fd47706 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/SmartCard/SmartCardViewModel.cs @@ -0,0 +1,23 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.SmartCard { + + class SmartCardViewModel : IDemoViewModel { + + public SmartCardViewModel() { + Name = "Smart Card"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/FormatVariable.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/FormatVariable.cs new file mode 100644 index 0000000..0093de2 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/FormatVariable.cs @@ -0,0 +1,27 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Demos.StoredFormat { + + public class FormatVariable { + + public string FieldName { + get; set; + } + + public string FieldValue { + get; set; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml new file mode 100644 index 0000000..3bf4574 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + Stored Formats + + + + Retrieved Formats + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml.cs new file mode 100644 index 0000000..0610ca4 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatView.xaml.cs @@ -0,0 +1,230 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Device; +using Zebra.Sdk.Printer; +using Zebra.Windows.DevDemo.Dialogs; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.Demos.StoredFormat { + + /// + /// Interaction logic for StoredFormatView.xaml + /// + public partial class StoredFormatView : UserControl { + + private StoredFormatViewModel viewModel; + + private List fieldDescDataVars; + private ObservableCollection formatVariables; + + public StoredFormatView() { + InitializeComponent(); + + viewModel = DataContext as StoredFormatViewModel; + } + + private void CreateFormatTableDialog() { + SetButtonState(retrieveFormatsButton, false); + SetFormatListState(false); + + string formatName = (string)storedFilesList.SelectedValue; + Connection printerConnection = null; + + Task.Run(() => { + try { + printerConnection = connectionSelector.GetConnection(); + printerConnection.Open(); + + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(printerConnection); + byte[] formatData = printer.RetrieveFormatFromPrinter(formatName); + + fieldDescDataVars = printer.GetVariableFields(Encoding.UTF8.GetString(formatData)).ToList(); + fieldDescDataVars = FormatFieldDescriptionDataVars(fieldDescDataVars); + + formatVariables = new ObservableCollection(); + for (int i = 0; i < fieldDescDataVars.Count; ++i) { + formatVariables.Add(new FormatVariable { FieldName = fieldDescDataVars[i].FieldName, FieldValue = "" }); + } + + try { + if (printerConnection != null) { + printerConnection.Close(); + } + } catch (ConnectionException) { } + + ShowStoredFormatDialog(formatName); + } catch (Exception e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + SetButtonState(retrieveFormatsButton, true); + SetFormatListState(true); + } finally { + try { + if (printerConnection != null && printerConnection.Connected) { + printerConnection.Close(); + } + } catch (ConnectionException) { } + } + }); + } + + private void PopulateListWithFormats() { + Connection printerConnection = null; + Task.Run(() => { + try { + ClearFormatList(); + printerConnection = connectionSelector.GetConnection(); + + printerConnection.Open(); + ZebraPrinter printer = ZebraPrinterFactory.GetInstance(printerConnection); + + string[] formatExtensions = printer.PrinterControlLanguage == PrinterLanguage.ZPL ? new String[] { "ZPL" } : new String[] { "FMT", "LBL" }; + string[] formats = printer.RetrieveFileNames(formatExtensions); + + AddFormatsToList(formats); + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } catch (ZebraIllegalArgumentException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } finally { + try { + if (printerConnection != null) { + printerConnection.Close(); + } + } catch (ConnectionException) { + } finally { + SetButtonState(retrieveFormatsButton, true); + SetFormatListState(true); + } + } + }); + } + + private void SetFormatListState(bool state) { + Application.Current.Dispatcher.Invoke(() => { + storedFilesList.IsEnabled = state; + }); + } + + private void AddFormatsToList(string[] formats) { + Application.Current.Dispatcher.Invoke(() => { + foreach (string format in formats) { + viewModel.StoredFormatList.Add(format); + } + }); + } + + private void ClearFormatList() { + SetFormatListState(false); + Application.Current.Dispatcher.Invoke(() => { + viewModel.StoredFormatList.Clear(); + }); + } + + private void PrintFormat(string formatName) { + Connection printerConnection = null; + try { + printerConnection = connectionSelector.GetConnection(); + printerConnection.Open(); + + Dictionary formatVars = GetFormatVariables(); + ZebraPrinterFactory.GetInstance(printerConnection).PrintStoredFormat(formatName, formatVars, "UTF-8"); + } catch (ArgumentException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } catch (ConnectionException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } catch (ZebraPrinterLanguageUnknownException e) { + MessageBoxCreator.ShowError(e.Message, "Communication Error"); + } finally { + if (printerConnection != null) { + try { + printerConnection.Close(); + } catch (ConnectionException) { } + } + } + } + + private List FormatFieldDescriptionDataVars(List variables) { + foreach (FieldDescriptionData data in variables) { + data.FieldName = data.FieldName ?? "Field " + data.FieldNumber; + } + return variables; + } + + private Dictionary GetFormatVariables() { + Dictionary formatVars = new Dictionary(); + for (int i = 0; i < formatVariables.Count; i++) { + int fieldNum = fieldDescDataVars[i].FieldNumber; + formatVars.Add(fieldNum, formatVariables[i].FieldValue); + } + return formatVars; + } + + private void RetrieveFormatsButton_Click(object sender, RoutedEventArgs e) { + try { + SetButtonState(retrieveFormatsButton, false); + PopulateListWithFormats(); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Stored Format Error"); + } + } + + private void SetButtonState(Button button, bool state) { + Application.Current.Dispatcher.Invoke(() => { + button.IsEnabled = state; + }); + } + + private void StoredFilesList_MouseDoubleClick(object sender, MouseButtonEventArgs e) { + if (!e.Handled) { + e.Handled = true; + CreateFormatTableDialog(); + } + } + + private void ShowStoredFormatDialog(string formatName) { + Application.Current.Dispatcher.Invoke(() => { + StoredFormatDialog storedFormatDialog = new StoredFormatDialog(new StoredFormatDialogViewModel(formatVariables)); + + Button printFormatButton = storedFormatDialog.PrintFormatButton; + printFormatButton.Click += async (s, e) => { + try { + SetButtonState(printFormatButton, false); + await Task.Run(() => PrintFormat(formatName)); + } catch (Exception ex) { + MessageBoxCreator.ShowError(ex.Message, "Print Format Error"); + } finally { + SetButtonState(printFormatButton, true); + } + }; + + storedFormatDialog.ShowDialog(); + SetButtonState(retrieveFormatsButton, true); + SetFormatListState(true); + }); + } + } +} \ No newline at end of file diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatViewModel.cs new file mode 100644 index 0000000..3cbc180 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Demos/StoredFormat/StoredFormatViewModel.cs @@ -0,0 +1,31 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.ObjectModel; + +namespace Zebra.Windows.DevDemo.Demos.StoredFormat { + + public class StoredFormatViewModel : IDemoViewModel { + + private ObservableCollection storedFormatList = new ObservableCollection(); + + public ObservableCollection StoredFormatList { + get => storedFormatList; + } + + public StoredFormatViewModel() { + Name = "Stored Format"; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml new file mode 100644 index 0000000..3d7a945 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml @@ -0,0 +1,17 @@ + + + + + + + Zebra Developer Demos + © 2017 ZIH Corp. + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml.cs new file mode 100644 index 0000000..c390d78 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/AboutDialog.xaml.cs @@ -0,0 +1,28 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Windows; + +namespace Zebra.Windows.DevDemo.Dialogs { + + /// + /// Interaction logic for AboutDialog.xaml + /// + public partial class AboutDialog : Window { + + public AboutDialog() { + InitializeComponent(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml new file mode 100644 index 0000000..ca382c5 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml.cs new file mode 100644 index 0000000..a9f9ebe --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialog.xaml.cs @@ -0,0 +1,35 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Windows; +using System.Windows.Controls; + +namespace Zebra.Windows.DevDemo.Dialogs { + + /// + /// Interaction logic for StoredFormatDialog.xaml + /// + public partial class StoredFormatDialog : Window { + + public Button PrintFormatButton { + get => printFormatButton; + } + + public StoredFormatDialog(StoredFormatDialogViewModel viewModel) { + InitializeComponent(); + + DataContext = viewModel; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialogViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialogViewModel.cs new file mode 100644 index 0000000..d313e95 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Dialogs/StoredFormatDialogViewModel.cs @@ -0,0 +1,40 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Zebra.Windows.DevDemo.Demos.StoredFormat; + +namespace Zebra.Windows.DevDemo.Dialogs { + + public class StoredFormatDialogViewModel : INotifyPropertyChanged { + + private ObservableCollection formatVariables = new ObservableCollection(); + + public event PropertyChangedEventHandler PropertyChanged; + + public ObservableCollection FormatVariables { + get => formatVariables; + } + + public StoredFormatDialogViewModel(ObservableCollection formatVariables) { + this.formatVariables = formatVariables; + } + + private void OnPropertyChanged([CallerMemberName] string memberName = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName)); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionState.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionState.cs new file mode 100644 index 0000000..7e997d0 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionState.cs @@ -0,0 +1,23 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +namespace Zebra.Windows.DevDemo.Enums { + + public enum ConnectionState { + Success, + Error, + Progress, + Info + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionType.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionType.cs new file mode 100644 index 0000000..bb31ff8 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/ConnectionType.cs @@ -0,0 +1,29 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.ComponentModel; + +namespace Zebra.Windows.DevDemo.Enums { + + public enum ConnectionType { + [Description("Network")] + Network, + [Description("USB")] + USB, + [Description("USB Direct")] + UsbDirect, + [Description("Bluetooth")] + Bluetooth + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/DiscoveryMethod.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/DiscoveryMethod.cs new file mode 100644 index 0000000..1f88702 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Enums/DiscoveryMethod.cs @@ -0,0 +1,37 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.ComponentModel; + +namespace Zebra.Windows.DevDemo.Enums { + + public enum DiscoveryMethod { + [Description("Local Broadcast")] + LocalBroadcast, + [Description("Directed Broadcast")] + DirectedBroadcast, + [Description("Multicast Broadcast")] + MulticastBroadcast, + [Description("Subnet Search")] + SubnetSearch, + [Description("Zebra USB Drivers")] + ZebraUsbDrivers, + [Description("USB Direct")] + UsbDirect, + [Description("Find Printers Near Me")] + FindPrintersNearMe, + [Description("Find all Bluetooth Devices")] + Bluetooth + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml new file mode 100644 index 0000000..5dbd0a6 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + × + + + Available Demos + + + + + + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml.cs new file mode 100644 index 0000000..3064458 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindow.xaml.cs @@ -0,0 +1,66 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Linq; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using Zebra.Windows.DevDemo.Demos; +using Zebra.Windows.DevDemo.Dialogs; + +namespace Zebra.Windows.DevDemo { + + /// + /// Interaction logic for MainWindow.xaml + /// + public partial class MainWindow : Window { + + public MainWindow() { + InitializeComponent(); + } + + private void TitleBar_MouseDown(object sender, MouseButtonEventArgs e) + { + if (e.ChangedButton == MouseButton.Left) + { + DragMove(); + } + } + + private void CloseButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + QuitApplication(); + } + + private void ListBoxItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { + if (sender is ListBoxItem item) { + IDemoViewModel demoViewModel = item.DataContext as IDemoViewModel; + (DataContext as MainWindowViewModel).CurrentDemoViewModel = (DataContext as MainWindowViewModel).DemoViewModels.FirstOrDefault(vm => vm == demoViewModel); + } + } + + private void AboutMenuItem_Click(object sender, RoutedEventArgs e) { + AboutDialog aboutDialog = new AboutDialog(); + aboutDialog.Show(); + } + + private void QuitMenuItem_Click(object sender, RoutedEventArgs e) { + QuitApplication(); + } + + private void QuitApplication() { + Application.Current.Shutdown(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindowViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindowViewModel.cs new file mode 100644 index 0000000..d31efe7 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/MainWindowViewModel.cs @@ -0,0 +1,81 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using Zebra.Windows.DevDemo.Demos; +using Zebra.Windows.DevDemo.Demos.ConnectionBuilder; +using Zebra.Windows.DevDemo.Demos.Connectivity; +using Zebra.Windows.DevDemo.Demos.Discovery; +using Zebra.Windows.DevDemo.Demos.ImagePrint; +using Zebra.Windows.DevDemo.Demos.ListFormats; +using Zebra.Windows.DevDemo.Demos.MagCard; +using Zebra.Windows.DevDemo.Demos.PrinterStatus; +using Zebra.Windows.DevDemo.Demos.Profile; +using Zebra.Windows.DevDemo.Demos.SendFile; +using Zebra.Windows.DevDemo.Demos.Settings; +using Zebra.Windows.DevDemo.Demos.SmartCard; +using Zebra.Windows.DevDemo.Demos.StoredFormat; + +namespace Zebra.Windows.DevDemo { + + class MainWindowViewModel : INotifyPropertyChanged { + + private IDemoViewModel currentDemoViewModel; + private ObservableCollection demoViewModels; + + public event PropertyChangedEventHandler PropertyChanged; + + public IDemoViewModel CurrentDemoViewModel { + get => currentDemoViewModel; + set { + if (currentDemoViewModel != value) { + currentDemoViewModel = value; + OnPropertyChanged(); + } + } + } + + public ObservableCollection DemoViewModels { + get { + if (demoViewModels == null) { + demoViewModels = new ObservableCollection(); + } + return demoViewModels; + } + } + + public MainWindowViewModel() { + DemoViewModels.Add(new ConnectivityViewModel()); + DemoViewModels.Add(new DiscoveryViewModel()); + DemoViewModels.Add(new ImagePrintViewModel()); + DemoViewModels.Add(new ListFormatsViewModel()); + DemoViewModels.Add(new MagCardViewModel()); + DemoViewModels.Add(new PrinterStatusViewModel()); + DemoViewModels.Add(new ProfileViewModel()); + DemoViewModels.Add(new SendFileViewModel()); + DemoViewModels.Add(new SettingsViewModel()); + DemoViewModels.Add(new SmartCardViewModel()); + DemoViewModels.Add(new StoredFormatViewModel()); + DemoViewModels.Add(new ConnectionBuilderViewModel()); + + CurrentDemoViewModel = DemoViewModels[0]; + } + + private void OnPropertyChanged([CallerMemberName] string memberName = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName)); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml new file mode 100644 index 0000000..99bea02 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + Connection Type: + + + + + + + + + USB Printers: + + + Symbolic Name: + + + IP Address: + + + Bluetooth Address: + + + Port: + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml.cs new file mode 100644 index 0000000..c3a0eb6 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorView.xaml.cs @@ -0,0 +1,158 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using Zebra.Sdk.Comm; +using Zebra.Sdk.Printer.Discovery; +using Zebra.Windows.DevDemo.Enums; + +namespace Zebra.Windows.DevDemo.UserControls { + + /// + /// Interaction logic for ConnectionSelectorView.xaml + /// + public partial class ConnectionSelectorView : UserControl { + + private ConnectionSelectorViewModel viewModel; + + public string IpAddress { + get => viewModel.IpAddress; + } + + public ConnectionType ConnectionType { + get => viewModel.ConnectionType; + } + public DiscoveredPrinterDriver SelectedUsbPrinter { + get => (DiscoveredPrinterDriver) usbPrintersDropdown.SelectedItem; + } + + public ConnectionSelectorView() { + InitializeComponent(); + + viewModel = DataContext as ConnectionSelectorViewModel; + connectionTypesDropdown.SelectedIndex = 0; + } + + private void ConnectionTypesDropdown_SelectionChanged(object sender, SelectionChangedEventArgs e) { + var selectedItem = (sender as ComboBox).SelectedItem; + if (selectedItem != null) { + usbPrintersLabel.Visibility = Visibility.Collapsed; + usbPrintersDropdown.Visibility = Visibility.Collapsed; + usbDirectLabel.Visibility = Visibility.Collapsed; + usbDirectInput.Visibility = Visibility.Collapsed; + ipAddressLabel.Visibility = Visibility.Collapsed; + ipAddressInput.Visibility = Visibility.Collapsed; + portLabel.Visibility = Visibility.Collapsed; + portInput.Visibility = Visibility.Collapsed; + btAddressInput.Visibility = Visibility.Collapsed; + btAddressLabel.Visibility = Visibility.Collapsed; + + switch (selectedItem) { + case ConnectionType.Network: + viewModel.ConnectionType = ConnectionType.Network; + ipAddressLabel.Visibility = Visibility.Visible; + ipAddressInput.Visibility = Visibility.Visible; + portLabel.Visibility = Visibility.Visible; + portInput.Visibility = Visibility.Visible; + break; + + case ConnectionType.USB: + viewModel.ConnectionType = ConnectionType.USB; + usbPrintersLabel.Visibility = Visibility.Visible; + usbPrintersDropdown.Visibility = Visibility.Visible; + break; + + case ConnectionType.UsbDirect: + viewModel.ConnectionType = ConnectionType.UsbDirect; + usbDirectLabel.Visibility = Visibility.Visible; + usbDirectInput.Visibility = Visibility.Visible; + break; + + case ConnectionType.Bluetooth: + viewModel.ConnectionType = ConnectionType.Bluetooth; + btAddressInput.Visibility = Visibility.Visible; + btAddressLabel.Visibility = Visibility.Visible; + break; + } + + if ((ConnectionType)selectedItem == ConnectionType.USB) { + GetUsbPrintersAndAddToList(); + if (usbPrintersDropdown.Items.Count > 0) { + usbPrintersDropdown.SelectedIndex = 0; + } + } + } + } + private void GetUsbPrintersAndAddToList() { + try { + viewModel.UsbDevices.Clear(); + + List discoPrinters = UsbDiscoverer.GetZebraDriverPrinters(); + foreach (DiscoveredPrinterDriver printer in discoPrinters) { + viewModel.UsbDevices.Add(printer); + } + } catch (ConnectionException) { + viewModel.UsbDevices.Clear(); + viewModel.UsbDevices.Add(new DiscoveredPrinterDriver("OS not supported", "", new List())); + usbPrintersDropdown.SelectedIndex = 0; + } + } + + public string getConnectionAddress() { + switch(viewModel.ConnectionType) { + case ConnectionType.Bluetooth: + return viewModel.MacAddress; + case ConnectionType.UsbDirect: + return viewModel.SymbolicName; + case ConnectionType.USB: + return viewModel.UsbPrinterName; + default: + return viewModel.IpAddress; + } + } + + public Connection GetConnection() { + if (viewModel.ConnectionType == ConnectionType.Network) { + try { + int port = string.IsNullOrEmpty(viewModel.Port) ? 9100 : int.Parse(viewModel.Port); + return new TcpConnection(viewModel.IpAddress, port); + } catch (Exception e) { + throw new ConnectionException(e.Message, e); + } + } else if (viewModel.ConnectionType == ConnectionType.UsbDirect) { + try { + return new UsbConnection(viewModel.SymbolicName); + } catch (Exception e) { + throw new ConnectionException(e.Message, e); + } + } else if(viewModel.ConnectionType == ConnectionType.USB) { + DiscoveredPrinterDriver printer = null; + Application.Current.Dispatcher.Invoke(() => { + printer = (DiscoveredPrinterDriver)usbPrintersDropdown.SelectedItem; + }); + viewModel.UsbPrinterName = printer.PrinterName; + return new DriverPrinterConnection(printer.PrinterName); + } else { + try { + return new BluetoothConnection(viewModel.MacAddress); + } catch (Exception e) { + throw new ConnectionException(e.Message, e); + } + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorViewModel.cs new file mode 100644 index 0000000..6567694 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/ConnectionSelectorViewModel.cs @@ -0,0 +1,121 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.ComponentModel; +using System.Linq; +using System.Runtime.CompilerServices; +using Zebra.Sdk.Printer.Discovery; +using Zebra.Windows.DevDemo.Enums; +using Zebra.Windows.DevDemo.Utils; + +namespace Zebra.Windows.DevDemo.UserControls { + + public class ConnectionSelectorViewModel : INotifyPropertyChanged { + + private ConnectionType connectionType; + private string ipAddress; + private string port; + private string macAddress; + private string usbPrinterName; + private string symbolicName; + private ObservableCollection usbDevices = new ObservableCollection(); + + public event PropertyChangedEventHandler PropertyChanged; + + public ConnectionType ConnectionType { + get => connectionType; + set { + if (connectionType != value) { + connectionType = value; + OnPropertyChanged(); + } + } + } + + public string IpAddress { + get => ipAddress; + set { + if (ipAddress != value) { + ipAddress = value; + OnPropertyChanged(); + } + } + } + + public string Port { + get => port; + set { + if (port != value) { + port = value; + OnPropertyChanged(); + } + } + } + + public string MacAddress { + get => macAddress; + set { + if (macAddress != value) { + macAddress = value; + OnPropertyChanged(); + } + } + } + + public string UsbPrinterName { + get => usbPrinterName; + set { + if (usbPrinterName != value) { + usbPrinterName = value; + OnPropertyChanged(); + } + } + } + + public string SymbolicName { + get => symbolicName; + set { + if (symbolicName != value) { + symbolicName = value; + OnPropertyChanged(); + } + } + } + + public ObservableCollection UsbDevices { + get => usbDevices; + } + + public List ConnectionTypes { + get { + List connectionTypes = Enum.GetValues(typeof(ConnectionType)).Cast().ToList(); + if (!BluetoothHelper.IsBluetoothSupported()) { + connectionTypes.Remove(ConnectionType.Bluetooth); + } + return connectionTypes; + } + } + + public ConnectionSelectorViewModel() { + Port = "9100"; + } + + private void OnPropertyChanged([CallerMemberName] string memberName = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName)); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml new file mode 100644 index 0000000..e0d608e --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml.cs new file mode 100644 index 0000000..a7ffef6 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorView.xaml.cs @@ -0,0 +1,45 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using Microsoft.Win32; +using System.Windows; +using System.Windows.Controls; + +namespace Zebra.Windows.DevDemo.UserControls { + + /// + /// Interaction logic for FileSelectorView.xaml + /// + public partial class FileSelectorView : UserControl { + + private FileSelectorViewModel viewModel; + + public string FileName { + get => viewModel.FileName; + } + + public FileSelectorView() { + InitializeComponent(); + + viewModel = DataContext as FileSelectorViewModel; + } + + private void BrowseButton_Click(object sender, RoutedEventArgs e) { + OpenFileDialog openFileDialog = new OpenFileDialog(); + if (openFileDialog.ShowDialog() == true) { + viewModel.FileName = openFileDialog.FileName; + } + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorViewModel.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorViewModel.cs new file mode 100644 index 0000000..1291a39 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/UserControls/FileSelectorViewModel.cs @@ -0,0 +1,40 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace Zebra.Windows.DevDemo.UserControls { + + class FileSelectorViewModel : INotifyPropertyChanged { + + private string fileName; + + public string FileName { + get => fileName; + set { + if (fileName != value) { + fileName = value; + OnPropertyChanged(); + } + } + } + + public event PropertyChangedEventHandler PropertyChanged; + + public void OnPropertyChanged([CallerMemberName] string memberName = null) { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(memberName)); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/BluetoothHelper.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/BluetoothHelper.cs new file mode 100644 index 0000000..d2bcea7 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/BluetoothHelper.cs @@ -0,0 +1,29 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; + +namespace Zebra.Windows.DevDemo.Utils { + + internal class BluetoothHelper { + + public static bool IsBluetoothSupported() { + var osVersion = Environment.OSVersion; + if (osVersion.Version.Major >= 10) { + return true; + } + return false; + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/ConnectionTypeDescriptionValueConverter.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/ConnectionTypeDescriptionValueConverter.cs new file mode 100644 index 0000000..f001592 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/ConnectionTypeDescriptionValueConverter.cs @@ -0,0 +1,35 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.ComponentModel; +using System.Globalization; +using System.Windows.Data; +using Zebra.Windows.DevDemo.Enums; + +namespace Zebra.Windows.DevDemo.Utils { + + public class ConnectionTypeDescriptionValueConverter : IValueConverter { + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + var type = typeof(ConnectionType); + var name = Enum.GetName(type, value); + return ((DescriptionAttribute)Attribute.GetCustomAttribute(type.GetField(name), typeof(DescriptionAttribute))).Description; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + throw new NotImplementedException(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DemoViewModelNameValueConverter.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DemoViewModelNameValueConverter.cs new file mode 100644 index 0000000..c854df2 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DemoViewModelNameValueConverter.cs @@ -0,0 +1,32 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.Globalization; +using System.Windows.Data; +using Zebra.Windows.DevDemo.Demos; + +namespace Zebra.Windows.DevDemo.Utils { + + public class DemoViewModelNameValueConverter : IValueConverter { + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + return (value as IDemoViewModel).Name; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + throw new NotImplementedException(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DiscoveryMethodDescriptionValueConverter.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DiscoveryMethodDescriptionValueConverter.cs new file mode 100644 index 0000000..5be9a6d --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/DiscoveryMethodDescriptionValueConverter.cs @@ -0,0 +1,35 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System; +using System.ComponentModel; +using System.Globalization; +using System.Windows.Data; +using Zebra.Windows.DevDemo.Enums; + +namespace Zebra.Windows.DevDemo.Utils { + + public class DiscoveryMethodDescriptionValueConverter : IValueConverter { + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { + var type = typeof(DiscoveryMethod); + var name = Enum.GetName(type, value); + return ((DescriptionAttribute) Attribute.GetCustomAttribute(type.GetField(name), typeof(DescriptionAttribute))).Description; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { + throw new NotImplementedException(); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/MessageBoxCreator.cs b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/MessageBoxCreator.cs new file mode 100644 index 0000000..37c1dd1 --- /dev/null +++ b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/Utils/MessageBoxCreator.cs @@ -0,0 +1,29 @@ +/*********************************************** + * CONFIDENTIAL AND PROPRIETARY + * + * The source code and other information contained herein is the confidential and exclusive property of + * ZIH Corp. and is subject to the terms and conditions in your end user license agreement. + * This source code, and any other information contained herein, shall not be copied, reproduced, published, + * displayed or distributed, in whole or in part, in any medium, by any means, for any purpose except as + * expressly permitted under such license agreement. + * + * Copyright ZIH Corp. 2017 + * + * ALL RIGHTS RESERVED + ***********************************************/ + +using System.Windows; + +namespace Zebra.Windows.DevDemo.Utils { + + public static class MessageBoxCreator { + + public static void ShowError(string message, string caption) { + MessageBox.Show(message, caption, MessageBoxButton.OK, MessageBoxImage.Error); + } + + public static void ShowInformation(string message, string caption) { + MessageBox.Show(message, caption, MessageBoxButton.OK, MessageBoxImage.Information); + } + } +} diff --git a/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/zebralogo.ico b/ZSDK_DevDemos_.NET/Zebra/Windows/DevDemo/zebralogo.ico new file mode 100644 index 0000000000000000000000000000000000000000..d7034be074bbaacf24455036d7254b5cd228e5b8 GIT binary patch literal 22147 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 literal 0 HcmV?d00001 diff --git a/ZSDK_DevDemos_.NET/app.manifest b/ZSDK_DevDemos_.NET/app.manifest new file mode 100644 index 0000000..ff42268 --- /dev/null +++ b/ZSDK_DevDemos_.NET/app.manifest @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +